Reformat before I go crazy.

This commit is contained in:
drtshock 2014-04-04 13:55:21 -05:00
parent 0c3ea377dd
commit 814e439705
124 changed files with 11302 additions and 13164 deletions

View File

@ -13,7 +13,7 @@
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>
<build> <build>
<defaultGoal>clean package install</defaultGoal> <defaultGoal>clean package install</defaultGoal>
<finalName>Factions</finalName> <finalName>Factions</finalName>

View File

@ -1,383 +1,320 @@
package com.massivecraft.factions; package com.massivecraft.factions;
import java.io.*;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import org.bukkit.ChatColor;
import org.bukkit.craftbukkit.libs.com.google.gson.reflect.TypeToken;
import com.massivecraft.factions.integration.LWCFeatures; import com.massivecraft.factions.integration.LWCFeatures;
import com.massivecraft.factions.struct.Relation; import com.massivecraft.factions.struct.Relation;
import com.massivecraft.factions.util.AsciiCompass; import com.massivecraft.factions.util.AsciiCompass;
import com.massivecraft.factions.zcore.util.DiscUtil; import com.massivecraft.factions.zcore.util.DiscUtil;
import org.bukkit.ChatColor;
import org.bukkit.craftbukkit.libs.com.google.gson.reflect.TypeToken;
import java.io.File;
import java.lang.reflect.Type;
import java.util.*;
import java.util.Map.Entry;
public class Board public class Board {
{ private static transient File file = new File(P.p.getDataFolder(), "board.json");
private static transient File file = new File(P.p.getDataFolder(), "board.json"); private static transient HashMap<FLocation, String> flocationIds = new HashMap<FLocation, String>();
private static transient HashMap<FLocation, String> flocationIds = new HashMap<FLocation, String>();
//----------------------------------------------//
// Get and Set
//----------------------------------------------//
public static String getIdAt(FLocation flocation)
{
if ( ! flocationIds.containsKey(flocation))
{
return "0";
}
return flocationIds.get(flocation);
}
public static Faction getFactionAt(FLocation flocation)
{
return Factions.i.get(getIdAt(flocation));
}
public static void setIdAt(String id, FLocation flocation)
{
clearOwnershipAt(flocation);
if (id == "0") //----------------------------------------------//
{ // Get and Set
removeAt(flocation); //----------------------------------------------//
} public static String getIdAt(FLocation flocation) {
if (!flocationIds.containsKey(flocation)) {
flocationIds.put(flocation, id); return "0";
} }
public static void setFactionAt(Faction faction, FLocation flocation)
{
setIdAt(faction.getId(), flocation);
}
public static void removeAt(FLocation flocation)
{
clearOwnershipAt(flocation);
flocationIds.remove(flocation);
}
// not to be confused with claims, ownership referring to further member-specific ownership of a claim
public static void clearOwnershipAt(FLocation flocation)
{
Faction faction = getFactionAt(flocation);
if (faction != null && faction.isNormal())
{
faction.clearClaimOwnership(flocation);
}
}
public static void unclaimAll(String factionId)
{
Faction faction = Factions.i.get(factionId);
if (faction != null && faction.isNormal())
{
faction.clearAllClaimOwnership();
}
Iterator<Entry<FLocation, String>> iter = flocationIds.entrySet().iterator(); return flocationIds.get(flocation);
while (iter.hasNext()) }
{
Entry<FLocation, String> entry = iter.next();
if (entry.getValue().equals(factionId))
{
if(Conf.onUnclaimResetLwcLocks && LWCFeatures.getEnabled())
{
LWCFeatures.clearAllChests(entry.getKey());
}
iter.remove();
}
}
}
// Is this coord NOT completely surrounded by coords claimed by the same faction? public static Faction getFactionAt(FLocation flocation) {
// Simpler: Is there any nearby coord with a faction other than the faction here? return Factions.i.get(getIdAt(flocation));
public static boolean isBorderLocation(FLocation flocation) }
{
Faction faction = getFactionAt(flocation);
FLocation a = flocation.getRelative(1, 0);
FLocation b = flocation.getRelative(-1, 0);
FLocation c = flocation.getRelative(0, 1);
FLocation d = flocation.getRelative(0, -1);
return faction != getFactionAt(a) || faction != getFactionAt(b) || faction != getFactionAt(c) || faction != getFactionAt(d);
}
// Is this coord connected to any coord claimed by the specified faction? public static void setIdAt(String id, FLocation flocation) {
public static boolean isConnectedLocation(FLocation flocation, Faction faction) clearOwnershipAt(flocation);
{
FLocation a = flocation.getRelative(1, 0);
FLocation b = flocation.getRelative(-1, 0);
FLocation c = flocation.getRelative(0, 1);
FLocation d = flocation.getRelative(0, -1);
return faction == getFactionAt(a) || faction == getFactionAt(b) || faction == getFactionAt(c) || faction == getFactionAt(d);
}
//----------------------------------------------//
// Cleaner. Remove orphaned foreign keys
//----------------------------------------------//
public static void clean()
{
Iterator<Entry<FLocation, String>> iter = flocationIds.entrySet().iterator();
while (iter.hasNext()) {
Entry<FLocation, String> entry = iter.next();
if ( ! Factions.i.exists(entry.getValue()))
{
if(Conf.onUnclaimResetLwcLocks && LWCFeatures.getEnabled())
{
LWCFeatures.clearAllChests(entry.getKey());
}
P.p.log("Board cleaner removed "+entry.getValue()+" from "+entry.getKey());
iter.remove();
}
}
}
//----------------------------------------------//
// Coord count
//----------------------------------------------//
public static int getFactionCoordCount(String factionId)
{
int ret = 0;
for (String thatFactionId : flocationIds.values())
{
if(thatFactionId.equals(factionId))
{
ret += 1;
}
}
return ret;
}
public static int getFactionCoordCount(Faction faction)
{
return getFactionCoordCount(faction.getId());
}
public static int getFactionCoordCountInWorld(Faction faction, String worldName)
{
String factionId = faction.getId();
int ret = 0;
Iterator<Entry<FLocation, String>> iter = flocationIds.entrySet().iterator();
while (iter.hasNext()) {
Entry<FLocation, String> entry = iter.next();
if (entry.getValue().equals(factionId) && entry.getKey().getWorldName().equals(worldName))
{
ret += 1;
}
}
return ret;
}
//----------------------------------------------//
// Map generation
//----------------------------------------------//
/**
* The map is relative to a coord and a faction
* north is in the direction of decreasing x
* east is in the direction of decreasing z
*/
public static ArrayList<String> getMap(Faction faction, FLocation flocation, double inDegrees)
{
ArrayList<String> ret = new ArrayList<String>();
Faction factionLoc = getFactionAt(flocation);
ret.add(P.p.txt.titleize("("+flocation.getCoordString()+") "+factionLoc.getTag(faction)));
int halfWidth = Conf.mapWidth / 2;
int halfHeight = Conf.mapHeight / 2;
FLocation topLeft = flocation.getRelative(-halfWidth, -halfHeight);
int width = halfWidth * 2 + 1;
int height = halfHeight * 2 + 1;
if (Conf.showMapFactionKey)
{
height--;
}
Map<String, Character> fList = new HashMap<String, Character>();
int chrIdx = 0;
// For each row
for (int dz = 0; dz < height; dz++)
{
// Draw and add that row
String row = "";
for (int dx = 0; dx < width; dx++)
{
if(dx == halfWidth && dz == halfHeight)
{
row += ChatColor.AQUA+"+";
}
else
{
FLocation flocationHere = topLeft.getRelative(dx, dz);
Faction factionHere = getFactionAt(flocationHere);
Relation relation = faction.getRelationTo(factionHere);
if (factionHere.isNone())
{
row += ChatColor.GRAY+"-";
}
else if (factionHere.isSafeZone())
{
row += Conf.colorPeaceful+"+";
}
else if (factionHere.isWarZone())
{
row += ChatColor.DARK_RED+"+";
}
else if
(
factionHere == faction
||
factionHere == factionLoc
||
relation.isAtLeast(Relation.ALLY)
||
(Conf.showNeutralFactionsOnMap && relation.equals(Relation.NEUTRAL))
||
(Conf.showEnemyFactionsOnMap && relation.equals(Relation.ENEMY))
)
{
if (!fList.containsKey(factionHere.getTag()))
fList.put(factionHere.getTag(), Conf.mapKeyChrs[chrIdx++]);
char tag = fList.get(factionHere.getTag());
row += factionHere.getColorTo(faction) + "" + tag;
}
else
{
row += ChatColor.GRAY+"-";
}
}
}
ret.add(row);
}
// Get the compass
ArrayList<String> asciiCompass = AsciiCompass.getAsciiCompass(inDegrees, ChatColor.RED, P.p.txt.parse("<a>"));
// Add the compass if (id == "0") {
ret.set(1, asciiCompass.get(0)+ret.get(1).substring(3*3)); removeAt(flocation);
ret.set(2, asciiCompass.get(1)+ret.get(2).substring(3*3)); }
ret.set(3, asciiCompass.get(2)+ret.get(3).substring(3*3));
flocationIds.put(flocation, id);
// Add the faction key }
if (Conf.showMapFactionKey)
{ public static void setFactionAt(Faction faction, FLocation flocation) {
String fRow = ""; setIdAt(faction.getId(), flocation);
for(String key : fList.keySet()) }
{
fRow += String.format("%s%s: %s ", ChatColor.GRAY, fList.get(key), key); public static void removeAt(FLocation flocation) {
} clearOwnershipAt(flocation);
ret.add(fRow); flocationIds.remove(flocation);
} }
return ret; // not to be confused with claims, ownership referring to further member-specific ownership of a claim
} public static void clearOwnershipAt(FLocation flocation) {
Faction faction = getFactionAt(flocation);
if (faction != null && faction.isNormal()) {
// -------------------------------------------- // faction.clearClaimOwnership(flocation);
// Persistance }
// -------------------------------------------- // }
public static Map<String,Map<String,String>> dumpAsSaveFormat() public static void unclaimAll(String factionId) {
{ Faction faction = Factions.i.get(factionId);
Map<String,Map<String,String>> worldCoordIds = new HashMap<String,Map<String,String>>(); if (faction != null && faction.isNormal()) {
faction.clearAllClaimOwnership();
String worldName, coords; }
String id;
Iterator<Entry<FLocation, String>> iter = flocationIds.entrySet().iterator();
for (Entry<FLocation, String> entry : flocationIds.entrySet()) while (iter.hasNext()) {
{ Entry<FLocation, String> entry = iter.next();
worldName = entry.getKey().getWorldName(); if (entry.getValue().equals(factionId)) {
coords = entry.getKey().getCoordString(); if (Conf.onUnclaimResetLwcLocks && LWCFeatures.getEnabled()) {
id = entry.getValue(); LWCFeatures.clearAllChests(entry.getKey());
if ( ! worldCoordIds.containsKey(worldName)) }
{ iter.remove();
worldCoordIds.put(worldName, new TreeMap<String,String>()); }
} }
}
worldCoordIds.get(worldName).put(coords, id);
} // Is this coord NOT completely surrounded by coords claimed by the same faction?
// Simpler: Is there any nearby coord with a faction other than the faction here?
return worldCoordIds; public static boolean isBorderLocation(FLocation flocation) {
} Faction faction = getFactionAt(flocation);
FLocation a = flocation.getRelative(1, 0);
public static void loadFromSaveFormat(Map<String,Map<String,String>> worldCoordIds) FLocation b = flocation.getRelative(-1, 0);
{ FLocation c = flocation.getRelative(0, 1);
flocationIds.clear(); FLocation d = flocation.getRelative(0, -1);
return faction != getFactionAt(a) || faction != getFactionAt(b) || faction != getFactionAt(c) || faction != getFactionAt(d);
String worldName; }
String[] coords;
int x, z; // Is this coord connected to any coord claimed by the specified faction?
String factionId; public static boolean isConnectedLocation(FLocation flocation, Faction faction) {
FLocation a = flocation.getRelative(1, 0);
for (Entry<String,Map<String,String>> entry : worldCoordIds.entrySet()) FLocation b = flocation.getRelative(-1, 0);
{ FLocation c = flocation.getRelative(0, 1);
worldName = entry.getKey(); FLocation d = flocation.getRelative(0, -1);
for (Entry<String,String> entry2 : entry.getValue().entrySet()) return faction == getFactionAt(a) || faction == getFactionAt(b) || faction == getFactionAt(c) || faction == getFactionAt(d);
{ }
coords = entry2.getKey().trim().split("[,\\s]+");
x = Integer.parseInt(coords[0]);
z = Integer.parseInt(coords[1]); //----------------------------------------------//
factionId = entry2.getValue(); // Cleaner. Remove orphaned foreign keys
flocationIds.put(new FLocation(worldName, x, z), factionId); //----------------------------------------------//
}
} public static void clean() {
} Iterator<Entry<FLocation, String>> iter = flocationIds.entrySet().iterator();
while (iter.hasNext()) {
public static boolean save() Entry<FLocation, String> entry = iter.next();
{ if (!Factions.i.exists(entry.getValue())) {
//Factions.log("Saving board to disk"); if (Conf.onUnclaimResetLwcLocks && LWCFeatures.getEnabled()) {
LWCFeatures.clearAllChests(entry.getKey());
try }
{ P.p.log("Board cleaner removed " + entry.getValue() + " from " + entry.getKey());
DiscUtil.write(file, P.p.gson.toJson(dumpAsSaveFormat())); iter.remove();
} }
catch (Exception e) }
{ }
e.printStackTrace();
P.p.log("Failed to save the board to disk."); //----------------------------------------------//
return false; // Coord count
} //----------------------------------------------//
return true; public static int getFactionCoordCount(String factionId) {
} int ret = 0;
for (String thatFactionId : flocationIds.values()) {
public static boolean load() if (thatFactionId.equals(factionId)) {
{ ret += 1;
P.p.log("Loading board from disk"); }
}
if ( ! file.exists()) return ret;
{ }
P.p.log("No board to load from disk. Creating new file.");
save(); public static int getFactionCoordCount(Faction faction) {
return true; return getFactionCoordCount(faction.getId());
} }
try public static int getFactionCoordCountInWorld(Faction faction, String worldName) {
{ String factionId = faction.getId();
Type type = new TypeToken<Map<String,Map<String,String>>>(){}.getType(); int ret = 0;
Map<String,Map<String,String>> worldCoordIds = P.p.gson.fromJson(DiscUtil.read(file), type); Iterator<Entry<FLocation, String>> iter = flocationIds.entrySet().iterator();
loadFromSaveFormat(worldCoordIds); while (iter.hasNext()) {
} Entry<FLocation, String> entry = iter.next();
catch (Exception e) if (entry.getValue().equals(factionId) && entry.getKey().getWorldName().equals(worldName)) {
{ ret += 1;
e.printStackTrace(); }
P.p.log("Failed to load the board from disk."); }
return false; return ret;
} }
return true; //----------------------------------------------//
} // Map generation
//----------------------------------------------//
/**
* The map is relative to a coord and a faction north is in the direction of decreasing x east is in the direction
* of decreasing z
*/
public static ArrayList<String> getMap(Faction faction, FLocation flocation, double inDegrees) {
ArrayList<String> ret = new ArrayList<String>();
Faction factionLoc = getFactionAt(flocation);
ret.add(P.p.txt.titleize("(" + flocation.getCoordString() + ") " + factionLoc.getTag(faction)));
int halfWidth = Conf.mapWidth / 2;
int halfHeight = Conf.mapHeight / 2;
FLocation topLeft = flocation.getRelative(-halfWidth, -halfHeight);
int width = halfWidth * 2 + 1;
int height = halfHeight * 2 + 1;
if (Conf.showMapFactionKey) {
height--;
}
Map<String, Character> fList = new HashMap<String, Character>();
int chrIdx = 0;
// For each row
for (int dz = 0; dz < height; dz++) {
// Draw and add that row
String row = "";
for (int dx = 0; dx < width; dx++) {
if (dx == halfWidth && dz == halfHeight) {
row += ChatColor.AQUA + "+";
} else {
FLocation flocationHere = topLeft.getRelative(dx, dz);
Faction factionHere = getFactionAt(flocationHere);
Relation relation = faction.getRelationTo(factionHere);
if (factionHere.isNone()) {
row += ChatColor.GRAY + "-";
} else if (factionHere.isSafeZone()) {
row += Conf.colorPeaceful + "+";
} else if (factionHere.isWarZone()) {
row += ChatColor.DARK_RED + "+";
} else if
(
factionHere == faction
||
factionHere == factionLoc
||
relation.isAtLeast(Relation.ALLY)
||
(Conf.showNeutralFactionsOnMap && relation.equals(Relation.NEUTRAL))
||
(Conf.showEnemyFactionsOnMap && relation.equals(Relation.ENEMY))
) {
if (!fList.containsKey(factionHere.getTag()))
fList.put(factionHere.getTag(), Conf.mapKeyChrs[chrIdx++]);
char tag = fList.get(factionHere.getTag());
row += factionHere.getColorTo(faction) + "" + tag;
} else {
row += ChatColor.GRAY + "-";
}
}
}
ret.add(row);
}
// Get the compass
ArrayList<String> asciiCompass = AsciiCompass.getAsciiCompass(inDegrees, ChatColor.RED, P.p.txt.parse("<a>"));
// Add the compass
ret.set(1, asciiCompass.get(0) + ret.get(1).substring(3 * 3));
ret.set(2, asciiCompass.get(1) + ret.get(2).substring(3 * 3));
ret.set(3, asciiCompass.get(2) + ret.get(3).substring(3 * 3));
// Add the faction key
if (Conf.showMapFactionKey) {
String fRow = "";
for (String key : fList.keySet()) {
fRow += String.format("%s%s: %s ", ChatColor.GRAY, fList.get(key), key);
}
ret.add(fRow);
}
return ret;
}
// -------------------------------------------- //
// Persistance
// -------------------------------------------- //
public static Map<String, Map<String, String>> dumpAsSaveFormat() {
Map<String, Map<String, String>> worldCoordIds = new HashMap<String, Map<String, String>>();
String worldName, coords;
String id;
for (Entry<FLocation, String> entry : flocationIds.entrySet()) {
worldName = entry.getKey().getWorldName();
coords = entry.getKey().getCoordString();
id = entry.getValue();
if (!worldCoordIds.containsKey(worldName)) {
worldCoordIds.put(worldName, new TreeMap<String, String>());
}
worldCoordIds.get(worldName).put(coords, id);
}
return worldCoordIds;
}
public static void loadFromSaveFormat(Map<String, Map<String, String>> worldCoordIds) {
flocationIds.clear();
String worldName;
String[] coords;
int x, z;
String factionId;
for (Entry<String, Map<String, String>> entry : worldCoordIds.entrySet()) {
worldName = entry.getKey();
for (Entry<String, String> entry2 : entry.getValue().entrySet()) {
coords = entry2.getKey().trim().split("[,\\s]+");
x = Integer.parseInt(coords[0]);
z = Integer.parseInt(coords[1]);
factionId = entry2.getValue();
flocationIds.put(new FLocation(worldName, x, z), factionId);
}
}
}
public static boolean save() {
//Factions.log("Saving board to disk");
try {
DiscUtil.write(file, P.p.gson.toJson(dumpAsSaveFormat()));
} catch (Exception e) {
e.printStackTrace();
P.p.log("Failed to save the board to disk.");
return false;
}
return true;
}
public static boolean load() {
P.p.log("Loading board from disk");
if (!file.exists()) {
P.p.log("No board to load from disk. Creating new file.");
save();
return true;
}
try {
Type type = new TypeToken<Map<String, Map<String, String>>>() {
}.getType();
Map<String, Map<String, String>> worldCoordIds = P.p.gson.fromJson(DiscUtil.read(file), type);
loadFromSaveFormat(worldCoordIds);
} catch (Exception e) {
e.printStackTrace();
P.p.log("Failed to load the board from disk.");
return false;
}
return true;
}
} }

View File

@ -1,385 +1,383 @@
package com.massivecraft.factions; package com.massivecraft.factions;
import java.util.*;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
public class Conf import java.util.*;
{
public static List<String> baseCommandAliases = new ArrayList<String>();
public static boolean allowNoSlashCommand = true;
// Colors
public static ChatColor colorMember = ChatColor.GREEN;
public static ChatColor colorAlly = ChatColor.LIGHT_PURPLE;
public static ChatColor colorNeutral = ChatColor.WHITE;
public static ChatColor colorEnemy = ChatColor.RED;
public static ChatColor colorPeaceful = ChatColor.GOLD;
public static ChatColor colorWar = ChatColor.DARK_RED;
//public static ChatColor colorWilderness = ChatColor.DARK_GREEN;
// Power
public static double powerPlayerMax = 10.0;
public static double powerPlayerMin = -10.0;
public static double powerPlayerStarting = 0.0;
public static double powerPerMinute = 0.2; // Default health rate... it takes 5 min to heal one power
public static double powerPerDeath = 4.0; // A death makes you lose 4 power
public static boolean powerRegenOffline = false; // does player power regenerate even while they're offline?
public static double powerOfflineLossPerDay = 0.0; // players will lose this much power per day offline
public static double powerOfflineLossLimit = 0.0; // players will no longer lose power from being offline once their power drops to this amount or less
public static double powerFactionMax = 0.0; // if greater than 0, the cap on how much power a faction can have (additional power from players beyond that will act as a "buffer" of sorts)
public static String prefixAdmin = "**";
public static String prefixMod = "*";
public static int factionTagLengthMin = 3;
public static int factionTagLengthMax = 10;
public static boolean factionTagForceUpperCase = false;
public static boolean newFactionsDefaultOpen = false;
// when faction membership hits this limit, players will no longer be able to join using /f join; default is 0, no limit public class Conf {
public static int factionMemberLimit = 0; public static List<String> baseCommandAliases = new ArrayList<String>();
public static boolean allowNoSlashCommand = true;
// what faction ID to start new players in when they first join the server; default is 0, "no faction" // Colors
public static String newPlayerStartingFactionID = "0"; public static ChatColor colorMember = ChatColor.GREEN;
public static ChatColor colorAlly = ChatColor.LIGHT_PURPLE;
public static ChatColor colorNeutral = ChatColor.WHITE;
public static ChatColor colorEnemy = ChatColor.RED;
public static boolean showMapFactionKey = true; public static ChatColor colorPeaceful = ChatColor.GOLD;
public static boolean showNeutralFactionsOnMap = true; public static ChatColor colorWar = ChatColor.DARK_RED;
public static boolean showEnemyFactionsOnMap = true; //public static ChatColor colorWilderness = ChatColor.DARK_GREEN;
// Disallow joining/leaving/kicking while power is negative
public static boolean canLeaveWithNegativePower = true;
// Configuration for faction-only chat
public static boolean factionOnlyChat = true;
// Configuration on the Faction tag in chat messages.
public static boolean chatTagEnabled = true;
public static transient boolean chatTagHandledByAnotherPlugin = false;
public static boolean chatTagRelationColored = true;
public static String chatTagReplaceString = "[FACTION]";
public static String chatTagInsertAfterString = "";
public static String chatTagInsertBeforeString = "";
public static int chatTagInsertIndex = 1;
public static boolean chatTagPadBefore = false;
public static boolean chatTagPadAfter = true;
public static String chatTagFormat = "%s"+ChatColor.WHITE;
public static String factionChatFormat = "%s:"+ChatColor.WHITE+" %s";
public static String allianceChatFormat = ChatColor.LIGHT_PURPLE+"%s:"+ChatColor.WHITE+" %s";
public static boolean broadcastDescriptionChanges = false; // Power
public static double powerPlayerMax = 10.0;
public static double powerPlayerMin = -10.0;
public static double powerPlayerStarting = 0.0;
public static double powerPerMinute = 0.2; // Default health rate... it takes 5 min to heal one power
public static double powerPerDeath = 4.0; // A death makes you lose 4 power
public static boolean powerRegenOffline = false; // does player power regenerate even while they're offline?
public static double powerOfflineLossPerDay = 0.0; // players will lose this much power per day offline
public static double powerOfflineLossLimit = 0.0; // players will no longer lose power from being offline once their power drops to this amount or less
public static double powerFactionMax = 0.0; // if greater than 0, the cap on how much power a faction can have (additional power from players beyond that will act as a "buffer" of sorts)
public static double saveToFileEveryXMinutes = 30.0; public static String prefixAdmin = "**";
public static String prefixMod = "*";
public static double autoLeaveAfterDaysOfInactivity = 10.0; public static int factionTagLengthMin = 3;
public static double autoLeaveRoutineRunsEveryXMinutes = 5.0; public static int factionTagLengthMax = 10;
public static int autoLeaveRoutineMaxMillisecondsPerTick = 5; // 1 server tick is roughly 50ms, so default max 10% of a tick public static boolean factionTagForceUpperCase = false;
public static boolean removePlayerDataWhenBanned = true;
public static boolean worldGuardChecking = false; public static boolean newFactionsDefaultOpen = false;
public static boolean worldGuardBuildPriority = false;
//LWC
public static boolean lwcIntegration = false;
public static boolean onUnclaimResetLwcLocks = false;
public static boolean onCaptureResetLwcLocks = false;
// server logging options // when faction membership hits this limit, players will no longer be able to join using /f join; default is 0, no limit
public static boolean logFactionCreate = true; public static int factionMemberLimit = 0;
public static boolean logFactionDisband = true;
public static boolean logFactionJoin = true;
public static boolean logFactionKick = true;
public static boolean logFactionLeave = true;
public static boolean logLandClaims = true;
public static boolean logLandUnclaims = true;
public static boolean logMoneyTransactions = true;
public static boolean logPlayerCommands = true;
// prevent some potential exploits // what faction ID to start new players in when they first join the server; default is 0, "no faction"
public static boolean handleExploitObsidianGenerators = true; public static String newPlayerStartingFactionID = "0";
public static boolean handleExploitEnderPearlClipping = true;
public static boolean handleExploitInteractionSpam = true;
public static boolean handleExploitTNTWaterlog = false;
public static boolean homesEnabled = true; public static boolean showMapFactionKey = true;
public static boolean homesMustBeInClaimedTerritory = true; public static boolean showNeutralFactionsOnMap = true;
public static boolean homesTeleportToOnDeath = true; public static boolean showEnemyFactionsOnMap = true;
public static boolean homesRespawnFromNoPowerLossWorlds = true;
public static boolean homesTeleportCommandEnabled = true;
public static boolean homesTeleportCommandEssentialsIntegration = true;
public static boolean homesTeleportCommandSmokeEffectEnabled = true;
public static float homesTeleportCommandSmokeEffectThickness = 3f;
public static boolean homesTeleportAllowedFromEnemyTerritory = true;
public static boolean homesTeleportAllowedFromDifferentWorld = true;
public static double homesTeleportAllowedEnemyDistance = 32.0;
public static boolean homesTeleportIgnoreEnemiesIfInOwnTerritory = true;
public static boolean disablePVPBetweenNeutralFactions = false;
public static boolean disablePVPForFactionlessPlayers = false;
public static boolean enablePVPAgainstFactionlessInAttackersLand = false;
public static int noPVPDamageToOthersForXSecondsAfterLogin = 3;
public static boolean peacefulTerritoryDisablePVP = true; // Disallow joining/leaving/kicking while power is negative
public static boolean peacefulTerritoryDisableMonsters = false; public static boolean canLeaveWithNegativePower = true;
public static boolean peacefulMembersDisablePowerLoss = true;
public static boolean permanentFactionsDisableLeaderPromotion = false;
public static boolean claimsMustBeConnected = false;
public static boolean claimsCanBeUnconnectedIfOwnedByOtherFaction = true;
public static int claimsRequireMinFactionMembers = 1;
public static int claimedLandsMax = 0;
// if someone is doing a radius claim and the process fails to claim land this many times in a row, it will exit // Configuration for faction-only chat
public static int radiusClaimFailureLimit = 9; public static boolean factionOnlyChat = true;
// Configuration on the Faction tag in chat messages.
public static boolean chatTagEnabled = true;
public static transient boolean chatTagHandledByAnotherPlugin = false;
public static boolean chatTagRelationColored = true;
public static String chatTagReplaceString = "[FACTION]";
public static String chatTagInsertAfterString = "";
public static String chatTagInsertBeforeString = "";
public static int chatTagInsertIndex = 1;
public static boolean chatTagPadBefore = false;
public static boolean chatTagPadAfter = true;
public static String chatTagFormat = "%s" + ChatColor.WHITE;
public static String factionChatFormat = "%s:" + ChatColor.WHITE + " %s";
public static String allianceChatFormat = ChatColor.LIGHT_PURPLE + "%s:" + ChatColor.WHITE + " %s";
public static double considerFactionsReallyOfflineAfterXMinutes = 0.0; public static boolean broadcastDescriptionChanges = false;
public static int actionDeniedPainAmount = 1;
// commands which will be prevented if the player is a member of a permanent faction public static double saveToFileEveryXMinutes = 30.0;
public static Set<String> permanentFactionMemberDenyCommands = new LinkedHashSet<String>();
// commands which will be prevented when in claimed territory of another faction public static double autoLeaveAfterDaysOfInactivity = 10.0;
public static Set<String> territoryNeutralDenyCommands = new LinkedHashSet<String>(); public static double autoLeaveRoutineRunsEveryXMinutes = 5.0;
public static Set<String> territoryEnemyDenyCommands = new LinkedHashSet<String>(); public static int autoLeaveRoutineMaxMillisecondsPerTick = 5; // 1 server tick is roughly 50ms, so default max 10% of a tick
public static boolean removePlayerDataWhenBanned = true;
public static double territoryShieldFactor = 0.3;
public static boolean territoryDenyBuild = true;
public static boolean territoryDenyBuildWhenOffline = true;
public static boolean territoryPainBuild = false;
public static boolean territoryPainBuildWhenOffline = false;
public static boolean territoryDenyUseage = true;
public static boolean territoryEnemyDenyBuild = true;
public static boolean territoryEnemyDenyBuildWhenOffline = true;
public static boolean territoryEnemyPainBuild = false;
public static boolean territoryEnemyPainBuildWhenOffline = false;
public static boolean territoryEnemyDenyUseage = true;
public static boolean territoryEnemyProtectMaterials = true;
public static boolean territoryAllyDenyBuild = true;
public static boolean territoryAllyDenyBuildWhenOffline = true;
public static boolean territoryAllyPainBuild = false;
public static boolean territoryAllyPainBuildWhenOffline = false;
public static boolean territoryAllyDenyUseage = true;
public static boolean territoryAllyProtectMaterials = true;
public static boolean territoryBlockCreepers = false;
public static boolean territoryBlockCreepersWhenOffline = false;
public static boolean territoryBlockFireballs = false;
public static boolean territoryBlockFireballsWhenOffline = false;
public static boolean territoryBlockTNT = false;
public static boolean territoryBlockTNTWhenOffline = false;
public static boolean territoryDenyEndermanBlocks = true;
public static boolean territoryDenyEndermanBlocksWhenOffline = true;
public static boolean safeZoneDenyBuild = true; public static boolean worldGuardChecking = false;
public static boolean safeZoneDenyUseage = true; public static boolean worldGuardBuildPriority = false;
public static boolean safeZoneBlockTNT = true;
public static boolean safeZonePreventAllDamageToPlayers = false;
public static boolean safeZoneDenyEndermanBlocks = true;
public static boolean warZoneDenyBuild = true;
public static boolean warZoneDenyUseage = true;
public static boolean warZoneBlockCreepers = false;
public static boolean warZoneBlockFireballs = false;
public static boolean warZoneBlockTNT = true;
public static boolean warZonePowerLoss = true;
public static boolean warZoneFriendlyFire = false;
public static boolean warZoneDenyEndermanBlocks = true;
public static boolean wildernessDenyBuild = false;
public static boolean wildernessDenyUseage = false;
public static boolean wildernessBlockCreepers = false;
public static boolean wildernessBlockFireballs = false;
public static boolean wildernessBlockTNT = false;
public static boolean wildernessPowerLoss = true;
public static boolean wildernessDenyEndermanBlocks = false;
// for claimed areas where further faction-member ownership can be defined //LWC
public static boolean ownedAreasEnabled = true; public static boolean lwcIntegration = false;
public static int ownedAreasLimitPerFaction = 0; public static boolean onUnclaimResetLwcLocks = false;
public static boolean ownedAreasModeratorsCanSet = false; public static boolean onCaptureResetLwcLocks = false;
public static boolean ownedAreaModeratorsBypass = true;
public static boolean ownedAreaDenyBuild = true;
public static boolean ownedAreaPainBuild = false;
public static boolean ownedAreaProtectMaterials = true;
public static boolean ownedAreaDenyUseage = true;
public static String ownedLandMessage = "Owner(s): "; // server logging options
public static String publicLandMessage = "Public faction land."; public static boolean logFactionCreate = true;
public static boolean ownedMessageOnBorder = true; public static boolean logFactionDisband = true;
public static boolean ownedMessageInsideTerritory = true; public static boolean logFactionJoin = true;
public static boolean ownedMessageByChunk = false; public static boolean logFactionKick = true;
public static boolean logFactionLeave = true;
public static boolean logLandClaims = true;
public static boolean logLandUnclaims = true;
public static boolean logMoneyTransactions = true;
public static boolean logPlayerCommands = true;
public static boolean pistonProtectionThroughDenyBuild = true; // prevent some potential exploits
public static boolean handleExploitObsidianGenerators = true;
public static boolean handleExploitEnderPearlClipping = true;
public static boolean handleExploitInteractionSpam = true;
public static boolean handleExploitTNTWaterlog = false;
public static Set<Material> territoryProtectedMaterials = EnumSet.noneOf(Material.class); public static boolean homesEnabled = true;
public static Set<Material> territoryDenyUseageMaterials = EnumSet.noneOf(Material.class); public static boolean homesMustBeInClaimedTerritory = true;
public static Set<Material> territoryProtectedMaterialsWhenOffline = EnumSet.noneOf(Material.class); public static boolean homesTeleportToOnDeath = true;
public static Set<Material> territoryDenyUseageMaterialsWhenOffline = EnumSet.noneOf(Material.class); public static boolean homesRespawnFromNoPowerLossWorlds = true;
public static boolean homesTeleportCommandEnabled = true;
public static transient Set<EntityType> safeZoneNerfedCreatureTypes = EnumSet.noneOf(EntityType.class); public static boolean homesTeleportCommandEssentialsIntegration = true;
public static boolean homesTeleportCommandSmokeEffectEnabled = true;
public static float homesTeleportCommandSmokeEffectThickness = 3f;
public static boolean homesTeleportAllowedFromEnemyTerritory = true;
public static boolean homesTeleportAllowedFromDifferentWorld = true;
public static double homesTeleportAllowedEnemyDistance = 32.0;
public static boolean homesTeleportIgnoreEnemiesIfInOwnTerritory = true;
// Spout features public static boolean disablePVPBetweenNeutralFactions = false;
public static boolean spoutFactionTagsOverNames = true; // show faction tags over names over player heads public static boolean disablePVPForFactionlessPlayers = false;
public static boolean spoutFactionTitlesOverNames = true; // whether to include player's title in that public static boolean enablePVPAgainstFactionlessInAttackersLand = false;
public static boolean spoutFactionAdminCapes = true; // Show capes on faction admins, colored based on the viewer's relation to the target player
public static boolean spoutFactionModeratorCapes = true; // same, but for faction moderators
public static int spoutTerritoryDisplayPosition = 1; // permanent territory display, instead of by chat; 0 = disabled, 1 = top left, 2 = top center, 3+ = top right
public static float spoutTerritoryDisplaySize = 1.0f; // text scale (size) for territory display
public static boolean spoutTerritoryDisplayShowDescription = true; // whether to show the faction description, not just the faction tag
public static boolean spoutTerritoryOwnersShow = true; // show territory owner list as well
public static boolean spoutTerritoryNoticeShow = true; // show additional brief territory notice near center of screen, to be sure player notices transition
public static int spoutTerritoryNoticeTop = 40; // how far down the screen to place the additional notice
public static boolean spoutTerritoryNoticeShowDescription = false; // whether to show the faction description in the notice, not just the faction tag
public static float spoutTerritoryNoticeSize = 1.5f; // text scale (size) for notice
public static float spoutTerritoryNoticeLeaveAfterSeconds = 2.00f; // how many seconds before the notice goes away
public static String capeAlly = "https://github.com/MassiveCraft/Factions/raw/master/capes/ally.png";
public static String capeEnemy = "https://github.com/MassiveCraft/Factions/raw/master/capes/enemy.png";
public static String capeMember = "https://github.com/MassiveCraft/Factions/raw/master/capes/member.png";
public static String capeNeutral = "https://github.com/MassiveCraft/Factions/raw/master/capes/neutral.png";
public static String capePeaceful = "https://github.com/MassiveCraft/Factions/raw/master/capes/peaceful.png";
// Economy settings
public static boolean econEnabled = false;
public static String econUniverseAccount = "";
public static double econCostClaimWilderness = 30.0;
public static double econCostClaimFromFactionBonus = 30.0;
public static double econClaimAdditionalMultiplier = 0.5;
public static double econClaimRefundMultiplier = 0.7;
public static double econClaimUnconnectedFee = 0.0;
public static double econCostCreate = 100.0;
public static double econCostOwner = 15.0;
public static double econCostSethome = 30.0;
public static double econCostJoin = 0.0;
public static double econCostLeave = 0.0;
public static double econCostKick = 0.0;
public static double econCostInvite = 0.0;
public static double econCostHome = 0.0;
public static double econCostTag = 0.0;
public static double econCostDesc = 0.0;
public static double econCostTitle = 0.0;
public static double econCostList = 0.0;
public static double econCostMap = 0.0;
public static double econCostPower = 0.0;
public static double econCostShow = 0.0;
public static double econCostOpen = 0.0;
public static double econCostAlly = 0.0;
public static double econCostEnemy = 0.0;
public static double econCostNeutral = 0.0;
public static double econCostNoBoom = 0.0;
//Faction banks, to pay for land claiming and other costs instead of individuals paying for them
public static boolean bankEnabled = true;
public static boolean bankMembersCanWithdraw = false; //Have to be at least moderator to withdraw or pay money to another faction
public static boolean bankFactionPaysCosts = true; //The faction pays for faction command costs, such as sethome
public static boolean bankFactionPaysLandCosts = true; //The faction pays for land claiming costs.
// mainly for other plugins/mods that use a fake player to take actions, which shouldn't be subject to our protections public static int noPVPDamageToOthersForXSecondsAfterLogin = 3;
public static Set<String> playersWhoBypassAllProtection = new LinkedHashSet<String>();
public static Set<String> worldsNoClaiming = new LinkedHashSet<String>(); public static boolean peacefulTerritoryDisablePVP = true;
public static Set<String> worldsNoPowerLoss = new LinkedHashSet<String>(); public static boolean peacefulTerritoryDisableMonsters = false;
public static Set<String> worldsIgnorePvP = new LinkedHashSet<String>(); public static boolean peacefulMembersDisablePowerLoss = true;
public static Set<String> worldsNoWildernessProtection = new LinkedHashSet<String>();
public static transient int mapHeight = 8;
public static transient int mapWidth = 39;
public static transient char[] mapKeyChrs = "\\/#?$%=&^ABCDEFGHJKLMNOPQRSTUVWXYZ1234567890abcdeghjmnopqrsuvwxyz".toCharArray();
static
{
baseCommandAliases.add("f");
territoryEnemyDenyCommands.add("home");
territoryEnemyDenyCommands.add("sethome");
territoryEnemyDenyCommands.add("spawn");
territoryEnemyDenyCommands.add("tpahere");
territoryEnemyDenyCommands.add("tpaccept");
territoryEnemyDenyCommands.add("tpa");
territoryProtectedMaterials.add(Material.WOODEN_DOOR); public static boolean permanentFactionsDisableLeaderPromotion = false;
territoryProtectedMaterials.add(Material.TRAP_DOOR);
territoryProtectedMaterials.add(Material.FENCE_GATE);
territoryProtectedMaterials.add(Material.DISPENSER);
territoryProtectedMaterials.add(Material.CHEST);
territoryProtectedMaterials.add(Material.FURNACE);
territoryProtectedMaterials.add(Material.BURNING_FURNACE);
territoryProtectedMaterials.add(Material.DIODE_BLOCK_OFF);
territoryProtectedMaterials.add(Material.DIODE_BLOCK_ON);
territoryProtectedMaterials.add(Material.JUKEBOX);
territoryProtectedMaterials.add(Material.BREWING_STAND);
territoryProtectedMaterials.add(Material.ENCHANTMENT_TABLE);
territoryProtectedMaterials.add(Material.CAULDRON);
territoryProtectedMaterials.add(Material.SOIL);
territoryProtectedMaterials.add(Material.BEACON);
territoryProtectedMaterials.add(Material.ANVIL);
territoryProtectedMaterials.add(Material.TRAPPED_CHEST);
territoryProtectedMaterials.add(Material.DROPPER);
territoryProtectedMaterials.add(Material.HOPPER);
territoryDenyUseageMaterials.add(Material.FIREBALL); public static boolean claimsMustBeConnected = false;
territoryDenyUseageMaterials.add(Material.FLINT_AND_STEEL); public static boolean claimsCanBeUnconnectedIfOwnedByOtherFaction = true;
territoryDenyUseageMaterials.add(Material.BUCKET); public static int claimsRequireMinFactionMembers = 1;
territoryDenyUseageMaterials.add(Material.WATER_BUCKET); public static int claimedLandsMax = 0;
territoryDenyUseageMaterials.add(Material.LAVA_BUCKET);
territoryProtectedMaterialsWhenOffline.add(Material.WOODEN_DOOR); // if someone is doing a radius claim and the process fails to claim land this many times in a row, it will exit
territoryProtectedMaterialsWhenOffline.add(Material.TRAP_DOOR); public static int radiusClaimFailureLimit = 9;
territoryProtectedMaterialsWhenOffline.add(Material.FENCE_GATE);
territoryProtectedMaterialsWhenOffline.add(Material.DISPENSER);
territoryProtectedMaterialsWhenOffline.add(Material.CHEST);
territoryProtectedMaterialsWhenOffline.add(Material.FURNACE);
territoryProtectedMaterialsWhenOffline.add(Material.BURNING_FURNACE);
territoryProtectedMaterialsWhenOffline.add(Material.DIODE_BLOCK_OFF);
territoryProtectedMaterialsWhenOffline.add(Material.DIODE_BLOCK_ON);
territoryProtectedMaterialsWhenOffline.add(Material.JUKEBOX);
territoryProtectedMaterialsWhenOffline.add(Material.BREWING_STAND);
territoryProtectedMaterialsWhenOffline.add(Material.ENCHANTMENT_TABLE);
territoryProtectedMaterialsWhenOffline.add(Material.CAULDRON);
territoryProtectedMaterialsWhenOffline.add(Material.SOIL);
territoryProtectedMaterialsWhenOffline.add(Material.BEACON);
territoryProtectedMaterialsWhenOffline.add(Material.ANVIL);
territoryProtectedMaterialsWhenOffline.add(Material.TRAPPED_CHEST);
territoryProtectedMaterialsWhenOffline.add(Material.DROPPER);
territoryProtectedMaterialsWhenOffline.add(Material.HOPPER);
territoryDenyUseageMaterialsWhenOffline.add(Material.FIREBALL); public static double considerFactionsReallyOfflineAfterXMinutes = 0.0;
territoryDenyUseageMaterialsWhenOffline.add(Material.FLINT_AND_STEEL);
territoryDenyUseageMaterialsWhenOffline.add(Material.BUCKET);
territoryDenyUseageMaterialsWhenOffline.add(Material.WATER_BUCKET);
territoryDenyUseageMaterialsWhenOffline.add(Material.LAVA_BUCKET);
safeZoneNerfedCreatureTypes.add(EntityType.BLAZE); public static int actionDeniedPainAmount = 1;
safeZoneNerfedCreatureTypes.add(EntityType.CAVE_SPIDER);
safeZoneNerfedCreatureTypes.add(EntityType.CREEPER);
safeZoneNerfedCreatureTypes.add(EntityType.ENDER_DRAGON);
safeZoneNerfedCreatureTypes.add(EntityType.ENDERMAN);
safeZoneNerfedCreatureTypes.add(EntityType.GHAST);
safeZoneNerfedCreatureTypes.add(EntityType.MAGMA_CUBE);
safeZoneNerfedCreatureTypes.add(EntityType.PIG_ZOMBIE);
safeZoneNerfedCreatureTypes.add(EntityType.SILVERFISH);
safeZoneNerfedCreatureTypes.add(EntityType.SKELETON);
safeZoneNerfedCreatureTypes.add(EntityType.SPIDER);
safeZoneNerfedCreatureTypes.add(EntityType.SLIME);
safeZoneNerfedCreatureTypes.add(EntityType.WITCH);
safeZoneNerfedCreatureTypes.add(EntityType.WITHER);
safeZoneNerfedCreatureTypes.add(EntityType.ZOMBIE);
}
// -------------------------------------------- // // commands which will be prevented if the player is a member of a permanent faction
// Persistance public static Set<String> permanentFactionMemberDenyCommands = new LinkedHashSet<String>();
// -------------------------------------------- //
private static transient Conf i = new Conf(); // commands which will be prevented when in claimed territory of another faction
public static void load() public static Set<String> territoryNeutralDenyCommands = new LinkedHashSet<String>();
{ public static Set<String> territoryEnemyDenyCommands = new LinkedHashSet<String>();
P.p.persist.loadOrSaveDefault(i, Conf.class, "conf");
} public static double territoryShieldFactor = 0.3;
public static void save() public static boolean territoryDenyBuild = true;
{ public static boolean territoryDenyBuildWhenOffline = true;
P.p.persist.save(i); public static boolean territoryPainBuild = false;
} public static boolean territoryPainBuildWhenOffline = false;
public static boolean territoryDenyUseage = true;
public static boolean territoryEnemyDenyBuild = true;
public static boolean territoryEnemyDenyBuildWhenOffline = true;
public static boolean territoryEnemyPainBuild = false;
public static boolean territoryEnemyPainBuildWhenOffline = false;
public static boolean territoryEnemyDenyUseage = true;
public static boolean territoryEnemyProtectMaterials = true;
public static boolean territoryAllyDenyBuild = true;
public static boolean territoryAllyDenyBuildWhenOffline = true;
public static boolean territoryAllyPainBuild = false;
public static boolean territoryAllyPainBuildWhenOffline = false;
public static boolean territoryAllyDenyUseage = true;
public static boolean territoryAllyProtectMaterials = true;
public static boolean territoryBlockCreepers = false;
public static boolean territoryBlockCreepersWhenOffline = false;
public static boolean territoryBlockFireballs = false;
public static boolean territoryBlockFireballsWhenOffline = false;
public static boolean territoryBlockTNT = false;
public static boolean territoryBlockTNTWhenOffline = false;
public static boolean territoryDenyEndermanBlocks = true;
public static boolean territoryDenyEndermanBlocksWhenOffline = true;
public static boolean safeZoneDenyBuild = true;
public static boolean safeZoneDenyUseage = true;
public static boolean safeZoneBlockTNT = true;
public static boolean safeZonePreventAllDamageToPlayers = false;
public static boolean safeZoneDenyEndermanBlocks = true;
public static boolean warZoneDenyBuild = true;
public static boolean warZoneDenyUseage = true;
public static boolean warZoneBlockCreepers = false;
public static boolean warZoneBlockFireballs = false;
public static boolean warZoneBlockTNT = true;
public static boolean warZonePowerLoss = true;
public static boolean warZoneFriendlyFire = false;
public static boolean warZoneDenyEndermanBlocks = true;
public static boolean wildernessDenyBuild = false;
public static boolean wildernessDenyUseage = false;
public static boolean wildernessBlockCreepers = false;
public static boolean wildernessBlockFireballs = false;
public static boolean wildernessBlockTNT = false;
public static boolean wildernessPowerLoss = true;
public static boolean wildernessDenyEndermanBlocks = false;
// for claimed areas where further faction-member ownership can be defined
public static boolean ownedAreasEnabled = true;
public static int ownedAreasLimitPerFaction = 0;
public static boolean ownedAreasModeratorsCanSet = false;
public static boolean ownedAreaModeratorsBypass = true;
public static boolean ownedAreaDenyBuild = true;
public static boolean ownedAreaPainBuild = false;
public static boolean ownedAreaProtectMaterials = true;
public static boolean ownedAreaDenyUseage = true;
public static String ownedLandMessage = "Owner(s): ";
public static String publicLandMessage = "Public faction land.";
public static boolean ownedMessageOnBorder = true;
public static boolean ownedMessageInsideTerritory = true;
public static boolean ownedMessageByChunk = false;
public static boolean pistonProtectionThroughDenyBuild = true;
public static Set<Material> territoryProtectedMaterials = EnumSet.noneOf(Material.class);
public static Set<Material> territoryDenyUseageMaterials = EnumSet.noneOf(Material.class);
public static Set<Material> territoryProtectedMaterialsWhenOffline = EnumSet.noneOf(Material.class);
public static Set<Material> territoryDenyUseageMaterialsWhenOffline = EnumSet.noneOf(Material.class);
public static transient Set<EntityType> safeZoneNerfedCreatureTypes = EnumSet.noneOf(EntityType.class);
// Spout features
public static boolean spoutFactionTagsOverNames = true; // show faction tags over names over player heads
public static boolean spoutFactionTitlesOverNames = true; // whether to include player's title in that
public static boolean spoutFactionAdminCapes = true; // Show capes on faction admins, colored based on the viewer's relation to the target player
public static boolean spoutFactionModeratorCapes = true; // same, but for faction moderators
public static int spoutTerritoryDisplayPosition = 1; // permanent territory display, instead of by chat; 0 = disabled, 1 = top left, 2 = top center, 3+ = top right
public static float spoutTerritoryDisplaySize = 1.0f; // text scale (size) for territory display
public static boolean spoutTerritoryDisplayShowDescription = true; // whether to show the faction description, not just the faction tag
public static boolean spoutTerritoryOwnersShow = true; // show territory owner list as well
public static boolean spoutTerritoryNoticeShow = true; // show additional brief territory notice near center of screen, to be sure player notices transition
public static int spoutTerritoryNoticeTop = 40; // how far down the screen to place the additional notice
public static boolean spoutTerritoryNoticeShowDescription = false; // whether to show the faction description in the notice, not just the faction tag
public static float spoutTerritoryNoticeSize = 1.5f; // text scale (size) for notice
public static float spoutTerritoryNoticeLeaveAfterSeconds = 2.00f; // how many seconds before the notice goes away
public static String capeAlly = "https://github.com/MassiveCraft/Factions/raw/master/capes/ally.png";
public static String capeEnemy = "https://github.com/MassiveCraft/Factions/raw/master/capes/enemy.png";
public static String capeMember = "https://github.com/MassiveCraft/Factions/raw/master/capes/member.png";
public static String capeNeutral = "https://github.com/MassiveCraft/Factions/raw/master/capes/neutral.png";
public static String capePeaceful = "https://github.com/MassiveCraft/Factions/raw/master/capes/peaceful.png";
// Economy settings
public static boolean econEnabled = false;
public static String econUniverseAccount = "";
public static double econCostClaimWilderness = 30.0;
public static double econCostClaimFromFactionBonus = 30.0;
public static double econClaimAdditionalMultiplier = 0.5;
public static double econClaimRefundMultiplier = 0.7;
public static double econClaimUnconnectedFee = 0.0;
public static double econCostCreate = 100.0;
public static double econCostOwner = 15.0;
public static double econCostSethome = 30.0;
public static double econCostJoin = 0.0;
public static double econCostLeave = 0.0;
public static double econCostKick = 0.0;
public static double econCostInvite = 0.0;
public static double econCostHome = 0.0;
public static double econCostTag = 0.0;
public static double econCostDesc = 0.0;
public static double econCostTitle = 0.0;
public static double econCostList = 0.0;
public static double econCostMap = 0.0;
public static double econCostPower = 0.0;
public static double econCostShow = 0.0;
public static double econCostOpen = 0.0;
public static double econCostAlly = 0.0;
public static double econCostEnemy = 0.0;
public static double econCostNeutral = 0.0;
public static double econCostNoBoom = 0.0;
//Faction banks, to pay for land claiming and other costs instead of individuals paying for them
public static boolean bankEnabled = true;
public static boolean bankMembersCanWithdraw = false; //Have to be at least moderator to withdraw or pay money to another faction
public static boolean bankFactionPaysCosts = true; //The faction pays for faction command costs, such as sethome
public static boolean bankFactionPaysLandCosts = true; //The faction pays for land claiming costs.
// mainly for other plugins/mods that use a fake player to take actions, which shouldn't be subject to our protections
public static Set<String> playersWhoBypassAllProtection = new LinkedHashSet<String>();
public static Set<String> worldsNoClaiming = new LinkedHashSet<String>();
public static Set<String> worldsNoPowerLoss = new LinkedHashSet<String>();
public static Set<String> worldsIgnorePvP = new LinkedHashSet<String>();
public static Set<String> worldsNoWildernessProtection = new LinkedHashSet<String>();
public static transient int mapHeight = 8;
public static transient int mapWidth = 39;
public static transient char[] mapKeyChrs = "\\/#?$%=&^ABCDEFGHJKLMNOPQRSTUVWXYZ1234567890abcdeghjmnopqrsuvwxyz".toCharArray();
static {
baseCommandAliases.add("f");
territoryEnemyDenyCommands.add("home");
territoryEnemyDenyCommands.add("sethome");
territoryEnemyDenyCommands.add("spawn");
territoryEnemyDenyCommands.add("tpahere");
territoryEnemyDenyCommands.add("tpaccept");
territoryEnemyDenyCommands.add("tpa");
territoryProtectedMaterials.add(Material.WOODEN_DOOR);
territoryProtectedMaterials.add(Material.TRAP_DOOR);
territoryProtectedMaterials.add(Material.FENCE_GATE);
territoryProtectedMaterials.add(Material.DISPENSER);
territoryProtectedMaterials.add(Material.CHEST);
territoryProtectedMaterials.add(Material.FURNACE);
territoryProtectedMaterials.add(Material.BURNING_FURNACE);
territoryProtectedMaterials.add(Material.DIODE_BLOCK_OFF);
territoryProtectedMaterials.add(Material.DIODE_BLOCK_ON);
territoryProtectedMaterials.add(Material.JUKEBOX);
territoryProtectedMaterials.add(Material.BREWING_STAND);
territoryProtectedMaterials.add(Material.ENCHANTMENT_TABLE);
territoryProtectedMaterials.add(Material.CAULDRON);
territoryProtectedMaterials.add(Material.SOIL);
territoryProtectedMaterials.add(Material.BEACON);
territoryProtectedMaterials.add(Material.ANVIL);
territoryProtectedMaterials.add(Material.TRAPPED_CHEST);
territoryProtectedMaterials.add(Material.DROPPER);
territoryProtectedMaterials.add(Material.HOPPER);
territoryDenyUseageMaterials.add(Material.FIREBALL);
territoryDenyUseageMaterials.add(Material.FLINT_AND_STEEL);
territoryDenyUseageMaterials.add(Material.BUCKET);
territoryDenyUseageMaterials.add(Material.WATER_BUCKET);
territoryDenyUseageMaterials.add(Material.LAVA_BUCKET);
territoryProtectedMaterialsWhenOffline.add(Material.WOODEN_DOOR);
territoryProtectedMaterialsWhenOffline.add(Material.TRAP_DOOR);
territoryProtectedMaterialsWhenOffline.add(Material.FENCE_GATE);
territoryProtectedMaterialsWhenOffline.add(Material.DISPENSER);
territoryProtectedMaterialsWhenOffline.add(Material.CHEST);
territoryProtectedMaterialsWhenOffline.add(Material.FURNACE);
territoryProtectedMaterialsWhenOffline.add(Material.BURNING_FURNACE);
territoryProtectedMaterialsWhenOffline.add(Material.DIODE_BLOCK_OFF);
territoryProtectedMaterialsWhenOffline.add(Material.DIODE_BLOCK_ON);
territoryProtectedMaterialsWhenOffline.add(Material.JUKEBOX);
territoryProtectedMaterialsWhenOffline.add(Material.BREWING_STAND);
territoryProtectedMaterialsWhenOffline.add(Material.ENCHANTMENT_TABLE);
territoryProtectedMaterialsWhenOffline.add(Material.CAULDRON);
territoryProtectedMaterialsWhenOffline.add(Material.SOIL);
territoryProtectedMaterialsWhenOffline.add(Material.BEACON);
territoryProtectedMaterialsWhenOffline.add(Material.ANVIL);
territoryProtectedMaterialsWhenOffline.add(Material.TRAPPED_CHEST);
territoryProtectedMaterialsWhenOffline.add(Material.DROPPER);
territoryProtectedMaterialsWhenOffline.add(Material.HOPPER);
territoryDenyUseageMaterialsWhenOffline.add(Material.FIREBALL);
territoryDenyUseageMaterialsWhenOffline.add(Material.FLINT_AND_STEEL);
territoryDenyUseageMaterialsWhenOffline.add(Material.BUCKET);
territoryDenyUseageMaterialsWhenOffline.add(Material.WATER_BUCKET);
territoryDenyUseageMaterialsWhenOffline.add(Material.LAVA_BUCKET);
safeZoneNerfedCreatureTypes.add(EntityType.BLAZE);
safeZoneNerfedCreatureTypes.add(EntityType.CAVE_SPIDER);
safeZoneNerfedCreatureTypes.add(EntityType.CREEPER);
safeZoneNerfedCreatureTypes.add(EntityType.ENDER_DRAGON);
safeZoneNerfedCreatureTypes.add(EntityType.ENDERMAN);
safeZoneNerfedCreatureTypes.add(EntityType.GHAST);
safeZoneNerfedCreatureTypes.add(EntityType.MAGMA_CUBE);
safeZoneNerfedCreatureTypes.add(EntityType.PIG_ZOMBIE);
safeZoneNerfedCreatureTypes.add(EntityType.SILVERFISH);
safeZoneNerfedCreatureTypes.add(EntityType.SKELETON);
safeZoneNerfedCreatureTypes.add(EntityType.SPIDER);
safeZoneNerfedCreatureTypes.add(EntityType.SLIME);
safeZoneNerfedCreatureTypes.add(EntityType.WITCH);
safeZoneNerfedCreatureTypes.add(EntityType.WITHER);
safeZoneNerfedCreatureTypes.add(EntityType.ZOMBIE);
}
// -------------------------------------------- //
// Persistance
// -------------------------------------------- //
private static transient Conf i = new Conf();
public static void load() {
P.p.persist.loadOrSaveDefault(i, Conf.class, "conf");
}
public static void save() {
P.p.persist.save(i);
}
} }

View File

@ -1,221 +1,189 @@
package com.massivecraft.factions; package com.massivecraft.factions;
import java.util.HashSet; import com.massivecraft.factions.util.MiscUtil;
import java.util.LinkedHashSet;
import java.util.Set;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
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;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.massivecraft.factions.util.MiscUtil; import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
public class FLocation public class FLocation {
{
private String worldName = "world"; private String worldName = "world";
private int x = 0; private int x = 0;
private int z = 0; private int z = 0;
//----------------------------------------------//
// Constructors
//----------------------------------------------//
public FLocation()
{
}
public FLocation(String worldName, int x, int z)
{
this.worldName = worldName;
this.x = x;
this.z = z;
}
public FLocation(Location location)
{
this( location.getWorld().getName(), blockToChunk(location.getBlockX()), blockToChunk(location.getBlockZ()) );
}
public FLocation(Player player)
{
this(player.getLocation());
}
public FLocation(FPlayer fplayer)
{
this(fplayer.getPlayer());
}
public FLocation(Block block)
{
this(block.getLocation());
}
//----------------------------------------------//
// Getters and Setters
//----------------------------------------------//
public String getWorldName()
{
return worldName;
}
public World getWorld() //----------------------------------------------//
{ // Constructors
return Bukkit.getWorld(worldName); //----------------------------------------------//
}
public void setWorldName(String worldName) public FLocation() {
{
this.worldName = worldName;
}
public long getX()
{
return x;
}
public void setX(int x) }
{
this.x = x;
}
public long getZ() public FLocation(String worldName, int x, int z) {
{ this.worldName = worldName;
return z; this.x = x;
} this.z = z;
}
public void setZ(int z) public FLocation(Location location) {
{ this(location.getWorld().getName(), blockToChunk(location.getBlockX()), blockToChunk(location.getBlockZ()));
this.z = z; }
}
public String getCoordString()
{
return ""+x+","+z;
}
@Override
public String toString() {
return "["+this.getWorldName()+","+this.getCoordString()+"]";
}
//----------------------------------------------// public FLocation(Player player) {
// Block/Chunk/Region Value Transformation this(player.getLocation());
//----------------------------------------------// }
// bit-shifting is used because it's much faster than standard division and multiplication public FLocation(FPlayer fplayer) {
public static int blockToChunk(int blockVal) this(fplayer.getPlayer());
{ // 1 chunk is 16x16 blocks }
return blockVal >> 4; // ">> 4" == "/ 16"
}
public static int blockToRegion(int blockVal) public FLocation(Block block) {
{ // 1 region is 512x512 blocks this(block.getLocation());
return blockVal >> 9; // ">> 9" == "/ 512" }
}
public static int chunkToRegion(int chunkVal) //----------------------------------------------//
{ // 1 region is 32x32 chunks // Getters and Setters
return chunkVal >> 5; // ">> 5" == "/ 32" //----------------------------------------------//
}
public static int chunkToBlock(int chunkVal) public String getWorldName() {
{ return worldName;
return chunkVal << 4; // "<< 4" == "* 16" }
}
public static int regionToBlock(int regionVal) public World getWorld() {
{ return Bukkit.getWorld(worldName);
return regionVal << 9; // "<< 9" == "* 512" }
}
public static int regionToChunk(int regionVal) public void setWorldName(String worldName) {
{ this.worldName = worldName;
return regionVal << 5; // "<< 5" == "* 32" }
}
//----------------------------------------------// public long getX() {
// Misc Geometry return x;
//----------------------------------------------// }
public FLocation getRelative(int dx, int dz)
{
return new FLocation(this.worldName, this.x + dx, this.z + dz);
}
public double getDistanceTo(FLocation that) public void setX(int x) {
{ this.x = x;
double dx = that.x - this.x; }
double dz = that.z - this.z;
return Math.sqrt(dx*dx+dz*dz);
}
//----------------------------------------------// public long getZ() {
// Some Geometry return z;
//----------------------------------------------// }
public Set<FLocation> getCircle(double radius)
{
Set<FLocation> ret = new LinkedHashSet<FLocation>();
if (radius <= 0) return ret;
int xfrom = (int) Math.floor(this.x - radius); public void setZ(int z) {
int xto = (int) Math.ceil(this.x + radius); this.z = z;
int zfrom = (int) Math.floor(this.z - radius); }
int zto = (int) Math.ceil(this.z + radius);
for (int x=xfrom; x<=xto; x++) public String getCoordString() {
{ return "" + x + "," + z;
for (int z=zfrom; z<=zto; z++) }
{
FLocation potential = new FLocation(this.worldName, x, z);
if (this.getDistanceTo(potential) <= radius)
ret.add(potential);
}
}
return ret; @Override
} public String toString() {
return "[" + this.getWorldName() + "," + this.getCoordString() + "]";
}
public static HashSet<FLocation> getArea(FLocation from, FLocation to) //----------------------------------------------//
{ // Block/Chunk/Region Value Transformation
HashSet<FLocation> ret = new HashSet<FLocation>(); //----------------------------------------------//
for (long x : MiscUtil.range(from.getX(), to.getX()))
{
for (long z : MiscUtil.range(from.getZ(), to.getZ()))
{
ret.add(new FLocation(from.getWorldName(), (int)x, (int)z));
}
}
return ret;
}
//----------------------------------------------//
// Comparison
//----------------------------------------------//
@Override
public int hashCode()
{
// should be fast, with good range and few hash collisions: (x * 512) + z + worldName.hashCode
return (this.x << 9) + this.z + (this.worldName != null ? this.worldName.hashCode() : 0);
}
@Override
public boolean equals(Object obj)
{
if (obj == this)
return true;
if (!(obj instanceof FLocation))
return false;
FLocation that = (FLocation) obj; // bit-shifting is used because it's much faster than standard division and multiplication
return this.x == that.x && this.z == that.z && ( this.worldName==null ? that.worldName==null : this.worldName.equals(that.worldName) ); public static int blockToChunk(int blockVal) { // 1 chunk is 16x16 blocks
} return blockVal >> 4; // ">> 4" == "/ 16"
}
public static int blockToRegion(int blockVal) { // 1 region is 512x512 blocks
return blockVal >> 9; // ">> 9" == "/ 512"
}
public static int chunkToRegion(int chunkVal) { // 1 region is 32x32 chunks
return chunkVal >> 5; // ">> 5" == "/ 32"
}
public static int chunkToBlock(int chunkVal) {
return chunkVal << 4; // "<< 4" == "* 16"
}
public static int regionToBlock(int regionVal) {
return regionVal << 9; // "<< 9" == "* 512"
}
public static int regionToChunk(int regionVal) {
return regionVal << 5; // "<< 5" == "* 32"
}
//----------------------------------------------//
// Misc Geometry
//----------------------------------------------//
public FLocation getRelative(int dx, int dz) {
return new FLocation(this.worldName, this.x + dx, this.z + dz);
}
public double getDistanceTo(FLocation that) {
double dx = that.x - this.x;
double dz = that.z - this.z;
return Math.sqrt(dx * dx + dz * dz);
}
//----------------------------------------------//
// Some Geometry
//----------------------------------------------//
public Set<FLocation> getCircle(double radius) {
Set<FLocation> ret = new LinkedHashSet<FLocation>();
if (radius <= 0) return ret;
int xfrom = (int) Math.floor(this.x - radius);
int xto = (int) Math.ceil(this.x + radius);
int zfrom = (int) Math.floor(this.z - radius);
int zto = (int) Math.ceil(this.z + radius);
for (int x = xfrom; x <= xto; x++) {
for (int z = zfrom; z <= zto; z++) {
FLocation potential = new FLocation(this.worldName, x, z);
if (this.getDistanceTo(potential) <= radius)
ret.add(potential);
}
}
return ret;
}
public static HashSet<FLocation> getArea(FLocation from, FLocation to) {
HashSet<FLocation> ret = new HashSet<FLocation>();
for (long x : MiscUtil.range(from.getX(), to.getX())) {
for (long z : MiscUtil.range(from.getZ(), to.getZ())) {
ret.add(new FLocation(from.getWorldName(), (int) x, (int) z));
}
}
return ret;
}
//----------------------------------------------//
// Comparison
//----------------------------------------------//
@Override
public int hashCode() {
// should be fast, with good range and few hash collisions: (x * 512) + z + worldName.hashCode
return (this.x << 9) + this.z + (this.worldName != null ? this.worldName.hashCode() : 0);
}
@Override
public boolean equals(Object obj) {
if (obj == this)
return true;
if (!(obj instanceof FLocation))
return false;
FLocation that = (FLocation) obj;
return this.x == that.x && this.z == that.z && (this.worldName == null ? that.worldName == null : this.worldName.equals(that.worldName));
}
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,50 +1,44 @@
package com.massivecraft.factions; package com.massivecraft.factions;
import com.massivecraft.factions.zcore.persist.PlayerEntityCollection;
import org.bukkit.craftbukkit.libs.com.google.gson.reflect.TypeToken;
import java.io.File; import java.io.File;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentSkipListMap; import java.util.concurrent.ConcurrentSkipListMap;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import org.bukkit.craftbukkit.libs.com.google.gson.reflect.TypeToken; public class FPlayers extends PlayerEntityCollection<FPlayer> {
import com.massivecraft.factions.struct.Role; public static FPlayers i = new FPlayers();
import com.massivecraft.factions.zcore.persist.PlayerEntityCollection;
public class FPlayers extends PlayerEntityCollection<FPlayer> P p = P.p;
{
public static FPlayers i = new FPlayers(); private FPlayers() {
super
P p = P.p; (
FPlayer.class,
private FPlayers() new CopyOnWriteArrayList<FPlayer>(),
{ new ConcurrentSkipListMap<String, FPlayer>(String.CASE_INSENSITIVE_ORDER),
super new File(P.p.getDataFolder(), "players.json"),
( P.p.gson
FPlayer.class, );
new CopyOnWriteArrayList<FPlayer>(),
new ConcurrentSkipListMap<String, FPlayer>(String.CASE_INSENSITIVE_ORDER), this.setCreative(true);
new File(P.p.getDataFolder(), "players.json"), }
P.p.gson
); @Override
public Type getMapType() {
this.setCreative(true); return new TypeToken<Map<String, FPlayer>>() {
} }.getType();
}
@Override
public Type getMapType() public void clean() {
{ for (FPlayer fplayer : this.get()) {
return new TypeToken<Map<String, FPlayer>>(){}.getType(); if (!Factions.i.exists(fplayer.getFactionId())) {
} p.log("Reset faction data (invalid faction) for player " + fplayer.getName());
fplayer.resetFactionData(false);
public void clean() }
{ }
for (FPlayer fplayer : this.get()) }
{
if ( ! Factions.i.exists(fplayer.getFactionId()))
{
p.log("Reset faction data (invalid faction) for player "+fplayer.getName());
fplayer.resetFactionData(false);
}
}
}
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,189 +1,163 @@
package com.massivecraft.factions; package com.massivecraft.factions;
import com.massivecraft.factions.util.MiscUtil;
import com.massivecraft.factions.zcore.persist.EntityCollection;
import com.massivecraft.factions.zcore.util.TextUtil;
import org.bukkit.ChatColor;
import org.bukkit.craftbukkit.libs.com.google.gson.reflect.TypeToken;
import java.io.File; import java.io.File;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.*; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Level; import java.util.logging.Level;
import org.bukkit.ChatColor; public class Factions extends EntityCollection<Faction> {
public static Factions i = new Factions();
import org.bukkit.craftbukkit.libs.com.google.gson.reflect.TypeToken; P p = P.p;
import com.massivecraft.factions.util.MiscUtil;
import com.massivecraft.factions.zcore.persist.EntityCollection;
import com.massivecraft.factions.zcore.util.TextUtil;
public class Factions extends EntityCollection<Faction> private Factions() {
{ super
public static Factions i = new Factions(); (
Faction.class,
P p = P.p; new CopyOnWriteArrayList<Faction>(),
new ConcurrentHashMap<String, Faction>(),
private Factions() new File(P.p.getDataFolder(), "factions.json"),
{ P.p.gson
super );
( }
Faction.class,
new CopyOnWriteArrayList<Faction>(),
new ConcurrentHashMap<String, Faction>(),
new File(P.p.getDataFolder(), "factions.json"),
P.p.gson
);
}
@Override
public Type getMapType()
{
return new TypeToken<Map<String, Faction>>(){}.getType();
}
@Override
public boolean loadFromDisc()
{
if ( ! super.loadFromDisc()) return false;
// Make sure the default neutral faction exists
if ( ! this.exists("0"))
{
Faction faction = this.create("0");
faction.setTag(ChatColor.DARK_GREEN+"Wilderness");
faction.setDescription("");
}
// Make sure the safe zone faction exists
if ( ! this.exists("-1"))
{
Faction faction = this.create("-1");
faction.setTag("SafeZone");
faction.setDescription("Free from PVP and monsters");
}
else
{
// if SafeZone has old pre-1.6.0 name, rename it to remove troublesome " "
Faction faction = this.getSafeZone();
if (faction.getTag().contains(" "))
faction.setTag("SafeZone");
}
// Make sure the war zone faction exists
if ( ! this.exists("-2"))
{
Faction faction = this.create("-2");
faction.setTag("WarZone");
faction.setDescription("Not the safest place to be");
}
else
{
// if WarZone has old pre-1.6.0 name, rename it to remove troublesome " "
Faction faction = this.getWarZone();
if (faction.getTag().contains(" "))
faction.setTag("WarZone");
}
// populate all faction player lists @Override
for (Faction faction : i.get()) public Type getMapType() {
{ return new TypeToken<Map<String, Faction>>() {
faction.refreshFPlayers(); }.getType();
} }
return true; @Override
} public boolean loadFromDisc() {
if (!super.loadFromDisc()) return false;
//----------------------------------------------// // Make sure the default neutral faction exists
// GET if (!this.exists("0")) {
//----------------------------------------------// Faction faction = this.create("0");
faction.setTag(ChatColor.DARK_GREEN + "Wilderness");
@Override faction.setDescription("");
public Faction get(String id) }
{
if ( ! this.exists(id)) // Make sure the safe zone faction exists
{ if (!this.exists("-1")) {
p.log(Level.WARNING, "Non existing factionId "+id+" requested! Issuing cleaning!"); Faction faction = this.create("-1");
Board.clean(); faction.setTag("SafeZone");
FPlayers.i.clean(); faction.setDescription("Free from PVP and monsters");
} } else {
// if SafeZone has old pre-1.6.0 name, rename it to remove troublesome " "
return super.get(id); Faction faction = this.getSafeZone();
} if (faction.getTag().contains(" "))
faction.setTag("SafeZone");
public Faction getNone() }
{
return this.get("0"); // Make sure the war zone faction exists
} if (!this.exists("-2")) {
Faction faction = this.create("-2");
public Faction getSafeZone() faction.setTag("WarZone");
{ faction.setDescription("Not the safest place to be");
return this.get("-1"); } else {
} // if WarZone has old pre-1.6.0 name, rename it to remove troublesome " "
Faction faction = this.getWarZone();
public Faction getWarZone() if (faction.getTag().contains(" "))
{ faction.setTag("WarZone");
return this.get("-2"); }
}
// populate all faction player lists
for (Faction faction : i.get()) {
//----------------------------------------------// faction.refreshFPlayers();
// Faction tag }
//----------------------------------------------//
return true;
public static ArrayList<String> validateTag(String str) }
{
ArrayList<String> errors = new ArrayList<String>();
//----------------------------------------------//
if(MiscUtil.getComparisonString(str).length() < Conf.factionTagLengthMin) // GET
{ //----------------------------------------------//
errors.add(P.p.txt.parse("<i>The faction tag can't be shorter than <h>%s<i> chars.", Conf.factionTagLengthMin));
} @Override
public Faction get(String id) {
if(str.length() > Conf.factionTagLengthMax) if (!this.exists(id)) {
{ p.log(Level.WARNING, "Non existing factionId " + id + " requested! Issuing cleaning!");
errors.add(P.p.txt.parse("<i>The faction tag can't be longer than <h>%s<i> chars.", Conf.factionTagLengthMax)); Board.clean();
} FPlayers.i.clean();
}
for (char c : str.toCharArray())
{ return super.get(id);
if ( ! MiscUtil.substanceChars.contains(String.valueOf(c))) }
{
errors.add(P.p.txt.parse("<i>Faction tag must be alphanumeric. \"<h>%s<i>\" is not allowed.", c)); public Faction getNone() {
} return this.get("0");
} }
return errors; public Faction getSafeZone() {
} return this.get("-1");
}
public Faction getByTag(String str)
{ public Faction getWarZone() {
String compStr = MiscUtil.getComparisonString(str); return this.get("-2");
for (Faction faction : this.get()) }
{
if (faction.getComparisonTag().equals(compStr))
{ //----------------------------------------------//
return faction; // Faction tag
} //----------------------------------------------//
}
return null; public static ArrayList<String> validateTag(String str) {
} ArrayList<String> errors = new ArrayList<String>();
public Faction getBestTagMatch(String searchFor) if (MiscUtil.getComparisonString(str).length() < Conf.factionTagLengthMin) {
{ errors.add(P.p.txt.parse("<i>The faction tag can't be shorter than <h>%s<i> chars.", Conf.factionTagLengthMin));
Map<String, Faction> tag2faction = new HashMap<String, Faction>(); }
// TODO: Slow index building if (str.length() > Conf.factionTagLengthMax) {
for (Faction faction : this.get()) errors.add(P.p.txt.parse("<i>The faction tag can't be longer than <h>%s<i> chars.", Conf.factionTagLengthMax));
{ }
tag2faction.put(ChatColor.stripColor(faction.getTag()), faction);
} for (char c : str.toCharArray()) {
if (!MiscUtil.substanceChars.contains(String.valueOf(c))) {
String tag = TextUtil.getBestStartWithCI(tag2faction.keySet(), searchFor); errors.add(P.p.txt.parse("<i>Faction tag must be alphanumeric. \"<h>%s<i>\" is not allowed.", c));
if (tag == null) return null; }
return tag2faction.get(tag); }
}
return errors;
public boolean isTagTaken(String str) }
{
return this.getByTag(str) != null; public Faction getByTag(String str) {
} String compStr = MiscUtil.getComparisonString(str);
for (Faction faction : this.get()) {
if (faction.getComparisonTag().equals(compStr)) {
return faction;
}
}
return null;
}
public Faction getBestTagMatch(String searchFor) {
Map<String, Faction> tag2faction = new HashMap<String, Faction>();
// TODO: Slow index building
for (Faction faction : this.get()) {
tag2faction.put(ChatColor.stripColor(faction.getTag()), faction);
}
String tag = TextUtil.getBestStartWithCI(tag2faction.keySet(), searchFor);
if (tag == null) return null;
return tag2faction.get(tag);
}
public boolean isTagTaken(String str) {
return this.getByTag(str) != null;
}
} }

View File

@ -1,34 +1,10 @@
package com.massivecraft.factions; package com.massivecraft.factions;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.Location;
import org.bukkit.Material;
import com.massivecraft.factions.cmd.CmdAutoHelp; import com.massivecraft.factions.cmd.CmdAutoHelp;
import com.massivecraft.factions.cmd.FCmdRoot; import com.massivecraft.factions.cmd.FCmdRoot;
import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.integration.*;
import com.massivecraft.factions.integration.EssentialsFeatures;
import com.massivecraft.factions.integration.LWCFeatures;
import com.massivecraft.factions.integration.SpoutFeatures;
import com.massivecraft.factions.integration.Worldguard;
import com.massivecraft.factions.integration.capi.CapiFeatures; import com.massivecraft.factions.integration.capi.CapiFeatures;
import com.massivecraft.factions.listeners.FactionsBlockListener; import com.massivecraft.factions.listeners.*;
import com.massivecraft.factions.listeners.FactionsChatListener;
import com.massivecraft.factions.listeners.FactionsEntityListener;
import com.massivecraft.factions.listeners.FactionsExploitListener;
import com.massivecraft.factions.listeners.FactionsPlayerListener;
import com.massivecraft.factions.listeners.FactionsServerListener;
import com.massivecraft.factions.struct.ChatMode; import com.massivecraft.factions.struct.ChatMode;
import com.massivecraft.factions.util.AutoLeaveTask; import com.massivecraft.factions.util.AutoLeaveTask;
import com.massivecraft.factions.util.LazyLocation; import com.massivecraft.factions.util.LazyLocation;
@ -36,334 +12,319 @@ import com.massivecraft.factions.util.MapFLocToStringSetTypeAdapter;
import com.massivecraft.factions.util.MyLocationTypeAdapter; import com.massivecraft.factions.util.MyLocationTypeAdapter;
import com.massivecraft.factions.zcore.MPlugin; import com.massivecraft.factions.zcore.MPlugin;
import com.massivecraft.factions.zcore.util.TextUtil; import com.massivecraft.factions.zcore.util.TextUtil;
import org.bukkit.Location;
import java.util.logging.Level; import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.craftbukkit.libs.com.google.gson.GsonBuilder; import org.bukkit.craftbukkit.libs.com.google.gson.GsonBuilder;
import org.bukkit.craftbukkit.libs.com.google.gson.reflect.TypeToken; import org.bukkit.craftbukkit.libs.com.google.gson.reflect.TypeToken;
import org.bukkit.entity.Player;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
public class P extends MPlugin public class P extends MPlugin {
{ // Our single plugin instance
// Our single plugin instance public static P p;
public static P p;
// Listeners
// Listeners public final FactionsPlayerListener playerListener;
public final FactionsPlayerListener playerListener; public final FactionsChatListener chatListener;
public final FactionsChatListener chatListener; public final FactionsEntityListener entityListener;
public final FactionsEntityListener entityListener; public final FactionsExploitListener exploitListener;
public final FactionsExploitListener exploitListener; public final FactionsBlockListener blockListener;
public final FactionsBlockListener blockListener; public final FactionsServerListener serverListener;
public final FactionsServerListener serverListener;
// Persistance related
// Persistance related private boolean locked = false;
private boolean locked = false;
public boolean getLocked() {return this.locked;} public boolean getLocked() {
public void setLocked(boolean val) {this.locked = val; this.setAutoSave(val);} return this.locked;
private Integer AutoLeaveTask = null; }
// Commands public void setLocked(boolean val) {
public FCmdRoot cmdBase; this.locked = val;
public CmdAutoHelp cmdAutoHelp; this.setAutoSave(val);
}
public P()
{ private Integer AutoLeaveTask = null;
p = this;
this.playerListener = new FactionsPlayerListener(this); // Commands
this.chatListener = new FactionsChatListener(this); public FCmdRoot cmdBase;
this.entityListener = new FactionsEntityListener(this); public CmdAutoHelp cmdAutoHelp;
this.exploitListener = new FactionsExploitListener();
this.blockListener = new FactionsBlockListener(this); public P() {
this.serverListener = new FactionsServerListener(this); p = this;
} this.playerListener = new FactionsPlayerListener(this);
this.chatListener = new FactionsChatListener(this);
this.entityListener = new FactionsEntityListener(this);
this.exploitListener = new FactionsExploitListener();
this.blockListener = new FactionsBlockListener(this);
this.serverListener = new FactionsServerListener(this);
}
@Override @Override
public void onEnable() public void onEnable() {
{ // bit of (apparently absolutely necessary) idiot-proofing for CB version support due to changed GSON lib package name
// bit of (apparently absolutely necessary) idiot-proofing for CB version support due to changed GSON lib package name try {
try Class.forName("org.bukkit.craftbukkit.libs.com.google.gson.reflect.TypeToken");
{ } catch (ClassNotFoundException ex) {
Class.forName("org.bukkit.craftbukkit.libs.com.google.gson.reflect.TypeToken"); this.log(Level.SEVERE, "GSON lib not found. Your CraftBukkit build is too old (< 1.3.2) or otherwise not compatible.");
} this.suicide();
catch (ClassNotFoundException ex) return;
{ }
this.log(Level.SEVERE, "GSON lib not found. Your CraftBukkit build is too old (< 1.3.2) or otherwise not compatible.");
this.suicide();
return;
}
if ( ! preEnable()) return; if (!preEnable()) return;
this.loadSuccessful = false; this.loadSuccessful = false;
// Load Conf from disk // Load Conf from disk
Conf.load(); Conf.load();
FPlayers.i.loadFromDisc(); FPlayers.i.loadFromDisc();
Factions.i.loadFromDisc(); Factions.i.loadFromDisc();
Board.load(); Board.load();
// Add Base Commands
this.cmdBase = new FCmdRoot();
this.cmdAutoHelp = new CmdAutoHelp();
this.getBaseCommands().add(cmdBase);
EssentialsFeatures.setup(); // Add Base Commands
SpoutFeatures.setup(); this.cmdBase = new FCmdRoot();
Econ.setup(); this.cmdAutoHelp = new CmdAutoHelp();
CapiFeatures.setup(); this.getBaseCommands().add(cmdBase);
LWCFeatures.setup();
if(Conf.worldGuardChecking || Conf.worldGuardBuildPriority) EssentialsFeatures.setup();
{ SpoutFeatures.setup();
Worldguard.init(this); Econ.setup();
} CapiFeatures.setup();
LWCFeatures.setup();
// start up task which runs the autoLeaveAfterDaysOfInactivity routine if (Conf.worldGuardChecking || Conf.worldGuardBuildPriority) {
startAutoLeaveTask(false); Worldguard.init(this);
}
// Register Event Handlers // start up task which runs the autoLeaveAfterDaysOfInactivity routine
getServer().getPluginManager().registerEvents(playerListener, this); startAutoLeaveTask(false);
getServer().getPluginManager().registerEvents(chatListener, this);
getServer().getPluginManager().registerEvents(entityListener, this);
getServer().getPluginManager().registerEvents(exploitListener, this);
getServer().getPluginManager().registerEvents(blockListener, this);
getServer().getPluginManager().registerEvents(serverListener, this);
// since some other plugins execute commands directly through this command interface, provide it // Register Event Handlers
this.getCommand(this.refCommand).setExecutor(this); getServer().getPluginManager().registerEvents(playerListener, this);
getServer().getPluginManager().registerEvents(chatListener, this);
getServer().getPluginManager().registerEvents(entityListener, this);
getServer().getPluginManager().registerEvents(exploitListener, this);
getServer().getPluginManager().registerEvents(blockListener, this);
getServer().getPluginManager().registerEvents(serverListener, this);
postEnable(); // since some other plugins execute commands directly through this command interface, provide it
this.loadSuccessful = true; this.getCommand(this.refCommand).setExecutor(this);
}
@Override
public GsonBuilder getGsonBuilder()
{
Type mapFLocToStringSetType = new TypeToken<Map<FLocation, Set<String>>>(){}.getType();
return new GsonBuilder() postEnable();
.setPrettyPrinting() this.loadSuccessful = true;
.disableHtmlEscaping() }
.excludeFieldsWithModifiers(Modifier.TRANSIENT, Modifier.VOLATILE)
.registerTypeAdapter(LazyLocation.class, new MyLocationTypeAdapter())
.registerTypeAdapter(mapFLocToStringSetType, new MapFLocToStringSetTypeAdapter());
}
@Override @Override
public void onDisable() public GsonBuilder getGsonBuilder() {
{ Type mapFLocToStringSetType = new TypeToken<Map<FLocation, Set<String>>>() {
// only save data if plugin actually completely loaded successfully }.getType();
if (this.loadSuccessful)
{
Board.save();
Conf.save();
}
EssentialsFeatures.unhookChat();
if (AutoLeaveTask != null)
{
this.getServer().getScheduler().cancelTask(AutoLeaveTask);
AutoLeaveTask = null;
}
super.onDisable();
}
public void startAutoLeaveTask(boolean restartIfRunning) return new GsonBuilder()
{ .setPrettyPrinting()
if (AutoLeaveTask != null) .disableHtmlEscaping()
{ .excludeFieldsWithModifiers(Modifier.TRANSIENT, Modifier.VOLATILE)
if ( ! restartIfRunning) return; .registerTypeAdapter(LazyLocation.class, new MyLocationTypeAdapter())
this.getServer().getScheduler().cancelTask(AutoLeaveTask); .registerTypeAdapter(mapFLocToStringSetType, new MapFLocToStringSetTypeAdapter());
} }
if (Conf.autoLeaveRoutineRunsEveryXMinutes > 0.0) @Override
{ public void onDisable() {
long ticks = (long)(20 * 60 * Conf.autoLeaveRoutineRunsEveryXMinutes); // only save data if plugin actually completely loaded successfully
AutoLeaveTask = getServer().getScheduler().scheduleSyncRepeatingTask(this, new AutoLeaveTask(), ticks, ticks); if (this.loadSuccessful) {
} Board.save();
} Conf.save();
}
EssentialsFeatures.unhookChat();
if (AutoLeaveTask != null) {
this.getServer().getScheduler().cancelTask(AutoLeaveTask);
AutoLeaveTask = null;
}
super.onDisable();
}
@Override public void startAutoLeaveTask(boolean restartIfRunning) {
public void postAutoSave() if (AutoLeaveTask != null) {
{ if (!restartIfRunning) return;
Board.save(); this.getServer().getScheduler().cancelTask(AutoLeaveTask);
Conf.save(); }
}
@Override if (Conf.autoLeaveRoutineRunsEveryXMinutes > 0.0) {
public boolean logPlayerCommands() long ticks = (long) (20 * 60 * Conf.autoLeaveRoutineRunsEveryXMinutes);
{ AutoLeaveTask = getServer().getScheduler().scheduleSyncRepeatingTask(this, new AutoLeaveTask(), ticks, ticks);
return Conf.logPlayerCommands; }
} }
@Override @Override
public boolean handleCommand(CommandSender sender, String commandString, boolean testOnly) public void postAutoSave() {
{ Board.save();
if (sender instanceof Player && FactionsPlayerListener.preventCommand(commandString, (Player)sender)) return true; Conf.save();
}
return super.handleCommand(sender, commandString, testOnly); @Override
} public boolean logPlayerCommands() {
return Conf.logPlayerCommands;
}
@Override @Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] split) public boolean handleCommand(CommandSender sender, String commandString, boolean testOnly) {
{ if (sender instanceof Player && FactionsPlayerListener.preventCommand(commandString, (Player) sender))
// if bare command at this point, it has already been handled by MPlugin's command listeners return true;
if (split == null || split.length == 0) return true;
// otherwise, needs to be handled; presumably another plugin directly ran the command return super.handleCommand(sender, commandString, testOnly);
String cmd = Conf.baseCommandAliases.isEmpty() ? "/f" : "/" + Conf.baseCommandAliases.get(0); }
return handleCommand(sender, cmd + " " + TextUtil.implode(Arrays.asList(split), " "), false);
} @Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] split) {
// if bare command at this point, it has already been handled by MPlugin's command listeners
if (split == null || split.length == 0) return true;
// otherwise, needs to be handled; presumably another plugin directly ran the command
String cmd = Conf.baseCommandAliases.isEmpty() ? "/f" : "/" + Conf.baseCommandAliases.get(0);
return handleCommand(sender, cmd + " " + TextUtil.implode(Arrays.asList(split), " "), false);
}
// -------------------------------------------- //
// Functions for other plugins to hook into
// -------------------------------------------- //
// -------------------------------------------- // // This value will be updated whenever new hooks are added
// Functions for other plugins to hook into public int hookSupportVersion() {
// -------------------------------------------- // return 3;
}
// This value will be updated whenever new hooks are added // If another plugin is handling insertion of chat tags, this should be used to notify Factions
public int hookSupportVersion() public void handleFactionTagExternally(boolean notByFactions) {
{ Conf.chatTagHandledByAnotherPlugin = notByFactions;
return 3; }
}
// If another plugin is handling insertion of chat tags, this should be used to notify Factions // Simply put, should this chat event be left for Factions to handle? For now, that means players with Faction Chat
public void handleFactionTagExternally(boolean notByFactions) // enabled or use of the Factions f command without a slash; combination of isPlayerFactionChatting() and isFactionsCommand()
{
Conf.chatTagHandledByAnotherPlugin = notByFactions;
}
// Simply put, should this chat event be left for Factions to handle? For now, that means players with Faction Chat public boolean shouldLetFactionsHandleThisChat(AsyncPlayerChatEvent event) {
// enabled or use of the Factions f command without a slash; combination of isPlayerFactionChatting() and isFactionsCommand() if (event == null) return false;
return (isPlayerFactionChatting(event.getPlayer()) || isFactionsCommand(event.getMessage()));
public boolean shouldLetFactionsHandleThisChat(AsyncPlayerChatEvent event) }
{
if (event == null) return false;
return (isPlayerFactionChatting(event.getPlayer()) || isFactionsCommand(event.getMessage()));
}
// Does player have Faction Chat enabled? If so, chat plugins should preferably not do channels, // Does player have Faction Chat enabled? If so, chat plugins should preferably not do channels,
// local chat, or anything else which targets individual recipients, so Faction Chat can be done // local chat, or anything else which targets individual recipients, so Faction Chat can be done
public boolean isPlayerFactionChatting(Player player) public boolean isPlayerFactionChatting(Player player) {
{ if (player == null) return false;
if (player == null) return false; FPlayer me = FPlayers.i.get(player);
FPlayer me = FPlayers.i.get(player);
if (me == null)return false;
return me.getChatMode().isAtLeast(ChatMode.ALLIANCE);
}
// Is this chat message actually a Factions command, and thus should be left alone by other plugins? if (me == null) return false;
return me.getChatMode().isAtLeast(ChatMode.ALLIANCE);
// TODO: GET THIS BACK AND WORKING }
public boolean isFactionsCommand(String check)
{
if (check == null || check.isEmpty()) return false;
return this.handleCommand(null, check, true);
}
// Get a player's faction tag (faction name), mainly for usage by chat plugins for local/channel chat // Is this chat message actually a Factions command, and thus should be left alone by other plugins?
public String getPlayerFactionTag(Player player)
{
return getPlayerFactionTagRelation(player, null);
}
// Same as above, but with relation (enemy/neutral/ally) coloring potentially added to the tag // TODO: GET THIS BACK AND WORKING
public String getPlayerFactionTagRelation(Player speaker, Player listener)
{
String tag = "~";
if (speaker == null) public boolean isFactionsCommand(String check) {
return tag; if (check == null || check.isEmpty()) return false;
return this.handleCommand(null, check, true);
}
FPlayer me = FPlayers.i.get(speaker); // Get a player's faction tag (faction name), mainly for usage by chat plugins for local/channel chat
if (me == null) public String getPlayerFactionTag(Player player) {
return tag; return getPlayerFactionTagRelation(player, null);
}
// if listener isn't set, or config option is disabled, give back uncolored tag // Same as above, but with relation (enemy/neutral/ally) coloring potentially added to the tag
if (listener == null || !Conf.chatTagRelationColored) { public String getPlayerFactionTagRelation(Player speaker, Player listener) {
tag = me.getChatTag().trim(); String tag = "~";
} else {
FPlayer you = FPlayers.i.get(listener);
if (you == null)
tag = me.getChatTag().trim();
else // everything checks out, give the colored tag
tag = me.getChatTag(you).trim();
}
if (tag.isEmpty())
tag = "~";
return tag; if (speaker == null)
} return tag;
// Get a player's title within their faction, mainly for usage by chat plugins for local/channel chat FPlayer me = FPlayers.i.get(speaker);
public String getPlayerTitle(Player player) if (me == null)
{ return tag;
if (player == null)
return "";
FPlayer me = FPlayers.i.get(player); // if listener isn't set, or config option is disabled, give back uncolored tag
if (me == null) if (listener == null || !Conf.chatTagRelationColored) {
return ""; tag = me.getChatTag().trim();
} else {
FPlayer you = FPlayers.i.get(listener);
if (you == null)
tag = me.getChatTag().trim();
else // everything checks out, give the colored tag
tag = me.getChatTag(you).trim();
}
if (tag.isEmpty())
tag = "~";
return me.getTitle().trim(); return tag;
} }
// Get a list of all faction tags (names) // Get a player's title within their faction, mainly for usage by chat plugins for local/channel chat
public Set<String> getFactionTags() public String getPlayerTitle(Player player) {
{ if (player == null)
Set<String> tags = new HashSet<String>(); return "";
for (Faction faction : Factions.i.get())
{
tags.add(faction.getTag());
}
return tags;
}
// Get a list of all players in the specified faction FPlayer me = FPlayers.i.get(player);
public Set<String> getPlayersInFaction(String factionTag) if (me == null)
{ return "";
Set<String> players = new HashSet<String>();
Faction faction = Factions.i.getByTag(factionTag);
if (faction != null)
{
for (FPlayer fplayer : faction.getFPlayers())
{
players.add(fplayer.getName());
}
}
return players;
}
// Get a list of all online players in the specified faction return me.getTitle().trim();
public Set<String> getOnlinePlayersInFaction(String factionTag) }
{
Set<String> players = new HashSet<String>();
Faction faction = Factions.i.getByTag(factionTag);
if (faction != null)
{
for (FPlayer fplayer : faction.getFPlayersWhereOnline(true))
{
players.add(fplayer.getName());
}
}
return players;
}
// check if player is allowed to build/destroy in a particular location // Get a list of all faction tags (names)
public boolean isPlayerAllowedToBuildHere(Player player, Location location) public Set<String> getFactionTags() {
{ Set<String> tags = new HashSet<String>();
return FactionsBlockListener.playerCanBuildDestroyBlock(player, location, "", true); for (Faction faction : Factions.i.get()) {
} tags.add(faction.getTag());
}
return tags;
}
// check if player is allowed to interact with the specified block (doors/chests/whatever) // Get a list of all players in the specified faction
public boolean isPlayerAllowedToInteractWith(Player player, Block block) public Set<String> getPlayersInFaction(String factionTag) {
{ Set<String> players = new HashSet<String>();
return FactionsPlayerListener.canPlayerUseBlock(player, block, true); Faction faction = Factions.i.getByTag(factionTag);
} if (faction != null) {
for (FPlayer fplayer : faction.getFPlayers()) {
players.add(fplayer.getName());
}
}
return players;
}
// check if player is allowed to use a specified item (flint&steel, buckets, etc) in a particular location // Get a list of all online players in the specified faction
public boolean isPlayerAllowedToUseThisHere(Player player, Location location, Material material) public Set<String> getOnlinePlayersInFaction(String factionTag) {
{ Set<String> players = new HashSet<String>();
return FactionsPlayerListener.playerCanUseItemHere(player, location, material, true); Faction faction = Factions.i.getByTag(factionTag);
} if (faction != null) {
for (FPlayer fplayer : faction.getFPlayersWhereOnline(true)) {
players.add(fplayer.getName());
}
}
return players;
}
// check if player is allowed to build/destroy in a particular location
public boolean isPlayerAllowedToBuildHere(Player player, Location location) {
return FactionsBlockListener.playerCanBuildDestroyBlock(player, location, "", true);
}
// check if player is allowed to interact with the specified block (doors/chests/whatever)
public boolean isPlayerAllowedToInteractWith(Player player, Block block) {
return FactionsPlayerListener.canPlayerUseBlock(player, block, true);
}
// check if player is allowed to use a specified item (flint&steel, buckets, etc) in a particular location
public boolean isPlayerAllowedToUseThisHere(Player player, Location location, Material material) {
return FactionsPlayerListener.playerCanUseItemHere(player, location, material, true);
}
} }

View File

@ -1,90 +1,80 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import org.bukkit.Bukkit;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.FPlayers; import com.massivecraft.factions.FPlayers;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.event.FPlayerJoinEvent; import com.massivecraft.factions.event.FPlayerJoinEvent;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.struct.Role; import com.massivecraft.factions.struct.Role;
import org.bukkit.Bukkit;
public class CmdAdmin extends FCommand public class CmdAdmin extends FCommand {
{ public CmdAdmin() {
public CmdAdmin() super();
{ this.aliases.add("admin");
super();
this.aliases.add("admin");
this.requiredArgs.add("player name");
//this.optionalArgs.put("", "");
this.permission = Permission.ADMIN.node;
this.disableOnLock = true;
senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
FPlayer fyou = this.argAsBestFPlayerMatch(0);
if (fyou == null) return;
boolean permAny = Permission.ADMIN_ANY.has(sender, false); this.requiredArgs.add("player name");
Faction targetFaction = fyou.getFaction(); //this.optionalArgs.put("", "");
if (targetFaction != myFaction && !permAny) this.permission = Permission.ADMIN.node;
{ this.disableOnLock = true;
msg("%s<i> is not a member in your faction.", fyou.describeTo(fme, true));
return;
}
if (fme != null && fme.getRole() != Role.ADMIN && !permAny) senderMustBePlayer = false;
{ senderMustBeMember = false;
msg("<b>You are not the faction admin."); senderMustBeModerator = false;
return; senderMustBeAdmin = false;
} }
if (fyou == fme && !permAny) @Override
{ public void perform() {
msg("<b>The target player musn't be yourself."); FPlayer fyou = this.argAsBestFPlayerMatch(0);
return; if (fyou == null) return;
}
// only perform a FPlayerJoinEvent when newLeader isn't actually in the faction boolean permAny = Permission.ADMIN_ANY.has(sender, false);
if (fyou.getFaction() != targetFaction) Faction targetFaction = fyou.getFaction();
{
FPlayerJoinEvent event = new FPlayerJoinEvent(FPlayers.i.get(me),targetFaction,FPlayerJoinEvent.PlayerJoinReason.LEADER);
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) return;
}
FPlayer admin = targetFaction.getFPlayerAdmin(); if (targetFaction != myFaction && !permAny) {
msg("%s<i> is not a member in your faction.", fyou.describeTo(fme, true));
return;
}
// if target player is currently admin, demote and replace him if (fme != null && fme.getRole() != Role.ADMIN && !permAny) {
if (fyou == admin) msg("<b>You are not the faction admin.");
{ return;
targetFaction.promoteNewLeader(); }
msg("<i>You have demoted %s<i> from the position of faction admin.", fyou.describeTo(fme, true));
fyou.msg("<i>You have been demoted from the position of faction admin by %s<i>.", senderIsConsole ? "a server admin" : fme.describeTo(fyou, true));
return;
}
// promote target player, and demote existing admin if one exists if (fyou == fme && !permAny) {
if (admin != null) msg("<b>The target player musn't be yourself.");
admin.setRole(Role.MODERATOR); return;
fyou.setRole(Role.ADMIN); }
msg("<i>You have promoted %s<i> to the position of faction admin.", fyou.describeTo(fme, true));
// only perform a FPlayerJoinEvent when newLeader isn't actually in the faction
if (fyou.getFaction() != targetFaction) {
FPlayerJoinEvent event = new FPlayerJoinEvent(FPlayers.i.get(me), targetFaction, FPlayerJoinEvent.PlayerJoinReason.LEADER);
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) return;
}
FPlayer admin = targetFaction.getFPlayerAdmin();
// if target player is currently admin, demote and replace him
if (fyou == admin) {
targetFaction.promoteNewLeader();
msg("<i>You have demoted %s<i> from the position of faction admin.", fyou.describeTo(fme, true));
fyou.msg("<i>You have been demoted from the position of faction admin by %s<i>.", senderIsConsole ? "a server admin" : fme.describeTo(fyou, true));
return;
}
// promote target player, and demote existing admin if one exists
if (admin != null)
admin.setRole(Role.MODERATOR);
fyou.setRole(Role.ADMIN);
msg("<i>You have promoted %s<i> to the position of faction admin.", fyou.describeTo(fme, true));
// Inform all players
for (FPlayer fplayer : FPlayers.i.getOnline()) {
fplayer.msg("%s<i> gave %s<i> the leadership of %s<i>.", senderIsConsole ? "A server admin" : fme.describeTo(fplayer, true), fyou.describeTo(fplayer), targetFaction.describeTo(fplayer));
}
}
// Inform all players
for (FPlayer fplayer : FPlayers.i.getOnline())
{
fplayer.msg("%s<i> gave %s<i> the leadership of %s<i>.", senderIsConsole ? "A server admin" : fme.describeTo(fplayer, true), fyou.describeTo(fplayer), targetFaction.describeTo(fplayer));
}
}
} }

View File

@ -4,50 +4,45 @@ import com.massivecraft.factions.Faction;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.struct.Role; import com.massivecraft.factions.struct.Role;
public class CmdAutoClaim extends FCommand public class CmdAutoClaim extends FCommand {
{ public CmdAutoClaim() {
public CmdAutoClaim() super();
{ this.aliases.add("autoclaim");
super();
this.aliases.add("autoclaim");
//this.requiredArgs.add("");
this.optionalArgs.put("faction", "your");
this.permission = Permission.AUTOCLAIM.node;
this.disableOnLock = true;
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override //this.requiredArgs.add("");
public void perform() this.optionalArgs.put("faction", "your");
{
Faction forFaction = this.argAsFaction(0, myFaction);
if (forFaction == null || forFaction == fme.getAutoClaimFor())
{
fme.setAutoClaimFor(null);
msg("<i>Auto-claiming of land disabled.");
return;
}
if (! fme.canClaimForFaction(forFaction)) this.permission = Permission.AUTOCLAIM.node;
{ this.disableOnLock = true;
if (myFaction == forFaction)
msg("<b>You must be <h>%s<b> to claim land.", Role.MODERATOR.toString()); senderMustBePlayer = true;
else senderMustBeMember = false;
msg("<b>You can't claim land for <h>%s<b>.", forFaction.describeTo(fme)); senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform() {
Faction forFaction = this.argAsFaction(0, myFaction);
if (forFaction == null || forFaction == fme.getAutoClaimFor()) {
fme.setAutoClaimFor(null);
msg("<i>Auto-claiming of land disabled.");
return;
}
if (!fme.canClaimForFaction(forFaction)) {
if (myFaction == forFaction)
msg("<b>You must be <h>%s<b> to claim land.", Role.MODERATOR.toString());
else
msg("<b>You can't claim land for <h>%s<b>.", forFaction.describeTo(fme));
return;
}
fme.setAutoClaimFor(forFaction);
msg("<i>Now auto-claiming land for <h>%s<i>.", forFaction.describeTo(fme));
fme.attemptClaim(forFaction, me.getLocation(), true);
}
return;
}
fme.setAutoClaimFor(forFaction);
msg("<i>Now auto-claiming land for <h>%s<i>.", forFaction.describeTo(fme));
fme.attemptClaim(forFaction, me.getLocation(), true);
}
} }

View File

@ -1,48 +1,43 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import java.util.ArrayList;
import com.massivecraft.factions.P; import com.massivecraft.factions.P;
import com.massivecraft.factions.zcore.CommandVisibility; import com.massivecraft.factions.zcore.CommandVisibility;
import com.massivecraft.factions.zcore.MCommand; import com.massivecraft.factions.zcore.MCommand;
public class CmdAutoHelp extends MCommand<P> import java.util.ArrayList;
{
public CmdAutoHelp() public class CmdAutoHelp extends MCommand<P> {
{ public CmdAutoHelp() {
super(P.p); super(P.p);
this.aliases.add("?"); this.aliases.add("?");
this.aliases.add("h"); this.aliases.add("h");
this.aliases.add("help"); this.aliases.add("help");
this.setHelpShort(""); this.setHelpShort("");
this.optionalArgs.put("page","1"); this.optionalArgs.put("page", "1");
} }
@Override @Override
public void perform() public void perform() {
{ if (this.commandChain.size() == 0) return;
if (this.commandChain.size() == 0) return; MCommand<?> pcmd = this.commandChain.get(this.commandChain.size() - 1);
MCommand<?> pcmd = this.commandChain.get(this.commandChain.size()-1);
ArrayList<String> lines = new ArrayList<String>();
ArrayList<String> lines = new ArrayList<String>();
lines.addAll(pcmd.helpLong);
lines.addAll(pcmd.helpLong);
for (MCommand<?> scmd : pcmd.subCommands) {
for(MCommand<?> scmd : pcmd.subCommands) if
{ (
if scmd.visibility == CommandVisibility.VISIBLE
( ||
scmd.visibility == CommandVisibility.VISIBLE (scmd.visibility == CommandVisibility.SECRET && scmd.validSenderPermissions(sender, false))
|| ) {
(scmd.visibility == CommandVisibility.SECRET && scmd.validSenderPermissions(sender, false)) lines.add(scmd.getUseageTemplate(this.commandChain, true));
) }
{ }
lines.add(scmd.getUseageTemplate(this.commandChain, true));
} sendMessage(p.txt.getPage(lines, this.argAsInt(0, 1), "Help for command \"" + pcmd.aliases.get(0) + "\""));
} }
sendMessage(p.txt.getPage(lines, this.argAsInt(0, 1), "Help for command \""+pcmd.aliases.get(0)+"\""));
}
} }

View File

@ -3,42 +3,38 @@ package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Conf; import com.massivecraft.factions.Conf;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdBoom extends FCommand public class CmdBoom extends FCommand {
{ public CmdBoom() {
public CmdBoom() super();
{ this.aliases.add("noboom");
super();
this.aliases.add("noboom");
//this.requiredArgs.add("");
this.optionalArgs.put("on/off", "flip");
this.permission = Permission.NO_BOOM.node;
this.disableOnLock = true;
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = true;
senderMustBeAdmin = false;
}
@Override //this.requiredArgs.add("");
public void perform() this.optionalArgs.put("on/off", "flip");
{
if ( ! myFaction.isPeaceful())
{
fme.msg("<b>This command is only usable by factions which are specially designated as peaceful.");
return;
}
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay this.permission = Permission.NO_BOOM.node;
if ( ! payForCommand(Conf.econCostNoBoom, "to toggle explosions", "for toggling explosions")) return; this.disableOnLock = true;
myFaction.setPeacefulExplosionsEnabled(this.argAsBool(0, ! myFaction.getPeacefulExplosionsEnabled())); senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = true;
senderMustBeAdmin = false;
}
String enabled = myFaction.noExplosionsInTerritory() ? "disabled" : "enabled"; @Override
public void perform() {
if (!myFaction.isPeaceful()) {
fme.msg("<b>This command is only usable by factions which are specially designated as peaceful.");
return;
}
// Inform // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay
myFaction.msg("%s<i> has "+enabled+" explosions in your faction's territory.", fme.describeTo(myFaction)); if (!payForCommand(Conf.econCostNoBoom, "to toggle explosions", "for toggling explosions")) return;
}
myFaction.setPeacefulExplosionsEnabled(this.argAsBool(0, !myFaction.getPeacefulExplosionsEnabled()));
String enabled = myFaction.noExplosionsInTerritory() ? "disabled" : "enabled";
// Inform
myFaction.msg("%s<i> has " + enabled + " explosions in your faction's territory.", fme.describeTo(myFaction));
}
} }

View File

@ -3,40 +3,34 @@ package com.massivecraft.factions.cmd;
import com.massivecraft.factions.P; import com.massivecraft.factions.P;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdBypass extends FCommand public class CmdBypass extends FCommand {
{ public CmdBypass() {
public CmdBypass() super();
{ this.aliases.add("bypass");
super();
this.aliases.add("bypass"); //this.requiredArgs.add("");
this.optionalArgs.put("on/off", "flip");
//this.requiredArgs.add("");
this.optionalArgs.put("on/off", "flip"); this.permission = Permission.BYPASS.node;
this.disableOnLock = false;
this.permission = Permission.BYPASS.node;
this.disableOnLock = false; senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBePlayer = true; senderMustBeModerator = false;
senderMustBeMember = false; senderMustBeAdmin = false;
senderMustBeModerator = false; }
senderMustBeAdmin = false;
} @Override
public void perform() {
@Override fme.setIsAdminBypassing(this.argAsBool(0, !fme.isAdminBypassing()));
public void perform()
{ // TODO: Move this to a transient field in the model??
fme.setIsAdminBypassing(this.argAsBool(0, ! fme.isAdminBypassing())); if (fme.isAdminBypassing()) {
fme.msg("<i>You have enabled admin bypass mode. You will be able to build or destroy anywhere.");
// TODO: Move this to a transient field in the model?? P.p.log(fme.getName() + " has ENABLED admin bypass mode.");
if ( fme.isAdminBypassing()) } else {
{ fme.msg("<i>You have disabled admin bypass mode.");
fme.msg("<i>You have enabled admin bypass mode. You will be able to build or destroy anywhere."); P.p.log(fme.getName() + " DISABLED admin bypass mode.");
P.p.log(fme.getName() + " has ENABLED admin bypass mode."); }
} }
else
{
fme.msg("<i>You have disabled admin bypass mode.");
P.p.log(fme.getName() + " DISABLED admin bypass mode.");
}
}
} }

View File

@ -4,74 +4,57 @@ import com.massivecraft.factions.Conf;
import com.massivecraft.factions.struct.ChatMode; import com.massivecraft.factions.struct.ChatMode;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdChat extends FCommand public class CmdChat extends FCommand {
{
public CmdChat() {
public CmdChat() super();
{ this.aliases.add("c");
super(); this.aliases.add("chat");
this.aliases.add("c");
this.aliases.add("chat"); //this.requiredArgs.add("");
this.optionalArgs.put("mode", "next");
//this.requiredArgs.add("");
this.optionalArgs.put("mode", "next"); this.permission = Permission.CHAT.node;
this.disableOnLock = false;
this.permission = Permission.CHAT.node;
this.disableOnLock = false; senderMustBePlayer = true;
senderMustBeMember = true;
senderMustBePlayer = true; senderMustBeModerator = false;
senderMustBeMember = true; senderMustBeAdmin = false;
senderMustBeModerator = false; }
senderMustBeAdmin = false;
} @Override
public void perform() {
@Override if (!Conf.factionOnlyChat) {
public void perform() msg("<b>The built in chat chat channels are disabled on this server.");
{ return;
if ( ! Conf.factionOnlyChat ) }
{
msg("<b>The built in chat chat channels are disabled on this server."); String modeString = this.argAsString(0);
return; ChatMode modeTarget = fme.getChatMode().getNext();
}
if (modeString != null) {
String modeString = this.argAsString(0); modeString.toLowerCase();
ChatMode modeTarget = fme.getChatMode().getNext(); if (modeString.startsWith("p")) {
modeTarget = ChatMode.PUBLIC;
if (modeString != null) } else if (modeString.startsWith("a")) {
{ modeTarget = ChatMode.ALLIANCE;
modeString.toLowerCase(); } else if (modeString.startsWith("f")) {
if(modeString.startsWith("p")) modeTarget = ChatMode.FACTION;
{ } else {
modeTarget = ChatMode.PUBLIC; msg("<b>Unrecognised chat mode. <i>Please enter either 'a','f' or 'p'");
} return;
else if (modeString.startsWith("a")) }
{ }
modeTarget = ChatMode.ALLIANCE;
} fme.setChatMode(modeTarget);
else if(modeString.startsWith("f"))
{ if (fme.getChatMode() == ChatMode.PUBLIC) {
modeTarget = ChatMode.FACTION; msg("<i>Public chat mode.");
} } else if (fme.getChatMode() == ChatMode.ALLIANCE) {
else msg("<i>Alliance only chat mode.");
{ } else {
msg("<b>Unrecognised chat mode. <i>Please enter either 'a','f' or 'p'"); msg("<i>Faction only chat mode.");
return; }
} }
}
fme.setChatMode(modeTarget);
if(fme.getChatMode() == ChatMode.PUBLIC)
{
msg("<i>Public chat mode.");
}
else if (fme.getChatMode() == ChatMode.ALLIANCE )
{
msg("<i>Alliance only chat mode.");
}
else
{
msg("<i>Faction only chat mode.");
}
}
} }

View File

@ -3,38 +3,32 @@ package com.massivecraft.factions.cmd;
import com.massivecraft.factions.P; import com.massivecraft.factions.P;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdChatSpy extends FCommand public class CmdChatSpy extends FCommand {
{ public CmdChatSpy() {
public CmdChatSpy() super();
{ this.aliases.add("chatspy");
super();
this.aliases.add("chatspy");
this.optionalArgs.put("on/off", "flip"); this.optionalArgs.put("on/off", "flip");
this.permission = Permission.CHATSPY.node; this.permission = Permission.CHATSPY.node;
this.disableOnLock = false; this.disableOnLock = false;
senderMustBePlayer = true; senderMustBePlayer = true;
senderMustBeMember = false; senderMustBeMember = false;
senderMustBeModerator = false; senderMustBeModerator = false;
senderMustBeAdmin = false; senderMustBeAdmin = false;
} }
@Override @Override
public void perform() public void perform() {
{ fme.setSpyingChat(this.argAsBool(0, !fme.isSpyingChat()));
fme.setSpyingChat(this.argAsBool(0, ! fme.isSpyingChat()));
if ( fme.isSpyingChat()) if (fme.isSpyingChat()) {
{ fme.msg("<i>You have enabled chat spying mode.");
fme.msg("<i>You have enabled chat spying mode."); P.p.log(fme.getName() + " has ENABLED chat spying mode.");
P.p.log(fme.getName() + " has ENABLED chat spying mode."); } else {
} fme.msg("<i>You have disabled chat spying mode.");
else P.p.log(fme.getName() + " DISABLED chat spying mode.");
{ }
fme.msg("<i>You have disabled chat spying mode."); }
P.p.log(fme.getName() + " DISABLED chat spying mode.");
}
}
} }

View File

@ -1,81 +1,70 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Conf; import com.massivecraft.factions.Conf;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.FLocation; import com.massivecraft.factions.FLocation;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.util.SpiralTask; import com.massivecraft.factions.util.SpiralTask;
public class CmdClaim extends FCommand public class CmdClaim extends FCommand {
{
public CmdClaim()
{
super();
this.aliases.add("claim");
//this.requiredArgs.add("");
this.optionalArgs.put("faction", "your");
this.optionalArgs.put("radius", "1");
this.permission = Permission.CLAIM.node;
this.disableOnLock = true;
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
// Read and validate input
final Faction forFaction = this.argAsFaction(0, myFaction);
int radius = this.argAsInt(1, 1);
if (radius < 1) public CmdClaim() {
{ super();
msg("<b>If you specify a radius, it must be at least 1."); this.aliases.add("claim");
return;
}
if (radius < 2) //this.requiredArgs.add("");
{ this.optionalArgs.put("faction", "your");
// single chunk this.optionalArgs.put("radius", "1");
fme.attemptClaim(forFaction, me.getLocation(), true);
}
else
{
// radius claim
if (! Permission.CLAIM_RADIUS.has(sender, false))
{
msg("<b>You do not have permission to claim in a radius.");
return;
}
new SpiralTask(new FLocation(me), radius) this.permission = Permission.CLAIM.node;
{ this.disableOnLock = true;
private int failCount = 0;
private final int limit = Conf.radiusClaimFailureLimit - 1;
@Override senderMustBePlayer = true;
public boolean work() senderMustBeMember = false;
{ senderMustBeModerator = false;
boolean success = fme.attemptClaim(forFaction, this.currentLocation(), true); senderMustBeAdmin = false;
if (success) }
failCount = 0;
else if ( ! success && failCount++ >= limit) @Override
{ public void perform() {
this.stop(); // Read and validate input
return false; final Faction forFaction = this.argAsFaction(0, myFaction);
} int radius = this.argAsInt(1, 1);
if (radius < 1) {
msg("<b>If you specify a radius, it must be at least 1.");
return;
}
if (radius < 2) {
// single chunk
fme.attemptClaim(forFaction, me.getLocation(), true);
} else {
// radius claim
if (!Permission.CLAIM_RADIUS.has(sender, false)) {
msg("<b>You do not have permission to claim in a radius.");
return;
}
new SpiralTask(new FLocation(me), radius) {
private int failCount = 0;
private final int limit = Conf.radiusClaimFailureLimit - 1;
@Override
public boolean work() {
boolean success = fme.attemptClaim(forFaction, this.currentLocation(), true);
if (success)
failCount = 0;
else if (!success && failCount++ >= limit) {
this.stop();
return false;
}
return true;
}
};
}
}
return true;
}
};
}
}
} }

View File

@ -1,302 +1,245 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Set;
import java.util.HashMap;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import com.massivecraft.factions.Conf; import com.massivecraft.factions.Conf;
import com.massivecraft.factions.P; import com.massivecraft.factions.P;
import com.massivecraft.factions.integration.SpoutFeatures; import com.massivecraft.factions.integration.SpoutFeatures;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
public class CmdConfig extends FCommand import java.lang.reflect.Field;
{ import java.lang.reflect.ParameterizedType;
private static HashMap<String, String> properFieldNames = new HashMap<String, String>(); import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Set;
public CmdConfig() public class CmdConfig extends FCommand {
{ private static HashMap<String, String> properFieldNames = new HashMap<String, String>();
super();
this.aliases.add("config");
this.requiredArgs.add("setting");
this.requiredArgs.add("value");
this.errorOnToManyArgs = false;
this.permission = Permission.CONFIG.node;
this.disableOnLock = true;
senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override public CmdConfig() {
public void perform() super();
{ this.aliases.add("config");
// store a lookup map of lowercase field names paired with proper capitalization field names
// that way, if the person using this command messes up the capitalization, we can fix that
if (properFieldNames.isEmpty())
{
Field[] fields = Conf.class.getDeclaredFields();
for(int i = 0; i < fields.length; i++)
{
properFieldNames.put(fields[i].getName().toLowerCase(), fields[i].getName());
}
}
String field = this.argAsString(0).toLowerCase(); this.requiredArgs.add("setting");
if (field.startsWith("\"") && field.endsWith("\"")) this.requiredArgs.add("value");
{ this.errorOnToManyArgs = false;
field = field.substring(1, field.length() - 1);
}
String fieldName = properFieldNames.get(field);
if (fieldName == null || fieldName.isEmpty()) this.permission = Permission.CONFIG.node;
{ this.disableOnLock = true;
msg("<b>No configuration setting \"<h>%s<b>\" exists.", field);
return;
}
String success = ""; senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
String value = args.get(1); @Override
for(int i = 2; i < args.size(); i++) public void perform() {
{ // store a lookup map of lowercase field names paired with proper capitalization field names
value += ' ' + args.get(i); // that way, if the person using this command messes up the capitalization, we can fix that
} if (properFieldNames.isEmpty()) {
Field[] fields = Conf.class.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
properFieldNames.put(fields[i].getName().toLowerCase(), fields[i].getName());
}
}
try String field = this.argAsString(0).toLowerCase();
{ if (field.startsWith("\"") && field.endsWith("\"")) {
Field target = Conf.class.getField(fieldName); field = field.substring(1, field.length() - 1);
}
String fieldName = properFieldNames.get(field);
// boolean if (fieldName == null || fieldName.isEmpty()) {
if (target.getType() == boolean.class) msg("<b>No configuration setting \"<h>%s<b>\" exists.", field);
{ return;
boolean targetValue = this.strAsBool(value); }
target.setBoolean(null, targetValue);
if (targetValue)
{
success = "\""+fieldName+"\" option set to true (enabled).";
}
else
{
success = "\""+fieldName+"\" option set to false (disabled).";
}
}
// int String success = "";
else if (target.getType() == int.class)
{
try
{
int intVal = Integer.parseInt(value);
target.setInt(null, intVal);
success = "\""+fieldName+"\" option set to "+intVal+".";
}
catch(NumberFormatException ex)
{
sendMessage("Cannot set \""+fieldName+"\": integer (whole number) value required.");
return;
}
}
// long String value = args.get(1);
else if (target.getType() == long.class) for (int i = 2; i < args.size(); i++) {
{ value += ' ' + args.get(i);
try }
{
long longVal = Long.parseLong(value);
target.setLong(null, longVal);
success = "\""+fieldName+"\" option set to "+longVal+".";
}
catch(NumberFormatException ex)
{
sendMessage("Cannot set \""+fieldName+"\": long integer (whole number) value required.");
return;
}
}
// double try {
else if (target.getType() == double.class) Field target = Conf.class.getField(fieldName);
{
try
{
double doubleVal = Double.parseDouble(value);
target.setDouble(null, doubleVal);
success = "\""+fieldName+"\" option set to "+doubleVal+".";
}
catch(NumberFormatException ex)
{
sendMessage("Cannot set \""+fieldName+"\": double (numeric) value required.");
return;
}
}
// float // boolean
else if (target.getType() == float.class) if (target.getType() == boolean.class) {
{ boolean targetValue = this.strAsBool(value);
try target.setBoolean(null, targetValue);
{
float floatVal = Float.parseFloat(value);
target.setFloat(null, floatVal);
success = "\""+fieldName+"\" option set to "+floatVal+".";
}
catch(NumberFormatException ex)
{
sendMessage("Cannot set \""+fieldName+"\": float (numeric) value required.");
return;
}
}
// String if (targetValue) {
else if (target.getType() == String.class) success = "\"" + fieldName + "\" option set to true (enabled).";
{ } else {
target.set(null, value); success = "\"" + fieldName + "\" option set to false (disabled).";
success = "\""+fieldName+"\" option set to \""+value+"\"."; }
} }
// ChatColor // int
else if (target.getType() == ChatColor.class) else if (target.getType() == int.class) {
{ try {
ChatColor newColor = null; int intVal = Integer.parseInt(value);
try target.setInt(null, intVal);
{ success = "\"" + fieldName + "\" option set to " + intVal + ".";
newColor = ChatColor.valueOf(value.toUpperCase()); } catch (NumberFormatException ex) {
} sendMessage("Cannot set \"" + fieldName + "\": integer (whole number) value required.");
catch (IllegalArgumentException ex) return;
{ }
}
}
if (newColor == null)
{
sendMessage("Cannot set \""+fieldName+"\": \""+value.toUpperCase()+"\" is not a valid color.");
return;
}
target.set(null, newColor);
success = "\""+fieldName+"\" color option set to \""+value.toUpperCase()+"\".";
}
// Set<?> or other parameterized collection // long
else if (target.getGenericType() instanceof ParameterizedType) else if (target.getType() == long.class) {
{ try {
ParameterizedType targSet = (ParameterizedType)target.getGenericType(); long longVal = Long.parseLong(value);
Type innerType = targSet.getActualTypeArguments()[0]; target.setLong(null, longVal);
success = "\"" + fieldName + "\" option set to " + longVal + ".";
} catch (NumberFormatException ex) {
sendMessage("Cannot set \"" + fieldName + "\": long integer (whole number) value required.");
return;
}
}
// not a Set, somehow, and that should be the only collection we're using in Conf.java // double
if (targSet.getRawType() != Set.class) else if (target.getType() == double.class) {
{ try {
sendMessage("\""+fieldName+"\" is not a data collection type which can be modified with this command."); double doubleVal = Double.parseDouble(value);
return; target.setDouble(null, doubleVal);
} success = "\"" + fieldName + "\" option set to " + doubleVal + ".";
} catch (NumberFormatException ex) {
sendMessage("Cannot set \"" + fieldName + "\": double (numeric) value required.");
return;
}
}
// Set<Material> // float
else if (innerType == Material.class) else if (target.getType() == float.class) {
{ try {
Material newMat = null; float floatVal = Float.parseFloat(value);
try target.setFloat(null, floatVal);
{ success = "\"" + fieldName + "\" option set to " + floatVal + ".";
newMat = Material.valueOf(value.toUpperCase()); } catch (NumberFormatException ex) {
} sendMessage("Cannot set \"" + fieldName + "\": float (numeric) value required.");
catch (IllegalArgumentException ex) return;
{ }
}
}
if (newMat == null)
{
sendMessage("Cannot change \""+fieldName+"\" set: \""+value.toUpperCase()+"\" is not a valid material.");
return;
}
@SuppressWarnings("unchecked") // String
Set<Material> matSet = (Set<Material>)target.get(null); else if (target.getType() == String.class) {
target.set(null, value);
success = "\"" + fieldName + "\" option set to \"" + value + "\".";
}
// Material already present, so remove it // ChatColor
if (matSet.contains(newMat)) else if (target.getType() == ChatColor.class) {
{ ChatColor newColor = null;
matSet.remove(newMat); try {
target.set(null, matSet); newColor = ChatColor.valueOf(value.toUpperCase());
success = "\""+fieldName+"\" set: Material \""+value.toUpperCase()+"\" removed."; } catch (IllegalArgumentException ex) {
}
// Material not present yet, add it
else
{
matSet.add(newMat);
target.set(null, matSet);
success = "\""+fieldName+"\" set: Material \""+value.toUpperCase()+"\" added.";
}
}
// Set<String> }
else if (innerType == String.class) if (newColor == null) {
{ sendMessage("Cannot set \"" + fieldName + "\": \"" + value.toUpperCase() + "\" is not a valid color.");
@SuppressWarnings("unchecked") return;
Set<String> stringSet = (Set<String>)target.get(null); }
target.set(null, newColor);
success = "\"" + fieldName + "\" color option set to \"" + value.toUpperCase() + "\".";
}
// String already present, so remove it // Set<?> or other parameterized collection
if (stringSet.contains(value)) else if (target.getGenericType() instanceof ParameterizedType) {
{ ParameterizedType targSet = (ParameterizedType) target.getGenericType();
stringSet.remove(value); Type innerType = targSet.getActualTypeArguments()[0];
target.set(null, stringSet);
success = "\""+fieldName+"\" set: \""+value+"\" removed.";
}
// String not present yet, add it
else
{
stringSet.add(value);
target.set(null, stringSet);
success = "\""+fieldName+"\" set: \""+value+"\" added.";
}
}
// Set of unknown type // not a Set, somehow, and that should be the only collection we're using in Conf.java
else if (targSet.getRawType() != Set.class) {
{ sendMessage("\"" + fieldName + "\" is not a data collection type which can be modified with this command.");
sendMessage("\""+fieldName+"\" is not a data type set which can be modified with this command."); return;
return; }
}
}
// unknown type // Set<Material>
else else if (innerType == Material.class) {
{ Material newMat = null;
sendMessage("\""+fieldName+"\" is not a data type which can be modified with this command."); try {
return; newMat = Material.valueOf(value.toUpperCase());
} } catch (IllegalArgumentException ex) {
}
catch (NoSuchFieldException ex)
{
sendMessage("Configuration setting \""+fieldName+"\" couldn't be matched, though it should be... please report this error.");
return;
}
catch (IllegalAccessException ex)
{
sendMessage("Error setting configuration setting \""+fieldName+"\" to \""+value+"\".");
return;
}
if (!success.isEmpty()) }
{ if (newMat == null) {
if (sender instanceof Player) sendMessage("Cannot change \"" + fieldName + "\" set: \"" + value.toUpperCase() + "\" is not a valid material.");
{ return;
sendMessage(success); }
P.p.log(success + " Command was run by "+fme.getName()+".");
} @SuppressWarnings("unchecked")
else // using P.p.log() instead of sendMessage if run from server console so that "[Factions v#.#.#]" is prepended in server log Set<Material> matSet = (Set<Material>) target.get(null);
P.p.log(success);
} // Material already present, so remove it
// save change to disk if (matSet.contains(newMat)) {
Conf.save(); matSet.remove(newMat);
target.set(null, matSet);
success = "\"" + fieldName + "\" set: Material \"" + value.toUpperCase() + "\" removed.";
}
// Material not present yet, add it
else {
matSet.add(newMat);
target.set(null, matSet);
success = "\"" + fieldName + "\" set: Material \"" + value.toUpperCase() + "\" added.";
}
}
// Set<String>
else if (innerType == String.class) {
@SuppressWarnings("unchecked")
Set<String> stringSet = (Set<String>) target.get(null);
// String already present, so remove it
if (stringSet.contains(value)) {
stringSet.remove(value);
target.set(null, stringSet);
success = "\"" + fieldName + "\" set: \"" + value + "\" removed.";
}
// String not present yet, add it
else {
stringSet.add(value);
target.set(null, stringSet);
success = "\"" + fieldName + "\" set: \"" + value + "\" added.";
}
}
// Set of unknown type
else {
sendMessage("\"" + fieldName + "\" is not a data type set which can be modified with this command.");
return;
}
}
// unknown type
else {
sendMessage("\"" + fieldName + "\" is not a data type which can be modified with this command.");
return;
}
} catch (NoSuchFieldException ex) {
sendMessage("Configuration setting \"" + fieldName + "\" couldn't be matched, though it should be... please report this error.");
return;
} catch (IllegalAccessException ex) {
sendMessage("Error setting configuration setting \"" + fieldName + "\" to \"" + value + "\".");
return;
}
if (!success.isEmpty()) {
if (sender instanceof Player) {
sendMessage(success);
P.p.log(success + " Command was run by " + fme.getName() + ".");
} else // using P.p.log() instead of sendMessage if run from server console so that "[Factions v#.#.#]" is prepended in server log
P.p.log(success);
}
// save change to disk
Conf.save();
// in case some Spout related setting was changed
SpoutFeatures.updateAppearances();
}
// in case some Spout related setting was changed
SpoutFeatures.updateAppearances();
}
} }

View File

@ -1,105 +1,91 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import java.util.ArrayList; import com.massivecraft.factions.*;
import org.bukkit.Bukkit;
import com.massivecraft.factions.Conf;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.FPlayers;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.Factions;
import com.massivecraft.factions.P;
import com.massivecraft.factions.event.FPlayerJoinEvent; import com.massivecraft.factions.event.FPlayerJoinEvent;
import com.massivecraft.factions.event.FactionCreateEvent; import com.massivecraft.factions.event.FactionCreateEvent;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.struct.Role; import com.massivecraft.factions.struct.Role;
import org.bukkit.Bukkit;
import java.util.ArrayList;
public class CmdCreate extends FCommand public class CmdCreate extends FCommand {
{ public CmdCreate() {
public CmdCreate() super();
{ this.aliases.add("create");
super();
this.aliases.add("create");
this.requiredArgs.add("faction tag");
//this.optionalArgs.put("", "");
this.permission = Permission.CREATE.node;
this.disableOnLock = true;
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
String tag = this.argAsString(0);
if (fme.hasFaction())
{
msg("<b>You must leave your current faction first.");
return;
}
if (Factions.i.isTagTaken(tag))
{
msg("<b>That tag is already in use.");
return;
}
ArrayList<String> tagValidationErrors = Factions.validateTag(tag);
if (tagValidationErrors.size() > 0)
{
sendMessage(tagValidationErrors);
return;
}
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make sure they can pay this.requiredArgs.add("faction tag");
if ( ! canAffordCommand(Conf.econCostCreate, "to create a new faction")) return; //this.optionalArgs.put("", "");
// trigger the faction creation event (cancellable) this.permission = Permission.CREATE.node;
FactionCreateEvent createEvent = new FactionCreateEvent(me, tag); this.disableOnLock = true;
Bukkit.getServer().getPluginManager().callEvent(createEvent);
if(createEvent.isCancelled()) return;
// then make 'em pay (if applicable) senderMustBePlayer = true;
if ( ! payForCommand(Conf.econCostCreate, "to create a new faction", "for creating a new faction")) return; senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
Faction faction = Factions.i.create(); @Override
public void perform() {
String tag = this.argAsString(0);
// TODO: Why would this even happen??? Auto increment clash?? if (fme.hasFaction()) {
if (faction == null) msg("<b>You must leave your current faction first.");
{ return;
msg("<b>There was an internal error while trying to create your faction. Please try again."); }
return;
}
// finish setting up the Faction if (Factions.i.isTagTaken(tag)) {
faction.setTag(tag); msg("<b>That tag is already in use.");
return;
}
// trigger the faction join event for the creator ArrayList<String> tagValidationErrors = Factions.validateTag(tag);
FPlayerJoinEvent joinEvent = new FPlayerJoinEvent(FPlayers.i.get(me),faction,FPlayerJoinEvent.PlayerJoinReason.CREATE); if (tagValidationErrors.size() > 0) {
Bukkit.getServer().getPluginManager().callEvent(joinEvent); sendMessage(tagValidationErrors);
// join event cannot be cancelled or you'll have an empty faction return;
}
// finish setting up the FPlayer // if economy is enabled, they're not on the bypass list, and this command has a cost set, make sure they can pay
fme.setRole(Role.ADMIN); if (!canAffordCommand(Conf.econCostCreate, "to create a new faction")) return;
fme.setFaction(faction);
for (FPlayer follower : FPlayers.i.getOnline()) // trigger the faction creation event (cancellable)
{ FactionCreateEvent createEvent = new FactionCreateEvent(me, tag);
follower.msg("%s<i> created a new faction %s", fme.describeTo(follower, true), faction.getTag(follower)); Bukkit.getServer().getPluginManager().callEvent(createEvent);
} if (createEvent.isCancelled()) return;
msg("<i>You should now: %s", p.cmdBase.cmdDescription.getUseageTemplate()); // then make 'em pay (if applicable)
if (!payForCommand(Conf.econCostCreate, "to create a new faction", "for creating a new faction")) return;
Faction faction = Factions.i.create();
// TODO: Why would this even happen??? Auto increment clash??
if (faction == null) {
msg("<b>There was an internal error while trying to create your faction. Please try again.");
return;
}
// finish setting up the Faction
faction.setTag(tag);
// trigger the faction join event for the creator
FPlayerJoinEvent joinEvent = new FPlayerJoinEvent(FPlayers.i.get(me), faction, FPlayerJoinEvent.PlayerJoinReason.CREATE);
Bukkit.getServer().getPluginManager().callEvent(joinEvent);
// join event cannot be cancelled or you'll have an empty faction
// finish setting up the FPlayer
fme.setRole(Role.ADMIN);
fme.setFaction(faction);
for (FPlayer follower : FPlayers.i.getOnline()) {
follower.msg("%s<i> created a new faction %s", fme.describeTo(follower, true), faction.getTag(follower));
}
msg("<i>You should now: %s", p.cmdBase.cmdDescription.getUseageTemplate());
if (Conf.logFactionCreate)
P.p.log(fme.getName() + " created a new faction: " + tag);
}
if (Conf.logFactionCreate)
P.p.log(fme.getName()+" created a new faction: "+tag);
}
} }

View File

@ -3,45 +3,41 @@ package com.massivecraft.factions.cmd;
import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdDeinvite extends FCommand public class CmdDeinvite extends FCommand {
{
public CmdDeinvite() {
public CmdDeinvite() super();
{ this.aliases.add("deinvite");
super(); this.aliases.add("deinv");
this.aliases.add("deinvite");
this.aliases.add("deinv"); this.requiredArgs.add("player name");
//this.optionalArgs.put("", "");
this.requiredArgs.add("player name");
//this.optionalArgs.put("", ""); this.permission = Permission.DEINVITE.node;
this.disableOnLock = true;
this.permission = Permission.DEINVITE.node;
this.disableOnLock = true; senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBePlayer = true; senderMustBeModerator = true;
senderMustBeMember = false; senderMustBeAdmin = false;
senderMustBeModerator = true; }
senderMustBeAdmin = false;
} @Override
public void perform() {
@Override FPlayer you = this.argAsBestFPlayerMatch(0);
public void perform() if (you == null) return;
{
FPlayer you = this.argAsBestFPlayerMatch(0); if (you.getFaction() == myFaction) {
if (you == null) return; msg("%s<i> is already a member of %s", you.getName(), myFaction.getTag());
msg("<i>You might want to: %s", p.cmdBase.cmdKick.getUseageTemplate(false));
if (you.getFaction() == myFaction) return;
{ }
msg("%s<i> is already a member of %s", you.getName(), myFaction.getTag());
msg("<i>You might want to: %s", p.cmdBase.cmdKick.getUseageTemplate(false)); myFaction.deinvite(you);
return;
} you.msg("%s<i> revoked your invitation to <h>%s<i>.", fme.describeTo(you), myFaction.describeTo(you));
myFaction.deinvite(you); myFaction.msg("%s<i> revoked %s's<i> invitation.", fme.describeTo(myFaction), you.describeTo(myFaction));
}
you.msg("%s<i> revoked your invitation to <h>%s<i>.", fme.describeTo(you), myFaction.describeTo(you));
myFaction.msg("%s<i> revoked %s's<i> invitation.", fme.describeTo(myFaction), you.describeTo(myFaction));
}
} }

View File

@ -6,47 +6,43 @@ import com.massivecraft.factions.FPlayers;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.zcore.util.TextUtil; import com.massivecraft.factions.zcore.util.TextUtil;
public class CmdDescription extends FCommand public class CmdDescription extends FCommand {
{ public CmdDescription() {
public CmdDescription() super();
{ this.aliases.add("desc");
super();
this.aliases.add("desc");
this.requiredArgs.add("desc");
this.errorOnToManyArgs = false;
//this.optionalArgs
this.permission = Permission.DESCRIPTION.node;
this.disableOnLock = true;
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = true;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay
if ( ! payForCommand(Conf.econCostDesc, "to change faction description", "for changing faction description")) return;
myFaction.setDescription(TextUtil.implode(args, " ").replaceAll("(&([a-f0-9]))", "& $2")); // since "&" color tags seem to work even through plain old FPlayer.sendMessage() for some reason, we need to break those up this.requiredArgs.add("desc");
this.errorOnToManyArgs = false;
//this.optionalArgs
if ( ! Conf.broadcastDescriptionChanges) this.permission = Permission.DESCRIPTION.node;
{ this.disableOnLock = true;
fme.msg("You have changed the description for <h>%s<i> to:", myFaction.describeTo(fme));
fme.sendMessage(myFaction.getDescription()); senderMustBePlayer = true;
return; senderMustBeMember = false;
} senderMustBeModerator = true;
senderMustBeAdmin = false;
}
@Override
public void perform() {
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay
if (!payForCommand(Conf.econCostDesc, "to change faction description", "for changing faction description"))
return;
myFaction.setDescription(TextUtil.implode(args, " ").replaceAll("(&([a-f0-9]))", "& $2")); // since "&" color tags seem to work even through plain old FPlayer.sendMessage() for some reason, we need to break those up
if (!Conf.broadcastDescriptionChanges) {
fme.msg("You have changed the description for <h>%s<i> to:", myFaction.describeTo(fme));
fme.sendMessage(myFaction.getDescription());
return;
}
// Broadcast the description to everyone
for (FPlayer fplayer : FPlayers.i.getOnline()) {
fplayer.msg("<i>The faction %s<i> changed their description to:", myFaction.describeTo(fplayer));
fplayer.sendMessage(myFaction.getDescription()); // players can inject "&" or "`" or "<i>" or whatever in their description; &k is particularly interesting looking
}
}
// Broadcast the description to everyone
for (FPlayer fplayer : FPlayers.i.getOnline())
{
fplayer.msg("<i>The faction %s<i> changed their description to:", myFaction.describeTo(fplayer));
fplayer.sendMessage(myFaction.getDescription()); // players can inject "&" or "`" or "<i>" or whatever in their description; &k is particularly interesting looking
}
}
} }

View File

@ -1,113 +1,92 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import org.bukkit.Bukkit; import com.massivecraft.factions.*;
import com.massivecraft.factions.Conf;
import com.massivecraft.factions.event.FPlayerLeaveEvent; import com.massivecraft.factions.event.FPlayerLeaveEvent;
import com.massivecraft.factions.event.FactionDisbandEvent; import com.massivecraft.factions.event.FactionDisbandEvent;
import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.integration.Econ;
import com.massivecraft.factions.FPlayers;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.P;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.integration.SpoutFeatures; import com.massivecraft.factions.integration.SpoutFeatures;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.struct.Role; import com.massivecraft.factions.struct.Role;
import org.bukkit.Bukkit;
public class CmdDisband extends FCommand public class CmdDisband extends FCommand {
{ public CmdDisband() {
public CmdDisband() super();
{ this.aliases.add("disband");
super();
this.aliases.add("disband");
//this.requiredArgs.add("");
this.optionalArgs.put("faction tag", "yours");
this.permission = Permission.DISBAND.node;
this.disableOnLock = true;
senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
// The faction, default to your own.. but null if console sender.
Faction faction = this.argAsFaction(0, fme == null ? null : myFaction);
if (faction == null) return;
boolean isMyFaction = fme == null ? false : faction == myFaction;
if (isMyFaction)
{
if ( ! assertMinRole(Role.ADMIN)) return;
}
else
{
if ( ! Permission.DISBAND_ANY.has(sender, true))
{
return;
}
}
if (! faction.isNormal()) //this.requiredArgs.add("");
{ this.optionalArgs.put("faction tag", "yours");
msg("<i>You cannot disband the Wilderness, SafeZone, or WarZone.");
return;
}
if (faction.isPermanent())
{
msg("<i>This faction is designated as permanent, so you cannot disband it.");
return;
}
FactionDisbandEvent disbandEvent = new FactionDisbandEvent(me, faction.getId()); this.permission = Permission.DISBAND.node;
Bukkit.getServer().getPluginManager().callEvent(disbandEvent); this.disableOnLock = true;
if(disbandEvent.isCancelled()) return;
// Send FPlayerLeaveEvent for each player in the faction senderMustBePlayer = false;
for ( FPlayer fplayer : faction.getFPlayers() ) senderMustBeMember = false;
{ senderMustBeModerator = false;
Bukkit.getServer().getPluginManager().callEvent(new FPlayerLeaveEvent(fplayer, faction, FPlayerLeaveEvent.PlayerLeaveReason.DISBAND)); senderMustBeAdmin = false;
} }
// Inform all players @Override
for (FPlayer fplayer : FPlayers.i.getOnline()) public void perform() {
{ // The faction, default to your own.. but null if console sender.
String who = senderIsConsole ? "A server admin" : fme.describeTo(fplayer); Faction faction = this.argAsFaction(0, fme == null ? null : myFaction);
if (fplayer.getFaction() == faction) if (faction == null) return;
{
fplayer.msg("<h>%s<i> disbanded your faction.", who);
}
else
{
fplayer.msg("<h>%s<i> disbanded the faction %s.", who, faction.getTag(fplayer));
}
}
if (Conf.logFactionDisband)
P.p.log("The faction "+faction.getTag()+" ("+faction.getId()+") was disbanded by "+(senderIsConsole ? "console command" : fme.getName())+".");
if (Econ.shouldBeUsed() && ! senderIsConsole) boolean isMyFaction = fme == null ? false : faction == myFaction;
{
//Give all the faction's money to the disbander
double amount = Econ.getBalance(faction.getAccountId());
Econ.transferMoney(fme, faction, fme, amount, false);
if (amount > 0.0)
{
String amountString = Econ.moneyString(amount);
msg("<i>You have been given the disbanded faction's bank, totaling %s.", amountString);
P.p.log(fme.getName() + " has been given bank holdings of "+amountString+" from disbanding "+faction.getTag()+".");
}
}
faction.detach();
SpoutFeatures.updateAppearances(); if (isMyFaction) {
} if (!assertMinRole(Role.ADMIN)) return;
} else {
if (!Permission.DISBAND_ANY.has(sender, true)) {
return;
}
}
if (!faction.isNormal()) {
msg("<i>You cannot disband the Wilderness, SafeZone, or WarZone.");
return;
}
if (faction.isPermanent()) {
msg("<i>This faction is designated as permanent, so you cannot disband it.");
return;
}
FactionDisbandEvent disbandEvent = new FactionDisbandEvent(me, faction.getId());
Bukkit.getServer().getPluginManager().callEvent(disbandEvent);
if (disbandEvent.isCancelled()) return;
// Send FPlayerLeaveEvent for each player in the faction
for (FPlayer fplayer : faction.getFPlayers()) {
Bukkit.getServer().getPluginManager().callEvent(new FPlayerLeaveEvent(fplayer, faction, FPlayerLeaveEvent.PlayerLeaveReason.DISBAND));
}
// Inform all players
for (FPlayer fplayer : FPlayers.i.getOnline()) {
String who = senderIsConsole ? "A server admin" : fme.describeTo(fplayer);
if (fplayer.getFaction() == faction) {
fplayer.msg("<h>%s<i> disbanded your faction.", who);
} else {
fplayer.msg("<h>%s<i> disbanded the faction %s.", who, faction.getTag(fplayer));
}
}
if (Conf.logFactionDisband)
P.p.log("The faction " + faction.getTag() + " (" + faction.getId() + ") was disbanded by " + (senderIsConsole ? "console command" : fme.getName()) + ".");
if (Econ.shouldBeUsed() && !senderIsConsole) {
//Give all the faction's money to the disbander
double amount = Econ.getBalance(faction.getAccountId());
Econ.transferMoney(fme, faction, fme, amount, false);
if (amount > 0.0) {
String amountString = Econ.moneyString(amount);
msg("<i>You have been given the disbanded faction's bank, totaling %s.", amountString);
P.p.log(fme.getName() + " has been given bank holdings of " + amountString + " from disbanding " + faction.getTag() + ".");
}
}
faction.detach();
SpoutFeatures.updateAppearances();
}
} }

View File

@ -1,190 +1,184 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import java.util.ArrayList;
import com.massivecraft.factions.Conf; import com.massivecraft.factions.Conf;
import com.massivecraft.factions.P; import com.massivecraft.factions.P;
import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.integration.Econ;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import java.util.ArrayList;
public class CmdHelp extends FCommand
{
public CmdHelp()
{
super();
this.aliases.add("help");
this.aliases.add("h");
this.aliases.add("?");
//this.requiredArgs.add("");
this.optionalArgs.put("page", "1");
this.permission = Permission.HELP.node;
this.disableOnLock = false;
senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
if (helpPages == null) updateHelp();
int page = this.argAsInt(0, 1);
sendMessage(p.txt.titleize("Factions Help ("+page+"/"+helpPages.size()+")"));
page -= 1;
if (page < 0 || page >= helpPages.size())
{
msg("<b>This page does not exist");
return;
}
sendMessage(helpPages.get(page));
}
//----------------------------------------------//
// Build the help pages
//----------------------------------------------//
public ArrayList<ArrayList<String>> helpPages;
public void updateHelp()
{
helpPages = new ArrayList<ArrayList<String>>();
ArrayList<String> pageLines;
pageLines = new ArrayList<String>(); public class CmdHelp extends FCommand {
pageLines.add( p.cmdBase.cmdHelp.getUseageTemplate(true) );
pageLines.add( p.cmdBase.cmdList.getUseageTemplate(true) ); public CmdHelp() {
pageLines.add( p.cmdBase.cmdShow.getUseageTemplate(true) ); super();
pageLines.add( p.cmdBase.cmdPower.getUseageTemplate(true) ); this.aliases.add("help");
pageLines.add( p.cmdBase.cmdJoin.getUseageTemplate(true) ); this.aliases.add("h");
pageLines.add( p.cmdBase.cmdLeave.getUseageTemplate(true) ); this.aliases.add("?");
pageLines.add( p.cmdBase.cmdChat.getUseageTemplate(true) );
pageLines.add( p.cmdBase.cmdHome.getUseageTemplate(true) ); //this.requiredArgs.add("");
pageLines.add( p.txt.parse("<i>Learn how to create a faction on the next page.") ); this.optionalArgs.put("page", "1");
helpPages.add(pageLines);
this.permission = Permission.HELP.node;
pageLines = new ArrayList<String>(); this.disableOnLock = false;
pageLines.add( p.cmdBase.cmdCreate.getUseageTemplate(true) );
pageLines.add( p.cmdBase.cmdDescription.getUseageTemplate(true) ); senderMustBePlayer = false;
pageLines.add( p.cmdBase.cmdTag.getUseageTemplate(true) ); senderMustBeMember = false;
pageLines.add( p.txt.parse("<i>You might want to close it and use invitations:" )); senderMustBeModerator = false;
pageLines.add( p.cmdBase.cmdOpen.getUseageTemplate(true) ); senderMustBeAdmin = false;
pageLines.add( p.cmdBase.cmdInvite.getUseageTemplate(true) ); }
pageLines.add( p.cmdBase.cmdDeinvite.getUseageTemplate(true) );
pageLines.add( p.txt.parse("<i>And don't forget to set your home:" )); @Override
pageLines.add( p.cmdBase.cmdSethome.getUseageTemplate(true) ); public void perform() {
helpPages.add(pageLines); if (helpPages == null) updateHelp();
if (Econ.isSetup() && Conf.econEnabled && Conf.bankEnabled) int page = this.argAsInt(0, 1);
{
pageLines = new ArrayList<String>(); sendMessage(p.txt.titleize("Factions Help (" + page + "/" + helpPages.size() + ")"));
pageLines.add( "" );
pageLines.add( p.txt.parse("<i>Your faction has a bank which is used to pay for certain" )); page -= 1;
pageLines.add( p.txt.parse("<i>things, so it will need to have money deposited into it." ));
pageLines.add( p.txt.parse("<i>To learn more, use the money command." )); if (page < 0 || page >= helpPages.size()) {
pageLines.add( "" ); msg("<b>This page does not exist");
pageLines.add( p.cmdBase.cmdMoney.getUseageTemplate(true) ); return;
pageLines.add( "" ); }
pageLines.add( "" ); sendMessage(helpPages.get(page));
pageLines.add( "" ); }
helpPages.add(pageLines);
} //----------------------------------------------//
// Build the help pages
pageLines = new ArrayList<String>(); //----------------------------------------------//
pageLines.add( p.cmdBase.cmdClaim.getUseageTemplate(true) );
pageLines.add( p.cmdBase.cmdAutoClaim.getUseageTemplate(true) ); public ArrayList<ArrayList<String>> helpPages;
pageLines.add( p.cmdBase.cmdUnclaim.getUseageTemplate(true) );
pageLines.add( p.cmdBase.cmdUnclaimall.getUseageTemplate(true) ); public void updateHelp() {
pageLines.add( p.cmdBase.cmdKick.getUseageTemplate(true) ); helpPages = new ArrayList<ArrayList<String>>();
pageLines.add( p.cmdBase.cmdMod.getUseageTemplate(true) ); ArrayList<String> pageLines;
pageLines.add( p.cmdBase.cmdAdmin.getUseageTemplate(true) );
pageLines.add( p.cmdBase.cmdTitle.getUseageTemplate(true) ); pageLines = new ArrayList<String>();
pageLines.add( p.txt.parse("<i>Player titles are just for fun. No rules connected to them." )); pageLines.add(p.cmdBase.cmdHelp.getUseageTemplate(true));
helpPages.add(pageLines); pageLines.add(p.cmdBase.cmdList.getUseageTemplate(true));
pageLines.add(p.cmdBase.cmdShow.getUseageTemplate(true));
pageLines = new ArrayList<String>(); pageLines.add(p.cmdBase.cmdPower.getUseageTemplate(true));
pageLines.add( p.cmdBase.cmdMap.getUseageTemplate(true) ); pageLines.add(p.cmdBase.cmdJoin.getUseageTemplate(true));
pageLines.add( p.cmdBase.cmdBoom.getUseageTemplate(true) ); pageLines.add(p.cmdBase.cmdLeave.getUseageTemplate(true));
pageLines.add( p.cmdBase.cmdOwner.getUseageTemplate(true) ); pageLines.add(p.cmdBase.cmdChat.getUseageTemplate(true));
pageLines.add( p.cmdBase.cmdOwnerList.getUseageTemplate(true) ); pageLines.add(p.cmdBase.cmdHome.getUseageTemplate(true));
pageLines.add(p.txt.parse("<i>Claimed land with ownership set is further protected so")); pageLines.add(p.txt.parse("<i>Learn how to create a faction on the next page."));
pageLines.add(p.txt.parse("<i>that only the owner(s), faction admin, and possibly the")); helpPages.add(pageLines);
pageLines.add(p.txt.parse("<i>faction moderators have full access."));
helpPages.add(pageLines); pageLines = new ArrayList<String>();
pageLines.add(p.cmdBase.cmdCreate.getUseageTemplate(true));
pageLines = new ArrayList<String>(); pageLines.add(p.cmdBase.cmdDescription.getUseageTemplate(true));
pageLines.add( p.cmdBase.cmdDisband.getUseageTemplate(true) ); pageLines.add(p.cmdBase.cmdTag.getUseageTemplate(true));
pageLines.add(""); pageLines.add(p.txt.parse("<i>You might want to close it and use invitations:"));
pageLines.add( p.cmdBase.cmdRelationAlly.getUseageTemplate(true) ); pageLines.add(p.cmdBase.cmdOpen.getUseageTemplate(true));
pageLines.add( p.cmdBase.cmdRelationNeutral.getUseageTemplate(true) ); pageLines.add(p.cmdBase.cmdInvite.getUseageTemplate(true));
pageLines.add( p.cmdBase.cmdRelationEnemy.getUseageTemplate(true) ); pageLines.add(p.cmdBase.cmdDeinvite.getUseageTemplate(true));
pageLines.add(p.txt.parse("<i>Set the relation you WISH to have with another faction.")); pageLines.add(p.txt.parse("<i>And don't forget to set your home:"));
pageLines.add(p.txt.parse("<i>Your default relation with other factions will be neutral.")); pageLines.add(p.cmdBase.cmdSethome.getUseageTemplate(true));
pageLines.add(p.txt.parse("<i>If BOTH factions choose \"ally\" you will be allies.")); helpPages.add(pageLines);
pageLines.add(p.txt.parse("<i>If ONE faction chooses \"enemy\" you will be enemies."));
helpPages.add(pageLines); if (Econ.isSetup() && Conf.econEnabled && Conf.bankEnabled) {
pageLines = new ArrayList<String>();
pageLines = new ArrayList<String>(); pageLines.add("");
pageLines.add(p.txt.parse("<i>You can never hurt members or allies.")); pageLines.add(p.txt.parse("<i>Your faction has a bank which is used to pay for certain"));
pageLines.add(p.txt.parse("<i>You can not hurt neutrals in their own territory.")); pageLines.add(p.txt.parse("<i>things, so it will need to have money deposited into it."));
pageLines.add(p.txt.parse("<i>You can always hurt enemies and players without faction.")); pageLines.add(p.txt.parse("<i>To learn more, use the money command."));
pageLines.add(""); pageLines.add("");
pageLines.add(p.txt.parse("<i>Damage from enemies is reduced in your own territory.")); pageLines.add(p.cmdBase.cmdMoney.getUseageTemplate(true));
pageLines.add(p.txt.parse("<i>When you die you lose power. It is restored over time.")); pageLines.add("");
pageLines.add(p.txt.parse("<i>The power of a faction is the sum of all member power.")); pageLines.add("");
pageLines.add(p.txt.parse("<i>The power of a faction determines how much land it can hold.")); pageLines.add("");
pageLines.add(p.txt.parse("<i>You can claim land from factions with too little power.")); helpPages.add(pageLines);
helpPages.add(pageLines); }
pageLines = new ArrayList<String>(); pageLines = new ArrayList<String>();
pageLines.add(p.txt.parse("<i>Only faction members can build and destroy in their own")); pageLines.add(p.cmdBase.cmdClaim.getUseageTemplate(true));
pageLines.add(p.txt.parse("<i>territory. Usage of the following items is also restricted:")); pageLines.add(p.cmdBase.cmdAutoClaim.getUseageTemplate(true));
pageLines.add(p.txt.parse("<i>Door, Chest, Furnace, Dispenser, Diode.")); pageLines.add(p.cmdBase.cmdUnclaim.getUseageTemplate(true));
pageLines.add(""); pageLines.add(p.cmdBase.cmdUnclaimall.getUseageTemplate(true));
pageLines.add(p.txt.parse("<i>Make sure to put pressure plates in front of doors for your")); pageLines.add(p.cmdBase.cmdKick.getUseageTemplate(true));
pageLines.add(p.txt.parse("<i>guest visitors. Otherwise they can't get through. You can")); pageLines.add(p.cmdBase.cmdMod.getUseageTemplate(true));
pageLines.add(p.txt.parse("<i>also use this to create member only areas.")); pageLines.add(p.cmdBase.cmdAdmin.getUseageTemplate(true));
pageLines.add(p.txt.parse("<i>As dispensers are protected, you can create traps without")); pageLines.add(p.cmdBase.cmdTitle.getUseageTemplate(true));
pageLines.add(p.txt.parse("<i>worrying about those arrows getting stolen.")); pageLines.add(p.txt.parse("<i>Player titles are just for fun. No rules connected to them."));
helpPages.add(pageLines); helpPages.add(pageLines);
pageLines = new ArrayList<String>(); pageLines = new ArrayList<String>();
pageLines.add("Finally some commands for the server admins:"); pageLines.add(p.cmdBase.cmdMap.getUseageTemplate(true));
pageLines.add( p.cmdBase.cmdBypass.getUseageTemplate(true) ); pageLines.add(p.cmdBase.cmdBoom.getUseageTemplate(true));
pageLines.add(p.txt.parse("<c>/f claim safezone <i>claim land for the Safe Zone")); pageLines.add(p.cmdBase.cmdOwner.getUseageTemplate(true));
pageLines.add(p.txt.parse("<c>/f claim warzone <i>claim land for the War Zone")); pageLines.add(p.cmdBase.cmdOwnerList.getUseageTemplate(true));
pageLines.add(p.txt.parse("<c>/f autoclaim [safezone|warzone] <i>take a guess")); pageLines.add(p.txt.parse("<i>Claimed land with ownership set is further protected so"));
pageLines.add( p.cmdBase.cmdSafeunclaimall.getUseageTemplate(true) ); pageLines.add(p.txt.parse("<i>that only the owner(s), faction admin, and possibly the"));
pageLines.add( p.cmdBase.cmdWarunclaimall.getUseageTemplate(true) ); pageLines.add(p.txt.parse("<i>faction moderators have full access."));
pageLines.add(p.txt.parse("<i>Note: " + p.cmdBase.cmdUnclaim.getUseageTemplate(false) + P.p.txt.parse("<i>") + " works on safe/war zones as well.")); helpPages.add(pageLines);
pageLines.add( p.cmdBase.cmdPeaceful.getUseageTemplate(true) );
helpPages.add(pageLines); pageLines = new ArrayList<String>();
pageLines.add(p.cmdBase.cmdDisband.getUseageTemplate(true));
pageLines = new ArrayList<String>(); pageLines.add("");
pageLines.add(p.txt.parse("<i>More commands for server admins:")); pageLines.add(p.cmdBase.cmdRelationAlly.getUseageTemplate(true));
pageLines.add( p.cmdBase.cmdChatSpy.getUseageTemplate(true) ); pageLines.add(p.cmdBase.cmdRelationNeutral.getUseageTemplate(true));
pageLines.add( p.cmdBase.cmdPermanent.getUseageTemplate(true) ); pageLines.add(p.cmdBase.cmdRelationEnemy.getUseageTemplate(true));
pageLines.add( p.cmdBase.cmdPermanentPower.getUseageTemplate(true) ); pageLines.add(p.txt.parse("<i>Set the relation you WISH to have with another faction."));
pageLines.add( p.cmdBase.cmdPowerBoost.getUseageTemplate(true) ); pageLines.add(p.txt.parse("<i>Your default relation with other factions will be neutral."));
pageLines.add( p.cmdBase.cmdConfig.getUseageTemplate(true) ); pageLines.add(p.txt.parse("<i>If BOTH factions choose \"ally\" you will be allies."));
helpPages.add(pageLines); pageLines.add(p.txt.parse("<i>If ONE faction chooses \"enemy\" you will be enemies."));
helpPages.add(pageLines);
pageLines = new ArrayList<String>();
pageLines.add(p.txt.parse("<i>Even more commands for server admins:")); pageLines = new ArrayList<String>();
pageLines.add( p.cmdBase.cmdLock.getUseageTemplate(true) ); pageLines.add(p.txt.parse("<i>You can never hurt members or allies."));
pageLines.add( p.cmdBase.cmdReload.getUseageTemplate(true) ); pageLines.add(p.txt.parse("<i>You can not hurt neutrals in their own territory."));
pageLines.add( p.cmdBase.cmdSaveAll.getUseageTemplate(true) ); pageLines.add(p.txt.parse("<i>You can always hurt enemies and players without faction."));
pageLines.add( p.cmdBase.cmdVersion.getUseageTemplate(true) ); pageLines.add("");
helpPages.add(pageLines); pageLines.add(p.txt.parse("<i>Damage from enemies is reduced in your own territory."));
} pageLines.add(p.txt.parse("<i>When you die you lose power. It is restored over time."));
pageLines.add(p.txt.parse("<i>The power of a faction is the sum of all member power."));
pageLines.add(p.txt.parse("<i>The power of a faction determines how much land it can hold."));
pageLines.add(p.txt.parse("<i>You can claim land from factions with too little power."));
helpPages.add(pageLines);
pageLines = new ArrayList<String>();
pageLines.add(p.txt.parse("<i>Only faction members can build and destroy in their own"));
pageLines.add(p.txt.parse("<i>territory. Usage of the following items is also restricted:"));
pageLines.add(p.txt.parse("<i>Door, Chest, Furnace, Dispenser, Diode."));
pageLines.add("");
pageLines.add(p.txt.parse("<i>Make sure to put pressure plates in front of doors for your"));
pageLines.add(p.txt.parse("<i>guest visitors. Otherwise they can't get through. You can"));
pageLines.add(p.txt.parse("<i>also use this to create member only areas."));
pageLines.add(p.txt.parse("<i>As dispensers are protected, you can create traps without"));
pageLines.add(p.txt.parse("<i>worrying about those arrows getting stolen."));
helpPages.add(pageLines);
pageLines = new ArrayList<String>();
pageLines.add("Finally some commands for the server admins:");
pageLines.add(p.cmdBase.cmdBypass.getUseageTemplate(true));
pageLines.add(p.txt.parse("<c>/f claim safezone <i>claim land for the Safe Zone"));
pageLines.add(p.txt.parse("<c>/f claim warzone <i>claim land for the War Zone"));
pageLines.add(p.txt.parse("<c>/f autoclaim [safezone|warzone] <i>take a guess"));
pageLines.add(p.cmdBase.cmdSafeunclaimall.getUseageTemplate(true));
pageLines.add(p.cmdBase.cmdWarunclaimall.getUseageTemplate(true));
pageLines.add(p.txt.parse("<i>Note: " + p.cmdBase.cmdUnclaim.getUseageTemplate(false) + P.p.txt.parse("<i>") + " works on safe/war zones as well."));
pageLines.add(p.cmdBase.cmdPeaceful.getUseageTemplate(true));
helpPages.add(pageLines);
pageLines = new ArrayList<String>();
pageLines.add(p.txt.parse("<i>More commands for server admins:"));
pageLines.add(p.cmdBase.cmdChatSpy.getUseageTemplate(true));
pageLines.add(p.cmdBase.cmdPermanent.getUseageTemplate(true));
pageLines.add(p.cmdBase.cmdPermanentPower.getUseageTemplate(true));
pageLines.add(p.cmdBase.cmdPowerBoost.getUseageTemplate(true));
pageLines.add(p.cmdBase.cmdConfig.getUseageTemplate(true));
helpPages.add(pageLines);
pageLines = new ArrayList<String>();
pageLines.add(p.txt.parse("<i>Even more commands for server admins:"));
pageLines.add(p.cmdBase.cmdLock.getUseageTemplate(true));
pageLines.add(p.cmdBase.cmdReload.getUseageTemplate(true));
pageLines.add(p.cmdBase.cmdSaveAll.getUseageTemplate(true));
pageLines.add(p.cmdBase.cmdVersion.getUseageTemplate(true));
helpPages.add(pageLines);
}
} }

View File

@ -1,148 +1,132 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import java.util.ArrayList; import com.massivecraft.factions.*;
import java.util.List;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import com.massivecraft.factions.Board;
import com.massivecraft.factions.Conf;
import com.massivecraft.factions.FLocation;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.FPlayers;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.integration.EssentialsFeatures; import com.massivecraft.factions.integration.EssentialsFeatures;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
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.zcore.util.SmokeUtil; import com.massivecraft.factions.zcore.util.SmokeUtil;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class CmdHome extends FCommand public class CmdHome extends FCommand {
{
public CmdHome()
{
super();
this.aliases.add("home");
//this.requiredArgs.add("");
//this.optionalArgs.put("", "");
this.permission = Permission.HOME.node;
this.disableOnLock = false;
senderMustBePlayer = true;
senderMustBeMember = true;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
// TODO: Hide this command on help also.
if ( ! Conf.homesEnabled)
{
fme.msg("<b>Sorry, Faction homes are disabled on this server.");
return;
}
if ( ! Conf.homesTeleportCommandEnabled) public CmdHome() {
{ super();
fme.msg("<b>Sorry, the ability to teleport to Faction homes is disabled on this server."); this.aliases.add("home");
return;
}
if ( ! myFaction.hasHome())
{
fme.msg("<b>Your faction does not have a home. " + (fme.getRole().value < Role.MODERATOR.value ? "<i> Ask your leader to:" : "<i>You should:"));
fme.sendMessage(p.cmdBase.cmdSethome.getUseageTemplate());
return;
}
if ( ! Conf.homesTeleportAllowedFromEnemyTerritory && fme.isInEnemyTerritory())
{
fme.msg("<b>You cannot teleport to your faction home while in the territory of an enemy faction.");
return;
}
if ( ! Conf.homesTeleportAllowedFromDifferentWorld && me.getWorld().getUID() != myFaction.getHome().getWorld().getUID())
{
fme.msg("<b>You cannot teleport to your faction home while in a different world.");
return;
}
Faction faction = Board.getFactionAt(new FLocation(me.getLocation()));
Location loc = me.getLocation().clone();
// if player is not in a safe zone or their own faction territory, only allow teleport if no enemies are nearby
if
(
Conf.homesTeleportAllowedEnemyDistance > 0
&&
! faction.isSafeZone()
&&
(
! fme.isInOwnTerritory()
||
(
fme.isInOwnTerritory()
&&
! Conf.homesTeleportIgnoreEnemiesIfInOwnTerritory
)
)
)
{
World w = loc.getWorld();
double x = loc.getX();
double y = loc.getY();
double z = loc.getZ();
for (Player p : me.getServer().getOnlinePlayers()) //this.requiredArgs.add("");
{ //this.optionalArgs.put("", "");
if (p == null || !p.isOnline() || p.isDead() || p == me || p.getWorld() != w)
continue;
FPlayer fp = FPlayers.i.get(p); this.permission = Permission.HOME.node;
if (fme.getRelationTo(fp) != Relation.ENEMY) this.disableOnLock = false;
continue;
Location l = p.getLocation(); senderMustBePlayer = true;
double dx = Math.abs(x - l.getX()); senderMustBeMember = true;
double dy = Math.abs(y - l.getY()); senderMustBeModerator = false;
double dz = Math.abs(z - l.getZ()); senderMustBeAdmin = false;
double max = Conf.homesTeleportAllowedEnemyDistance; }
// box-shaped distance check @Override
if (dx > max || dy > max || dz > max) public void perform() {
continue; // TODO: Hide this command on help also.
if (!Conf.homesEnabled) {
fme.msg("<b>Sorry, Faction homes are disabled on this server.");
return;
}
fme.msg("<b>You cannot teleport to your faction home while an enemy is within " + Conf.homesTeleportAllowedEnemyDistance + " blocks of you."); if (!Conf.homesTeleportCommandEnabled) {
return; fme.msg("<b>Sorry, the ability to teleport to Faction homes is disabled on this server.");
} return;
} }
// if Essentials teleport handling is enabled and available, pass the teleport off to it (for delay and cooldown) if (!myFaction.hasHome()) {
if (EssentialsFeatures.handleTeleport(me, myFaction.getHome())) return; fme.msg("<b>Your faction does not have a home. " + (fme.getRole().value < Role.MODERATOR.value ? "<i> Ask your leader to:" : "<i>You should:"));
fme.sendMessage(p.cmdBase.cmdSethome.getUseageTemplate());
return;
}
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay if (!Conf.homesTeleportAllowedFromEnemyTerritory && fme.isInEnemyTerritory()) {
if ( ! payForCommand(Conf.econCostHome, "to teleport to your faction home", "for teleporting to your faction home")) return; fme.msg("<b>You cannot teleport to your faction home while in the territory of an enemy faction.");
return;
}
if (!Conf.homesTeleportAllowedFromDifferentWorld && me.getWorld().getUID() != myFaction.getHome().getWorld().getUID()) {
fme.msg("<b>You cannot teleport to your faction home while in a different world.");
return;
}
Faction faction = Board.getFactionAt(new FLocation(me.getLocation()));
Location loc = me.getLocation().clone();
// if player is not in a safe zone or their own faction territory, only allow teleport if no enemies are nearby
if
(
Conf.homesTeleportAllowedEnemyDistance > 0
&&
!faction.isSafeZone()
&&
(
!fme.isInOwnTerritory()
||
(
fme.isInOwnTerritory()
&&
!Conf.homesTeleportIgnoreEnemiesIfInOwnTerritory
)
)
) {
World w = loc.getWorld();
double x = loc.getX();
double y = loc.getY();
double z = loc.getZ();
for (Player p : me.getServer().getOnlinePlayers()) {
if (p == null || !p.isOnline() || p.isDead() || p == me || p.getWorld() != w)
continue;
FPlayer fp = FPlayers.i.get(p);
if (fme.getRelationTo(fp) != Relation.ENEMY)
continue;
Location l = p.getLocation();
double dx = Math.abs(x - l.getX());
double dy = Math.abs(y - l.getY());
double dz = Math.abs(z - l.getZ());
double max = Conf.homesTeleportAllowedEnemyDistance;
// box-shaped distance check
if (dx > max || dy > max || dz > max)
continue;
fme.msg("<b>You cannot teleport to your faction home while an enemy is within " + Conf.homesTeleportAllowedEnemyDistance + " blocks of you.");
return;
}
}
// if Essentials teleport handling is enabled and available, pass the teleport off to it (for delay and cooldown)
if (EssentialsFeatures.handleTeleport(me, myFaction.getHome())) return;
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay
if (!payForCommand(Conf.econCostHome, "to teleport to your faction home", "for teleporting to your faction home"))
return;
// Create a smoke effect
if (Conf.homesTeleportCommandSmokeEffectEnabled) {
List<Location> smokeLocations = new ArrayList<Location>();
smokeLocations.add(loc);
smokeLocations.add(loc.add(0, 1, 0));
smokeLocations.add(myFaction.getHome());
smokeLocations.add(myFaction.getHome().clone().add(0, 1, 0));
SmokeUtil.spawnCloudRandom(smokeLocations, Conf.homesTeleportCommandSmokeEffectThickness);
}
me.teleport(myFaction.getHome());
}
// Create a smoke effect
if (Conf.homesTeleportCommandSmokeEffectEnabled)
{
List<Location> smokeLocations = new ArrayList<Location>();
smokeLocations.add(loc);
smokeLocations.add(loc.add(0, 1, 0));
smokeLocations.add(myFaction.getHome());
smokeLocations.add(myFaction.getHome().clone().add(0, 1, 0));
SmokeUtil.spawnCloudRandom(smokeLocations, Conf.homesTeleportCommandSmokeEffectThickness);
}
me.teleport(myFaction.getHome());
}
} }

View File

@ -4,46 +4,42 @@ import com.massivecraft.factions.Conf;
import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdInvite extends FCommand public class CmdInvite extends FCommand {
{ public CmdInvite() {
public CmdInvite() super();
{ this.aliases.add("invite");
super(); this.aliases.add("inv");
this.aliases.add("invite");
this.aliases.add("inv");
this.requiredArgs.add("player name");
//this.optionalArgs.put("", "");
this.permission = Permission.INVITE.node;
this.disableOnLock = true;
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = true;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
FPlayer you = this.argAsBestFPlayerMatch(0);
if (you == null) return;
if (you.getFaction() == myFaction)
{
msg("%s<i> is already a member of %s", you.getName(), myFaction.getTag());
msg("<i>You might want to: " + p.cmdBase.cmdKick.getUseageTemplate(false));
return;
}
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay this.requiredArgs.add("player name");
if ( ! payForCommand(Conf.econCostInvite, "to invite someone", "for inviting someone")) return; //this.optionalArgs.put("", "");
this.permission = Permission.INVITE.node;
this.disableOnLock = true;
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = true;
senderMustBeAdmin = false;
}
@Override
public void perform() {
FPlayer you = this.argAsBestFPlayerMatch(0);
if (you == null) return;
if (you.getFaction() == myFaction) {
msg("%s<i> is already a member of %s", you.getName(), myFaction.getTag());
msg("<i>You might want to: " + p.cmdBase.cmdKick.getUseageTemplate(false));
return;
}
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay
if (!payForCommand(Conf.econCostInvite, "to invite someone", "for inviting someone")) return;
myFaction.invite(you);
you.msg("%s<i> invited you to %s", fme.describeTo(you, true), myFaction.describeTo(you));
myFaction.msg("%s<i> invited %s<i> to your faction.", fme.describeTo(myFaction, true), you.describeTo(myFaction));
}
myFaction.invite(you);
you.msg("%s<i> invited you to %s", fme.describeTo(you, true), myFaction.describeTo(you));
myFaction.msg("%s<i> invited %s<i> to your faction.", fme.describeTo(myFaction, true), you.describeTo(myFaction));
}
} }

View File

@ -1,114 +1,98 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import org.bukkit.Bukkit; import com.massivecraft.factions.*;
import com.massivecraft.factions.Conf;
import com.massivecraft.factions.FPlayers;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.P;
import com.massivecraft.factions.event.FPlayerJoinEvent; import com.massivecraft.factions.event.FPlayerJoinEvent;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import org.bukkit.Bukkit;
public class CmdJoin extends FCommand public class CmdJoin extends FCommand {
{ public CmdJoin() {
public CmdJoin() super();
{ this.aliases.add("join");
super();
this.aliases.add("join");
this.requiredArgs.add("faction name");
this.optionalArgs.put("player", "you");
this.permission = Permission.JOIN.node;
this.disableOnLock = true;
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
Faction faction = this.argAsFaction(0);
if (faction == null) return;
FPlayer fplayer = this.argAsBestFPlayerMatch(1, fme, false); this.requiredArgs.add("faction name");
boolean samePlayer = fplayer == fme; this.optionalArgs.put("player", "you");
if (!samePlayer && ! Permission.JOIN_OTHERS.has(sender, false)) this.permission = Permission.JOIN.node;
{ this.disableOnLock = true;
msg("<b>You do not have permission to move other players into a faction.");
return;
}
if ( ! faction.isNormal()) senderMustBePlayer = true;
{ senderMustBeMember = false;
msg("<b>Players may only join normal factions. This is a system faction."); senderMustBeModerator = false;
return; senderMustBeAdmin = false;
} }
if (faction == fplayer.getFaction()) @Override
{ public void perform() {
msg("<b>%s %s already a member of %s", fplayer.describeTo(fme, true), (samePlayer ? "are" : "is"), faction.getTag(fme)); Faction faction = this.argAsFaction(0);
return; if (faction == null) return;
}
if (Conf.factionMemberLimit > 0 && faction.getFPlayers().size() >= Conf.factionMemberLimit) FPlayer fplayer = this.argAsBestFPlayerMatch(1, fme, false);
{ boolean samePlayer = fplayer == fme;
msg(" <b>!<white> The faction %s is at the limit of %d members, so %s cannot currently join.", faction.getTag(fme), Conf.factionMemberLimit, fplayer.describeTo(fme, false));
return;
}
if (fplayer.hasFaction()) if (!samePlayer && !Permission.JOIN_OTHERS.has(sender, false)) {
{ msg("<b>You do not have permission to move other players into a faction.");
msg("<b>%s must leave %s current faction first.", fplayer.describeTo(fme, true), (samePlayer ? "your" : "their")); return;
return; }
}
if (!Conf.canLeaveWithNegativePower && fplayer.getPower() < 0) if (!faction.isNormal()) {
{ msg("<b>Players may only join normal factions. This is a system faction.");
msg("<b>%s cannot join a faction with a negative power level.", fplayer.describeTo(fme, true)); return;
return; }
}
if( ! (faction.getOpen() || faction.isInvited(fplayer) || fme.isAdminBypassing() || Permission.JOIN_ANY.has(sender, false))) if (faction == fplayer.getFaction()) {
{ msg("<b>%s %s already a member of %s", fplayer.describeTo(fme, true), (samePlayer ? "are" : "is"), faction.getTag(fme));
msg("<i>This faction requires invitation."); return;
if (samePlayer) }
faction.msg("%s<i> tried to join your faction.", fplayer.describeTo(faction, true));
return;
}
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make sure they can pay if (Conf.factionMemberLimit > 0 && faction.getFPlayers().size() >= Conf.factionMemberLimit) {
if (samePlayer && ! canAffordCommand(Conf.econCostJoin, "to join a faction")) return; msg(" <b>!<white> The faction %s is at the limit of %d members, so %s cannot currently join.", faction.getTag(fme), Conf.factionMemberLimit, fplayer.describeTo(fme, false));
return;
}
// trigger the join event (cancellable) if (fplayer.hasFaction()) {
FPlayerJoinEvent joinEvent = new FPlayerJoinEvent(FPlayers.i.get(me),faction,FPlayerJoinEvent.PlayerJoinReason.COMMAND); msg("<b>%s must leave %s current faction first.", fplayer.describeTo(fme, true), (samePlayer ? "your" : "their"));
Bukkit.getServer().getPluginManager().callEvent(joinEvent); return;
if (joinEvent.isCancelled()) return; }
// then make 'em pay (if applicable) if (!Conf.canLeaveWithNegativePower && fplayer.getPower() < 0) {
if (samePlayer && ! payForCommand(Conf.econCostJoin, "to join a faction", "for joining a faction")) return; msg("<b>%s cannot join a faction with a negative power level.", fplayer.describeTo(fme, true));
return;
}
fme.msg("<i>%s successfully joined %s.", fplayer.describeTo(fme, true), faction.getTag(fme)); if (!(faction.getOpen() || faction.isInvited(fplayer) || fme.isAdminBypassing() || Permission.JOIN_ANY.has(sender, false))) {
msg("<i>This faction requires invitation.");
if (samePlayer)
faction.msg("%s<i> tried to join your faction.", fplayer.describeTo(faction, true));
return;
}
if (!samePlayer) // if economy is enabled, they're not on the bypass list, and this command has a cost set, make sure they can pay
fplayer.msg("<i>%s moved you into the faction %s.", fme.describeTo(fplayer, true), faction.getTag(fplayer)); if (samePlayer && !canAffordCommand(Conf.econCostJoin, "to join a faction")) return;
faction.msg("<i>%s joined your faction.", fplayer.describeTo(faction, true));
fplayer.resetFactionData(); // trigger the join event (cancellable)
fplayer.setFaction(faction); FPlayerJoinEvent joinEvent = new FPlayerJoinEvent(FPlayers.i.get(me), faction, FPlayerJoinEvent.PlayerJoinReason.COMMAND);
faction.deinvite(fplayer); Bukkit.getServer().getPluginManager().callEvent(joinEvent);
if (joinEvent.isCancelled()) return;
if (Conf.logFactionJoin) // then make 'em pay (if applicable)
{ if (samePlayer && !payForCommand(Conf.econCostJoin, "to join a faction", "for joining a faction")) return;
if (samePlayer)
P.p.log("%s joined the faction %s.", fplayer.getName(), faction.getTag()); fme.msg("<i>%s successfully joined %s.", fplayer.describeTo(fme, true), faction.getTag(fme));
else
P.p.log("%s moved the player %s into the faction %s.", fme.getName(), fplayer.getName(), faction.getTag()); if (!samePlayer)
} fplayer.msg("<i>%s moved you into the faction %s.", fme.describeTo(fplayer, true), faction.getTag(fplayer));
} faction.msg("<i>%s joined your faction.", fplayer.describeTo(faction, true));
fplayer.resetFactionData();
fplayer.setFaction(faction);
faction.deinvite(fplayer);
if (Conf.logFactionJoin) {
if (samePlayer)
P.p.log("%s joined the faction %s.", fplayer.getName(), faction.getTag());
else
P.p.log("%s moved the player %s into the faction %s.", fme.getName(), fplayer.getName(), faction.getTag());
}
}
} }

View File

@ -1,7 +1,5 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import org.bukkit.Bukkit;
import com.massivecraft.factions.Conf; import com.massivecraft.factions.Conf;
import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.Faction; import com.massivecraft.factions.Faction;
@ -9,91 +7,84 @@ import com.massivecraft.factions.P;
import com.massivecraft.factions.event.FPlayerLeaveEvent; import com.massivecraft.factions.event.FPlayerLeaveEvent;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.struct.Role; import com.massivecraft.factions.struct.Role;
import org.bukkit.Bukkit;
public class CmdKick extends FCommand public class CmdKick extends FCommand {
{
public CmdKick()
{
super();
this.aliases.add("kick");
this.requiredArgs.add("player name");
//this.optionalArgs.put("", "");
this.permission = Permission.KICK.node;
this.disableOnLock = false;
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = true;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
FPlayer you = this.argAsBestFPlayerMatch(0);
if (you == null) return;
if (fme == you)
{
msg("<b>You cannot kick yourself.");
msg("<i>You might want to: %s", p.cmdBase.cmdLeave.getUseageTemplate(false));
return;
}
Faction yourFaction = you.getFaction(); public CmdKick() {
super();
this.aliases.add("kick");
// players with admin-level "disband" permission can bypass these requirements this.requiredArgs.add("player name");
if ( ! Permission.KICK_ANY.has(sender)) //this.optionalArgs.put("", "");
{
if (yourFaction != myFaction)
{
msg("%s<b> is not a member of %s", you.describeTo(fme, true), myFaction.describeTo(fme));
return;
}
if (you.getRole().value >= fme.getRole().value) this.permission = Permission.KICK.node;
{ this.disableOnLock = false;
// TODO add more informative messages.
msg("<b>Your rank is too low to kick this player.");
return;
}
if ( ! Conf.canLeaveWithNegativePower && you.getPower() < 0) senderMustBePlayer = true;
{ senderMustBeMember = false;
msg("<b>You cannot kick that member until their power is positive."); senderMustBeModerator = true;
return; senderMustBeAdmin = false;
} }
}
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make sure they can pay @Override
if ( ! canAffordCommand(Conf.econCostKick, "to kick someone from the faction")) return; public void perform() {
FPlayer you = this.argAsBestFPlayerMatch(0);
if (you == null) return;
// trigger the leave event (cancellable) [reason:kicked] if (fme == you) {
FPlayerLeaveEvent event = new FPlayerLeaveEvent(you, you.getFaction(), FPlayerLeaveEvent.PlayerLeaveReason.KICKED); msg("<b>You cannot kick yourself.");
Bukkit.getServer().getPluginManager().callEvent(event); msg("<i>You might want to: %s", p.cmdBase.cmdLeave.getUseageTemplate(false));
if (event.isCancelled()) return; return;
}
// then make 'em pay (if applicable) Faction yourFaction = you.getFaction();
if ( ! payForCommand(Conf.econCostKick, "to kick someone from the faction", "for kicking someone from the faction")) return;
yourFaction.msg("%s<i> kicked %s<i> from the faction! :O", fme.describeTo(yourFaction, true), you.describeTo(yourFaction, true)); // players with admin-level "disband" permission can bypass these requirements
you.msg("%s<i> kicked you from %s<i>! :O", fme.describeTo(you, true), yourFaction.describeTo(you)); if (!Permission.KICK_ANY.has(sender)) {
if (yourFaction != myFaction) if (yourFaction != myFaction) {
{ msg("%s<b> is not a member of %s", you.describeTo(fme, true), myFaction.describeTo(fme));
fme.msg("<i>You kicked %s<i> from the faction %s<i>!", you.describeTo(fme), yourFaction.describeTo(fme)); return;
} }
if (Conf.logFactionKick) if (you.getRole().value >= fme.getRole().value) {
P.p.log((senderIsConsole ? "A console command" : fme.getName())+" kicked "+you.getName()+" from the faction: "+yourFaction.getTag()); // TODO add more informative messages.
msg("<b>Your rank is too low to kick this player.");
return;
}
if (you.getRole() == Role.ADMIN) if (!Conf.canLeaveWithNegativePower && you.getPower() < 0) {
yourFaction.promoteNewLeader(); msg("<b>You cannot kick that member until their power is positive.");
return;
}
}
yourFaction.deinvite(you); // if economy is enabled, they're not on the bypass list, and this command has a cost set, make sure they can pay
you.resetFactionData(); if (!canAffordCommand(Conf.econCostKick, "to kick someone from the faction")) return;
}
// trigger the leave event (cancellable) [reason:kicked]
FPlayerLeaveEvent event = new FPlayerLeaveEvent(you, you.getFaction(), FPlayerLeaveEvent.PlayerLeaveReason.KICKED);
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) return;
// then make 'em pay (if applicable)
if (!payForCommand(Conf.econCostKick, "to kick someone from the faction", "for kicking someone from the faction"))
return;
yourFaction.msg("%s<i> kicked %s<i> from the faction! :O", fme.describeTo(yourFaction, true), you.describeTo(yourFaction, true));
you.msg("%s<i> kicked you from %s<i>! :O", fme.describeTo(you, true), yourFaction.describeTo(you));
if (yourFaction != myFaction) {
fme.msg("<i>You kicked %s<i> from the faction %s<i>!", you.describeTo(fme), yourFaction.describeTo(fme));
}
if (Conf.logFactionKick)
P.p.log((senderIsConsole ? "A console command" : fme.getName()) + " kicked " + you.getName() + " from the faction: " + yourFaction.getTag());
if (you.getRole() == Role.ADMIN)
yourFaction.promoteNewLeader();
yourFaction.deinvite(you);
you.resetFactionData();
}
} }

View File

@ -3,28 +3,26 @@ package com.massivecraft.factions.cmd;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdLeave extends FCommand { public class CmdLeave extends FCommand {
public CmdLeave() public CmdLeave() {
{ super();
super(); this.aliases.add("leave");
this.aliases.add("leave");
//this.requiredArgs.add("");
//this.requiredArgs.add(""); //this.optionalArgs.put("", "");
//this.optionalArgs.put("", "");
this.permission = Permission.LEAVE.node;
this.permission = Permission.LEAVE.node; this.disableOnLock = true;
this.disableOnLock = true;
senderMustBePlayer = true;
senderMustBePlayer = true; senderMustBeMember = true;
senderMustBeMember = true; senderMustBeModerator = false;
senderMustBeModerator = false; senderMustBeAdmin = false;
senderMustBeAdmin = false; }
}
@Override
@Override public void perform() {
public void perform() fme.leave(true);
{ }
fme.leave(true);
}
} }

View File

@ -1,79 +1,76 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import com.massivecraft.factions.Conf; import com.massivecraft.factions.Conf;
import com.massivecraft.factions.Faction; import com.massivecraft.factions.Faction;
import com.massivecraft.factions.Factions; import com.massivecraft.factions.Factions;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class CmdList extends FCommand
{
public CmdList()
{
super();
this.aliases.add("list");
this.aliases.add("ls");
//this.requiredArgs.add("");
this.optionalArgs.put("page", "1");
this.permission = Permission.LIST.node;
this.disableOnLock = false;
senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override public class CmdList extends FCommand {
public void perform()
{
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay
if ( ! payForCommand(Conf.econCostList, "to list the factions", "for listing the factions")) return;
ArrayList<Faction> factionList = new ArrayList<Faction>(Factions.i.get());
factionList.remove(Factions.i.getNone());
factionList.remove(Factions.i.getSafeZone());
factionList.remove(Factions.i.getWarZone());
// Sort by total followers first
Collections.sort(factionList, new Comparator<Faction>(){
@Override
public int compare(Faction f1, Faction f2) {
int f1Size = f1.getFPlayers().size();
int f2Size = f2.getFPlayers().size();
if (f1Size < f2Size)
return 1;
else if (f1Size > f2Size)
return -1;
return 0;
}
});
// Then sort by how many members are online now public CmdList() {
Collections.sort(factionList, new Comparator<Faction>(){ super();
@Override this.aliases.add("list");
public int compare(Faction f1, Faction f2) { this.aliases.add("ls");
int f1Size = f1.getFPlayersWhereOnline(true).size();
int f2Size = f2.getFPlayersWhereOnline(true).size(); //this.requiredArgs.add("");
if (f1Size < f2Size) this.optionalArgs.put("page", "1");
return 1;
else if (f1Size > f2Size) this.permission = Permission.LIST.node;
return -1; this.disableOnLock = false;
return 0;
} senderMustBePlayer = false;
}); senderMustBeMember = false;
senderMustBeModerator = false;
ArrayList<String> lines = new ArrayList<String>(); senderMustBeAdmin = false;
}
@Override
public void perform() {
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay
if (!payForCommand(Conf.econCostList, "to list the factions", "for listing the factions")) return;
ArrayList<Faction> factionList = new ArrayList<Faction>(Factions.i.get());
factionList.remove(Factions.i.getNone());
factionList.remove(Factions.i.getSafeZone());
factionList.remove(Factions.i.getWarZone());
// Sort by total followers first
Collections.sort(factionList, new Comparator<Faction>() {
@Override
public int compare(Faction f1, Faction f2) {
int f1Size = f1.getFPlayers().size();
int f2Size = f2.getFPlayers().size();
if (f1Size < f2Size)
return 1;
else if (f1Size > f2Size)
return -1;
return 0;
}
});
// Then sort by how many members are online now
Collections.sort(factionList, new Comparator<Faction>() {
@Override
public int compare(Faction f1, Faction f2) {
int f1Size = f1.getFPlayersWhereOnline(true).size();
int f2Size = f2.getFPlayersWhereOnline(true).size();
if (f1Size < f2Size)
return 1;
else if (f1Size > f2Size)
return -1;
return 0;
}
});
ArrayList<String> lines = new ArrayList<String>();
/* // this code was really slow on large servers, getting full info for every faction and then only showing 9 of them; rewritten below /* // this code was really slow on large servers, getting full info for every faction and then only showing 9 of them; rewritten below
lines.add(p.txt.parse("<i>Factionless<i> %d online", Factions.i.getNone().getFPlayersWhereOnline(true).size())); lines.add(p.txt.parse("<i>Factionless<i> %d online", Factions.i.getNone().getFPlayersWhereOnline(true).size()));
for (Faction faction : factionList) for (Faction faction : factionList)
{ {
lines.add(p.txt.parse("%s<i> %d/%d online, %d/%d/%d", lines.add(p.txt.parse("%s<i> %d/%d online, %d/%d/%d",
@ -89,39 +86,37 @@ public class CmdList extends FCommand
sendMessage(p.txt.getPage(lines, this.argAsInt(0, 1), "Faction List")); sendMessage(p.txt.getPage(lines, this.argAsInt(0, 1), "Faction List"));
*/ */
factionList.add(0, Factions.i.getNone()); factionList.add(0, Factions.i.getNone());
final int pageheight = 9; final int pageheight = 9;
int pagenumber = this.argAsInt(0, 1); int pagenumber = this.argAsInt(0, 1);
int pagecount = (factionList.size() / pageheight) + 1; int pagecount = (factionList.size() / pageheight) + 1;
if (pagenumber > pagecount) if (pagenumber > pagecount)
pagenumber = pagecount; pagenumber = pagecount;
else if (pagenumber < 1) else if (pagenumber < 1)
pagenumber = 1; pagenumber = 1;
int start = (pagenumber - 1) * pageheight; int start = (pagenumber - 1) * pageheight;
int end = start + pageheight; int end = start + pageheight;
if (end > factionList.size()) if (end > factionList.size())
end = factionList.size(); end = factionList.size();
lines.add(p.txt.titleize("Faction List "+pagenumber+"/"+pagecount)); lines.add(p.txt.titleize("Faction List " + pagenumber + "/" + pagecount));
for (Faction faction : factionList.subList(start, end)) for (Faction faction : factionList.subList(start, end)) {
{ if (faction.isNone()) {
if (faction.isNone()) lines.add(p.txt.parse("<i>Factionless<i> %d online", Factions.i.getNone().getFPlayersWhereOnline(true).size()));
{ continue;
lines.add(p.txt.parse("<i>Factionless<i> %d online", Factions.i.getNone().getFPlayersWhereOnline(true).size())); }
continue; lines.add(p.txt.parse("%s<i> %d/%d online, %d/%d/%d",
} faction.getTag(fme),
lines.add(p.txt.parse("%s<i> %d/%d online, %d/%d/%d", faction.getFPlayersWhereOnline(true).size(),
faction.getTag(fme), faction.getFPlayers().size(),
faction.getFPlayersWhereOnline(true).size(), faction.getLandRounded(),
faction.getFPlayers().size(), faction.getPowerRounded(),
faction.getLandRounded(), faction.getPowerMaxRounded())
faction.getPowerRounded(), );
faction.getPowerMaxRounded()) }
);
}
sendMessage(lines); sendMessage(lines);
} }
} }

View File

@ -3,44 +3,39 @@ package com.massivecraft.factions.cmd;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdLock extends FCommand { public class CmdLock extends FCommand {
// TODO: This solution needs refactoring. // TODO: This solution needs refactoring.
/* /*
factions.lock: factions.lock:
description: use the /f lock [on/off] command to temporarily lock the data files from being overwritten description: use the /f lock [on/off] command to temporarily lock the data files from being overwritten
default: op default: op
*/ */
public CmdLock() public CmdLock() {
{ super();
super(); this.aliases.add("lock");
this.aliases.add("lock");
//this.requiredArgs.add("");
//this.requiredArgs.add(""); this.optionalArgs.put("on/off", "flip");
this.optionalArgs.put("on/off", "flip");
this.permission = Permission.LOCK.node;
this.permission = Permission.LOCK.node; this.disableOnLock = false;
this.disableOnLock = false;
senderMustBePlayer = false;
senderMustBePlayer = false; senderMustBeMember = false;
senderMustBeMember = false; senderMustBeModerator = false;
senderMustBeModerator = false; senderMustBeAdmin = false;
senderMustBeAdmin = false; }
}
@Override
@Override public void perform() {
public void perform() p.setLocked(this.argAsBool(0, !p.getLocked()));
{
p.setLocked(this.argAsBool(0, ! p.getLocked())); if (p.getLocked()) {
msg("<i>Factions is now locked");
if( p.getLocked()) } else {
{ msg("<i>Factions in now unlocked");
msg("<i>Factions is now locked"); }
} }
else
{
msg("<i>Factions in now unlocked");
}
}
} }

View File

@ -6,62 +6,52 @@ import com.massivecraft.factions.FLocation;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdMap extends FCommand public class CmdMap extends FCommand {
{ public CmdMap() {
public CmdMap() super();
{ this.aliases.add("map");
super();
this.aliases.add("map");
//this.requiredArgs.add("");
this.optionalArgs.put("on/off", "once");
this.permission = Permission.MAP.node;
this.disableOnLock = false;
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
if (this.argIsSet(0))
{
if (this.argAsBool(0, ! fme.isMapAutoUpdating()))
{
// Turn on
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay //this.requiredArgs.add("");
if ( ! payForCommand(Conf.econCostMap, "to show the map", "for showing the map")) return; this.optionalArgs.put("on/off", "once");
fme.setMapAutoUpdating(true); this.permission = Permission.MAP.node;
msg("<i>Map auto update <green>ENABLED."); this.disableOnLock = false;
// And show the map once senderMustBePlayer = true;
showMap(); senderMustBeMember = false;
} senderMustBeModerator = false;
else senderMustBeAdmin = false;
{ }
// Turn off
fme.setMapAutoUpdating(false); @Override
msg("<i>Map auto update <red>DISABLED."); public void perform() {
} if (this.argIsSet(0)) {
} if (this.argAsBool(0, !fme.isMapAutoUpdating())) {
else // Turn on
{
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay
if ( ! payForCommand(Conf.econCostMap, "to show the map", "for showing the map")) return; if (!payForCommand(Conf.econCostMap, "to show the map", "for showing the map")) return;
fme.setMapAutoUpdating(true);
msg("<i>Map auto update <green>ENABLED.");
// And show the map once
showMap();
} else {
// Turn off
fme.setMapAutoUpdating(false);
msg("<i>Map auto update <red>DISABLED.");
}
} else {
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay
if (!payForCommand(Conf.econCostMap, "to show the map", "for showing the map")) return;
showMap();
}
}
public void showMap() {
sendMessage(Board.getMap(myFaction, new FLocation(fme), fme.getPlayer().getLocation().getYaw()));
}
showMap();
}
}
public void showMap()
{
sendMessage(Board.getMap(myFaction, new FLocation(fme), fme.getPlayer().getLocation().getYaw()));
}
} }

View File

@ -1,77 +1,67 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.struct.Role; import com.massivecraft.factions.struct.Role;
public class CmdMod extends FCommand public class CmdMod extends FCommand {
{
public CmdMod()
{
super();
this.aliases.add("mod");
this.requiredArgs.add("player name");
//this.optionalArgs.put("", "");
this.permission = Permission.MOD.node;
this.disableOnLock = true;
senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
FPlayer you = this.argAsBestFPlayerMatch(0);
if (you == null) return;
boolean permAny = Permission.MOD_ANY.has(sender, false); public CmdMod() {
Faction targetFaction = you.getFaction(); super();
this.aliases.add("mod");
if (targetFaction != myFaction && !permAny) this.requiredArgs.add("player name");
{ //this.optionalArgs.put("", "");
msg("%s<b> is not a member in your faction.", you.describeTo(fme, true));
return;
}
if (fme != null && fme.getRole() != Role.ADMIN && !permAny) this.permission = Permission.MOD.node;
{ this.disableOnLock = true;
msg("<b>You are not the faction admin.");
return;
}
if (you == fme && !permAny) senderMustBePlayer = false;
{ senderMustBeMember = false;
msg("<b>The target player musn't be yourself."); senderMustBeModerator = false;
return; senderMustBeAdmin = false;
} }
if (you.getRole() == Role.ADMIN) @Override
{ public void perform() {
msg("<b>The target player is a faction admin. Demote them first."); FPlayer you = this.argAsBestFPlayerMatch(0);
return; if (you == null) return;
}
boolean permAny = Permission.MOD_ANY.has(sender, false);
Faction targetFaction = you.getFaction();
if (targetFaction != myFaction && !permAny) {
msg("%s<b> is not a member in your faction.", you.describeTo(fme, true));
return;
}
if (fme != null && fme.getRole() != Role.ADMIN && !permAny) {
msg("<b>You are not the faction admin.");
return;
}
if (you == fme && !permAny) {
msg("<b>The target player musn't be yourself.");
return;
}
if (you.getRole() == Role.ADMIN) {
msg("<b>The target player is a faction admin. Demote them first.");
return;
}
if (you.getRole() == Role.MODERATOR) {
// Revoke
you.setRole(Role.NORMAL);
targetFaction.msg("%s<i> is no longer moderator in your faction.", you.describeTo(targetFaction, true));
msg("<i>You have removed moderator status from %s<i>.", you.describeTo(fme, true));
} else {
// Give
you.setRole(Role.MODERATOR);
targetFaction.msg("%s<i> was promoted to moderator in your faction.", you.describeTo(targetFaction, true));
msg("<i>You have promoted %s<i> to moderator.", you.describeTo(fme, true));
}
}
if (you.getRole() == Role.MODERATOR)
{
// Revoke
you.setRole(Role.NORMAL);
targetFaction.msg("%s<i> is no longer moderator in your faction.", you.describeTo(targetFaction, true));
msg("<i>You have removed moderator status from %s<i>.", you.describeTo(fme, true));
}
else
{
// Give
you.setRole(Role.MODERATOR);
targetFaction.msg("%s<i> was promoted to moderator in your faction.", you.describeTo(targetFaction, true));
msg("<i>You have promoted %s<i> to moderator.", you.describeTo(fme, true));
}
}
} }

View File

@ -2,46 +2,43 @@ package com.massivecraft.factions.cmd;
import com.massivecraft.factions.P; import com.massivecraft.factions.P;
public class CmdMoney extends FCommand public class CmdMoney extends FCommand {
{ public CmdMoneyBalance cmdMoneyBalance = new CmdMoneyBalance();
public CmdMoneyBalance cmdMoneyBalance = new CmdMoneyBalance(); public CmdMoneyDeposit cmdMoneyDeposit = new CmdMoneyDeposit();
public CmdMoneyDeposit cmdMoneyDeposit = new CmdMoneyDeposit(); public CmdMoneyWithdraw cmdMoneyWithdraw = new CmdMoneyWithdraw();
public CmdMoneyWithdraw cmdMoneyWithdraw = new CmdMoneyWithdraw(); public CmdMoneyTransferFf cmdMoneyTransferFf = new CmdMoneyTransferFf();
public CmdMoneyTransferFf cmdMoneyTransferFf = new CmdMoneyTransferFf(); public CmdMoneyTransferFp cmdMoneyTransferFp = new CmdMoneyTransferFp();
public CmdMoneyTransferFp cmdMoneyTransferFp = new CmdMoneyTransferFp(); public CmdMoneyTransferPf cmdMoneyTransferPf = new CmdMoneyTransferPf();
public CmdMoneyTransferPf cmdMoneyTransferPf = new CmdMoneyTransferPf();
public CmdMoney() {
public CmdMoney() super();
{ this.aliases.add("money");
super();
this.aliases.add("money"); //this.requiredArgs.add("");
//this.optionalArgs.put("","")
//this.requiredArgs.add("");
//this.optionalArgs.put("","") this.isMoneyCommand = true;
this.isMoneyCommand = true; senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBePlayer = false; senderMustBeModerator = false;
senderMustBeMember = false; senderMustBeAdmin = false;
senderMustBeModerator = false;
senderMustBeAdmin = false; this.setHelpShort("faction money commands");
this.helpLong.add(p.txt.parseTags("<i>The faction money commands."));
this.setHelpShort("faction money commands");
this.helpLong.add(p.txt.parseTags("<i>The faction money commands.")); this.addSubCommand(this.cmdMoneyBalance);
this.addSubCommand(this.cmdMoneyDeposit);
this.addSubCommand(this.cmdMoneyBalance); this.addSubCommand(this.cmdMoneyWithdraw);
this.addSubCommand(this.cmdMoneyDeposit); this.addSubCommand(this.cmdMoneyTransferFf);
this.addSubCommand(this.cmdMoneyWithdraw); this.addSubCommand(this.cmdMoneyTransferFp);
this.addSubCommand(this.cmdMoneyTransferFf); this.addSubCommand(this.cmdMoneyTransferPf);
this.addSubCommand(this.cmdMoneyTransferFp); }
this.addSubCommand(this.cmdMoneyTransferPf);
} @Override
public void perform() {
@Override this.commandChain.add(this);
public void perform() P.p.cmdAutoHelp.execute(this.sender, this.args, this.commandChain);
{ }
this.commandChain.add(this);
P.p.cmdAutoHelp.execute(this.sender, this.args, this.commandChain);
}
} }

View File

@ -1,42 +1,38 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.integration.Econ;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.Faction;
public class CmdMoneyBalance extends FCommand public class CmdMoneyBalance extends FCommand {
{ public CmdMoneyBalance() {
public CmdMoneyBalance() super();
{ this.aliases.add("b");
super(); this.aliases.add("balance");
this.aliases.add("b");
this.aliases.add("balance"); //this.requiredArgs.add("");
this.optionalArgs.put("faction", "yours");
//this.requiredArgs.add("");
this.optionalArgs.put("faction", "yours"); this.permission = Permission.MONEY_BALANCE.node;
this.setHelpShort("show faction balance");
this.permission = Permission.MONEY_BALANCE.node;
this.setHelpShort("show faction balance"); senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBePlayer = false; senderMustBeModerator = false;
senderMustBeMember = false; senderMustBeAdmin = false;
senderMustBeModerator = false; }
senderMustBeAdmin = false;
} @Override
public void perform() {
@Override Faction faction = myFaction;
public void perform() if (this.argIsSet(0)) {
{ faction = this.argAsFaction(0);
Faction faction = myFaction; }
if (this.argIsSet(0))
{ if (faction == null) return;
faction = this.argAsFaction(0); if (faction != myFaction && !Permission.MONEY_BALANCE_ANY.has(sender, true)) return;
}
Econ.sendBalanceInfo(fme, faction);
if (faction == null) return; }
if (faction != myFaction && ! Permission.MONEY_BALANCE_ANY.has(sender, true)) return;
Econ.sendBalanceInfo(fme, faction);
}
} }

View File

@ -5,41 +5,37 @@ import com.massivecraft.factions.P;
import com.massivecraft.factions.iface.EconomyParticipator; import com.massivecraft.factions.iface.EconomyParticipator;
import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.integration.Econ;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
public class CmdMoneyDeposit extends FCommand public class CmdMoneyDeposit extends FCommand {
{
public CmdMoneyDeposit() {
public CmdMoneyDeposit() super();
{ this.aliases.add("d");
super(); this.aliases.add("deposit");
this.aliases.add("d");
this.aliases.add("deposit"); this.requiredArgs.add("amount");
this.optionalArgs.put("faction", "yours");
this.requiredArgs.add("amount");
this.optionalArgs.put("faction", "yours"); this.permission = Permission.MONEY_DEPOSIT.node;
this.setHelpShort("deposit money");
this.permission = Permission.MONEY_DEPOSIT.node;
this.setHelpShort("deposit money"); senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBePlayer = true; senderMustBeModerator = false;
senderMustBeMember = false; senderMustBeAdmin = false;
senderMustBeModerator = false; }
senderMustBeAdmin = false;
} @Override
public void perform() {
@Override double amount = this.argAsDouble(0, 0d);
public void perform() EconomyParticipator faction = this.argAsFaction(1, myFaction);
{ if (faction == null) return;
double amount = this.argAsDouble(0, 0d); boolean success = Econ.transferMoney(fme, fme, faction, amount);
EconomyParticipator faction = this.argAsFaction(1, myFaction);
if (faction == null) return; if (success && Conf.logMoneyTransactions)
boolean success = Econ.transferMoney(fme, fme, faction, amount); P.p.log(ChatColor.stripColor(P.p.txt.parse("%s deposited %s in the faction bank: %s", fme.getName(), Econ.moneyString(amount), faction.describeTo(null))));
}
if (success && Conf.logMoneyTransactions)
P.p.log(ChatColor.stripColor(P.p.txt.parse("%s deposited %s in the faction bank: %s", fme.getName(), Econ.moneyString(amount), faction.describeTo(null))));
}
} }

View File

@ -1,47 +1,43 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Conf; import com.massivecraft.factions.Conf;
import com.massivecraft.factions.iface.EconomyParticipator;
import com.massivecraft.factions.P; import com.massivecraft.factions.P;
import com.massivecraft.factions.iface.EconomyParticipator;
import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.integration.Econ;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
public class CmdMoneyTransferFf extends FCommand public class CmdMoneyTransferFf extends FCommand {
{ public CmdMoneyTransferFf() {
public CmdMoneyTransferFf() this.aliases.add("ff");
{
this.aliases.add("ff");
this.requiredArgs.add("amount");
this.requiredArgs.add("faction");
this.requiredArgs.add("faction");
//this.optionalArgs.put("", "");
this.permission = Permission.MONEY_F2F.node;
this.setHelpShort("transfer f -> f");
senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
double amount = this.argAsDouble(0, 0d);
EconomyParticipator from = this.argAsFaction(1);
if (from == null) return;
EconomyParticipator to = this.argAsFaction(2);
if (to == null) return;
boolean success = Econ.transferMoney(fme, from, to, amount);
if (success && Conf.logMoneyTransactions) this.requiredArgs.add("amount");
P.p.log(ChatColor.stripColor(P.p.txt.parse("%s transferred %s from the faction \"%s\" to the faction \"%s\"", fme.getName(), Econ.moneyString(amount), from.describeTo(null), to.describeTo(null)))); this.requiredArgs.add("faction");
} this.requiredArgs.add("faction");
//this.optionalArgs.put("", "");
this.permission = Permission.MONEY_F2F.node;
this.setHelpShort("transfer f -> f");
senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform() {
double amount = this.argAsDouble(0, 0d);
EconomyParticipator from = this.argAsFaction(1);
if (from == null) return;
EconomyParticipator to = this.argAsFaction(2);
if (to == null) return;
boolean success = Econ.transferMoney(fme, from, to, amount);
if (success && Conf.logMoneyTransactions)
P.p.log(ChatColor.stripColor(P.p.txt.parse("%s transferred %s from the faction \"%s\" to the faction \"%s\"", fme.getName(), Econ.moneyString(amount), from.describeTo(null), to.describeTo(null))));
}
} }

View File

@ -1,47 +1,43 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Conf; import com.massivecraft.factions.Conf;
import com.massivecraft.factions.iface.EconomyParticipator;
import com.massivecraft.factions.P; import com.massivecraft.factions.P;
import com.massivecraft.factions.iface.EconomyParticipator;
import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.integration.Econ;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
public class CmdMoneyTransferFp extends FCommand public class CmdMoneyTransferFp extends FCommand {
{ public CmdMoneyTransferFp() {
public CmdMoneyTransferFp() this.aliases.add("fp");
{
this.aliases.add("fp");
this.requiredArgs.add("amount");
this.requiredArgs.add("faction");
this.requiredArgs.add("player");
//this.optionalArgs.put("", "");
this.permission = Permission.MONEY_F2P.node;
this.setHelpShort("transfer f -> p");
senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
double amount = this.argAsDouble(0, 0d);
EconomyParticipator from = this.argAsFaction(1);
if (from == null) return;
EconomyParticipator to = this.argAsBestFPlayerMatch(2);
if (to == null) return;
boolean success = Econ.transferMoney(fme, from, to, amount);
if (success && Conf.logMoneyTransactions) this.requiredArgs.add("amount");
P.p.log(ChatColor.stripColor(P.p.txt.parse("%s transferred %s from the faction \"%s\" to the player \"%s\"", fme.getName(), Econ.moneyString(amount), from.describeTo(null), to.describeTo(null)))); this.requiredArgs.add("faction");
} this.requiredArgs.add("player");
//this.optionalArgs.put("", "");
this.permission = Permission.MONEY_F2P.node;
this.setHelpShort("transfer f -> p");
senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform() {
double amount = this.argAsDouble(0, 0d);
EconomyParticipator from = this.argAsFaction(1);
if (from == null) return;
EconomyParticipator to = this.argAsBestFPlayerMatch(2);
if (to == null) return;
boolean success = Econ.transferMoney(fme, from, to, amount);
if (success && Conf.logMoneyTransactions)
P.p.log(ChatColor.stripColor(P.p.txt.parse("%s transferred %s from the faction \"%s\" to the player \"%s\"", fme.getName(), Econ.moneyString(amount), from.describeTo(null), to.describeTo(null))));
}
} }

View File

@ -1,47 +1,43 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Conf; import com.massivecraft.factions.Conf;
import com.massivecraft.factions.iface.EconomyParticipator;
import com.massivecraft.factions.P; import com.massivecraft.factions.P;
import com.massivecraft.factions.iface.EconomyParticipator;
import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.integration.Econ;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
public class CmdMoneyTransferPf extends FCommand public class CmdMoneyTransferPf extends FCommand {
{ public CmdMoneyTransferPf() {
public CmdMoneyTransferPf() this.aliases.add("pf");
{
this.aliases.add("pf");
this.requiredArgs.add("amount");
this.requiredArgs.add("player");
this.requiredArgs.add("faction");
//this.optionalArgs.put("", "");
this.permission = Permission.MONEY_P2F.node;
this.setHelpShort("transfer p -> f");
senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
double amount = this.argAsDouble(0, 0d);
EconomyParticipator from = this.argAsBestFPlayerMatch(1);
if (from == null) return;
EconomyParticipator to = this.argAsFaction(2);
if (to == null) return;
boolean success = Econ.transferMoney(fme, from, to, amount);
if (success && Conf.logMoneyTransactions) this.requiredArgs.add("amount");
P.p.log(ChatColor.stripColor(P.p.txt.parse("%s transferred %s from the player \"%s\" to the faction \"%s\"", fme.getName(), Econ.moneyString(amount), from.describeTo(null), to.describeTo(null)))); this.requiredArgs.add("player");
} this.requiredArgs.add("faction");
//this.optionalArgs.put("", "");
this.permission = Permission.MONEY_P2F.node;
this.setHelpShort("transfer p -> f");
senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform() {
double amount = this.argAsDouble(0, 0d);
EconomyParticipator from = this.argAsBestFPlayerMatch(1);
if (from == null) return;
EconomyParticipator to = this.argAsFaction(2);
if (to == null) return;
boolean success = Econ.transferMoney(fme, from, to, amount);
if (success && Conf.logMoneyTransactions)
P.p.log(ChatColor.stripColor(P.p.txt.parse("%s transferred %s from the player \"%s\" to the faction \"%s\"", fme.getName(), Econ.moneyString(amount), from.describeTo(null), to.describeTo(null))));
}
} }

View File

@ -1,42 +1,38 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Conf; import com.massivecraft.factions.Conf;
import com.massivecraft.factions.iface.EconomyParticipator;
import com.massivecraft.factions.P; import com.massivecraft.factions.P;
import com.massivecraft.factions.iface.EconomyParticipator;
import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.integration.Econ;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
public class CmdMoneyWithdraw extends FCommand public class CmdMoneyWithdraw extends FCommand {
{ public CmdMoneyWithdraw() {
public CmdMoneyWithdraw() this.aliases.add("w");
{ this.aliases.add("withdraw");
this.aliases.add("w");
this.aliases.add("withdraw");
this.requiredArgs.add("amount");
this.optionalArgs.put("faction", "yours");
this.permission = Permission.MONEY_WITHDRAW.node;
this.setHelpShort("withdraw money");
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
double amount = this.argAsDouble(0, 0d);
EconomyParticipator faction = this.argAsFaction(1, myFaction);
if (faction == null) return;
boolean success = Econ.transferMoney(fme, faction, fme, amount);
if (success && Conf.logMoneyTransactions) this.requiredArgs.add("amount");
P.p.log(ChatColor.stripColor(P.p.txt.parse("%s withdrew %s from the faction bank: %s", fme.getName(), Econ.moneyString(amount), faction.describeTo(null)))); this.optionalArgs.put("faction", "yours");
}
this.permission = Permission.MONEY_WITHDRAW.node;
this.setHelpShort("withdraw money");
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform() {
double amount = this.argAsDouble(0, 0d);
EconomyParticipator faction = this.argAsFaction(1, myFaction);
if (faction == null) return;
boolean success = Econ.transferMoney(fme, faction, fme, amount);
if (success && Conf.logMoneyTransactions)
P.p.log(ChatColor.stripColor(P.p.txt.parse("%s withdrew %s from the faction bank: %s", fme.getName(), Econ.moneyString(amount), faction.describeTo(null))));
}
} }

View File

@ -5,45 +5,41 @@ import com.massivecraft.factions.Faction;
import com.massivecraft.factions.Factions; import com.massivecraft.factions.Factions;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdOpen extends FCommand public class CmdOpen extends FCommand {
{ public CmdOpen() {
public CmdOpen() super();
{ this.aliases.add("open");
super();
this.aliases.add("open"); //this.requiredArgs.add("");
this.optionalArgs.put("yes/no", "flip");
//this.requiredArgs.add("");
this.optionalArgs.put("yes/no", "flip"); this.permission = Permission.OPEN.node;
this.disableOnLock = false;
this.permission = Permission.OPEN.node;
this.disableOnLock = false; senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBePlayer = true; senderMustBeModerator = true;
senderMustBeMember = false; senderMustBeAdmin = false;
senderMustBeModerator = true; }
senderMustBeAdmin = false;
} @Override
public void perform() {
@Override // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay
public void perform() if (!payForCommand(Conf.econCostOpen, "to open or close the faction", "for opening or closing the faction"))
{ return;
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay
if ( ! payForCommand(Conf.econCostOpen, "to open or close the faction", "for opening or closing the faction")) return; myFaction.setOpen(this.argAsBool(0, !myFaction.getOpen()));
String open = myFaction.getOpen() ? "open" : "closed";
// Inform
myFaction.msg("%s<i> changed the faction to <h>%s<i>.", fme.describeTo(myFaction, true), open);
for (Faction faction : Factions.i.get()) {
if (faction == myFaction) {
continue;
}
faction.msg("<i>The faction %s<i> is now %s", myFaction.getTag(faction), open);
}
}
myFaction.setOpen(this.argAsBool(0, ! myFaction.getOpen()));
String open = myFaction.getOpen() ? "open" : "closed";
// Inform
myFaction.msg("%s<i> changed the faction to <h>%s<i>.", fme.describeTo(myFaction, true), open);
for (Faction faction : Factions.i.get())
{
if (faction == myFaction)
{
continue;
}
faction.msg("<i>The faction %s<i> is now %s", myFaction.getTag(faction), open);
}
}
} }

View File

@ -1,115 +1,100 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Board; import com.massivecraft.factions.*;
import com.massivecraft.factions.Conf;
import com.massivecraft.factions.FLocation;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.integration.SpoutFeatures; import com.massivecraft.factions.integration.SpoutFeatures;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.struct.Role; import com.massivecraft.factions.struct.Role;
public class CmdOwner extends FCommand public class CmdOwner extends FCommand {
{
public CmdOwner()
{
super();
this.aliases.add("owner");
//this.requiredArgs.add("");
this.optionalArgs.put("player name", "you");
this.permission = Permission.OWNER.node;
this.disableOnLock = true;
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
// TODO: Fix colors!
@Override
public void perform()
{
boolean hasBypass = fme.isAdminBypassing();
if ( ! hasBypass && ! assertHasFaction()) {
return;
}
if ( ! Conf.ownedAreasEnabled) public CmdOwner() {
{ super();
fme.msg("<b>Sorry, but owned areas are disabled on this server."); this.aliases.add("owner");
return;
}
if ( ! hasBypass && Conf.ownedAreasLimitPerFaction > 0 && myFaction.getCountOfClaimsWithOwners() >= Conf.ownedAreasLimitPerFaction) //this.requiredArgs.add("");
{ this.optionalArgs.put("player name", "you");
fme.msg("<b>Sorry, but you have reached the server's <h>limit of %d <b>owned areas per faction.", Conf.ownedAreasLimitPerFaction);
return;
}
if ( ! hasBypass && !assertMinRole(Conf.ownedAreasModeratorsCanSet ? Role.MODERATOR : Role.ADMIN)) this.permission = Permission.OWNER.node;
{ this.disableOnLock = true;
return;
}
FLocation flocation = new FLocation(fme); senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
Faction factionHere = Board.getFactionAt(flocation); // TODO: Fix colors!
if (factionHere != myFaction)
{
if ( ! hasBypass)
{
fme.msg("<b>This land is not claimed by your faction, so you can't set ownership of it.");
return;
}
if ( ! factionHere.isNormal()) @Override
{ public void perform() {
fme.msg("<b>This land is not claimed by a faction. Ownership is not possible."); boolean hasBypass = fme.isAdminBypassing();
return;
}
}
FPlayer target = this.argAsBestFPlayerMatch(0, fme); if (!hasBypass && !assertHasFaction()) {
if (target == null) return; return;
}
String playerName = target.getName(); if (!Conf.ownedAreasEnabled) {
fme.msg("<b>Sorry, but owned areas are disabled on this server.");
return;
}
if (target.getFaction() != myFaction) if (!hasBypass && Conf.ownedAreasLimitPerFaction > 0 && myFaction.getCountOfClaimsWithOwners() >= Conf.ownedAreasLimitPerFaction) {
{ fme.msg("<b>Sorry, but you have reached the server's <h>limit of %d <b>owned areas per faction.", Conf.ownedAreasLimitPerFaction);
fme.msg("%s<i> is not a member of this faction.", playerName); return;
return; }
}
// if no player name was passed, and this claim does already have owners set, clear them if (!hasBypass && !assertMinRole(Conf.ownedAreasModeratorsCanSet ? Role.MODERATOR : Role.ADMIN)) {
if (args.isEmpty() && myFaction.doesLocationHaveOwnersSet(flocation)) return;
{ }
myFaction.clearClaimOwnership(flocation);
SpoutFeatures.updateOwnerListLoc(flocation);
fme.msg("<i>You have cleared ownership for this claimed area.");
return;
}
if (myFaction.isPlayerInOwnerList(playerName, flocation)) FLocation flocation = new FLocation(fme);
{
myFaction.removePlayerAsOwner(playerName, flocation);
SpoutFeatures.updateOwnerListLoc(flocation);
fme.msg("<i>You have removed ownership of this claimed land from %s<i>.", playerName);
return;
}
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay Faction factionHere = Board.getFactionAt(flocation);
if ( ! payForCommand(Conf.econCostOwner, "to set ownership of claimed land", "for setting ownership of claimed land")) return; if (factionHere != myFaction) {
if (!hasBypass) {
fme.msg("<b>This land is not claimed by your faction, so you can't set ownership of it.");
return;
}
myFaction.setPlayerAsOwner(playerName, flocation); if (!factionHere.isNormal()) {
SpoutFeatures.updateOwnerListLoc(flocation); fme.msg("<b>This land is not claimed by a faction. Ownership is not possible.");
return;
}
}
fme.msg("<i>You have added %s<i> to the owner list for this claimed land.", playerName); FPlayer target = this.argAsBestFPlayerMatch(0, fme);
} if (target == null) return;
String playerName = target.getName();
if (target.getFaction() != myFaction) {
fme.msg("%s<i> is not a member of this faction.", playerName);
return;
}
// if no player name was passed, and this claim does already have owners set, clear them
if (args.isEmpty() && myFaction.doesLocationHaveOwnersSet(flocation)) {
myFaction.clearClaimOwnership(flocation);
SpoutFeatures.updateOwnerListLoc(flocation);
fme.msg("<i>You have cleared ownership for this claimed area.");
return;
}
if (myFaction.isPlayerInOwnerList(playerName, flocation)) {
myFaction.removePlayerAsOwner(playerName, flocation);
SpoutFeatures.updateOwnerListLoc(flocation);
fme.msg("<i>You have removed ownership of this claimed land from %s<i>.", playerName);
return;
}
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay
if (!payForCommand(Conf.econCostOwner, "to set ownership of claimed land", "for setting ownership of claimed land"))
return;
myFaction.setPlayerAsOwner(playerName, flocation);
SpoutFeatures.updateOwnerListLoc(flocation);
fme.msg("<i>You have added %s<i> to the owner list for this claimed land.", playerName);
}
} }

View File

@ -6,68 +6,59 @@ import com.massivecraft.factions.FLocation;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdOwnerList extends FCommand public class CmdOwnerList extends FCommand {
{
public CmdOwnerList()
{
super();
this.aliases.add("ownerlist");
//this.requiredArgs.add("");
//this.optionalArgs.put("", "");
this.permission = Permission.OWNERLIST.node;
this.disableOnLock = false;
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
boolean hasBypass = fme.isAdminBypassing();
if ( ! hasBypass && ! assertHasFaction()) public CmdOwnerList() {
{ super();
return; this.aliases.add("ownerlist");
}
if ( ! Conf.ownedAreasEnabled) //this.requiredArgs.add("");
{ //this.optionalArgs.put("", "");
fme.msg("<b>Owned areas are disabled on this server.");
return;
}
FLocation flocation = new FLocation(fme); this.permission = Permission.OWNERLIST.node;
this.disableOnLock = false;
if (Board.getFactionAt(flocation) != myFaction) senderMustBePlayer = true;
{ senderMustBeMember = false;
if (!hasBypass) senderMustBeModerator = false;
{ senderMustBeAdmin = false;
fme.msg("<b>This land is not claimed by your faction."); }
return;
}
myFaction = Board.getFactionAt(flocation); @Override
if (!myFaction.isNormal()) public void perform() {
{ boolean hasBypass = fme.isAdminBypassing();
fme.msg("<i>This land is not claimed by any faction, thus no owners.");
return;
}
}
String owners = myFaction.getOwnerListString(flocation); if (!hasBypass && !assertHasFaction()) {
return;
}
if (owners == null || owners.isEmpty()) if (!Conf.ownedAreasEnabled) {
{ fme.msg("<b>Owned areas are disabled on this server.");
fme.msg("<i>No owners are set here; everyone in the faction has access."); return;
return; }
}
fme.msg("<i>Current owner(s) of this land: %s", owners); FLocation flocation = new FLocation(fme);
}
if (Board.getFactionAt(flocation) != myFaction) {
if (!hasBypass) {
fme.msg("<b>This land is not claimed by your faction.");
return;
}
myFaction = Board.getFactionAt(flocation);
if (!myFaction.isNormal()) {
fme.msg("<i>This land is not claimed by any faction, thus no owners.");
return;
}
}
String owners = myFaction.getOwnerListString(flocation);
if (owners == null || owners.isEmpty()) {
fme.msg("<i>No owners are set here; everyone in the faction has access.");
return;
}
fme.msg("<i>Current owner(s) of this land: %s", owners);
}
} }

View File

@ -1,63 +1,53 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.FPlayers; import com.massivecraft.factions.FPlayers;
import com.massivecraft.factions.Faction; import com.massivecraft.factions.Faction;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.integration.SpoutFeatures; import com.massivecraft.factions.integration.SpoutFeatures;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdPeaceful extends FCommand public class CmdPeaceful extends FCommand {
{
public CmdPeaceful()
{
super();
this.aliases.add("peaceful");
this.requiredArgs.add("faction tag");
//this.optionalArgs.put("", "");
this.permission = Permission.SET_PEACEFUL.node;
this.disableOnLock = true;
senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
Faction faction = this.argAsFaction(0);
if (faction == null) return;
String change; public CmdPeaceful() {
if (faction.isPeaceful()) super();
{ this.aliases.add("peaceful");
change = "removed peaceful status from";
faction.setPeaceful(false); this.requiredArgs.add("faction tag");
} //this.optionalArgs.put("", "");
else
{ this.permission = Permission.SET_PEACEFUL.node;
change = "granted peaceful status to"; this.disableOnLock = true;
faction.setPeaceful(true);
} senderMustBePlayer = false;
senderMustBeMember = false;
// Inform all players senderMustBeModerator = false;
for (FPlayer fplayer : FPlayers.i.getOnline()) senderMustBeAdmin = false;
{ }
if (fplayer.getFaction() == faction)
{ @Override
fplayer.msg((fme == null ? "A server admin" : fme.describeTo(fplayer, true))+"<i> has "+change+" your faction."); public void perform() {
} Faction faction = this.argAsFaction(0);
else if (faction == null) return;
{
fplayer.msg((fme == null ? "A server admin" : fme.describeTo(fplayer, true))+"<i> has "+change+" the faction \"" + faction.getTag(fplayer) + "<i>\"."); String change;
} if (faction.isPeaceful()) {
} change = "removed peaceful status from";
faction.setPeaceful(false);
} else {
change = "granted peaceful status to";
faction.setPeaceful(true);
}
// Inform all players
for (FPlayer fplayer : FPlayers.i.getOnline()) {
if (fplayer.getFaction() == faction) {
fplayer.msg((fme == null ? "A server admin" : fme.describeTo(fplayer, true)) + "<i> has " + change + " your faction.");
} else {
fplayer.msg((fme == null ? "A server admin" : fme.describeTo(fplayer, true)) + "<i> has " + change + " the faction \"" + faction.getTag(fplayer) + "<i>\".");
}
}
SpoutFeatures.updateAppearances(faction);
}
SpoutFeatures.updateAppearances(faction);
}
} }

View File

@ -1,62 +1,52 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.FPlayers; import com.massivecraft.factions.FPlayers;
import com.massivecraft.factions.Faction; import com.massivecraft.factions.Faction;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.P; import com.massivecraft.factions.P;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdPermanent extends FCommand public class CmdPermanent extends FCommand {
{ public CmdPermanent() {
public CmdPermanent() super();
{ this.aliases.add("permanent");
super();
this.aliases.add("permanent");
this.requiredArgs.add("faction tag");
//this.optionalArgs.put("", "");
this.permission = Permission.SET_PERMANENT.node;
this.disableOnLock = true;
senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
Faction faction = this.argAsFaction(0);
if (faction == null) return;
String change;
if(faction.isPermanent())
{
change = "removed permanent status from";
faction.setPermanent(false);
}
else
{
change = "added permanent status to";
faction.setPermanent(true);
}
P.p.log((fme == null ? "A server admin" : fme.getName())+" "+change+" the faction \"" + faction.getTag() + "\"."); this.requiredArgs.add("faction tag");
//this.optionalArgs.put("", "");
// Inform all players
for (FPlayer fplayer : FPlayers.i.getOnline()) this.permission = Permission.SET_PERMANENT.node;
{ this.disableOnLock = true;
if (fplayer.getFaction() == faction)
{ senderMustBePlayer = false;
fplayer.msg((fme == null ? "A server admin" : fme.describeTo(fplayer, true))+"<i> "+change+" your faction."); senderMustBeMember = false;
} senderMustBeModerator = false;
else senderMustBeAdmin = false;
{ }
fplayer.msg((fme == null ? "A server admin" : fme.describeTo(fplayer, true))+"<i> "+change+" the faction \"" + faction.getTag(fplayer) + "\".");
} @Override
} public void perform() {
} Faction faction = this.argAsFaction(0);
if (faction == null) return;
String change;
if (faction.isPermanent()) {
change = "removed permanent status from";
faction.setPermanent(false);
} else {
change = "added permanent status to";
faction.setPermanent(true);
}
P.p.log((fme == null ? "A server admin" : fme.getName()) + " " + change + " the faction \"" + faction.getTag() + "\".");
// Inform all players
for (FPlayer fplayer : FPlayers.i.getOnline()) {
if (fplayer.getFaction() == faction) {
fplayer.msg((fme == null ? "A server admin" : fme.describeTo(fplayer, true)) + "<i> " + change + " your faction.");
} else {
fplayer.msg((fme == null ? "A server admin" : fme.describeTo(fplayer, true)) + "<i> " + change + " the faction \"" + faction.getTag(fplayer) + "\".");
}
}
}
} }

View File

@ -1,50 +1,45 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdPermanentPower extends FCommand public class CmdPermanentPower extends FCommand {
{ public CmdPermanentPower() {
public CmdPermanentPower() super();
{ this.aliases.add("permanentpower");
super();
this.aliases.add("permanentpower"); this.requiredArgs.add("faction");
this.optionalArgs.put("power", "reset");
this.requiredArgs.add("faction");
this.optionalArgs.put("power", "reset"); this.permission = Permission.SET_PERMANENTPOWER.node;
this.disableOnLock = true;
this.permission = Permission.SET_PERMANENTPOWER.node;
this.disableOnLock = true; senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBePlayer = false; senderMustBeModerator = false;
senderMustBeMember = false; senderMustBeAdmin = false;
senderMustBeModerator = false; }
senderMustBeAdmin = false;
} @Override
public void perform() {
@Override Faction targetFaction = this.argAsFaction(0);
public void perform() if (targetFaction == null) return;
{
Faction targetFaction = this.argAsFaction(0); Integer targetPower = this.argAsInt(1);
if (targetFaction == null) return;
targetFaction.setPermanentPower(targetPower);
Integer targetPower = this.argAsInt(1);
String change = "removed permanentpower status from";
targetFaction.setPermanentPower(targetPower); if (targetFaction.hasPermanentPower()) {
change = "added permanentpower status to";
String change = "removed permanentpower status from"; }
if(targetFaction.hasPermanentPower())
{ msg("<i>You %s <h>%s<i>.", change, targetFaction.describeTo(fme));
change = "added permanentpower status to";
} // Inform all players
for (FPlayer fplayer : targetFaction.getFPlayersWhereOnline(true)) {
msg("<i>You %s <h>%s<i>.", change, targetFaction.describeTo(fme)); fplayer.msg((fme == null ? "A server admin" : fme.describeTo(fplayer, true)) + "<i> " + change + " your faction.");
}
// Inform all players }
for (FPlayer fplayer : targetFaction.getFPlayersWhereOnline(true))
{
fplayer.msg((fme == null ? "A server admin" : fme.describeTo(fplayer, true))+"<i> "+change+" your faction.");
}
}
} }

View File

@ -4,41 +4,38 @@ import com.massivecraft.factions.Conf;
import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdPower extends FCommand public class CmdPower extends FCommand {
{
public CmdPower()
{
super();
this.aliases.add("power");
this.aliases.add("pow");
//this.requiredArgs.add("faction tag");
this.optionalArgs.put("player name", "you");
this.permission = Permission.POWER.node;
this.disableOnLock = false;
senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
FPlayer target = this.argAsBestFPlayerMatch(0, fme);
if (target == null) return;
if (target != fme && ! Permission.POWER_ANY.has(sender, true)) return;
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay public CmdPower() {
if ( ! payForCommand(Conf.econCostPower, "to show player power info", "for showing player power info")) return; super();
this.aliases.add("power");
this.aliases.add("pow");
//this.requiredArgs.add("faction tag");
this.optionalArgs.put("player name", "you");
this.permission = Permission.POWER.node;
this.disableOnLock = false;
senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform() {
FPlayer target = this.argAsBestFPlayerMatch(0, fme);
if (target == null) return;
if (target != fme && !Permission.POWER_ANY.has(sender, true)) return;
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay
if (!payForCommand(Conf.econCostPower, "to show player power info", "for showing player power info")) return;
double powerBoost = target.getPowerBoost();
String boost = (powerBoost == 0.0) ? "" : (powerBoost > 0.0 ? " (bonus: " : " (penalty: ") + powerBoost + ")";
msg("%s<a> - Power / Maxpower: <i>%d / %d %s", target.describeTo(fme, true), target.getPowerRounded(), target.getPowerMaxRounded(), boost);
}
double powerBoost = target.getPowerBoost();
String boost = (powerBoost == 0.0) ? "" : (powerBoost > 0.0 ? " (bonus: " : " (penalty: ") + powerBoost + ")";
msg("%s<a> - Power / Maxpower: <i>%d / %d %s", target.describeTo(fme, true), target.getPowerRounded(), target.getPowerMaxRounded(), boost);
}
} }

View File

@ -1,72 +1,62 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.P; import com.massivecraft.factions.P;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdPowerBoost extends FCommand public class CmdPowerBoost extends FCommand {
{ public CmdPowerBoost() {
public CmdPowerBoost() super();
{ this.aliases.add("powerboost");
super();
this.aliases.add("powerboost");
this.requiredArgs.add("p|f|player|faction");
this.requiredArgs.add("name");
this.requiredArgs.add("#");
this.permission = Permission.POWERBOOST.node;
this.disableOnLock = true;
senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
String type = this.argAsString(0).toLowerCase();
boolean doPlayer = true;
if (type.equals("f") || type.equals("faction"))
{
doPlayer = false;
}
else if (!type.equals("p") && !type.equals("player"))
{
msg("<b>You must specify \"p\" or \"player\" to target a player or \"f\" or \"faction\" to target a faction.");
msg("<b>ex. /f powerboost p SomePlayer 0.5 -or- /f powerboost f SomeFaction -5");
return;
}
Double targetPower = this.argAsDouble(2);
if (targetPower == null)
{
msg("<b>You must specify a valid numeric value for the power bonus/penalty amount.");
return;
}
String target; this.requiredArgs.add("p|f|player|faction");
this.requiredArgs.add("name");
this.requiredArgs.add("#");
if (doPlayer) this.permission = Permission.POWERBOOST.node;
{ this.disableOnLock = true;
FPlayer targetPlayer = this.argAsBestFPlayerMatch(1);
if (targetPlayer == null) return;
targetPlayer.setPowerBoost(targetPower);
target = "Player \""+targetPlayer.getName()+"\"";
}
else
{
Faction targetFaction = this.argAsFaction(1);
if (targetFaction == null) return;
targetFaction.setPowerBoost(targetPower);
target = "Faction \""+targetFaction.getTag()+"\"";
}
msg("<i>"+target+" now has a power bonus/penalty of "+targetPower+" to min and max power levels."); senderMustBePlayer = false;
if (!senderIsConsole) senderMustBeMember = false;
P.p.log(fme.getName()+" has set the power bonus/penalty for "+target+" to "+targetPower+"."); senderMustBeModerator = false;
} senderMustBeAdmin = false;
}
@Override
public void perform() {
String type = this.argAsString(0).toLowerCase();
boolean doPlayer = true;
if (type.equals("f") || type.equals("faction")) {
doPlayer = false;
} else if (!type.equals("p") && !type.equals("player")) {
msg("<b>You must specify \"p\" or \"player\" to target a player or \"f\" or \"faction\" to target a faction.");
msg("<b>ex. /f powerboost p SomePlayer 0.5 -or- /f powerboost f SomeFaction -5");
return;
}
Double targetPower = this.argAsDouble(2);
if (targetPower == null) {
msg("<b>You must specify a valid numeric value for the power bonus/penalty amount.");
return;
}
String target;
if (doPlayer) {
FPlayer targetPlayer = this.argAsBestFPlayerMatch(1);
if (targetPlayer == null) return;
targetPlayer.setPowerBoost(targetPower);
target = "Player \"" + targetPlayer.getName() + "\"";
} else {
Faction targetFaction = this.argAsFaction(1);
if (targetFaction == null) return;
targetFaction.setPowerBoost(targetPower);
target = "Faction \"" + targetFaction.getTag() + "\"";
}
msg("<i>" + target + " now has a power bonus/penalty of " + targetPower + " to min and max power levels.");
if (!senderIsConsole)
P.p.log(fme.getName() + " has set the power bonus/penalty for " + target + " to " + targetPower + ".");
}
} }

View File

@ -2,11 +2,9 @@ package com.massivecraft.factions.cmd;
import com.massivecraft.factions.struct.Relation; import com.massivecraft.factions.struct.Relation;
public class CmdRelationAlly extends FRelationCommand public class CmdRelationAlly extends FRelationCommand {
{ public CmdRelationAlly() {
public CmdRelationAlly() aliases.add("ally");
{ targetRelation = Relation.ALLY;
aliases.add("ally"); }
targetRelation = Relation.ALLY;
}
} }

View File

@ -2,11 +2,9 @@ package com.massivecraft.factions.cmd;
import com.massivecraft.factions.struct.Relation; import com.massivecraft.factions.struct.Relation;
public class CmdRelationEnemy extends FRelationCommand public class CmdRelationEnemy extends FRelationCommand {
{ public CmdRelationEnemy() {
public CmdRelationEnemy() aliases.add("enemy");
{ targetRelation = Relation.ENEMY;
aliases.add("enemy"); }
targetRelation = Relation.ENEMY;
}
} }

View File

@ -2,11 +2,9 @@ package com.massivecraft.factions.cmd;
import com.massivecraft.factions.struct.Relation; import com.massivecraft.factions.struct.Relation;
public class CmdRelationNeutral extends FRelationCommand public class CmdRelationNeutral extends FRelationCommand {
{ public CmdRelationNeutral() {
public CmdRelationNeutral() aliases.add("neutral");
{ targetRelation = Relation.NEUTRAL;
aliases.add("neutral"); }
targetRelation = Relation.NEUTRAL;
}
} }

View File

@ -1,78 +1,60 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Board; import com.massivecraft.factions.*;
import com.massivecraft.factions.Conf;
import com.massivecraft.factions.FPlayers;
import com.massivecraft.factions.Factions;
import com.massivecraft.factions.P;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdReload extends FCommand public class CmdReload extends FCommand {
{
public CmdReload() {
public CmdReload() super();
{ this.aliases.add("reload");
super();
this.aliases.add("reload"); //this.requiredArgs.add("");
this.optionalArgs.put("file", "all");
//this.requiredArgs.add("");
this.optionalArgs.put("file", "all"); this.permission = Permission.RELOAD.node;
this.disableOnLock = false;
this.permission = Permission.RELOAD.node;
this.disableOnLock = false; senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBePlayer = false; senderMustBeModerator = false;
senderMustBeMember = false; senderMustBeAdmin = false;
senderMustBeModerator = false; }
senderMustBeAdmin = false;
} @Override
public void perform() {
@Override long timeInitStart = System.currentTimeMillis();
public void perform() String file = this.argAsString(0, "all").toLowerCase();
{
long timeInitStart = System.currentTimeMillis(); String fileName;
String file = this.argAsString(0, "all").toLowerCase();
if (file.startsWith("c")) {
String fileName; Conf.load();
fileName = "conf.json";
if (file.startsWith("c")) } else if (file.startsWith("b")) {
{ Board.load();
Conf.load(); fileName = "board.json";
fileName = "conf.json"; } else if (file.startsWith("f")) {
} Factions.i.loadFromDisc();
else if (file.startsWith("b")) fileName = "factions.json";
{ } else if (file.startsWith("p")) {
Board.load(); FPlayers.i.loadFromDisc();
fileName = "board.json"; fileName = "players.json";
} } else if (file.startsWith("a")) {
else if (file.startsWith("f")) fileName = "all";
{ Conf.load();
Factions.i.loadFromDisc(); FPlayers.i.loadFromDisc();
fileName = "factions.json"; Factions.i.loadFromDisc();
} Board.load();
else if (file.startsWith("p")) } else {
{ P.p.log("RELOAD CANCELLED - SPECIFIED FILE INVALID");
FPlayers.i.loadFromDisc(); msg("<b>Invalid file specified. <i>Valid files: all, conf, board, factions, players");
fileName = "players.json"; return;
} }
else if (file.startsWith("a"))
{ long timeReload = (System.currentTimeMillis() - timeInitStart);
fileName = "all";
Conf.load(); msg("<i>Reloaded <h>%s <i>from disk, took <h>%dms<i>.", fileName, timeReload);
FPlayers.i.loadFromDisc(); }
Factions.i.loadFromDisc();
Board.load();
}
else
{
P.p.log("RELOAD CANCELLED - SPECIFIED FILE INVALID");
msg("<b>Invalid file specified. <i>Valid files: all, conf, board, factions, players");
return;
}
long timeReload = (System.currentTimeMillis()-timeInitStart);
msg("<i>Reloaded <h>%s <i>from disk, took <h>%dms<i>.", fileName, timeReload);
}
} }

View File

@ -6,36 +6,33 @@ import com.massivecraft.factions.Factions;
import com.massivecraft.factions.P; import com.massivecraft.factions.P;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdSafeunclaimall extends FCommand public class CmdSafeunclaimall extends FCommand {
{
public CmdSafeunclaimall() {
public CmdSafeunclaimall() this.aliases.add("safeunclaimall");
{ this.aliases.add("safedeclaimall");
this.aliases.add("safeunclaimall");
this.aliases.add("safedeclaimall"); //this.requiredArgs.add("");
//this.optionalArgs.put("radius", "0");
//this.requiredArgs.add("");
//this.optionalArgs.put("radius", "0"); this.permission = Permission.MANAGE_SAFE_ZONE.node;
this.disableOnLock = true;
this.permission = Permission.MANAGE_SAFE_ZONE.node;
this.disableOnLock = true; senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBePlayer = false; senderMustBeModerator = false;
senderMustBeMember = false; senderMustBeAdmin = false;
senderMustBeModerator = false;
senderMustBeAdmin = false; this.setHelpShort("Unclaim all safezone land");
}
this.setHelpShort("Unclaim all safezone land");
} @Override
public void perform() {
@Override Board.unclaimAll(Factions.i.getSafeZone().getId());
public void perform() msg("<i>You unclaimed ALL safe zone land.");
{
Board.unclaimAll(Factions.i.getSafeZone().getId()); if (Conf.logLandUnclaims)
msg("<i>You unclaimed ALL safe zone land."); P.p.log(fme.getName() + " unclaimed all safe zones.");
}
if (Conf.logLandUnclaims)
P.p.log(fme.getName()+" unclaimed all safe zones.");
}
} }

View File

@ -6,35 +6,32 @@ import com.massivecraft.factions.FPlayers;
import com.massivecraft.factions.Factions; import com.massivecraft.factions.Factions;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdSaveAll extends FCommand public class CmdSaveAll extends FCommand {
{
public CmdSaveAll() {
public CmdSaveAll() super();
{ this.aliases.add("saveall");
super(); this.aliases.add("save");
this.aliases.add("saveall");
this.aliases.add("save"); //this.requiredArgs.add("");
//this.optionalArgs.put("", "");
//this.requiredArgs.add("");
//this.optionalArgs.put("", ""); this.permission = Permission.SAVE.node;
this.disableOnLock = false;
this.permission = Permission.SAVE.node;
this.disableOnLock = false; senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBePlayer = false; senderMustBeModerator = false;
senderMustBeMember = false; senderMustBeAdmin = false;
senderMustBeModerator = false; }
senderMustBeAdmin = false;
} @Override
public void perform() {
@Override FPlayers.i.saveToDisc();
public void perform() Factions.i.saveToDisc();
{ Board.save();
FPlayers.i.saveToDisc(); Conf.save();
Factions.i.saveToDisc(); msg("<i>Factions saved to disk!");
Board.save(); }
Conf.save();
msg("<i>Factions saved to disk!");
}
} }

View File

@ -7,71 +7,62 @@ import com.massivecraft.factions.Faction;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.struct.Role; import com.massivecraft.factions.struct.Role;
public class CmdSethome extends FCommand public class CmdSethome extends FCommand {
{ public CmdSethome() {
public CmdSethome() this.aliases.add("sethome");
{
this.aliases.add("sethome");
//this.requiredArgs.add("");
this.optionalArgs.put("faction tag", "mine");
this.permission = Permission.SETHOME.node;
this.disableOnLock = true;
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
if ( ! Conf.homesEnabled)
{
fme.msg("<b>Sorry, Faction homes are disabled on this server.");
return;
}
Faction faction = this.argAsFaction(0, myFaction);
if (faction == null) return;
// Can the player set the home for this faction?
if (faction == myFaction)
{
if ( ! Permission.SETHOME_ANY.has(sender) && ! assertMinRole(Role.MODERATOR)) return;
}
else
{
if ( ! Permission.SETHOME_ANY.has(sender, true)) return;
}
// Can the player set the faction home HERE?
if
(
! Permission.BYPASS.has(me)
&&
Conf.homesMustBeInClaimedTerritory
&&
Board.getFactionAt(new FLocation(me)) != faction
)
{
fme.msg("<b>Sorry, your faction home can only be set inside your own claimed territory.");
return;
}
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay //this.requiredArgs.add("");
if ( ! payForCommand(Conf.econCostSethome, "to set the faction home", "for setting the faction home")) return; this.optionalArgs.put("faction tag", "mine");
this.permission = Permission.SETHOME.node;
this.disableOnLock = true;
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform() {
if (!Conf.homesEnabled) {
fme.msg("<b>Sorry, Faction homes are disabled on this server.");
return;
}
Faction faction = this.argAsFaction(0, myFaction);
if (faction == null) return;
// Can the player set the home for this faction?
if (faction == myFaction) {
if (!Permission.SETHOME_ANY.has(sender) && !assertMinRole(Role.MODERATOR)) return;
} else {
if (!Permission.SETHOME_ANY.has(sender, true)) return;
}
// Can the player set the faction home HERE?
if
(
!Permission.BYPASS.has(me)
&&
Conf.homesMustBeInClaimedTerritory
&&
Board.getFactionAt(new FLocation(me)) != faction
) {
fme.msg("<b>Sorry, your faction home can only be set inside your own claimed territory.");
return;
}
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay
if (!payForCommand(Conf.econCostSethome, "to set the faction home", "for setting the faction home")) return;
faction.setHome(me.getLocation());
faction.msg("%s<i> set the home for your faction. You can now use:", fme.describeTo(myFaction, true));
faction.sendMessage(p.cmdBase.cmdHome.getUseageTemplate());
if (faction != myFaction) {
fme.msg("<b>You have set the home for the " + faction.getTag(fme) + "<i> faction.");
}
}
faction.setHome(me.getLocation());
faction.msg("%s<i> set the home for your faction. You can now use:", fme.describeTo(myFaction, true));
faction.sendMessage(p.cmdBase.cmdHome.getUseageTemplate());
if (faction != myFaction)
{
fme.msg("<b>You have set the home for the "+faction.getTag(fme)+"<i> faction.");
}
}
} }

View File

@ -1,165 +1,150 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import java.util.Collection;
import com.massivecraft.factions.Conf; import com.massivecraft.factions.Conf;
import com.massivecraft.factions.integration.Econ;
import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.Faction; import com.massivecraft.factions.Faction;
import com.massivecraft.factions.Factions; import com.massivecraft.factions.Factions;
import com.massivecraft.factions.integration.Econ;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.struct.Role;
import com.massivecraft.factions.struct.Relation; import com.massivecraft.factions.struct.Relation;
import com.massivecraft.factions.struct.Role;
public class CmdShow extends FCommand import java.util.Collection;
{
public CmdShow()
{
this.aliases.add("show");
this.aliases.add("who");
//this.requiredArgs.add("");
this.optionalArgs.put("faction tag", "yours");
this.permission = Permission.SHOW.node;
this.disableOnLock = false;
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override public class CmdShow extends FCommand {
public void perform()
{
Faction faction = myFaction;
if (this.argIsSet(0))
{
faction = this.argAsFaction(0);
if (faction == null) return;
}
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay public CmdShow() {
if ( ! payForCommand(Conf.econCostShow, "to show faction information", "for showing faction information")) return; this.aliases.add("show");
this.aliases.add("who");
Collection<FPlayer> admins = faction.getFPlayersWhereRole(Role.ADMIN); //this.requiredArgs.add("");
Collection<FPlayer> mods = faction.getFPlayersWhereRole(Role.MODERATOR); this.optionalArgs.put("faction tag", "yours");
Collection<FPlayer> normals = faction.getFPlayersWhereRole(Role.NORMAL);
msg(p.txt.titleize(faction.getTag(fme)));
msg("<a>Description: <i>%s", faction.getDescription());
if ( ! faction.isNormal())
{
return;
}
String peaceStatus = "";
if (faction.isPeaceful())
{
peaceStatus = " "+Conf.colorNeutral+"This faction is Peaceful";
}
msg("<a>Joining: <i>"+(faction.getOpen() ? "no invitation is needed" : "invitation is required")+peaceStatus);
double powerBoost = faction.getPowerBoost(); this.permission = Permission.SHOW.node;
String boost = (powerBoost == 0.0) ? "" : (powerBoost > 0.0 ? " (bonus: " : " (penalty: ") + powerBoost + ")"; this.disableOnLock = false;
msg("<a>Land / Power / Maxpower: <i> %d/%d/%d %s", faction.getLandRounded(), faction.getPowerRounded(), faction.getPowerMaxRounded(), boost);
if (faction.isPermanent()) senderMustBePlayer = true;
{ senderMustBeMember = false;
msg("<a>This faction is permanent, remaining even with no members."); senderMustBeModerator = false;
} senderMustBeAdmin = false;
}
// show the land value @Override
if (Econ.shouldBeUsed()) public void perform() {
{ Faction faction = myFaction;
double value = Econ.calculateTotalLandValue(faction.getLandRounded()); if (this.argIsSet(0)) {
double refund = value * Conf.econClaimRefundMultiplier; faction = this.argAsFaction(0);
if (value > 0) if (faction == null) return;
{ }
String stringValue = Econ.moneyString(value);
String stringRefund = (refund > 0.0) ? (" ("+Econ.moneyString(refund)+" depreciated)") : "";
msg("<a>Total land value: <i>" + stringValue + stringRefund);
}
//Show bank contents
if(Conf.bankEnabled) {
msg("<a>Bank contains: <i>"+Econ.moneyString(Econ.getBalance(faction.getAccountId())));
}
}
String listpart; // if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay
if (!payForCommand(Conf.econCostShow, "to show faction information", "for showing faction information")) return;
// List relation
String allyList = p.txt.parse("<a>Allies: ");
String enemyList = p.txt.parse("<a>Enemies: ");
for (Faction otherFaction : Factions.i.get())
{
if (otherFaction == faction) continue;
Relation rel = otherFaction.getRelationTo(faction); Collection<FPlayer> admins = faction.getFPlayersWhereRole(Role.ADMIN);
if ( ! rel.isAlly() && ! rel.isEnemy()) continue; // if not ally or enemy, drop out now so we're not wasting time on it; good performance boost Collection<FPlayer> mods = faction.getFPlayersWhereRole(Role.MODERATOR);
Collection<FPlayer> normals = faction.getFPlayersWhereRole(Role.NORMAL);
msg(p.txt.titleize(faction.getTag(fme)));
msg("<a>Description: <i>%s", faction.getDescription());
if (!faction.isNormal()) {
return;
}
String peaceStatus = "";
if (faction.isPeaceful()) {
peaceStatus = " " + Conf.colorNeutral + "This faction is Peaceful";
}
msg("<a>Joining: <i>" + (faction.getOpen() ? "no invitation is needed" : "invitation is required") + peaceStatus);
double powerBoost = faction.getPowerBoost();
String boost = (powerBoost == 0.0) ? "" : (powerBoost > 0.0 ? " (bonus: " : " (penalty: ") + powerBoost + ")";
msg("<a>Land / Power / Maxpower: <i> %d/%d/%d %s", faction.getLandRounded(), faction.getPowerRounded(), faction.getPowerMaxRounded(), boost);
if (faction.isPermanent()) {
msg("<a>This faction is permanent, remaining even with no members.");
}
// show the land value
if (Econ.shouldBeUsed()) {
double value = Econ.calculateTotalLandValue(faction.getLandRounded());
double refund = value * Conf.econClaimRefundMultiplier;
if (value > 0) {
String stringValue = Econ.moneyString(value);
String stringRefund = (refund > 0.0) ? (" (" + Econ.moneyString(refund) + " depreciated)") : "";
msg("<a>Total land value: <i>" + stringValue + stringRefund);
}
//Show bank contents
if (Conf.bankEnabled) {
msg("<a>Bank contains: <i>" + Econ.moneyString(Econ.getBalance(faction.getAccountId())));
}
}
String listpart;
// List relation
String allyList = p.txt.parse("<a>Allies: ");
String enemyList = p.txt.parse("<a>Enemies: ");
for (Faction otherFaction : Factions.i.get()) {
if (otherFaction == faction) continue;
Relation rel = otherFaction.getRelationTo(faction);
if (!rel.isAlly() && !rel.isEnemy())
continue; // if not ally or enemy, drop out now so we're not wasting time on it; good performance boost
listpart = otherFaction.getTag(fme) + p.txt.parse("<i>") + ", ";
if (rel.isAlly())
allyList += listpart;
else if (rel.isEnemy())
enemyList += listpart;
}
if (allyList.endsWith(", "))
allyList = allyList.substring(0, allyList.length() - 2);
if (enemyList.endsWith(", "))
enemyList = enemyList.substring(0, enemyList.length() - 2);
sendMessage(allyList);
sendMessage(enemyList);
// List the members...
String onlineList = p.txt.parse("<a>") + "Members online: ";
String offlineList = p.txt.parse("<a>") + "Members offline: ";
for (FPlayer follower : admins) {
listpart = follower.getNameAndTitle(fme) + p.txt.parse("<i>") + ", ";
if (follower.isOnlineAndVisibleTo(me)) {
onlineList += listpart;
} else {
offlineList += listpart;
}
}
for (FPlayer follower : mods) {
listpart = follower.getNameAndTitle(fme) + p.txt.parse("<i>") + ", ";
if
(follower.isOnlineAndVisibleTo(me)) {
onlineList += listpart;
} else {
offlineList += listpart;
}
}
for (FPlayer follower : normals) {
listpart = follower.getNameAndTitle(fme) + p.txt.parse("<i>") + ", ";
if (follower.isOnlineAndVisibleTo(me)) {
onlineList += listpart;
} else {
offlineList += listpart;
}
}
if (onlineList.endsWith(", ")) {
onlineList = onlineList.substring(0, onlineList.length() - 2);
}
if (offlineList.endsWith(", ")) {
offlineList = offlineList.substring(0, offlineList.length() - 2);
}
sendMessage(onlineList);
sendMessage(offlineList);
}
listpart = otherFaction.getTag(fme)+p.txt.parse("<i>")+", ";
if (rel.isAlly())
allyList += listpart;
else if (rel.isEnemy())
enemyList += listpart;
}
if (allyList.endsWith(", "))
allyList = allyList.substring(0, allyList.length()-2);
if (enemyList.endsWith(", "))
enemyList = enemyList.substring(0, enemyList.length()-2);
sendMessage(allyList);
sendMessage(enemyList);
// List the members...
String onlineList = p.txt.parse("<a>")+"Members online: ";
String offlineList = p.txt.parse("<a>")+"Members offline: ";
for (FPlayer follower : admins)
{
listpart = follower.getNameAndTitle(fme)+p.txt.parse("<i>")+", ";
if (follower.isOnlineAndVisibleTo(me))
{
onlineList += listpart;
}
else
{
offlineList += listpart;
}
}
for (FPlayer follower : mods)
{
listpart = follower.getNameAndTitle(fme)+p.txt.parse("<i>")+", ";
if
(follower.isOnlineAndVisibleTo(me))
{
onlineList += listpart;
} else {
offlineList += listpart;
}
}
for (FPlayer follower : normals) {
listpart = follower.getNameAndTitle(fme)+p.txt.parse("<i>")+", ";
if (follower.isOnlineAndVisibleTo(me)) {
onlineList += listpart;
} else {
offlineList += listpart;
}
}
if (onlineList.endsWith(", ")) {
onlineList = onlineList.substring(0, onlineList.length()-2);
}
if (offlineList.endsWith(", ")) {
offlineList = offlineList.substring(0, offlineList.length()-2);
}
sendMessage(onlineList);
sendMessage(offlineList);
}
} }

View File

@ -1,9 +1,5 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import java.util.ArrayList;
import org.bukkit.Bukkit;
import com.massivecraft.factions.Conf; import com.massivecraft.factions.Conf;
import com.massivecraft.factions.Faction; import com.massivecraft.factions.Faction;
import com.massivecraft.factions.Factions; import com.massivecraft.factions.Factions;
@ -11,75 +7,70 @@ import com.massivecraft.factions.event.FactionRenameEvent;
import com.massivecraft.factions.integration.SpoutFeatures; import com.massivecraft.factions.integration.SpoutFeatures;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.util.MiscUtil; import com.massivecraft.factions.util.MiscUtil;
import org.bukkit.Bukkit;
public class CmdTag extends FCommand import java.util.ArrayList;
{
public CmdTag()
{
this.aliases.add("tag");
this.requiredArgs.add("faction tag");
//this.optionalArgs.put("", "");
this.permission = Permission.TAG.node;
this.disableOnLock = true;
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = true;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
String tag = this.argAsString(0);
// TODO does not first test cover selfcase?
if (Factions.i.isTagTaken(tag) && ! MiscUtil.getComparisonString(tag).equals(myFaction.getComparisonTag()))
{
msg("<b>That tag is already taken");
return;
}
ArrayList<String> errors = new ArrayList<String>();
errors.addAll(Factions.validateTag(tag));
if (errors.size() > 0)
{
sendMessage(errors);
return;
}
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make sure they can pay public class CmdTag extends FCommand {
if ( ! canAffordCommand(Conf.econCostTag, "to change the faction tag")) return;
// trigger the faction rename event (cancellable) public CmdTag() {
FactionRenameEvent renameEvent = new FactionRenameEvent(fme, tag); this.aliases.add("tag");
Bukkit.getServer().getPluginManager().callEvent(renameEvent);
if(renameEvent.isCancelled()) return;
// then make 'em pay (if applicable) this.requiredArgs.add("faction tag");
if ( ! payForCommand(Conf.econCostTag, "to change the faction tag", "for changing the faction tag")) return; //this.optionalArgs.put("", "");
String oldtag = myFaction.getTag(); this.permission = Permission.TAG.node;
myFaction.setTag(tag); this.disableOnLock = true;
// Inform senderMustBePlayer = true;
myFaction.msg("%s<i> changed your faction tag to %s", fme.describeTo(myFaction, true), myFaction.getTag(myFaction)); senderMustBeMember = false;
for (Faction faction : Factions.i.get()) senderMustBeModerator = true;
{ senderMustBeAdmin = false;
if (faction == myFaction) }
{
continue; @Override
} public void perform() {
faction.msg("<i>The faction %s<i> changed their name to %s.", fme.getColorTo(faction)+oldtag, myFaction.getTag(faction)); String tag = this.argAsString(0);
}
// TODO does not first test cover selfcase?
if (Factions.i.isTagTaken(tag) && !MiscUtil.getComparisonString(tag).equals(myFaction.getComparisonTag())) {
msg("<b>That tag is already taken");
return;
}
ArrayList<String> errors = new ArrayList<String>();
errors.addAll(Factions.validateTag(tag));
if (errors.size() > 0) {
sendMessage(errors);
return;
}
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make sure they can pay
if (!canAffordCommand(Conf.econCostTag, "to change the faction tag")) return;
// trigger the faction rename event (cancellable)
FactionRenameEvent renameEvent = new FactionRenameEvent(fme, tag);
Bukkit.getServer().getPluginManager().callEvent(renameEvent);
if (renameEvent.isCancelled()) return;
// then make 'em pay (if applicable)
if (!payForCommand(Conf.econCostTag, "to change the faction tag", "for changing the faction tag")) return;
String oldtag = myFaction.getTag();
myFaction.setTag(tag);
// Inform
myFaction.msg("%s<i> changed your faction tag to %s", fme.describeTo(myFaction, true), myFaction.getTag(myFaction));
for (Faction faction : Factions.i.get()) {
if (faction == myFaction) {
continue;
}
faction.msg("<i>The faction %s<i> changed their name to %s.", fme.getColorTo(faction) + oldtag, myFaction.getTag(faction));
}
if (Conf.spoutFactionTagsOverNames) {
SpoutFeatures.updateAppearances(myFaction);
}
}
if (Conf.spoutFactionTagsOverNames)
{
SpoutFeatures.updateAppearances(myFaction);
}
}
} }

View File

@ -6,47 +6,43 @@ import com.massivecraft.factions.integration.SpoutFeatures;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.zcore.util.TextUtil; import com.massivecraft.factions.zcore.util.TextUtil;
public class CmdTitle extends FCommand public class CmdTitle extends FCommand {
{ public CmdTitle() {
public CmdTitle() this.aliases.add("title");
{
this.aliases.add("title");
this.requiredArgs.add("player name");
this.optionalArgs.put("title", "");
this.permission = Permission.TITLE.node;
this.disableOnLock = true;
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = true;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
FPlayer you = this.argAsBestFPlayerMatch(0);
if (you == null) return;
args.remove(0);
String title = TextUtil.implode(args, " ");
if ( ! canIAdministerYou(fme, you)) return;
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay this.requiredArgs.add("player name");
if ( ! payForCommand(Conf.econCostTitle, "to change a players title", "for changing a players title")) return; this.optionalArgs.put("title", "");
you.setTitle(title); this.permission = Permission.TITLE.node;
this.disableOnLock = true;
// Inform
myFaction.msg("%s<i> changed a title: %s", fme.describeTo(myFaction, true), you.describeTo(myFaction, true)); senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = true;
senderMustBeAdmin = false;
}
@Override
public void perform() {
FPlayer you = this.argAsBestFPlayerMatch(0);
if (you == null) return;
args.remove(0);
String title = TextUtil.implode(args, " ");
if (!canIAdministerYou(fme, you)) return;
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay
if (!payForCommand(Conf.econCostTitle, "to change a players title", "for changing a players title")) return;
you.setTitle(title);
// Inform
myFaction.msg("%s<i> changed a title: %s", fme.describeTo(myFaction, true), you.describeTo(myFaction, true));
if (Conf.spoutFactionTitlesOverNames) {
SpoutFeatures.updateAppearances(me);
}
}
if (Conf.spoutFactionTitlesOverNames)
{
SpoutFeatures.updateAppearances(me);
}
}
} }

View File

@ -1,133 +1,108 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import org.bukkit.Bukkit; import com.massivecraft.factions.*;
import com.massivecraft.factions.Board;
import com.massivecraft.factions.Conf;
import com.massivecraft.factions.event.LandUnclaimEvent; import com.massivecraft.factions.event.LandUnclaimEvent;
import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.integration.Econ;
import com.massivecraft.factions.integration.SpoutFeatures; import com.massivecraft.factions.integration.SpoutFeatures;
import com.massivecraft.factions.FLocation;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.P;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.struct.Role; import com.massivecraft.factions.struct.Role;
import org.bukkit.Bukkit;
public class CmdUnclaim extends FCommand public class CmdUnclaim extends FCommand {
{ public CmdUnclaim() {
public CmdUnclaim() this.aliases.add("unclaim");
{ this.aliases.add("declaim");
this.aliases.add("unclaim");
this.aliases.add("declaim");
//this.requiredArgs.add("");
//this.optionalArgs.put("", "");
this.permission = Permission.UNCLAIM.node;
this.disableOnLock = true;
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
FLocation flocation = new FLocation(fme);
Faction otherFaction = Board.getFactionAt(flocation);
if (otherFaction.isSafeZone())
{
if (Permission.MANAGE_SAFE_ZONE.has(sender))
{
Board.removeAt(flocation);
SpoutFeatures.updateTerritoryDisplayLoc(flocation);
msg("<i>Safe zone was unclaimed.");
if (Conf.logLandUnclaims) //this.requiredArgs.add("");
P.p.log(fme.getName()+" unclaimed land at ("+flocation.getCoordString()+") from the faction: "+otherFaction.getTag()); //this.optionalArgs.put("", "");
}
else
{
msg("<b>This is a safe zone. You lack permissions to unclaim.");
}
return;
}
else if (otherFaction.isWarZone())
{
if (Permission.MANAGE_WAR_ZONE.has(sender))
{
Board.removeAt(flocation);
SpoutFeatures.updateTerritoryDisplayLoc(flocation);
msg("<i>War zone was unclaimed.");
if (Conf.logLandUnclaims) this.permission = Permission.UNCLAIM.node;
P.p.log(fme.getName()+" unclaimed land at ("+flocation.getCoordString()+") from the faction: "+otherFaction.getTag()); this.disableOnLock = true;
}
else
{
msg("<b>This is a war zone. You lack permissions to unclaim.");
}
return;
}
if (fme.isAdminBypassing())
{
Board.removeAt(flocation);
SpoutFeatures.updateTerritoryDisplayLoc(flocation);
otherFaction.msg("%s<i> unclaimed some of your land.", fme.describeTo(otherFaction, true)); senderMustBePlayer = true;
msg("<i>You unclaimed this land."); senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
if (Conf.logLandUnclaims) @Override
P.p.log(fme.getName()+" unclaimed land at ("+flocation.getCoordString()+") from the faction: "+otherFaction.getTag()); public void perform() {
FLocation flocation = new FLocation(fme);
Faction otherFaction = Board.getFactionAt(flocation);
return; if (otherFaction.isSafeZone()) {
} if (Permission.MANAGE_SAFE_ZONE.has(sender)) {
Board.removeAt(flocation);
if ( ! assertHasFaction()) SpoutFeatures.updateTerritoryDisplayLoc(flocation);
{ msg("<i>Safe zone was unclaimed.");
return;
}
if ( ! assertMinRole(Role.MODERATOR))
{
return;
}
if ( myFaction != otherFaction)
{
msg("<b>You don't own this land.");
return;
}
LandUnclaimEvent unclaimEvent = new LandUnclaimEvent(flocation, otherFaction, fme); if (Conf.logLandUnclaims)
Bukkit.getServer().getPluginManager().callEvent(unclaimEvent); P.p.log(fme.getName() + " unclaimed land at (" + flocation.getCoordString() + ") from the faction: " + otherFaction.getTag());
if(unclaimEvent.isCancelled()) return; } else {
msg("<b>This is a safe zone. You lack permissions to unclaim.");
}
return;
} else if (otherFaction.isWarZone()) {
if (Permission.MANAGE_WAR_ZONE.has(sender)) {
Board.removeAt(flocation);
SpoutFeatures.updateTerritoryDisplayLoc(flocation);
msg("<i>War zone was unclaimed.");
if (Econ.shouldBeUsed()) if (Conf.logLandUnclaims)
{ P.p.log(fme.getName() + " unclaimed land at (" + flocation.getCoordString() + ") from the faction: " + otherFaction.getTag());
double refund = Econ.calculateClaimRefund(myFaction.getLandRounded()); } else {
msg("<b>This is a war zone. You lack permissions to unclaim.");
if(Conf.bankEnabled && Conf.bankFactionPaysLandCosts) }
{ return;
if ( ! Econ.modifyMoney(myFaction, refund, "to unclaim this land", "for unclaiming this land")) return; }
}
else
{
if ( ! Econ.modifyMoney(fme , refund, "to unclaim this land", "for unclaiming this land")) return;
}
}
Board.removeAt(flocation); if (fme.isAdminBypassing()) {
SpoutFeatures.updateTerritoryDisplayLoc(flocation); Board.removeAt(flocation);
myFaction.msg("%s<i> unclaimed some land.", fme.describeTo(myFaction, true)); SpoutFeatures.updateTerritoryDisplayLoc(flocation);
otherFaction.msg("%s<i> unclaimed some of your land.", fme.describeTo(otherFaction, true));
msg("<i>You unclaimed this land.");
if (Conf.logLandUnclaims)
P.p.log(fme.getName() + " unclaimed land at (" + flocation.getCoordString() + ") from the faction: " + otherFaction.getTag());
return;
}
if (!assertHasFaction()) {
return;
}
if (!assertMinRole(Role.MODERATOR)) {
return;
}
if (myFaction != otherFaction) {
msg("<b>You don't own this land.");
return;
}
LandUnclaimEvent unclaimEvent = new LandUnclaimEvent(flocation, otherFaction, fme);
Bukkit.getServer().getPluginManager().callEvent(unclaimEvent);
if (unclaimEvent.isCancelled()) return;
if (Econ.shouldBeUsed()) {
double refund = Econ.calculateClaimRefund(myFaction.getLandRounded());
if (Conf.bankEnabled && Conf.bankFactionPaysLandCosts) {
if (!Econ.modifyMoney(myFaction, refund, "to unclaim this land", "for unclaiming this land")) return;
} else {
if (!Econ.modifyMoney(fme, refund, "to unclaim this land", "for unclaiming this land")) return;
}
}
Board.removeAt(flocation);
SpoutFeatures.updateTerritoryDisplayLoc(flocation);
myFaction.msg("%s<i> unclaimed some land.", fme.describeTo(myFaction, true));
if (Conf.logLandUnclaims)
P.p.log(fme.getName() + " unclaimed land at (" + flocation.getCoordString() + ") from the faction: " + otherFaction.getTag());
}
if (Conf.logLandUnclaims)
P.p.log(fme.getName()+" unclaimed land at ("+flocation.getCoordString()+") from the faction: "+otherFaction.getTag());
}
} }

View File

@ -1,7 +1,5 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import org.bukkit.Bukkit;
import com.massivecraft.factions.Board; import com.massivecraft.factions.Board;
import com.massivecraft.factions.Conf; import com.massivecraft.factions.Conf;
import com.massivecraft.factions.P; import com.massivecraft.factions.P;
@ -9,52 +7,48 @@ import com.massivecraft.factions.event.LandUnclaimAllEvent;
import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.integration.Econ;
import com.massivecraft.factions.integration.SpoutFeatures; import com.massivecraft.factions.integration.SpoutFeatures;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import org.bukkit.Bukkit;
public class CmdUnclaimall extends FCommand public class CmdUnclaimall extends FCommand {
{ public CmdUnclaimall() {
public CmdUnclaimall() this.aliases.add("unclaimall");
{ this.aliases.add("declaimall");
this.aliases.add("unclaimall");
this.aliases.add("declaimall");
//this.requiredArgs.add("");
//this.optionalArgs.put("", "");
this.permission = Permission.UNCLAIM_ALL.node;
this.disableOnLock = true;
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = true;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
if (Econ.shouldBeUsed())
{
double refund = Econ.calculateTotalLandRefund(myFaction.getLandRounded());
if(Conf.bankEnabled && Conf.bankFactionPaysLandCosts)
{
if ( ! Econ.modifyMoney(myFaction, refund, "to unclaim all faction land", "for unclaiming all faction land")) return;
}
else
{
if ( ! Econ.modifyMoney(fme , refund, "to unclaim all faction land", "for unclaiming all faction land")) return;
}
}
LandUnclaimAllEvent unclaimAllEvent = new LandUnclaimAllEvent(myFaction, fme); //this.requiredArgs.add("");
Bukkit.getServer().getPluginManager().callEvent(unclaimAllEvent); //this.optionalArgs.put("", "");
// this event cannot be cancelled
Board.unclaimAll(myFaction.getId()); this.permission = Permission.UNCLAIM_ALL.node;
myFaction.msg("%s<i> unclaimed ALL of your faction's land.", fme.describeTo(myFaction, true)); this.disableOnLock = true;
SpoutFeatures.updateTerritoryDisplayLoc(null);
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = true;
senderMustBeAdmin = false;
}
@Override
public void perform() {
if (Econ.shouldBeUsed()) {
double refund = Econ.calculateTotalLandRefund(myFaction.getLandRounded());
if (Conf.bankEnabled && Conf.bankFactionPaysLandCosts) {
if (!Econ.modifyMoney(myFaction, refund, "to unclaim all faction land", "for unclaiming all faction land"))
return;
} else {
if (!Econ.modifyMoney(fme, refund, "to unclaim all faction land", "for unclaiming all faction land"))
return;
}
}
LandUnclaimAllEvent unclaimAllEvent = new LandUnclaimAllEvent(myFaction, fme);
Bukkit.getServer().getPluginManager().callEvent(unclaimAllEvent);
// this event cannot be cancelled
Board.unclaimAll(myFaction.getId());
myFaction.msg("%s<i> unclaimed ALL of your faction's land.", fme.describeTo(myFaction, true));
SpoutFeatures.updateTerritoryDisplayLoc(null);
if (Conf.logLandUnclaims)
P.p.log(fme.getName() + " unclaimed everything for the faction: " + myFaction.getTag());
}
if (Conf.logLandUnclaims)
P.p.log(fme.getName()+" unclaimed everything for the faction: "+myFaction.getTag());
}
} }

View File

@ -4,27 +4,24 @@ import com.massivecraft.factions.P;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdVersion extends FCommand public class CmdVersion extends FCommand {
{ public CmdVersion() {
public CmdVersion() this.aliases.add("version");
{
this.aliases.add("version");
//this.requiredArgs.add("");
//this.optionalArgs.put("", "");
this.permission = Permission.VERSION.node;
this.disableOnLock = false;
senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override //this.requiredArgs.add("");
public void perform() //this.optionalArgs.put("", "");
{
msg("<i>You are running "+P.p.getDescription().getFullName()); this.permission = Permission.VERSION.node;
} this.disableOnLock = false;
senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void perform() {
msg("<i>You are running " + P.p.getDescription().getFullName());
}
} }

View File

@ -6,36 +6,33 @@ import com.massivecraft.factions.Factions;
import com.massivecraft.factions.P; import com.massivecraft.factions.P;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
public class CmdWarunclaimall extends FCommand public class CmdWarunclaimall extends FCommand {
{
public CmdWarunclaimall() {
public CmdWarunclaimall() this.aliases.add("warunclaimall");
{ this.aliases.add("wardeclaimall");
this.aliases.add("warunclaimall");
this.aliases.add("wardeclaimall"); //this.requiredArgs.add("");
//this.optionalArgs.put("", "");
//this.requiredArgs.add("");
//this.optionalArgs.put("", ""); this.permission = Permission.MANAGE_WAR_ZONE.node;
this.disableOnLock = true;
this.permission = Permission.MANAGE_WAR_ZONE.node;
this.disableOnLock = true; senderMustBePlayer = false;
senderMustBeMember = false;
senderMustBePlayer = false; senderMustBeModerator = false;
senderMustBeMember = false; senderMustBeAdmin = false;
senderMustBeModerator = false;
senderMustBeAdmin = false; this.setHelpShort("unclaim all warzone land");
}
this.setHelpShort("unclaim all warzone land");
} @Override
public void perform() {
@Override Board.unclaimAll(Factions.i.getWarZone().getId());
public void perform() msg("<i>You unclaimed ALL war zone land.");
{
Board.unclaimAll(Factions.i.getWarZone().getId()); if (Conf.logLandUnclaims)
msg("<i>You unclaimed ALL war zone land."); P.p.log(fme.getName() + " unclaimed all war zones.");
}
if (Conf.logLandUnclaims)
P.p.log(fme.getName()+" unclaimed all war zones.");
}
} }

View File

@ -1,131 +1,128 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import java.util.Collections;
import com.massivecraft.factions.Conf; import com.massivecraft.factions.Conf;
public class FCmdRoot extends FCommand import java.util.Collections;
{
public CmdAdmin cmdAdmin = new CmdAdmin(); public class FCmdRoot extends FCommand {
public CmdAutoClaim cmdAutoClaim = new CmdAutoClaim(); public CmdAdmin cmdAdmin = new CmdAdmin();
public CmdBoom cmdBoom = new CmdBoom(); public CmdAutoClaim cmdAutoClaim = new CmdAutoClaim();
public CmdBypass cmdBypass = new CmdBypass(); public CmdBoom cmdBoom = new CmdBoom();
public CmdChat cmdChat = new CmdChat(); public CmdBypass cmdBypass = new CmdBypass();
public CmdChatSpy cmdChatSpy = new CmdChatSpy(); public CmdChat cmdChat = new CmdChat();
public CmdClaim cmdClaim = new CmdClaim(); public CmdChatSpy cmdChatSpy = new CmdChatSpy();
public CmdConfig cmdConfig = new CmdConfig(); public CmdClaim cmdClaim = new CmdClaim();
public CmdCreate cmdCreate = new CmdCreate(); public CmdConfig cmdConfig = new CmdConfig();
public CmdDeinvite cmdDeinvite = new CmdDeinvite(); public CmdCreate cmdCreate = new CmdCreate();
public CmdDescription cmdDescription = new CmdDescription(); public CmdDeinvite cmdDeinvite = new CmdDeinvite();
public CmdDisband cmdDisband = new CmdDisband(); public CmdDescription cmdDescription = new CmdDescription();
public CmdHelp cmdHelp = new CmdHelp(); public CmdDisband cmdDisband = new CmdDisband();
public CmdHome cmdHome = new CmdHome(); public CmdHelp cmdHelp = new CmdHelp();
public CmdInvite cmdInvite = new CmdInvite(); public CmdHome cmdHome = new CmdHome();
public CmdJoin cmdJoin = new CmdJoin(); public CmdInvite cmdInvite = new CmdInvite();
public CmdKick cmdKick = new CmdKick(); public CmdJoin cmdJoin = new CmdJoin();
public CmdLeave cmdLeave = new CmdLeave(); public CmdKick cmdKick = new CmdKick();
public CmdList cmdList = new CmdList(); public CmdLeave cmdLeave = new CmdLeave();
public CmdLock cmdLock = new CmdLock(); public CmdList cmdList = new CmdList();
public CmdMap cmdMap = new CmdMap(); public CmdLock cmdLock = new CmdLock();
public CmdMod cmdMod = new CmdMod(); public CmdMap cmdMap = new CmdMap();
public CmdMoney cmdMoney = new CmdMoney(); public CmdMod cmdMod = new CmdMod();
public CmdOpen cmdOpen = new CmdOpen(); public CmdMoney cmdMoney = new CmdMoney();
public CmdOwner cmdOwner = new CmdOwner(); public CmdOpen cmdOpen = new CmdOpen();
public CmdOwnerList cmdOwnerList = new CmdOwnerList(); public CmdOwner cmdOwner = new CmdOwner();
public CmdPeaceful cmdPeaceful = new CmdPeaceful(); public CmdOwnerList cmdOwnerList = new CmdOwnerList();
public CmdPermanent cmdPermanent = new CmdPermanent(); public CmdPeaceful cmdPeaceful = new CmdPeaceful();
public CmdPermanentPower cmdPermanentPower = new CmdPermanentPower(); public CmdPermanent cmdPermanent = new CmdPermanent();
public CmdPowerBoost cmdPowerBoost = new CmdPowerBoost(); public CmdPermanentPower cmdPermanentPower = new CmdPermanentPower();
public CmdPower cmdPower = new CmdPower(); public CmdPowerBoost cmdPowerBoost = new CmdPowerBoost();
public CmdRelationAlly cmdRelationAlly = new CmdRelationAlly(); public CmdPower cmdPower = new CmdPower();
public CmdRelationEnemy cmdRelationEnemy = new CmdRelationEnemy(); public CmdRelationAlly cmdRelationAlly = new CmdRelationAlly();
public CmdRelationNeutral cmdRelationNeutral = new CmdRelationNeutral(); public CmdRelationEnemy cmdRelationEnemy = new CmdRelationEnemy();
public CmdReload cmdReload = new CmdReload(); public CmdRelationNeutral cmdRelationNeutral = new CmdRelationNeutral();
public CmdSafeunclaimall cmdSafeunclaimall = new CmdSafeunclaimall(); public CmdReload cmdReload = new CmdReload();
public CmdSaveAll cmdSaveAll = new CmdSaveAll(); public CmdSafeunclaimall cmdSafeunclaimall = new CmdSafeunclaimall();
public CmdSethome cmdSethome = new CmdSethome(); public CmdSaveAll cmdSaveAll = new CmdSaveAll();
public CmdShow cmdShow = new CmdShow(); public CmdSethome cmdSethome = new CmdSethome();
public CmdTag cmdTag = new CmdTag(); public CmdShow cmdShow = new CmdShow();
public CmdTitle cmdTitle = new CmdTitle(); public CmdTag cmdTag = new CmdTag();
public CmdUnclaim cmdUnclaim = new CmdUnclaim(); public CmdTitle cmdTitle = new CmdTitle();
public CmdUnclaimall cmdUnclaimall = new CmdUnclaimall(); public CmdUnclaim cmdUnclaim = new CmdUnclaim();
public CmdVersion cmdVersion = new CmdVersion(); public CmdUnclaimall cmdUnclaimall = new CmdUnclaimall();
public CmdWarunclaimall cmdWarunclaimall = new CmdWarunclaimall(); public CmdVersion cmdVersion = new CmdVersion();
public CmdWarunclaimall cmdWarunclaimall = new CmdWarunclaimall();
public FCmdRoot()
{ public FCmdRoot() {
super(); super();
this.aliases.addAll(Conf.baseCommandAliases); this.aliases.addAll(Conf.baseCommandAliases);
this.aliases.removeAll(Collections.singletonList(null)); // remove any nulls from extra commas this.aliases.removeAll(Collections.singletonList(null)); // remove any nulls from extra commas
this.allowNoSlashAccess = Conf.allowNoSlashCommand; this.allowNoSlashAccess = Conf.allowNoSlashCommand;
//this.requiredArgs.add(""); //this.requiredArgs.add("");
//this.optionalArgs.put("","") //this.optionalArgs.put("","")
senderMustBePlayer = false; senderMustBePlayer = false;
senderMustBeMember = false; senderMustBeMember = false;
senderMustBeModerator = false; senderMustBeModerator = false;
senderMustBeAdmin = false; senderMustBeAdmin = false;
this.disableOnLock = false; this.disableOnLock = false;
this.setHelpShort("The faction base command"); this.setHelpShort("The faction base command");
this.helpLong.add(p.txt.parseTags("<i>This command contains all faction stuff.")); this.helpLong.add(p.txt.parseTags("<i>This command contains all faction stuff."));
//this.subCommands.add(p.cmdHelp); //this.subCommands.add(p.cmdHelp);
this.addSubCommand(this.cmdAdmin); this.addSubCommand(this.cmdAdmin);
this.addSubCommand(this.cmdAutoClaim); this.addSubCommand(this.cmdAutoClaim);
this.addSubCommand(this.cmdBoom); this.addSubCommand(this.cmdBoom);
this.addSubCommand(this.cmdBypass); this.addSubCommand(this.cmdBypass);
this.addSubCommand(this.cmdChat); this.addSubCommand(this.cmdChat);
this.addSubCommand(this.cmdChatSpy); this.addSubCommand(this.cmdChatSpy);
this.addSubCommand(this.cmdClaim); this.addSubCommand(this.cmdClaim);
this.addSubCommand(this.cmdConfig); this.addSubCommand(this.cmdConfig);
this.addSubCommand(this.cmdCreate); this.addSubCommand(this.cmdCreate);
this.addSubCommand(this.cmdDeinvite); this.addSubCommand(this.cmdDeinvite);
this.addSubCommand(this.cmdDescription); this.addSubCommand(this.cmdDescription);
this.addSubCommand(this.cmdDisband); this.addSubCommand(this.cmdDisband);
this.addSubCommand(this.cmdHelp); this.addSubCommand(this.cmdHelp);
this.addSubCommand(this.cmdHome); this.addSubCommand(this.cmdHome);
this.addSubCommand(this.cmdInvite); this.addSubCommand(this.cmdInvite);
this.addSubCommand(this.cmdJoin); this.addSubCommand(this.cmdJoin);
this.addSubCommand(this.cmdKick); this.addSubCommand(this.cmdKick);
this.addSubCommand(this.cmdLeave); this.addSubCommand(this.cmdLeave);
this.addSubCommand(this.cmdList); this.addSubCommand(this.cmdList);
this.addSubCommand(this.cmdLock); this.addSubCommand(this.cmdLock);
this.addSubCommand(this.cmdMap); this.addSubCommand(this.cmdMap);
this.addSubCommand(this.cmdMod); this.addSubCommand(this.cmdMod);
this.addSubCommand(this.cmdMoney); this.addSubCommand(this.cmdMoney);
this.addSubCommand(this.cmdOpen); this.addSubCommand(this.cmdOpen);
this.addSubCommand(this.cmdOwner); this.addSubCommand(this.cmdOwner);
this.addSubCommand(this.cmdOwnerList); this.addSubCommand(this.cmdOwnerList);
this.addSubCommand(this.cmdPeaceful); this.addSubCommand(this.cmdPeaceful);
this.addSubCommand(this.cmdPermanent); this.addSubCommand(this.cmdPermanent);
this.addSubCommand(this.cmdPermanentPower); this.addSubCommand(this.cmdPermanentPower);
this.addSubCommand(this.cmdPower); this.addSubCommand(this.cmdPower);
this.addSubCommand(this.cmdPowerBoost); this.addSubCommand(this.cmdPowerBoost);
this.addSubCommand(this.cmdRelationAlly); this.addSubCommand(this.cmdRelationAlly);
this.addSubCommand(this.cmdRelationEnemy); this.addSubCommand(this.cmdRelationEnemy);
this.addSubCommand(this.cmdRelationNeutral); this.addSubCommand(this.cmdRelationNeutral);
this.addSubCommand(this.cmdReload); this.addSubCommand(this.cmdReload);
this.addSubCommand(this.cmdSafeunclaimall); this.addSubCommand(this.cmdSafeunclaimall);
this.addSubCommand(this.cmdSaveAll); this.addSubCommand(this.cmdSaveAll);
this.addSubCommand(this.cmdSethome); this.addSubCommand(this.cmdSethome);
this.addSubCommand(this.cmdShow); this.addSubCommand(this.cmdShow);
this.addSubCommand(this.cmdTag); this.addSubCommand(this.cmdTag);
this.addSubCommand(this.cmdTitle); this.addSubCommand(this.cmdTitle);
this.addSubCommand(this.cmdUnclaim); this.addSubCommand(this.cmdUnclaim);
this.addSubCommand(this.cmdUnclaimall); this.addSubCommand(this.cmdUnclaimall);
this.addSubCommand(this.cmdVersion); this.addSubCommand(this.cmdVersion);
this.addSubCommand(this.cmdWarunclaimall); this.addSubCommand(this.cmdWarunclaimall);
} }
@Override @Override
public void perform() public void perform() {
{ this.commandChain.add(this);
this.commandChain.add(this); this.cmdHelp.execute(this.sender, this.args, this.commandChain);
this.cmdHelp.execute(this.sender, this.args, this.commandChain); }
}
} }

View File

@ -1,337 +1,284 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import java.util.List; import com.massivecraft.factions.*;
import com.massivecraft.factions.integration.Econ;
import com.massivecraft.factions.struct.Role;
import com.massivecraft.factions.zcore.MCommand;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.massivecraft.factions.Conf; import java.util.List;
import com.massivecraft.factions.integration.Econ;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.FPlayers;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.Factions;
import com.massivecraft.factions.P;
import com.massivecraft.factions.struct.Role;
import com.massivecraft.factions.zcore.MCommand;
public abstract class FCommand extends MCommand<P> public abstract class FCommand extends MCommand<P> {
{ public boolean disableOnLock;
public boolean disableOnLock;
public FPlayer fme;
public Faction myFaction;
public boolean senderMustBeMember;
public boolean senderMustBeModerator;
public boolean senderMustBeAdmin;
public boolean isMoneyCommand;
public FCommand()
{
super(P.p);
// Due to safety reasons it defaults to disable on lock.
disableOnLock = true;
// The money commands must be disabled if money should not be used.
isMoneyCommand = false;
senderMustBeMember = false;
senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void execute(CommandSender sender, List<String> args, List<MCommand<?>> commandChain)
{
if (sender instanceof Player)
{
this.fme = FPlayers.i.get((Player)sender);
this.myFaction = this.fme.getFaction();
}
else
{
this.fme = null;
this.myFaction = null;
}
super.execute(sender, args, commandChain);
}
@Override
public boolean isEnabled()
{
if (p.getLocked() && this.disableOnLock)
{
msg("<b>Factions was locked by an admin. Please try again later.");
return false;
}
if (this.isMoneyCommand && ! Conf.econEnabled)
{
msg("<b>Faction economy features are disabled on this server.");
return false;
}
if (this.isMoneyCommand && ! Conf.bankEnabled)
{
msg("<b>The faction bank system is disabled on this server.");
return false;
}
return true;
}
@Override
public boolean validSenderType(CommandSender sender, boolean informSenderIfNot)
{
boolean superValid = super.validSenderType(sender, informSenderIfNot);
if ( ! superValid) return false;
if ( ! (this.senderMustBeMember || this.senderMustBeModerator || this.senderMustBeAdmin)) return true;
if ( ! (sender instanceof Player)) return false;
FPlayer fplayer = FPlayers.i.get((Player)sender);
if ( ! fplayer.hasFaction())
{
sender.sendMessage(p.txt.parse("<b>You are not member of any faction."));
return false;
}
if (this.senderMustBeModerator && ! fplayer.getRole().isAtLeast(Role.MODERATOR))
{
sender.sendMessage(p.txt.parse("<b>Only faction moderators can %s.", this.getHelpShort()));
return false;
}
if (this.senderMustBeAdmin && ! fplayer.getRole().isAtLeast(Role.ADMIN))
{
sender.sendMessage(p.txt.parse("<b>Only faction admins can %s.", this.getHelpShort()));
return false;
}
return true;
}
// -------------------------------------------- //
// Assertions
// -------------------------------------------- //
public boolean assertHasFaction() public FPlayer fme;
{ public Faction myFaction;
if (me == null) return true; public boolean senderMustBeMember;
public boolean senderMustBeModerator;
if ( ! fme.hasFaction()) public boolean senderMustBeAdmin;
{
sendMessage("You are not member of any faction.");
return false;
}
return true;
}
public boolean assertMinRole(Role role) public boolean isMoneyCommand;
{
if (me == null) return true;
if (fme.getRole().value < role.value)
{
msg("<b>You <h>must be "+role+"<b> to "+this.getHelpShort()+".");
return false;
}
return true;
}
// -------------------------------------------- //
// Argument Readers
// -------------------------------------------- //
// FPLAYER ======================
public FPlayer strAsFPlayer(String name, FPlayer def, boolean msg)
{
FPlayer ret = def;
if (name != null)
{
FPlayer fplayer = FPlayers.i.get(name);
if (fplayer != null)
{
ret = fplayer;
}
}
if (msg && ret == null)
{
this.msg("<b>No player \"<p>%s<b>\" could be found.", name);
}
return ret;
}
public FPlayer argAsFPlayer(int idx, FPlayer def, boolean msg)
{
return this.strAsFPlayer(this.argAsString(idx), def, msg);
}
public FPlayer argAsFPlayer(int idx, FPlayer def)
{
return this.argAsFPlayer(idx, def, true);
}
public FPlayer argAsFPlayer(int idx)
{
return this.argAsFPlayer(idx, null);
}
// BEST FPLAYER MATCH ======================
public FPlayer strAsBestFPlayerMatch(String name, FPlayer def, boolean msg)
{
FPlayer ret = def;
if (name != null)
{
FPlayer fplayer = FPlayers.i.getBestIdMatch(name);
if (fplayer != null)
{
ret = fplayer;
}
}
if (msg && ret == null)
{
this.msg("<b>No player match found for \"<p>%s<b>\".", name);
}
return ret;
}
public FPlayer argAsBestFPlayerMatch(int idx, FPlayer def, boolean msg)
{
return this.strAsBestFPlayerMatch(this.argAsString(idx), def, msg);
}
public FPlayer argAsBestFPlayerMatch(int idx, FPlayer def)
{
return this.argAsBestFPlayerMatch(idx, def, true);
}
public FPlayer argAsBestFPlayerMatch(int idx)
{
return this.argAsBestFPlayerMatch(idx, null);
}
// FACTION ======================
public Faction strAsFaction(String name, Faction def, boolean msg)
{
Faction ret = def;
if (name != null)
{
Faction faction = null;
// First we try an exact match
if (faction == null)
{
faction = Factions.i.getByTag(name);
}
// Next we match faction tags
if (faction == null)
{
faction = Factions.i.getBestTagMatch(name);
}
// Next we match player names
if (faction == null)
{
FPlayer fplayer = FPlayers.i.getBestIdMatch(name);
if (fplayer != null)
{
faction = fplayer.getFaction();
}
}
if (faction != null)
{
ret = faction;
}
}
if (msg && ret == null)
{
this.msg("<b>The faction or player \"<p>%s<b>\" could not be found.", name);
}
return ret;
}
public Faction argAsFaction(int idx, Faction def, boolean msg)
{
return this.strAsFaction(this.argAsString(idx), def, msg);
}
public Faction argAsFaction(int idx, Faction def)
{
return this.argAsFaction(idx, def, true);
}
public Faction argAsFaction(int idx)
{
return this.argAsFaction(idx, null);
}
// -------------------------------------------- //
// Commonly used logic
// -------------------------------------------- //
public boolean canIAdministerYou(FPlayer i, FPlayer you)
{
if ( ! i.getFaction().equals(you.getFaction()))
{
i.sendMessage(p.txt.parse("%s <b>is not in the same faction as you.",you.describeTo(i, true)));
return false;
}
if (i.getRole().value > you.getRole().value || i.getRole().equals(Role.ADMIN) )
{
return true;
}
if (you.getRole().equals(Role.ADMIN))
{
i.sendMessage(p.txt.parse("<b>Only the faction admin can do that."));
}
else if (i.getRole().equals(Role.MODERATOR))
{
if ( i == you )
{
return true; //Moderators can control themselves
}
else
{
i.sendMessage(p.txt.parse("<b>Moderators can't control each other..."));
}
}
else
{
i.sendMessage(p.txt.parse("<b>You must be a faction moderator to do that."));
}
return false;
}
// if economy is enabled and they're not on the bypass list, make 'em pay; returns true unless person can't afford the cost
public boolean payForCommand(double cost, String toDoThis, String forDoingThis)
{
if ( ! Econ.shouldBeUsed() || this.fme == null || cost == 0.0 || fme.isAdminBypassing()) return true;
if(Conf.bankEnabled && Conf.bankFactionPaysCosts && fme.hasFaction()) public FCommand() {
return Econ.modifyMoney(myFaction, -cost, toDoThis, forDoingThis); super(P.p);
else
return Econ.modifyMoney(fme, -cost, toDoThis, forDoingThis);
}
// like above, but just make sure they can pay; returns true unless person can't afford the cost // Due to safety reasons it defaults to disable on lock.
public boolean canAffordCommand(double cost, String toDoThis) disableOnLock = true;
{
if ( ! Econ.shouldBeUsed() || this.fme == null || cost == 0.0 || fme.isAdminBypassing()) return true;
if(Conf.bankEnabled && Conf.bankFactionPaysCosts && fme.hasFaction()) // The money commands must be disabled if money should not be used.
return Econ.hasAtLeast(myFaction, cost, toDoThis); isMoneyCommand = false;
else
return Econ.hasAtLeast(fme, cost, toDoThis); senderMustBeMember = false;
} senderMustBeModerator = false;
senderMustBeAdmin = false;
}
@Override
public void execute(CommandSender sender, List<String> args, List<MCommand<?>> commandChain) {
if (sender instanceof Player) {
this.fme = FPlayers.i.get((Player) sender);
this.myFaction = this.fme.getFaction();
} else {
this.fme = null;
this.myFaction = null;
}
super.execute(sender, args, commandChain);
}
@Override
public boolean isEnabled() {
if (p.getLocked() && this.disableOnLock) {
msg("<b>Factions was locked by an admin. Please try again later.");
return false;
}
if (this.isMoneyCommand && !Conf.econEnabled) {
msg("<b>Faction economy features are disabled on this server.");
return false;
}
if (this.isMoneyCommand && !Conf.bankEnabled) {
msg("<b>The faction bank system is disabled on this server.");
return false;
}
return true;
}
@Override
public boolean validSenderType(CommandSender sender, boolean informSenderIfNot) {
boolean superValid = super.validSenderType(sender, informSenderIfNot);
if (!superValid) return false;
if (!(this.senderMustBeMember || this.senderMustBeModerator || this.senderMustBeAdmin)) return true;
if (!(sender instanceof Player)) return false;
FPlayer fplayer = FPlayers.i.get((Player) sender);
if (!fplayer.hasFaction()) {
sender.sendMessage(p.txt.parse("<b>You are not member of any faction."));
return false;
}
if (this.senderMustBeModerator && !fplayer.getRole().isAtLeast(Role.MODERATOR)) {
sender.sendMessage(p.txt.parse("<b>Only faction moderators can %s.", this.getHelpShort()));
return false;
}
if (this.senderMustBeAdmin && !fplayer.getRole().isAtLeast(Role.ADMIN)) {
sender.sendMessage(p.txt.parse("<b>Only faction admins can %s.", this.getHelpShort()));
return false;
}
return true;
}
// -------------------------------------------- //
// Assertions
// -------------------------------------------- //
public boolean assertHasFaction() {
if (me == null) return true;
if (!fme.hasFaction()) {
sendMessage("You are not member of any faction.");
return false;
}
return true;
}
public boolean assertMinRole(Role role) {
if (me == null) return true;
if (fme.getRole().value < role.value) {
msg("<b>You <h>must be " + role + "<b> to " + this.getHelpShort() + ".");
return false;
}
return true;
}
// -------------------------------------------- //
// Argument Readers
// -------------------------------------------- //
// FPLAYER ======================
public FPlayer strAsFPlayer(String name, FPlayer def, boolean msg) {
FPlayer ret = def;
if (name != null) {
FPlayer fplayer = FPlayers.i.get(name);
if (fplayer != null) {
ret = fplayer;
}
}
if (msg && ret == null) {
this.msg("<b>No player \"<p>%s<b>\" could be found.", name);
}
return ret;
}
public FPlayer argAsFPlayer(int idx, FPlayer def, boolean msg) {
return this.strAsFPlayer(this.argAsString(idx), def, msg);
}
public FPlayer argAsFPlayer(int idx, FPlayer def) {
return this.argAsFPlayer(idx, def, true);
}
public FPlayer argAsFPlayer(int idx) {
return this.argAsFPlayer(idx, null);
}
// BEST FPLAYER MATCH ======================
public FPlayer strAsBestFPlayerMatch(String name, FPlayer def, boolean msg) {
FPlayer ret = def;
if (name != null) {
FPlayer fplayer = FPlayers.i.getBestIdMatch(name);
if (fplayer != null) {
ret = fplayer;
}
}
if (msg && ret == null) {
this.msg("<b>No player match found for \"<p>%s<b>\".", name);
}
return ret;
}
public FPlayer argAsBestFPlayerMatch(int idx, FPlayer def, boolean msg) {
return this.strAsBestFPlayerMatch(this.argAsString(idx), def, msg);
}
public FPlayer argAsBestFPlayerMatch(int idx, FPlayer def) {
return this.argAsBestFPlayerMatch(idx, def, true);
}
public FPlayer argAsBestFPlayerMatch(int idx) {
return this.argAsBestFPlayerMatch(idx, null);
}
// FACTION ======================
public Faction strAsFaction(String name, Faction def, boolean msg) {
Faction ret = def;
if (name != null) {
Faction faction = null;
// First we try an exact match
if (faction == null) {
faction = Factions.i.getByTag(name);
}
// Next we match faction tags
if (faction == null) {
faction = Factions.i.getBestTagMatch(name);
}
// Next we match player names
if (faction == null) {
FPlayer fplayer = FPlayers.i.getBestIdMatch(name);
if (fplayer != null) {
faction = fplayer.getFaction();
}
}
if (faction != null) {
ret = faction;
}
}
if (msg && ret == null) {
this.msg("<b>The faction or player \"<p>%s<b>\" could not be found.", name);
}
return ret;
}
public Faction argAsFaction(int idx, Faction def, boolean msg) {
return this.strAsFaction(this.argAsString(idx), def, msg);
}
public Faction argAsFaction(int idx, Faction def) {
return this.argAsFaction(idx, def, true);
}
public Faction argAsFaction(int idx) {
return this.argAsFaction(idx, null);
}
// -------------------------------------------- //
// Commonly used logic
// -------------------------------------------- //
public boolean canIAdministerYou(FPlayer i, FPlayer you) {
if (!i.getFaction().equals(you.getFaction())) {
i.sendMessage(p.txt.parse("%s <b>is not in the same faction as you.", you.describeTo(i, true)));
return false;
}
if (i.getRole().value > you.getRole().value || i.getRole().equals(Role.ADMIN)) {
return true;
}
if (you.getRole().equals(Role.ADMIN)) {
i.sendMessage(p.txt.parse("<b>Only the faction admin can do that."));
} else if (i.getRole().equals(Role.MODERATOR)) {
if (i == you) {
return true; //Moderators can control themselves
} else {
i.sendMessage(p.txt.parse("<b>Moderators can't control each other..."));
}
} else {
i.sendMessage(p.txt.parse("<b>You must be a faction moderator to do that."));
}
return false;
}
// if economy is enabled and they're not on the bypass list, make 'em pay; returns true unless person can't afford the cost
public boolean payForCommand(double cost, String toDoThis, String forDoingThis) {
if (!Econ.shouldBeUsed() || this.fme == null || cost == 0.0 || fme.isAdminBypassing()) return true;
if (Conf.bankEnabled && Conf.bankFactionPaysCosts && fme.hasFaction())
return Econ.modifyMoney(myFaction, -cost, toDoThis, forDoingThis);
else
return Econ.modifyMoney(fme, -cost, toDoThis, forDoingThis);
}
// like above, but just make sure they can pay; returns true unless person can't afford the cost
public boolean canAffordCommand(double cost, String toDoThis) {
if (!Econ.shouldBeUsed() || this.fme == null || cost == 0.0 || fme.isAdminBypassing()) return true;
if (Conf.bankEnabled && Conf.bankFactionPaysCosts && fme.hasFaction())
return Econ.hasAtLeast(myFaction, cost, toDoThis);
else
return Econ.hasAtLeast(fme, cost, toDoThis);
}
} }

View File

@ -1,98 +1,88 @@
package com.massivecraft.factions.cmd; package com.massivecraft.factions.cmd;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import com.massivecraft.factions.Conf; import com.massivecraft.factions.Conf;
import com.massivecraft.factions.Faction; import com.massivecraft.factions.Faction;
import com.massivecraft.factions.event.FactionRelationEvent; import com.massivecraft.factions.event.FactionRelationEvent;
import com.massivecraft.factions.integration.SpoutFeatures; import com.massivecraft.factions.integration.SpoutFeatures;
import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.struct.Relation; import com.massivecraft.factions.struct.Relation;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
public abstract class FRelationCommand extends FCommand public abstract class FRelationCommand extends FCommand {
{ public Relation targetRelation;
public Relation targetRelation;
public FRelationCommand()
{
super();
this.requiredArgs.add("faction tag");
//this.optionalArgs.put("player name", "you");
this.permission = Permission.RELATION.node;
this.disableOnLock = true;
senderMustBePlayer = true;
senderMustBeMember = false;
senderMustBeModerator = true;
senderMustBeAdmin = false;
}
@Override
public void perform()
{
Faction them = this.argAsFaction(0);
if (them == null) return;
if ( ! them.isNormal())
{
msg("<b>Nope! You can't.");
return;
}
if (them == myFaction)
{
msg("<b>Nope! You can't declare a relation to yourself :)");
return;
}
if (myFaction.getRelationWish(them) == targetRelation) public FRelationCommand() {
{ super();
msg("<b>You already have that relation wish set with %s.", them.getTag()); this.requiredArgs.add("faction tag");
return; //this.optionalArgs.put("player name", "you");
}
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay this.permission = Permission.RELATION.node;
if ( ! payForCommand(targetRelation.getRelationCost(), "to change a relation wish", "for changing a relation wish")) return; this.disableOnLock = true;
// try to set the new relation senderMustBePlayer = true;
Relation oldRelation = myFaction.getRelationTo(them, true); senderMustBeMember = false;
myFaction.setRelationWish(them, targetRelation); senderMustBeModerator = true;
Relation currentRelation = myFaction.getRelationTo(them, true); senderMustBeAdmin = false;
ChatColor currentRelationColor = currentRelation.getColor(); }
// if the relation change was successful @Override
if (targetRelation.value == currentRelation.value) public void perform() {
{ Faction them = this.argAsFaction(0);
// trigger the faction relation event if (them == null) return;
FactionRelationEvent relationEvent = new FactionRelationEvent(myFaction, them, oldRelation, currentRelation);
Bukkit.getServer().getPluginManager().callEvent(relationEvent);
them.msg("<i>Your faction is now "+currentRelationColor+targetRelation.toString()+"<i> to "+currentRelationColor+myFaction.getTag()); if (!them.isNormal()) {
myFaction.msg("<i>Your faction is now "+currentRelationColor+targetRelation.toString()+"<i> to "+currentRelationColor+them.getTag()); msg("<b>Nope! You can't.");
} return;
// inform the other faction of your request }
else
{
them.msg(currentRelationColor+myFaction.getTag()+"<i> wishes to be your "+targetRelation.getColor()+targetRelation.toString());
them.msg("<i>Type <c>/"+Conf.baseCommandAliases.get(0)+" "+targetRelation+" "+myFaction.getTag()+"<i> to accept.");
myFaction.msg(currentRelationColor+them.getTag()+"<i> were informed that you wish to be "+targetRelation.getColor()+targetRelation);
}
if ( ! targetRelation.isNeutral() && them.isPeaceful())
{
them.msg("<i>This will have no effect while your faction is peaceful.");
myFaction.msg("<i>This will have no effect while their faction is peaceful.");
}
if ( ! targetRelation.isNeutral() && myFaction.isPeaceful())
{
them.msg("<i>This will have no effect while their faction is peaceful.");
myFaction.msg("<i>This will have no effect while your faction is peaceful.");
}
SpoutFeatures.updateAppearances(myFaction, them); if (them == myFaction) {
SpoutFeatures.updateTerritoryDisplayLoc(null); msg("<b>Nope! You can't declare a relation to yourself :)");
} return;
}
if (myFaction.getRelationWish(them) == targetRelation) {
msg("<b>You already have that relation wish set with %s.", them.getTag());
return;
}
// if economy is enabled, they're not on the bypass list, and this command has a cost set, make 'em pay
if (!payForCommand(targetRelation.getRelationCost(), "to change a relation wish", "for changing a relation wish"))
return;
// try to set the new relation
Relation oldRelation = myFaction.getRelationTo(them, true);
myFaction.setRelationWish(them, targetRelation);
Relation currentRelation = myFaction.getRelationTo(them, true);
ChatColor currentRelationColor = currentRelation.getColor();
// if the relation change was successful
if (targetRelation.value == currentRelation.value) {
// trigger the faction relation event
FactionRelationEvent relationEvent = new FactionRelationEvent(myFaction, them, oldRelation, currentRelation);
Bukkit.getServer().getPluginManager().callEvent(relationEvent);
them.msg("<i>Your faction is now " + currentRelationColor + targetRelation.toString() + "<i> to " + currentRelationColor + myFaction.getTag());
myFaction.msg("<i>Your faction is now " + currentRelationColor + targetRelation.toString() + "<i> to " + currentRelationColor + them.getTag());
}
// inform the other faction of your request
else {
them.msg(currentRelationColor + myFaction.getTag() + "<i> wishes to be your " + targetRelation.getColor() + targetRelation.toString());
them.msg("<i>Type <c>/" + Conf.baseCommandAliases.get(0) + " " + targetRelation + " " + myFaction.getTag() + "<i> to accept.");
myFaction.msg(currentRelationColor + them.getTag() + "<i> were informed that you wish to be " + targetRelation.getColor() + targetRelation);
}
if (!targetRelation.isNeutral() && them.isPeaceful()) {
them.msg("<i>This will have no effect while your faction is peaceful.");
myFaction.msg("<i>This will have no effect while their faction is peaceful.");
}
if (!targetRelation.isNeutral() && myFaction.isPeaceful()) {
them.msg("<i>This will have no effect while their faction is peaceful.");
myFaction.msg("<i>This will have no effect while your faction is peaceful.");
}
SpoutFeatures.updateAppearances(myFaction, them);
SpoutFeatures.updateTerritoryDisplayLoc(null);
}
} }

View File

@ -1,60 +1,56 @@
package com.massivecraft.factions.event; package com.massivecraft.factions.event;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.Faction;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import com.massivecraft.factions.FPlayer; public class FPlayerJoinEvent extends Event implements Cancellable {
import com.massivecraft.factions.Faction; private static final HandlerList handlers = new HandlerList();
public class FPlayerJoinEvent extends Event implements Cancellable FPlayer fplayer;
{ Faction faction;
private static final HandlerList handlers = new HandlerList(); PlayerJoinReason reason;
boolean cancelled = false;
FPlayer fplayer; public enum PlayerJoinReason {
Faction faction; CREATE, LEADER, COMMAND
PlayerJoinReason reason; }
boolean cancelled = false;
public enum PlayerJoinReason
{
CREATE, LEADER, COMMAND
}
public FPlayerJoinEvent(FPlayer fp, Faction f, PlayerJoinReason r)
{
fplayer = fp;
faction = f;
reason = r;
}
public FPlayer getFPlayer() public FPlayerJoinEvent(FPlayer fp, Faction f, PlayerJoinReason r) {
{ fplayer = fp;
return fplayer; faction = f;
} reason = r;
public Faction getFaction() }
{
return faction;
}
public PlayerJoinReason getReason()
{
return reason;
}
public HandlerList getHandlers()
{
return handlers;
}
public static HandlerList getHandlerList() public FPlayer getFPlayer() {
{ return fplayer;
return handlers; }
}
@Override public Faction getFaction() {
public boolean isCancelled() return faction;
{ }
return cancelled;
} public PlayerJoinReason getReason() {
@Override return reason;
public void setCancelled(boolean c) }
{
cancelled = c; public HandlerList getHandlers() {
} return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean c) {
cancelled = c;
}
} }

View File

@ -1,71 +1,59 @@
package com.massivecraft.factions.event; package com.massivecraft.factions.event;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.Faction;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import com.massivecraft.factions.FPlayer; public class FPlayerLeaveEvent extends Event implements Cancellable {
import com.massivecraft.factions.Faction; private static final HandlerList handlers = new HandlerList();
private PlayerLeaveReason reason;
FPlayer FPlayer;
Faction Faction;
boolean cancelled = false;
public class FPlayerLeaveEvent extends Event implements Cancellable public enum PlayerLeaveReason {
{ KICKED, DISBAND, RESET, JOINOTHER, LEAVE
private static final HandlerList handlers = new HandlerList(); }
private PlayerLeaveReason reason;
FPlayer FPlayer;
Faction Faction;
boolean cancelled = false;
public enum PlayerLeaveReason public FPlayerLeaveEvent(FPlayer p, Faction f, PlayerLeaveReason r) {
{ FPlayer = p;
KICKED, DISBAND, RESET, JOINOTHER, LEAVE Faction = f;
} reason = r;
}
public FPlayerLeaveEvent(FPlayer p, Faction f, PlayerLeaveReason r) public HandlerList getHandlers() {
{ return handlers;
FPlayer = p; }
Faction = f;
reason = r;
}
public HandlerList getHandlers() public static HandlerList getHandlerList() {
{ return handlers;
return handlers; }
}
public static HandlerList getHandlerList() public PlayerLeaveReason getReason() {
{ return reason;
return handlers; }
}
public PlayerLeaveReason getReason()
{
return reason;
}
public FPlayer getFPlayer()
{
return FPlayer;
}
public Faction getFaction()
{
return Faction;
}
@Override public FPlayer getFPlayer() {
public boolean isCancelled() return FPlayer;
{ }
return cancelled;
}
@Override public Faction getFaction() {
public void setCancelled(boolean c) return Faction;
{ }
if (reason == PlayerLeaveReason.DISBAND || reason == PlayerLeaveReason.RESET)
{ @Override
cancelled = false; public boolean isCancelled() {
return; return cancelled;
} }
cancelled = c;
} @Override
public void setCancelled(boolean c) {
if (reason == PlayerLeaveReason.DISBAND || reason == PlayerLeaveReason.RESET) {
cancelled = false;
return;
}
cancelled = c;
}
} }

View File

@ -1,63 +1,53 @@
package com.massivecraft.factions.event; package com.massivecraft.factions.event;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.FPlayers;
import com.massivecraft.factions.Factions;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import com.massivecraft.factions.FPlayer; public class FactionCreateEvent extends Event implements Cancellable {
import com.massivecraft.factions.FPlayers; private static final HandlerList handlers = new HandlerList();
import com.massivecraft.factions.Factions;
public class FactionCreateEvent extends Event implements Cancellable private String factionTag;
{ private Player sender;
private static final HandlerList handlers = new HandlerList(); private boolean cancelled;
private String factionTag;
private Player sender;
private boolean cancelled;
public FactionCreateEvent(Player sender, String tag)
{
this.factionTag = tag;
this.sender = sender;
this.cancelled = false;
}
public FPlayer getFPlayer()
{
return FPlayers.i.get(sender);
}
public String getFactionId()
{
return Factions.i.getNextId();
}
public String getFactionTag() public FactionCreateEvent(Player sender, String tag) {
{ this.factionTag = tag;
return factionTag; this.sender = sender;
} this.cancelled = false;
}
public HandlerList getHandlers() public FPlayer getFPlayer() {
{ return FPlayers.i.get(sender);
return handlers; }
}
public static HandlerList getHandlerList()
{
return handlers;
}
@Override public String getFactionId() {
public boolean isCancelled() return Factions.i.getNextId();
{ }
return cancelled;
}
@Override public String getFactionTag() {
public void setCancelled(boolean c) return factionTag;
{ }
this.cancelled = c;
} public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean c) {
this.cancelled = c;
}
} }

View File

@ -1,64 +1,54 @@
package com.massivecraft.factions.event; package com.massivecraft.factions.event;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.FPlayers; import com.massivecraft.factions.FPlayers;
import com.massivecraft.factions.Faction; import com.massivecraft.factions.Faction;
import com.massivecraft.factions.Factions; import com.massivecraft.factions.Factions;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
public class FactionDisbandEvent extends Event implements Cancellable public class FactionDisbandEvent extends Event implements Cancellable {
{ private static final HandlerList handlers = new HandlerList();
private static final HandlerList handlers = new HandlerList();
private boolean cancelled; private boolean cancelled;
private String id; private String id;
private Player sender; private Player sender;
public FactionDisbandEvent(Player sender, String factionId) public FactionDisbandEvent(Player sender, String factionId) {
{ cancelled = false;
cancelled = false; this.sender = sender;
this.sender = sender; this.id = factionId;
this.id = factionId; }
}
public HandlerList getHandlers() public HandlerList getHandlers() {
{ return handlers;
return handlers; }
}
public static HandlerList getHandlerList() public static HandlerList getHandlerList() {
{ return handlers;
return handlers; }
}
public Faction getFaction() public Faction getFaction() {
{ return Factions.i.get(id);
return Factions.i.get(id); }
}
public FPlayer getFPlayer() public FPlayer getFPlayer() {
{ return FPlayers.i.get(sender);
return FPlayers.i.get(sender); }
}
public Player getPlayer() public Player getPlayer() {
{ return sender;
return sender; }
}
@Override @Override
public boolean isCancelled() public boolean isCancelled() {
{ return cancelled;
return cancelled; }
}
@Override @Override
public void setCancelled(boolean c) public void setCancelled(boolean c) {
{ cancelled = c;
cancelled = c; }
}
} }

View File

@ -1,56 +1,47 @@
package com.massivecraft.factions.event; package com.massivecraft.factions.event;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.struct.Relation;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import com.massivecraft.factions.struct.Relation;
import com.massivecraft.factions.Faction;
public class FactionRelationEvent extends Event {
private static final HandlerList handlers = new HandlerList();
public class FactionRelationEvent extends Event private Faction fsender;
{ private Faction ftarget;
private static final HandlerList handlers = new HandlerList(); private Relation foldrel;
private Relation frel;
private Faction fsender; public FactionRelationEvent(Faction sender, Faction target, Relation oldrel, Relation rel) {
private Faction ftarget; fsender = sender;
private Relation foldrel; ftarget = target;
private Relation frel; foldrel = oldrel;
frel = rel;
}
public FactionRelationEvent(Faction sender, Faction target, Relation oldrel, Relation rel) public HandlerList getHandlers() {
{ return handlers;
fsender = sender; }
ftarget = target;
foldrel = oldrel;
frel = rel;
}
public HandlerList getHandlers() public static HandlerList getHandlerList() {
{ return handlers;
return handlers; }
}
public static HandlerList getHandlerList() public Relation getOldRelation() {
{ return foldrel;
return handlers; }
}
public Relation getOldRelation() public Relation getRelation() {
{ return frel;
return foldrel; }
}
public Relation getRelation() public Faction getFaction() {
{ return fsender;
return frel; }
}
public Faction getFaction() public Faction getTargetFaction() {
{ return ftarget;
return fsender; }
}
public Faction getTargetFaction()
{
return ftarget;
}
} }

View File

@ -1,74 +1,62 @@
package com.massivecraft.factions.event; package com.massivecraft.factions.event;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.Faction;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import com.massivecraft.factions.FPlayer; public class FactionRenameEvent extends Event implements Cancellable {
import com.massivecraft.factions.Faction; private static final HandlerList handlers = new HandlerList();
public class FactionRenameEvent extends Event implements Cancellable private boolean cancelled;
{ private FPlayer fplayer;
private static final HandlerList handlers = new HandlerList(); private Faction faction;
private String tag;
private boolean cancelled; public FactionRenameEvent(FPlayer sender, String newTag) {
private FPlayer fplayer; fplayer = sender;
private Faction faction; faction = sender.getFaction();
private String tag; tag = newTag;
this.cancelled = false;
}
public FactionRenameEvent(FPlayer sender, String newTag) public Faction getFaction() {
{ return (faction);
fplayer = sender; }
faction = sender.getFaction();
tag = newTag;
this.cancelled = false;
}
public Faction getFaction() public FPlayer getFPlayer() {
{ return (fplayer);
return(faction); }
}
public FPlayer getFPlayer() public Player getPlayer() {
{ return (fplayer.getPlayer());
return(fplayer); }
}
public Player getPlayer() public String getOldFactionTag() {
{ return (faction.getTag());
return(fplayer.getPlayer()); }
}
public String getOldFactionTag() public String getFactionTag() {
{ return (tag);
return(faction.getTag()); }
}
public String getFactionTag() public HandlerList getHandlers() {
{ return handlers;
return(tag); }
}
public HandlerList getHandlers() public static HandlerList getHandlerList() {
{ return handlers;
return handlers; }
}
public static HandlerList getHandlerList() @Override
{ public boolean isCancelled() {
return handlers; return cancelled;
} }
@Override @Override
public boolean isCancelled() public void setCancelled(boolean c) {
{ this.cancelled = c;
return cancelled; }
}
@Override
public void setCancelled(boolean c)
{
this.cancelled = c;
}
} }

View File

@ -1,80 +1,67 @@
package com.massivecraft.factions.event; package com.massivecraft.factions.event;
import com.massivecraft.factions.FLocation;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.Faction;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import com.massivecraft.factions.FLocation; public class LandClaimEvent extends Event implements Cancellable {
import com.massivecraft.factions.Faction; private static final HandlerList handlers = new HandlerList();
import com.massivecraft.factions.FPlayer;
import org.bukkit.entity.Player;
public class LandClaimEvent extends Event implements Cancellable private boolean cancelled;
{ private FLocation location;
private static final HandlerList handlers = new HandlerList(); private Faction faction;
private FPlayer fplayer;
private boolean cancelled; public LandClaimEvent(FLocation loc, Faction f, FPlayer p) {
private FLocation location; cancelled = false;
private Faction faction; location = loc;
private FPlayer fplayer; faction = f;
fplayer = p;
}
public LandClaimEvent(FLocation loc, Faction f, FPlayer p) public HandlerList getHandlers() {
{ return handlers;
cancelled = false; }
location = loc;
faction = f;
fplayer = p;
}
public HandlerList getHandlers() public static HandlerList getHandlerList() {
{ return handlers;
return handlers; }
}
public static HandlerList getHandlerList() public FLocation getLocation() {
{ return this.location;
return handlers; }
}
public FLocation getLocation() public Faction getFaction() {
{ return faction;
return this.location; }
}
public Faction getFaction() public String getFactionId() {
{ return faction.getId();
return faction; }
}
public String getFactionId() public String getFactionTag() {
{ return faction.getTag();
return faction.getId(); }
}
public String getFactionTag() public FPlayer getFPlayer() {
{ return fplayer;
return faction.getTag(); }
}
public FPlayer getFPlayer() public Player getPlayer() {
{ return fplayer.getPlayer();
return fplayer; }
}
public Player getPlayer() @Override
{ public boolean isCancelled() {
return fplayer.getPlayer(); return cancelled;
} }
@Override @Override
public boolean isCancelled() public void setCancelled(boolean c) {
{ this.cancelled = c;
return cancelled; }
}
@Override
public void setCancelled(boolean c)
{
this.cancelled = c;
}
} }

View File

@ -1,57 +1,47 @@
package com.massivecraft.factions.event; package com.massivecraft.factions.event;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.Faction;
import org.bukkit.entity.Player;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import com.massivecraft.factions.Faction; public class LandUnclaimAllEvent extends Event {
import com.massivecraft.factions.FPlayer; private static final HandlerList handlers = new HandlerList();
import org.bukkit.entity.Player;
public class LandUnclaimAllEvent extends Event private Faction faction;
{ private FPlayer fplayer;
private static final HandlerList handlers = new HandlerList();
private Faction faction; public LandUnclaimAllEvent(Faction f, FPlayer p) {
private FPlayer fplayer; faction = f;
fplayer = p;
}
public LandUnclaimAllEvent(Faction f, FPlayer p) public HandlerList getHandlers() {
{ return handlers;
faction = f; }
fplayer = p;
}
public HandlerList getHandlers() public static HandlerList getHandlerList() {
{ return handlers;
return handlers; }
}
public static HandlerList getHandlerList() public Faction getFaction() {
{ return faction;
return handlers; }
}
public Faction getFaction() public String getFactionId() {
{ return faction.getId();
return faction; }
}
public String getFactionId() public String getFactionTag() {
{ return faction.getTag();
return faction.getId(); }
}
public String getFactionTag() public FPlayer getFPlayer() {
{ return fplayer;
return faction.getTag(); }
}
public FPlayer getFPlayer() public Player getPlayer() {
{ return fplayer.getPlayer();
return fplayer; }
}
public Player getPlayer()
{
return fplayer.getPlayer();
}
} }

View File

@ -1,79 +1,67 @@
package com.massivecraft.factions.event; package com.massivecraft.factions.event;
import com.massivecraft.factions.FLocation;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.Faction;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import com.massivecraft.factions.FLocation; public class LandUnclaimEvent extends Event implements Cancellable {
import com.massivecraft.factions.Faction; private static final HandlerList handlers = new HandlerList();
import com.massivecraft.factions.FPlayer;
import org.bukkit.entity.Player;
public class LandUnclaimEvent extends Event implements Cancellable private boolean cancelled;
{ private FLocation location;
private static final HandlerList handlers = new HandlerList(); private Faction faction;
private FPlayer fplayer;
private boolean cancelled; public LandUnclaimEvent(FLocation loc, Faction f, FPlayer p) {
private FLocation location; cancelled = false;
private Faction faction; location = loc;
private FPlayer fplayer; faction = f;
fplayer = p;
}
public LandUnclaimEvent(FLocation loc, Faction f, FPlayer p) public HandlerList getHandlers() {
{ return handlers;
cancelled = false; }
location = loc;
faction = f;
fplayer = p;
}
public HandlerList getHandlers() public static HandlerList getHandlerList() {
{ return handlers;
return handlers; }
}
public static HandlerList getHandlerList() public FLocation getLocation() {
{ return this.location;
return handlers; }
}
public FLocation getLocation() public Faction getFaction() {
{ return faction;
return this.location; }
}
public Faction getFaction() public String getFactionId() {
{ return faction.getId();
return faction; }
}
public String getFactionId() public String getFactionTag() {
{ return faction.getTag();
return faction.getId(); }
}
public String getFactionTag() public FPlayer getFPlayer() {
{ return fplayer;
return faction.getTag(); }
}
public FPlayer getFPlayer() public Player getPlayer() {
{ return fplayer.getPlayer();
return fplayer; }
}
public Player getPlayer() @Override
{ public boolean isCancelled() {
return fplayer.getPlayer(); return cancelled;
} }
@Override @Override
public boolean isCancelled() public void setCancelled(boolean c) {
{ cancelled = c;
return cancelled; }
}
@Override
public void setCancelled(boolean c) {
cancelled = c;
}
} }

View File

@ -1,85 +1,72 @@
package com.massivecraft.factions.event; package com.massivecraft.factions.event;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.Faction;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.Faction;
import org.bukkit.entity.Player; public class PowerLossEvent extends Event implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private Faction faction;
private FPlayer fplayer;
private String message;
public class PowerLossEvent extends Event implements Cancellable public PowerLossEvent(Faction f, FPlayer p) {
{ cancelled = false;
private static final HandlerList handlers = new HandlerList(); faction = f;
fplayer = p;
}
private boolean cancelled; @Override
private Faction faction; public HandlerList getHandlers() {
private FPlayer fplayer; return handlers;
private String message; }
public PowerLossEvent(Faction f, FPlayer p) public static HandlerList getHandlerList() {
{ return handlers;
cancelled = false; }
faction = f;
fplayer = p;
}
@Override public Faction getFaction() {
public HandlerList getHandlers() return faction;
{ }
return handlers;
}
public static HandlerList getHandlerList() public String getFactionId() {
{ return faction.getId();
return handlers; }
}
public Faction getFaction() public String getFactionTag() {
{ return faction.getTag();
return faction; }
}
public String getFactionId() public FPlayer getFPlayer() {
{ return fplayer;
return faction.getId(); }
}
public String getFactionTag() public Player getPlayer() {
{ return fplayer.getPlayer();
return faction.getTag(); }
}
public FPlayer getFPlayer() public String getMessage() {
{ return message;
return fplayer; }
}
public Player getPlayer() public void setMessage(String message) {
{ this.message = message;
return fplayer.getPlayer(); }
}
public String getMessage() { @Override
return message; public boolean isCancelled() {
} return cancelled;
}
public void setMessage(String message) { @Override
this.message = message; public void setCancelled(boolean c) {
} this.cancelled = c;
}
@Override
public boolean isCancelled()
{
return cancelled;
}
@Override
public void setCancelled(boolean c)
{
this.cancelled = c;
}
} }

View File

@ -1,8 +1,7 @@
package com.massivecraft.factions.iface; package com.massivecraft.factions.iface;
public interface EconomyParticipator extends RelationParticipator public interface EconomyParticipator extends RelationParticipator {
{ public String getAccountId();
public String getAccountId();
public void msg(String str, Object... args);
public void msg(String str, Object... args);
} }

View File

@ -1,16 +1,16 @@
package com.massivecraft.factions.iface; package com.massivecraft.factions.iface;
import com.massivecraft.factions.struct.Relation;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import com.massivecraft.factions.struct.Relation; public interface RelationParticipator {
public String describeTo(RelationParticipator that);
public interface RelationParticipator public String describeTo(RelationParticipator that, boolean ucfirst);
{
public String describeTo(RelationParticipator that); public Relation getRelationTo(RelationParticipator that);
public String describeTo(RelationParticipator that, boolean ucfirst);
public Relation getRelationTo(RelationParticipator that, boolean ignorePeaceful);
public Relation getRelationTo(RelationParticipator that);
public Relation getRelationTo(RelationParticipator that, boolean ignorePeaceful); public ChatColor getColorTo(RelationParticipator to);
public ChatColor getColorTo(RelationParticipator to);
} }

View File

@ -1,393 +1,332 @@
package com.massivecraft.factions.integration; package com.massivecraft.factions.integration;
import com.massivecraft.factions.*;
import com.massivecraft.factions.iface.EconomyParticipator;
import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.struct.Role;
import com.massivecraft.factions.util.RelationUtil;
import net.milkbowl.vault.economy.Economy;
import net.milkbowl.vault.economy.EconomyResponse;
import org.bukkit.Bukkit;
import org.bukkit.plugin.RegisteredServiceProvider;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.logging.Level; import java.util.logging.Level;
import org.bukkit.Bukkit;
import org.bukkit.plugin.RegisteredServiceProvider;
import com.massivecraft.factions.Conf; public class Econ {
import com.massivecraft.factions.FPlayer; private static Economy econ = null;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.Factions;
import com.massivecraft.factions.P;
import com.massivecraft.factions.iface.EconomyParticipator;
import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.struct.Role;
import com.massivecraft.factions.util.RelationUtil;
import net.milkbowl.vault.economy.Economy; public static void setup() {
import net.milkbowl.vault.economy.EconomyResponse; if (isSetup()) return;
String integrationFail = "Economy integration is " + (Conf.econEnabled ? "enabled, but" : "disabled, and") + " the plugin \"Vault\" ";
if (Bukkit.getServer().getPluginManager().getPlugin("Vault") == null) {
P.p.log(integrationFail + "is not installed.");
return;
}
RegisteredServiceProvider<Economy> rsp = Bukkit.getServer().getServicesManager().getRegistration(Economy.class);
if (rsp == null) {
P.p.log(integrationFail + "is not hooked into an economy plugin.");
return;
}
econ = rsp.getProvider();
P.p.log("Economy integration through Vault plugin successful.");
if (!Conf.econEnabled)
P.p.log("NOTE: Economy is disabled. You can enable it with the command: f config econEnabled true");
P.p.cmdBase.cmdHelp.updateHelp();
oldMoneyDoTransfer();
}
public static boolean shouldBeUsed() {
return Conf.econEnabled && econ != null && econ.isEnabled();
}
public static boolean isSetup() {
return econ != null;
}
public class Econ public static void modifyUniverseMoney(double delta) {
{ if (!shouldBeUsed()) return;
private static Economy econ = null;
public static void setup() if (Conf.econUniverseAccount == null) return;
{ if (Conf.econUniverseAccount.length() == 0) return;
if (isSetup()) return; if (!econ.hasAccount(Conf.econUniverseAccount)) return;
String integrationFail = "Economy integration is "+(Conf.econEnabled ? "enabled, but" : "disabled, and")+" the plugin \"Vault\" "; modifyBalance(Conf.econUniverseAccount, delta);
}
if (Bukkit.getServer().getPluginManager().getPlugin("Vault") == null) public static void sendBalanceInfo(FPlayer to, EconomyParticipator about) {
{ if (!shouldBeUsed()) {
P.p.log(integrationFail+"is not installed."); P.p.log(Level.WARNING, "Vault does not appear to be hooked into an economy plugin.");
return; return;
} }
to.msg("<a>%s's<i> balance is <h>%s<i>.", about.describeTo(to, true), Econ.moneyString(econ.getBalance(about.getAccountId())));
}
RegisteredServiceProvider<Economy> rsp = Bukkit.getServer().getServicesManager().getRegistration(Economy.class); public static boolean canIControllYou(EconomyParticipator i, EconomyParticipator you) {
if (rsp == null) Faction fI = RelationUtil.getFaction(i);
{ Faction fYou = RelationUtil.getFaction(you);
P.p.log(integrationFail+"is not hooked into an economy plugin.");
return;
}
econ = rsp.getProvider();
P.p.log("Economy integration through Vault plugin successful."); // This is a system invoker. Accept it.
if (fI == null) return true;
if ( ! Conf.econEnabled) // Bypassing players can do any kind of transaction
P.p.log("NOTE: Economy is disabled. You can enable it with the command: f config econEnabled true"); if (i instanceof FPlayer && ((FPlayer) i).isAdminBypassing()) return true;
P.p.cmdBase.cmdHelp.updateHelp(); // Players with the any withdraw can do.
if (i instanceof FPlayer && Permission.MONEY_WITHDRAW_ANY.has(((FPlayer) i).getPlayer())) return true;
oldMoneyDoTransfer(); // You can deposit to anywhere you feel like. It's your loss if you can't withdraw it again.
} if (i == you) return true;
public static boolean shouldBeUsed() // A faction can always transfer away the money of it's members and its own money...
{ // This will however probably never happen as a faction does not have free will.
return Conf.econEnabled && econ != null && econ.isEnabled(); // Ohh by the way... Yes it could. For daily rent to the faction.
} if (i == fI && fI == fYou) return true;
public static boolean isSetup()
{
return econ != null;
}
// Factions can be controlled by members that are moderators... or any member if any member can withdraw.
if (you instanceof Faction && fI == fYou && (Conf.bankMembersCanWithdraw || ((FPlayer) i).getRole().value >= Role.MODERATOR.value))
return true;
public static void modifyUniverseMoney(double delta) // Otherwise you may not! ;,,;
{ i.msg("<h>%s<i> lacks permission to control <h>%s's<i> money.", i.describeTo(i, true), you.describeTo(i));
if (!shouldBeUsed()) return; return false;
}
if (Conf.econUniverseAccount == null) return; public static boolean transferMoney(EconomyParticipator invoker, EconomyParticipator from, EconomyParticipator to, double amount) {
if (Conf.econUniverseAccount.length() == 0) return; return transferMoney(invoker, from, to, amount, true);
if ( ! econ.hasAccount(Conf.econUniverseAccount)) return; }
modifyBalance(Conf.econUniverseAccount, delta); public static boolean transferMoney(EconomyParticipator invoker, EconomyParticipator from, EconomyParticipator to, double amount, boolean notify) {
} if (!shouldBeUsed()) return false;
public static void sendBalanceInfo(FPlayer to, EconomyParticipator about)
{
if (!shouldBeUsed())
{
P.p.log(Level.WARNING, "Vault does not appear to be hooked into an economy plugin.");
return;
}
to.msg("<a>%s's<i> balance is <h>%s<i>.", about.describeTo(to, true), Econ.moneyString(econ.getBalance(about.getAccountId())));
}
public static boolean canIControllYou(EconomyParticipator i, EconomyParticipator you)
{
Faction fI = RelationUtil.getFaction(i);
Faction fYou = RelationUtil.getFaction(you);
// This is a system invoker. Accept it.
if (fI == null) return true;
// Bypassing players can do any kind of transaction
if (i instanceof FPlayer && ((FPlayer)i).isAdminBypassing()) return true;
// Players with the any withdraw can do.
if (i instanceof FPlayer && Permission.MONEY_WITHDRAW_ANY.has(((FPlayer)i).getPlayer())) return true;
// You can deposit to anywhere you feel like. It's your loss if you can't withdraw it again.
if (i == you) return true;
// A faction can always transfer away the money of it's members and its own money...
// This will however probably never happen as a faction does not have free will.
// Ohh by the way... Yes it could. For daily rent to the faction.
if (i == fI && fI == fYou) return true;
// Factions can be controlled by members that are moderators... or any member if any member can withdraw.
if (you instanceof Faction && fI == fYou && (Conf.bankMembersCanWithdraw || ((FPlayer)i).getRole().value >= Role.MODERATOR.value)) return true;
// Otherwise you may not! ;,,;
i.msg("<h>%s<i> lacks permission to control <h>%s's<i> money.", i.describeTo(i, true), you.describeTo(i));
return false;
}
public static boolean transferMoney(EconomyParticipator invoker, EconomyParticipator from, EconomyParticipator to, double amount)
{
return transferMoney(invoker, from, to, amount, true);
}
public static boolean transferMoney(EconomyParticipator invoker, EconomyParticipator from, EconomyParticipator to, double amount, boolean notify)
{
if ( ! shouldBeUsed()) return false;
// The amount must be positive. // The amount must be positive.
// If the amount is negative we must flip and multiply amount with -1. // If the amount is negative we must flip and multiply amount with -1.
if (amount < 0) if (amount < 0) {
{ amount *= -1;
amount *= -1; EconomyParticipator temp = from;
EconomyParticipator temp = from; from = to;
from = to; to = temp;
to = temp; }
}
// Check the rights
if ( ! canIControllYou(invoker, from)) return false;
// Is there enough money for the transaction to happen?
if ( ! econ.has(from.getAccountId(), amount))
{
// There was not enough money to pay
if (invoker != null && notify)
invoker.msg("<h>%s<b> can't afford to transfer <h>%s<b> to %s<b>.", from.describeTo(invoker, true), moneyString(amount), to.describeTo(invoker));
return false; // Check the rights
} if (!canIControllYou(invoker, from)) return false;
// Transfer money
EconomyResponse erw = econ.withdrawPlayer(from.getAccountId(), amount);
if (erw.transactionSuccess()) { // Is there enough money for the transaction to happen?
EconomyResponse erd = econ.depositPlayer(to.getAccountId(), amount); if (!econ.has(from.getAccountId(), amount)) {
if (erd.transactionSuccess()) { // There was not enough money to pay
if (notify) sendTransferInfo(invoker, from, to, amount); if (invoker != null && notify)
return true; invoker.msg("<h>%s<b> can't afford to transfer <h>%s<b> to %s<b>.", from.describeTo(invoker, true), moneyString(amount), to.describeTo(invoker));
} else {
// transaction failed, refund account
econ.depositPlayer(from.getAccountId(), amount);
}
}
// if we get here something with the transaction failed return false;
if (notify) }
invoker.msg("Unable to transfer %s<b> to <h>%s<b> from <h>%s<b>.", moneyString(amount), to.describeTo(invoker), from.describeTo(invoker, true));
return false; // Transfer money
} EconomyResponse erw = econ.withdrawPlayer(from.getAccountId(), amount);
public static Set<FPlayer> getFplayers(EconomyParticipator ep)
{
Set<FPlayer> fplayers = new HashSet<FPlayer>();
if (ep == null)
{
// Add nothing
}
else if (ep instanceof FPlayer)
{
fplayers.add((FPlayer)ep);
}
else if (ep instanceof Faction)
{
fplayers.addAll(((Faction)ep).getFPlayers());
}
return fplayers;
}
public static void sendTransferInfo(EconomyParticipator invoker, EconomyParticipator from, EconomyParticipator to, double amount)
{
Set<FPlayer> recipients = new HashSet<FPlayer>();
recipients.addAll(getFplayers(invoker));
recipients.addAll(getFplayers(from));
recipients.addAll(getFplayers(to));
if (invoker == null)
{
for (FPlayer recipient : recipients)
{
recipient.msg("<h>%s<i> was transfered from <h>%s<i> to <h>%s<i>.", moneyString(amount), from.describeTo(recipient), to.describeTo(recipient));
}
}
else if (invoker == from)
{
for (FPlayer recipient : recipients)
{
recipient.msg("<h>%s<i> <h>gave %s<i> to <h>%s<i>.", from.describeTo(recipient, true), moneyString(amount), to.describeTo(recipient));
}
}
else if (invoker == to)
{
for (FPlayer recipient : recipients)
{
recipient.msg("<h>%s<i> <h>took %s<i> from <h>%s<i>.", to.describeTo(recipient, true), moneyString(amount), from.describeTo(recipient));
}
}
else
{
for (FPlayer recipient : recipients)
{
recipient.msg("<h>%s<i> transfered <h>%s<i> from <h>%s<i> to <h>%s<i>.", invoker.describeTo(recipient, true), moneyString(amount), from.describeTo(recipient), to.describeTo(recipient));
}
}
}
public static boolean hasAtLeast(EconomyParticipator ep, double delta, String toDoThis) if (erw.transactionSuccess()) {
{ EconomyResponse erd = econ.depositPlayer(to.getAccountId(), amount);
if ( ! shouldBeUsed()) return true; if (erd.transactionSuccess()) {
if (notify) sendTransferInfo(invoker, from, to, amount);
return true;
} else {
// transaction failed, refund account
econ.depositPlayer(from.getAccountId(), amount);
}
}
if ( ! econ.has(ep.getAccountId(), delta)) // if we get here something with the transaction failed
{ if (notify)
if (toDoThis != null && !toDoThis.isEmpty()) invoker.msg("Unable to transfer %s<b> to <h>%s<b> from <h>%s<b>.", moneyString(amount), to.describeTo(invoker), from.describeTo(invoker, true));
ep.msg("<h>%s<i> can't afford <h>%s<i> %s.", ep.describeTo(ep, true), moneyString(delta), toDoThis);
return false;
}
return true;
}
public static boolean modifyMoney(EconomyParticipator ep, double delta, String toDoThis, String forDoingThis) return false;
{ }
if ( ! shouldBeUsed()) return false;
String acc = ep.getAccountId(); public static Set<FPlayer> getFplayers(EconomyParticipator ep) {
String You = ep.describeTo(ep, true); Set<FPlayer> fplayers = new HashSet<FPlayer>();
if (delta == 0) if (ep == null) {
{ // Add nothing
// no money actually transferred? } else if (ep instanceof FPlayer) {
fplayers.add((FPlayer) ep);
} else if (ep instanceof Faction) {
fplayers.addAll(((Faction) ep).getFPlayers());
}
return fplayers;
}
public static void sendTransferInfo(EconomyParticipator invoker, EconomyParticipator from, EconomyParticipator to, double amount) {
Set<FPlayer> recipients = new HashSet<FPlayer>();
recipients.addAll(getFplayers(invoker));
recipients.addAll(getFplayers(from));
recipients.addAll(getFplayers(to));
if (invoker == null) {
for (FPlayer recipient : recipients) {
recipient.msg("<h>%s<i> was transfered from <h>%s<i> to <h>%s<i>.", moneyString(amount), from.describeTo(recipient), to.describeTo(recipient));
}
} else if (invoker == from) {
for (FPlayer recipient : recipients) {
recipient.msg("<h>%s<i> <h>gave %s<i> to <h>%s<i>.", from.describeTo(recipient, true), moneyString(amount), to.describeTo(recipient));
}
} else if (invoker == to) {
for (FPlayer recipient : recipients) {
recipient.msg("<h>%s<i> <h>took %s<i> from <h>%s<i>.", to.describeTo(recipient, true), moneyString(amount), from.describeTo(recipient));
}
} else {
for (FPlayer recipient : recipients) {
recipient.msg("<h>%s<i> transfered <h>%s<i> from <h>%s<i> to <h>%s<i>.", invoker.describeTo(recipient, true), moneyString(amount), from.describeTo(recipient), to.describeTo(recipient));
}
}
}
public static boolean hasAtLeast(EconomyParticipator ep, double delta, String toDoThis) {
if (!shouldBeUsed()) return true;
if (!econ.has(ep.getAccountId(), delta)) {
if (toDoThis != null && !toDoThis.isEmpty())
ep.msg("<h>%s<i> can't afford <h>%s<i> %s.", ep.describeTo(ep, true), moneyString(delta), toDoThis);
return false;
}
return true;
}
public static boolean modifyMoney(EconomyParticipator ep, double delta, String toDoThis, String forDoingThis) {
if (!shouldBeUsed()) return false;
String acc = ep.getAccountId();
String You = ep.describeTo(ep, true);
if (delta == 0) {
// no money actually transferred?
// ep.msg("<h>%s<i> didn't have to pay anything %s.", You, forDoingThis); // might be for gains, might be for losses // ep.msg("<h>%s<i> didn't have to pay anything %s.", You, forDoingThis); // might be for gains, might be for losses
return true; return true;
} }
if (delta > 0) if (delta > 0) {
{ // The player should gain money
// The player should gain money // The account might not have enough space
// The account might not have enough space EconomyResponse er = econ.depositPlayer(acc, delta);
EconomyResponse er = econ.depositPlayer(acc, delta); if (er.transactionSuccess()) {
if (er.transactionSuccess()) { modifyUniverseMoney(-delta);
modifyUniverseMoney(-delta); if (forDoingThis != null && !forDoingThis.isEmpty())
if (forDoingThis != null && !forDoingThis.isEmpty()) ep.msg("<h>%s<i> gained <h>%s<i> %s.", You, moneyString(delta), forDoingThis);
ep.msg("<h>%s<i> gained <h>%s<i> %s.", You, moneyString(delta), forDoingThis); return true;
return true; } else {
} else { // transfer to account failed
// transfer to account failed if (forDoingThis != null && !forDoingThis.isEmpty())
if (forDoingThis != null && !forDoingThis.isEmpty()) ep.msg("<h>%s<i> would have gained <h>%s<i> %s, but the deposit failed.", You, moneyString(delta), forDoingThis);
ep.msg("<h>%s<i> would have gained <h>%s<i> %s, but the deposit failed.", You, moneyString(delta), forDoingThis); return false;
return false; }
} } else {
} // The player should loose money
else // The player might not have enough.
{
// The player should loose money
// The player might not have enough.
if (econ.has(acc, -delta) && econ.withdrawPlayer(acc, -delta).transactionSuccess())
{
// There is enough money to pay
modifyUniverseMoney(-delta);
if (forDoingThis != null && !forDoingThis.isEmpty())
ep.msg("<h>%s<i> lost <h>%s<i> %s.", You, moneyString(-delta), forDoingThis);
return true;
}
else
{
// There was not enough money to pay
if (toDoThis != null && !toDoThis.isEmpty())
ep.msg("<h>%s<i> can't afford <h>%s<i> %s.", You, moneyString(-delta), toDoThis);
return false;
}
}
}
// format money string based on server's set currency type, like "24 gold" or "$24.50" if (econ.has(acc, -delta) && econ.withdrawPlayer(acc, -delta).transactionSuccess()) {
public static String moneyString(double amount) // There is enough money to pay
{ modifyUniverseMoney(-delta);
return econ.format(amount); if (forDoingThis != null && !forDoingThis.isEmpty())
} ep.msg("<h>%s<i> lost <h>%s<i> %s.", You, moneyString(-delta), forDoingThis);
return true;
public static void oldMoneyDoTransfer() } else {
{ // There was not enough money to pay
if ( ! shouldBeUsed()) return; if (toDoThis != null && !toDoThis.isEmpty())
ep.msg("<h>%s<i> can't afford <h>%s<i> %s.", You, moneyString(-delta), toDoThis);
for (Faction faction : Factions.i.get()) return false;
{ }
if (faction.money > 0) }
{ }
econ.depositPlayer(faction.getAccountId(), faction.money);
faction.money = 0;
}
}
}
// calculate the cost for claiming land // format money string based on server's set currency type, like "24 gold" or "$24.50"
public static double calculateClaimCost(int ownedLand, boolean takingFromAnotherFaction) public static String moneyString(double amount) {
{ return econ.format(amount);
if ( ! shouldBeUsed()) }
{
return 0d;
}
// basic claim cost, plus land inflation cost, minus the potential bonus given for claiming from another faction public static void oldMoneyDoTransfer() {
return Conf.econCostClaimWilderness if (!shouldBeUsed()) return;
+ (Conf.econCostClaimWilderness * Conf.econClaimAdditionalMultiplier * ownedLand)
- (takingFromAnotherFaction ? Conf.econCostClaimFromFactionBonus: 0);
}
// calculate refund amount for unclaiming land for (Faction faction : Factions.i.get()) {
public static double calculateClaimRefund(int ownedLand) if (faction.money > 0) {
{ econ.depositPlayer(faction.getAccountId(), faction.money);
return calculateClaimCost(ownedLand - 1, false) * Conf.econClaimRefundMultiplier; faction.money = 0;
} }
}
}
// calculate value of all owned land // calculate the cost for claiming land
public static double calculateTotalLandValue(int ownedLand) public static double calculateClaimCost(int ownedLand, boolean takingFromAnotherFaction) {
{ if (!shouldBeUsed()) {
double amount = 0; return 0d;
for (int x = 0; x < ownedLand; x++) { }
amount += calculateClaimCost(x, false);
}
return amount;
}
// calculate refund amount for all owned land // basic claim cost, plus land inflation cost, minus the potential bonus given for claiming from another faction
public static double calculateTotalLandRefund(int ownedLand) return Conf.econCostClaimWilderness
{ + (Conf.econCostClaimWilderness * Conf.econClaimAdditionalMultiplier * ownedLand)
return calculateTotalLandValue(ownedLand) * Conf.econClaimRefundMultiplier; - (takingFromAnotherFaction ? Conf.econCostClaimFromFactionBonus : 0);
} }
// calculate refund amount for unclaiming land
public static double calculateClaimRefund(int ownedLand) {
return calculateClaimCost(ownedLand - 1, false) * Conf.econClaimRefundMultiplier;
}
// calculate value of all owned land
public static double calculateTotalLandValue(int ownedLand) {
double amount = 0;
for (int x = 0; x < ownedLand; x++) {
amount += calculateClaimCost(x, false);
}
return amount;
}
// calculate refund amount for all owned land
public static double calculateTotalLandRefund(int ownedLand) {
return calculateTotalLandValue(ownedLand) * Conf.econClaimRefundMultiplier;
}
// -------------------------------------------- // // -------------------------------------------- //
// Standard account management methods // Standard account management methods
// -------------------------------------------- // // -------------------------------------------- //
public static boolean hasAccount(String name) public static boolean hasAccount(String name) {
{ return econ.hasAccount(name);
return econ.hasAccount(name); }
}
public static double getBalance(String account) public static double getBalance(String account) {
{ return econ.getBalance(account);
return econ.getBalance(account); }
}
public static boolean setBalance(String account, double amount) public static boolean setBalance(String account, double amount) {
{ double current = econ.getBalance(account);
double current = econ.getBalance(account); if (current > amount)
if (current > amount) return econ.withdrawPlayer(account, current - amount).transactionSuccess();
return econ.withdrawPlayer(account, current - amount).transactionSuccess(); else
else return econ.depositPlayer(account, amount - current).transactionSuccess();
return econ.depositPlayer(account, amount - current).transactionSuccess(); }
}
public static boolean modifyBalance(String account, double amount) public static boolean modifyBalance(String account, double amount) {
{ if (amount < 0)
if (amount < 0) return econ.withdrawPlayer(account, -amount).transactionSuccess();
return econ.withdrawPlayer(account, -amount).transactionSuccess(); else
else return econ.depositPlayer(account, amount).transactionSuccess();
return econ.depositPlayer(account, amount).transactionSuccess(); }
}
public static boolean deposit(String account, double amount) public static boolean deposit(String account, double amount) {
{ return econ.depositPlayer(account, amount).transactionSuccess();
return econ.depositPlayer(account, amount).transactionSuccess(); }
}
public static boolean withdraw(String account, double amount) public static boolean withdraw(String account, double amount) {
{ return econ.withdrawPlayer(account, amount).transactionSuccess();
return econ.withdrawPlayer(account, amount).transactionSuccess(); }
}
} }

View File

@ -1,22 +1,20 @@
package com.massivecraft.factions.integration; package com.massivecraft.factions.integration;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.Location;
import org.bukkit.plugin.Plugin;
import com.massivecraft.factions.Conf;
import com.massivecraft.factions.P;
import com.earth2me.essentials.IEssentials; import com.earth2me.essentials.IEssentials;
import com.earth2me.essentials.Teleport; import com.earth2me.essentials.Teleport;
import com.earth2me.essentials.Trade; import com.earth2me.essentials.Trade;
import com.earth2me.essentials.chat.EssentialsChat; import com.earth2me.essentials.chat.EssentialsChat;
import com.earth2me.essentials.chat.EssentialsLocalChatEvent; import com.earth2me.essentials.chat.EssentialsLocalChatEvent;
import com.massivecraft.factions.Conf;
import com.massivecraft.factions.P;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.plugin.Plugin;
/* /*
@ -26,111 +24,90 @@ import com.earth2me.essentials.chat.EssentialsLocalChatEvent;
// silence deprecation warnings with this old interface // silence deprecation warnings with this old interface
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public class EssentialsFeatures public class EssentialsFeatures {
{ private static EssentialsChat essChat;
private static EssentialsChat essChat; private static IEssentials essentials;
private static IEssentials essentials;
public static void setup() public static void setup() {
{ // integrate main essentials plugin
// integrate main essentials plugin // TODO: this is the old Essentials method not supported in 3.0... probably needs to eventually be moved to EssentialsOldVersionFeatures and new method implemented
// TODO: this is the old Essentials method not supported in 3.0... probably needs to eventually be moved to EssentialsOldVersionFeatures and new method implemented if (essentials == null) {
if (essentials == null) Plugin ess = Bukkit.getPluginManager().getPlugin("Essentials");
{ if (ess != null && ess.isEnabled())
Plugin ess = Bukkit.getPluginManager().getPlugin("Essentials"); essentials = (IEssentials) ess;
if (ess != null && ess.isEnabled()) }
essentials = (IEssentials)ess;
}
// integrate chat // integrate chat
if (essChat != null) return; if (essChat != null) return;
Plugin test = Bukkit.getServer().getPluginManager().getPlugin("EssentialsChat"); Plugin test = Bukkit.getServer().getPluginManager().getPlugin("EssentialsChat");
if (test == null || !test.isEnabled()) return; if (test == null || !test.isEnabled()) return;
essChat = (EssentialsChat)test; essChat = (EssentialsChat) test;
// try newer Essentials 3.x integration method // try newer Essentials 3.x integration method
try try {
{ Class.forName("com.earth2me.essentials.chat.EssentialsLocalChatEvent");
Class.forName("com.earth2me.essentials.chat.EssentialsLocalChatEvent"); integrateChat(essChat);
integrateChat(essChat); } catch (ClassNotFoundException ex) {
} // no? try older Essentials 2.x integration method
catch (ClassNotFoundException ex) try {
{ EssentialsOldVersionFeatures.integrateChat(essChat);
// no? try older Essentials 2.x integration method } catch (NoClassDefFoundError ex2) { /* no known integration method, then */ }
try }
{ }
EssentialsOldVersionFeatures.integrateChat(essChat);
}
catch (NoClassDefFoundError ex2) { /* no known integration method, then */ }
}
}
public static void unhookChat() public static void unhookChat() {
{ if (essChat == null) return;
if (essChat == null) return;
try try {
{ EssentialsOldVersionFeatures.unhookChat();
EssentialsOldVersionFeatures.unhookChat(); } catch (NoClassDefFoundError ex) {
} }
catch (NoClassDefFoundError ex) {} }
}
// return false if feature is disabled or Essentials isn't available // return false if feature is disabled or Essentials isn't available
public static boolean handleTeleport(Player player, Location loc) public static boolean handleTeleport(Player player, Location loc) {
{ if (!Conf.homesTeleportCommandEssentialsIntegration || essentials == null) return false;
if ( ! Conf.homesTeleportCommandEssentialsIntegration || essentials == null) return false;
Teleport teleport = (Teleport) essentials.getUser(player).getTeleport(); Teleport teleport = (Teleport) essentials.getUser(player).getTeleport();
Trade trade = new Trade(Conf.econCostHome, essentials); Trade trade = new Trade(Conf.econCostHome, essentials);
try try {
{ teleport.teleport(loc, trade);
teleport.teleport(loc, trade); } catch (Exception e) {
} player.sendMessage(ChatColor.RED.toString() + e.getMessage());
catch (Exception e) }
{ return true;
player.sendMessage(ChatColor.RED.toString()+e.getMessage()); }
}
return true;
}
public static void integrateChat(EssentialsChat instance) public static void integrateChat(EssentialsChat instance) {
{ essChat = instance;
essChat = instance; try {
try Bukkit.getServer().getPluginManager().registerEvents(new LocalChatListener(), P.p);
{ P.p.log("Found and will integrate chat with newer " + essChat.getDescription().getFullName());
Bukkit.getServer().getPluginManager().registerEvents(new LocalChatListener(), P.p);
P.p.log("Found and will integrate chat with newer "+essChat.getDescription().getFullName());
// curly braces used to be accepted by the format string EssentialsChat but no longer are, so... deal with chatTagReplaceString which might need updating // curly braces used to be accepted by the format string EssentialsChat but no longer are, so... deal with chatTagReplaceString which might need updating
if (Conf.chatTagReplaceString.contains("{")) if (Conf.chatTagReplaceString.contains("{")) {
{ Conf.chatTagReplaceString = Conf.chatTagReplaceString.replace("{", "[").replace("}", "]");
Conf.chatTagReplaceString = Conf.chatTagReplaceString.replace("{", "[").replace("}", "]"); P.p.log("NOTE: as of Essentials 2.8+, we've had to switch the default chat replacement tag from \"{FACTION}\" to \"[FACTION]\". This has automatically been updated for you.");
P.p.log("NOTE: as of Essentials 2.8+, we've had to switch the default chat replacement tag from \"{FACTION}\" to \"[FACTION]\". This has automatically been updated for you."); }
} } catch (NoSuchMethodError ex) {
} essChat = null;
catch (NoSuchMethodError ex) }
{ }
essChat = null;
}
}
private static class LocalChatListener implements Listener private static class LocalChatListener implements Listener {
{ @SuppressWarnings("unused")
@SuppressWarnings("unused") @EventHandler(priority = EventPriority.NORMAL)
@EventHandler(priority = EventPriority.NORMAL) public void onPlayerChat(EssentialsLocalChatEvent event) {
public void onPlayerChat(EssentialsLocalChatEvent event) Player speaker = event.getPlayer();
{ String format = event.getFormat();
Player speaker = event.getPlayer(); format = format.replace(Conf.chatTagReplaceString, P.p.getPlayerFactionTag(speaker)).replace("[FACTION_TITLE]", P.p.getPlayerTitle(speaker));
String format = event.getFormat(); event.setFormat(format);
format = format.replace(Conf.chatTagReplaceString, P.p.getPlayerFactionTag(speaker)).replace("[FACTION_TITLE]", P.p.getPlayerTitle(speaker)); // NOTE: above doesn't do relation coloring. if/when we can get a local recipient list from EssentialsLocalChatEvent, we'll probably
event.setFormat(format); // want to pass it on to FactionsPlayerListener.onPlayerChat(PlayerChatEvent event) rather than duplicating code
// NOTE: above doesn't do relation coloring. if/when we can get a local recipient list from EssentialsLocalChatEvent, we'll probably }
// want to pass it on to FactionsPlayerListener.onPlayerChat(PlayerChatEvent event) rather than duplicating code }
}
}
} }

View File

@ -1,59 +1,47 @@
package com.massivecraft.factions.integration; package com.massivecraft.factions.integration;
import org.bukkit.entity.Player;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import com.massivecraft.factions.Conf;
import com.massivecraft.factions.P;
import com.earth2me.essentials.chat.EssentialsChat; import com.earth2me.essentials.chat.EssentialsChat;
import com.earth2me.essentials.chat.IEssentialsChatListener; import com.earth2me.essentials.chat.IEssentialsChatListener;
import com.massivecraft.factions.Conf;
import com.massivecraft.factions.P;
import org.bukkit.entity.Player;
import org.bukkit.event.player.AsyncPlayerChatEvent;
/* /*
* This Essentials integration handler is for older 2.x.x versions of Essentials which have "IEssentialsChatListener" * This Essentials integration handler is for older 2.x.x versions of Essentials which have "IEssentialsChatListener"
*/ */
public class EssentialsOldVersionFeatures public class EssentialsOldVersionFeatures {
{ private static EssentialsChat essChat;
private static EssentialsChat essChat;
public static void integrateChat(EssentialsChat instance) public static void integrateChat(EssentialsChat instance) {
{ essChat = instance;
essChat = instance; try {
try essChat.addEssentialsChatListener("Factions", new IEssentialsChatListener() {
{ public boolean shouldHandleThisChat(AsyncPlayerChatEvent event) {
essChat.addEssentialsChatListener("Factions", new IEssentialsChatListener() return P.p.shouldLetFactionsHandleThisChat(event);
{ }
public boolean shouldHandleThisChat(AsyncPlayerChatEvent event)
{
return P.p.shouldLetFactionsHandleThisChat(event);
}
public String modifyMessage(AsyncPlayerChatEvent event, Player target, String message)
{
return message.replace(Conf.chatTagReplaceString, P.p.getPlayerFactionTagRelation(event.getPlayer(), target)).replace("[FACTION_TITLE]", P.p.getPlayerTitle(event.getPlayer()));
}
});
P.p.log("Found and will integrate chat with "+essChat.getDescription().getFullName());
// As of Essentials 2.8+, curly braces are not accepted and are instead replaced with square braces, so... deal with it public String modifyMessage(AsyncPlayerChatEvent event, Player target, String message) {
if (essChat.getDescription().getVersion().startsWith("2.8.") && Conf.chatTagReplaceString.contains("{")) return message.replace(Conf.chatTagReplaceString, P.p.getPlayerFactionTagRelation(event.getPlayer(), target)).replace("[FACTION_TITLE]", P.p.getPlayerTitle(event.getPlayer()));
{ }
Conf.chatTagReplaceString = Conf.chatTagReplaceString.replace("{", "[").replace("}", "]"); });
P.p.log("NOTE: as of Essentials 2.8+, we've had to switch the default chat replacement tag from \"{FACTION}\" to \"[FACTION]\". This has automatically been updated for you."); P.p.log("Found and will integrate chat with " + essChat.getDescription().getFullName());
}
}
catch (NoSuchMethodError ex)
{
essChat = null;
}
}
public static void unhookChat() // As of Essentials 2.8+, curly braces are not accepted and are instead replaced with square braces, so... deal with it
{ if (essChat.getDescription().getVersion().startsWith("2.8.") && Conf.chatTagReplaceString.contains("{")) {
if (essChat != null) Conf.chatTagReplaceString = Conf.chatTagReplaceString.replace("{", "[").replace("}", "]");
{ P.p.log("NOTE: as of Essentials 2.8+, we've had to switch the default chat replacement tag from \"{FACTION}\" to \"[FACTION]\". This has automatically been updated for you.");
essChat.removeEssentialsChatListener("Factions"); }
} } catch (NoSuchMethodError ex) {
} essChat = null;
}
}
public static void unhookChat() {
if (essChat != null) {
essChat.removeEssentialsChatListener("Factions");
}
}
} }

View File

@ -1,90 +1,72 @@
package com.massivecraft.factions.integration; package com.massivecraft.factions.integration;
import com.griefcraft.lwc.LWC;
import com.griefcraft.lwc.LWCPlugin;
import com.massivecraft.factions.*;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.plugin.Plugin;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import org.bukkit.Bukkit; public class LWCFeatures {
import org.bukkit.Chunk; private static LWC lwc;
import org.bukkit.Location;
import org.bukkit.plugin.Plugin;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import com.griefcraft.lwc.LWC; public static void setup() {
import com.griefcraft.lwc.LWCPlugin; Plugin test = Bukkit.getServer().getPluginManager().getPlugin("LWC");
import com.massivecraft.factions.Conf; if (test == null || !test.isEnabled()) return;
import com.massivecraft.factions.FLocation;
import com.massivecraft.factions.FPlayers;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.P;
public class LWCFeatures lwc = ((LWCPlugin) test).getLWC();
{ P.p.log("Successfully hooked into LWC!" + (Conf.lwcIntegration ? "" : " Integration is currently disabled, though (\"lwcIntegration\")."));
private static LWC lwc; }
public static void setup() public static boolean getEnabled() {
{ return Conf.lwcIntegration && lwc != null;
Plugin test = Bukkit.getServer().getPluginManager().getPlugin("LWC"); }
if(test == null || !test.isEnabled()) return;
lwc = ((LWCPlugin)test).getLWC(); public static void clearOtherChests(FLocation flocation, Faction faction) {
P.p.log("Successfully hooked into LWC!"+(Conf.lwcIntegration ? "" : " Integration is currently disabled, though (\"lwcIntegration\").")); Location location = new Location(Bukkit.getWorld(flocation.getWorldName()), flocation.getX() * 16, 5, flocation.getZ() * 16);
} if (location.getWorld() == null) return; // world not loaded or something? cancel out to prevent error
Chunk chunk = location.getChunk();
BlockState[] blocks = chunk.getTileEntities();
List<Block> chests = new LinkedList<Block>();
public static boolean getEnabled() for (int x = 0; x < blocks.length; x++) {
{ if (blocks[x].getType() == Material.CHEST) {
return Conf.lwcIntegration && lwc != null; chests.add(blocks[x].getBlock());
} }
}
public static void clearOtherChests(FLocation flocation, Faction faction) for (int x = 0; x < chests.size(); x++) {
{ if (lwc.findProtection(chests.get(x)) != null) {
Location location = new Location(Bukkit.getWorld(flocation.getWorldName()), flocation.getX() * 16, 5, flocation.getZ() * 16); if (!faction.getFPlayers().contains(FPlayers.i.get(lwc.findProtection(chests.get(x)).getOwner())))
if (location.getWorld() == null) return; // world not loaded or something? cancel out to prevent error lwc.findProtection(chests.get(x)).remove();
Chunk chunk = location.getChunk(); }
BlockState[] blocks = chunk.getTileEntities(); }
List<Block> chests = new LinkedList<Block>(); }
for(int x = 0; x < blocks.length; x++) public static void clearAllChests(FLocation flocation) {
{ Location location = new Location(Bukkit.getWorld(flocation.getWorldName()), flocation.getX() * 16, 5, flocation.getZ() * 16);
if(blocks[x].getType() == Material.CHEST) if (location.getWorld() == null) return; // world not loaded or something? cancel out to prevent error
{ Chunk chunk = location.getChunk();
chests.add(blocks[x].getBlock()); BlockState[] blocks = chunk.getTileEntities();
} List<Block> chests = new LinkedList<Block>();
}
for (int x = 0; x < blocks.length; x++) {
for(int x = 0; x < chests.size(); x++) if (blocks[x].getType() == Material.CHEST) {
{ chests.add(blocks[x].getBlock());
if(lwc.findProtection(chests.get(x)) != null) }
{ }
if(!faction.getFPlayers().contains(FPlayers.i.get(lwc.findProtection(chests.get(x)).getOwner())))
lwc.findProtection(chests.get(x)).remove(); for (int x = 0; x < chests.size(); x++) {
} if (lwc.findProtection(chests.get(x)) != null) {
} lwc.findProtection(chests.get(x)).remove();
} }
}
public static void clearAllChests(FLocation flocation) }
{
Location location = new Location(Bukkit.getWorld(flocation.getWorldName()), flocation.getX() * 16, 5, flocation.getZ() * 16);
if (location.getWorld() == null) return; // world not loaded or something? cancel out to prevent error
Chunk chunk = location.getChunk();
BlockState[] blocks = chunk.getTileEntities();
List<Block> chests = new LinkedList<Block>();
for(int x = 0; x < blocks.length; x++)
{
if(blocks[x].getType() == Material.CHEST)
{
chests.add(blocks[x].getBlock());
}
}
for(int x = 0; x < chests.size(); x++)
{
if(lwc.findProtection(chests.get(x)) != null)
{
lwc.findProtection(chests.get(x)).remove();
}
}
}
} }

View File

@ -1,329 +1,298 @@
package com.massivecraft.factions.integration; package com.massivecraft.factions.integration;
import com.massivecraft.factions.*;
import com.massivecraft.factions.struct.Relation;
import com.massivecraft.factions.struct.Role;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.getspout.spoutapi.SpoutManager;
import org.getspout.spoutapi.gui.Color;
import org.getspout.spoutapi.player.SpoutPlayer;
import java.util.Set; import java.util.Set;
import com.massivecraft.factions.Conf;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.FPlayers;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.FLocation;
import com.massivecraft.factions.P;
import org.bukkit.Bukkit; public class SpoutFeatures {
import org.bukkit.ChatColor; private transient static boolean spoutMe = false;
import org.bukkit.plugin.Plugin; private transient static SpoutMainListener mainListener;
import org.bukkit.entity.Player; private transient static boolean listenersHooked;
import com.massivecraft.factions.struct.Relation; public static void setup() {
import com.massivecraft.factions.struct.Role; Plugin test = Bukkit.getServer().getPluginManager().getPlugin("Spout");
if (test == null || !test.isEnabled()) return;
import org.getspout.spoutapi.gui.Color; setAvailable(true, test.getDescription().getFullName());
import org.getspout.spoutapi.player.SpoutPlayer; }
import org.getspout.spoutapi.SpoutManager;
// set integration availability
public static void setAvailable(boolean enable, String pluginName) {
spoutMe = enable;
if (!spoutMe) return;
P.p.log("Found and will use features of " + pluginName);
if (!listenersHooked) {
listenersHooked = true;
mainListener = new SpoutMainListener();
Bukkit.getServer().getPluginManager().registerEvents(mainListener, P.p);
}
}
// If we're successfully hooked into Spout
public static boolean enabled() {
return spoutMe;
}
// If Spout is available and the specified Player is running the Spoutcraft client
public static boolean availableFor(Player player) {
return spoutMe && SpoutManager.getPlayer(player).isSpoutCraftEnabled();
}
public class SpoutFeatures // update displayed current territory for all players inside a specified chunk; if specified chunk is null, then simply update everyone online
{ public static void updateTerritoryDisplayLoc(FLocation fLoc) {
private transient static boolean spoutMe = false; if (!enabled())
private transient static SpoutMainListener mainListener; return;
private transient static boolean listenersHooked;
public static void setup() Set<FPlayer> players = FPlayers.i.getOnline();
{
Plugin test = Bukkit.getServer().getPluginManager().getPlugin("Spout");
if (test == null || !test.isEnabled()) return;
setAvailable(true, test.getDescription().getFullName()); for (FPlayer player : players) {
} if (fLoc == null)
mainListener.updateTerritoryDisplay(player, false);
else if (player.getLastStoodAt().equals(fLoc))
mainListener.updateTerritoryDisplay(player, true);
}
}
// set integration availability // update displayed current territory for specified player; returns false if unsuccessful
public static void setAvailable(boolean enable, String pluginName) public static boolean updateTerritoryDisplay(FPlayer player) {
{ if (!enabled())
spoutMe = enable; return false;
if (!spoutMe) return;
P.p.log("Found and will use features of "+pluginName); return mainListener.updateTerritoryDisplay(player, true);
}
if (!listenersHooked) // update owner list for all players inside a specified chunk; if specified chunk is null, then simply update everyone online
{ public static void updateOwnerListLoc(FLocation fLoc) {
listenersHooked = true; if (!enabled())
mainListener = new SpoutMainListener(); return;
Bukkit.getServer().getPluginManager().registerEvents(mainListener, P.p);
}
}
// If we're successfully hooked into Spout Set<FPlayer> players = FPlayers.i.getOnline();
public static boolean enabled()
{
return spoutMe;
}
// If Spout is available and the specified Player is running the Spoutcraft client for (FPlayer player : players) {
public static boolean availableFor(Player player) if (fLoc == null || player.getLastStoodAt().equals(fLoc))
{ mainListener.updateOwnerList(player);
return spoutMe && SpoutManager.getPlayer(player).isSpoutCraftEnabled(); }
} }
// update owner list for specified player
public static void updateOwnerList(FPlayer player) {
if (!enabled())
return;
mainListener.updateOwnerList(player);
}
public static void playerDisconnect(FPlayer player) {
if (!enabled())
return;
mainListener.removeTerritoryLabels(player.getName());
}
// update displayed current territory for all players inside a specified chunk; if specified chunk is null, then simply update everyone online // update all appearances between every player
public static void updateTerritoryDisplayLoc(FLocation fLoc) public static void updateAppearances() {
{ if (!enabled())
if (!enabled()) return;
return;
Set<FPlayer> players = FPlayers.i.getOnline(); Set<FPlayer> players = FPlayers.i.getOnline();
for (FPlayer player : players) for (FPlayer playerA : players) {
{ for (FPlayer playerB : players) {
if (fLoc == null) updateSingle(playerB, playerA);
mainListener.updateTerritoryDisplay(player, false); }
else if (player.getLastStoodAt().equals(fLoc)) }
mainListener.updateTerritoryDisplay(player, true); }
}
}
// update displayed current territory for specified player; returns false if unsuccessful // update all appearances related to a specific player
public static boolean updateTerritoryDisplay(FPlayer player) public static void updateAppearances(Player player) {
{ if (!enabled() || player == null)
if (!enabled()) return;
return false;
return mainListener.updateTerritoryDisplay(player, true); Set<FPlayer> players = FPlayers.i.getOnline();
} FPlayer playerA = FPlayers.i.get(player);
// update owner list for all players inside a specified chunk; if specified chunk is null, then simply update everyone online for (FPlayer playerB : players) {
public static void updateOwnerListLoc(FLocation fLoc) updateSingle(playerB, playerA);
{ updateSingle(playerA, playerB);
if (!enabled()) }
return; }
Set<FPlayer> players = FPlayers.i.getOnline(); // as above method, but with a delay added; useful for after-login update which doesn't always propagate if done immediately
public static void updateAppearancesShortly(final Player player) {
P.p.getServer().getScheduler().scheduleSyncDelayedTask(P.p, new Runnable() {
@Override
public void run() {
updateAppearances(player);
}
}, 100);
}
for (FPlayer player : players) // update all appearances related to a single faction
{ public static void updateAppearances(Faction faction) {
if (fLoc == null || player.getLastStoodAt().equals(fLoc)) if (!enabled() || faction == null)
mainListener.updateOwnerList(player); return;
}
}
// update owner list for specified player Set<FPlayer> players = FPlayers.i.getOnline();
public static void updateOwnerList(FPlayer player) Faction factionA;
{
if (!enabled())
return;
mainListener.updateOwnerList(player); for (FPlayer playerA : players) {
} factionA = playerA.getFaction();
public static void playerDisconnect(FPlayer player) for (FPlayer playerB : players) {
{ if (factionA != faction && playerB.getFaction() != faction)
if (!enabled()) continue;
return;
mainListener.removeTerritoryLabels(player.getName()); updateSingle(playerB, playerA);
} }
}
}
// update all appearances between two factions
public static void updateAppearances(Faction factionA, Faction factionB) {
if (!enabled() || factionA == null || factionB == null)
return;
for (FPlayer playerA : factionA.getFPlayersWhereOnline(true)) {
for (FPlayer playerB : factionB.getFPlayersWhereOnline(true)) {
updateSingle(playerB, playerA);
updateSingle(playerA, playerB);
}
}
}
// update all appearances between every player // update a single appearance; internal use only by above public methods
public static void updateAppearances() private static void updateSingle(FPlayer viewer, FPlayer viewed) {
{ if (viewer == null || viewed == null)
if (!enabled()) return;
return;
Set<FPlayer> players = FPlayers.i.getOnline(); Faction viewedFaction = viewed.getFaction();
if (viewedFaction == null)
return;
for (FPlayer playerA : players) // these still end up returning null on occasion at this point, mucking up the SpoutManager.getPlayer() method
{ if (viewer.getPlayer() == null || viewed.getPlayer() == null)
for (FPlayer playerB : players) return;
{
updateSingle(playerB, playerA);
}
}
}
// update all appearances related to a specific player SpoutPlayer pViewer = SpoutManager.getPlayer(viewer.getPlayer());
public static void updateAppearances(Player player) SpoutPlayer pViewed = SpoutManager.getPlayer(viewed.getPlayer());
{ if (pViewed == null || pViewer == null)
if (!enabled() || player == null) return;
return;
Set<FPlayer> players = FPlayers.i.getOnline(); String viewedTitle = viewed.getTitle();
FPlayer playerA = FPlayers.i.get(player); Role viewedRole = viewed.getRole();
for (FPlayer playerB : players) if ((Conf.spoutFactionTagsOverNames || Conf.spoutFactionTitlesOverNames) && viewer != viewed) {
{ if (viewedFaction.isNormal()) {
updateSingle(playerB, playerA); String addTag = "";
updateSingle(playerA, playerB); if (Conf.spoutFactionTagsOverNames)
} addTag += viewedFaction.getTag(viewed.getColorTo(viewer).toString() + "[") + "]";
}
// as above method, but with a delay added; useful for after-login update which doesn't always propagate if done immediately String rolePrefix = viewedRole.getPrefix();
public static void updateAppearancesShortly(final Player player) if (Conf.spoutFactionTitlesOverNames && (!viewedTitle.isEmpty() || !rolePrefix.isEmpty()))
{ addTag += (addTag.isEmpty() ? "" : " ") + viewedRole.getPrefix() + viewedTitle;
P.p.getServer().getScheduler().scheduleSyncDelayedTask(P.p, new Runnable()
{
@Override
public void run()
{
updateAppearances(player);
}
}, 100);
}
// update all appearances related to a single faction pViewed.setTitleFor(pViewer, addTag + "\n" + pViewed.getDisplayName());
public static void updateAppearances(Faction faction) } else {
{ pViewed.setTitleFor(pViewer, pViewed.getDisplayName());
if (!enabled() || faction == null) }
return; }
Set<FPlayer> players = FPlayers.i.getOnline(); if
Faction factionA; (
(
Conf.spoutFactionAdminCapes
&&
viewedRole.equals(Role.ADMIN)
)
||
(
Conf.spoutFactionModeratorCapes
&&
viewedRole.equals(Role.MODERATOR)
)
) {
Relation relation = viewer.getRelationTo(viewed);
String cape = "";
if (!viewedFaction.isNormal()) {
// yeah, no cape if no faction
} else if (viewedFaction.isPeaceful())
cape = Conf.capePeaceful;
else if (relation.isNeutral())
cape = Conf.capeNeutral;
else if (relation.isMember())
cape = Conf.capeMember;
else if (relation.isEnemy())
cape = Conf.capeEnemy;
else if (relation.isAlly())
cape = Conf.capeAlly;
for (FPlayer playerA : players) if (cape.isEmpty())
{ pViewed.resetCapeFor(pViewer);
factionA = playerA.getFaction(); else
pViewed.setCapeFor(pViewer, cape);
for (FPlayer playerB : players) } else if (Conf.spoutFactionAdminCapes || Conf.spoutFactionModeratorCapes) {
{ pViewed.resetCapeFor(pViewer);
if (factionA != faction && playerB.getFaction() != faction) }
continue; }
updateSingle(playerB, playerA);
}
}
}
// update all appearances between two factions
public static void updateAppearances(Faction factionA, Faction factionB)
{
if (!enabled() || factionA == null || factionB == null)
return;
for (FPlayer playerA : factionA.getFPlayersWhereOnline(true))
{
for (FPlayer playerB : factionB.getFPlayersWhereOnline(true))
{
updateSingle(playerB, playerA);
updateSingle(playerA, playerB);
}
}
}
// update a single appearance; internal use only by above public methods // method to convert a Bukkit ChatColor to a Spout Color
private static void updateSingle(FPlayer viewer, FPlayer viewed) protected static Color getSpoutColor(ChatColor inColor, int alpha) {
{ if (inColor == null)
if (viewer == null || viewed == null) return SpoutFixedColor(191, 191, 191, alpha);
return;
Faction viewedFaction = viewed.getFaction(); switch (inColor.getChar()) {
if (viewedFaction == null) case 0x1:
return; return SpoutFixedColor(0, 0, 191, alpha);
case 0x2:
return SpoutFixedColor(0, 191, 0, alpha);
case 0x3:
return SpoutFixedColor(0, 191, 191, alpha);
case 0x4:
return SpoutFixedColor(191, 0, 0, alpha);
case 0x5:
return SpoutFixedColor(191, 0, 191, alpha);
case 0x6:
return SpoutFixedColor(191, 191, 0, alpha);
case 0x7:
return SpoutFixedColor(191, 191, 191, alpha);
case 0x8:
return SpoutFixedColor(64, 64, 64, alpha);
case 0x9:
return SpoutFixedColor(64, 64, 255, alpha);
case 0xA:
return SpoutFixedColor(64, 255, 64, alpha);
case 0xB:
return SpoutFixedColor(64, 255, 255, alpha);
case 0xC:
return SpoutFixedColor(255, 64, 64, alpha);
case 0xD:
return SpoutFixedColor(255, 64, 255, alpha);
case 0xE:
return SpoutFixedColor(255, 255, 64, alpha);
case 0xF:
return SpoutFixedColor(255, 255, 255, alpha);
default:
return SpoutFixedColor(0, 0, 0, alpha);
}
}
// these still end up returning null on occasion at this point, mucking up the SpoutManager.getPlayer() method private static Color SpoutFixedColor(int r, int g, int b, int a) {
if (viewer.getPlayer() == null || viewed.getPlayer() == null) return new Color(r / 255.0f, g / 255.0f, b / 255.0f, a / 255.0f);
return; }
SpoutPlayer pViewer = SpoutManager.getPlayer(viewer.getPlayer());
SpoutPlayer pViewed = SpoutManager.getPlayer(viewed.getPlayer());
if (pViewed == null || pViewer == null)
return;
String viewedTitle = viewed.getTitle();
Role viewedRole = viewed.getRole();
if ((Conf.spoutFactionTagsOverNames || Conf.spoutFactionTitlesOverNames) && viewer != viewed)
{
if (viewedFaction.isNormal())
{
String addTag = "";
if (Conf.spoutFactionTagsOverNames)
addTag += viewedFaction.getTag(viewed.getColorTo(viewer).toString() + "[") + "]";
String rolePrefix = viewedRole.getPrefix();
if (Conf.spoutFactionTitlesOverNames && (!viewedTitle.isEmpty() || !rolePrefix.isEmpty()))
addTag += (addTag.isEmpty() ? "" : " ") + viewedRole.getPrefix() + viewedTitle;
pViewed.setTitleFor(pViewer, addTag + "\n" + pViewed.getDisplayName());
}
else
{
pViewed.setTitleFor(pViewer, pViewed.getDisplayName());
}
}
if
(
(
Conf.spoutFactionAdminCapes
&&
viewedRole.equals(Role.ADMIN)
)
||
(
Conf.spoutFactionModeratorCapes
&&
viewedRole.equals(Role.MODERATOR)
)
)
{
Relation relation = viewer.getRelationTo(viewed);
String cape = "";
if (!viewedFaction.isNormal())
{
// yeah, no cape if no faction
}
else if (viewedFaction.isPeaceful())
cape = Conf.capePeaceful;
else if (relation.isNeutral())
cape = Conf.capeNeutral;
else if (relation.isMember())
cape = Conf.capeMember;
else if (relation.isEnemy())
cape = Conf.capeEnemy;
else if (relation.isAlly())
cape = Conf.capeAlly;
if (cape.isEmpty())
pViewed.resetCapeFor(pViewer);
else
pViewed.setCapeFor(pViewer, cape);
}
else if (Conf.spoutFactionAdminCapes || Conf.spoutFactionModeratorCapes)
{
pViewed.resetCapeFor(pViewer);
}
}
// method to convert a Bukkit ChatColor to a Spout Color
protected static Color getSpoutColor(ChatColor inColor, int alpha)
{
if (inColor == null)
return SpoutFixedColor(191, 191, 191, alpha);
switch (inColor.getChar())
{
case 0x1: return SpoutFixedColor(0, 0, 191, alpha);
case 0x2: return SpoutFixedColor(0, 191, 0, alpha);
case 0x3: return SpoutFixedColor(0, 191, 191, alpha);
case 0x4: return SpoutFixedColor(191, 0, 0, alpha);
case 0x5: return SpoutFixedColor(191, 0, 191, alpha);
case 0x6: return SpoutFixedColor(191, 191, 0, alpha);
case 0x7: return SpoutFixedColor(191, 191, 191, alpha);
case 0x8: return SpoutFixedColor(64, 64, 64, alpha);
case 0x9: return SpoutFixedColor(64, 64, 255, alpha);
case 0xA: return SpoutFixedColor(64, 255, 64, alpha);
case 0xB: return SpoutFixedColor(64, 255, 255, alpha);
case 0xC: return SpoutFixedColor(255, 64, 64, alpha);
case 0xD: return SpoutFixedColor(255, 64, 255, alpha);
case 0xE: return SpoutFixedColor(255, 255, 64, alpha);
case 0xF: return SpoutFixedColor(255, 255, 255, alpha);
default: return SpoutFixedColor(0, 0, 0, alpha);
}
}
private static Color SpoutFixedColor(int r, int g, int b, int a)
{
return new Color(r/255.0f, g/255.0f, b/255.0f, a/255.0f);
}
} }

View File

@ -1,247 +1,217 @@
package com.massivecraft.factions.integration; package com.massivecraft.factions.integration;
import java.util.HashMap; import com.massivecraft.factions.*;
import java.util.Map;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.getspout.spoutapi.SpoutManager;
import com.massivecraft.factions.Board;
import com.massivecraft.factions.Conf;
import com.massivecraft.factions.FLocation;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.FPlayers;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.P;
import org.getspout.spoutapi.event.spout.SpoutCraftEnableEvent; import org.getspout.spoutapi.event.spout.SpoutCraftEnableEvent;
import org.getspout.spoutapi.gui.GenericLabel; import org.getspout.spoutapi.gui.GenericLabel;
import org.getspout.spoutapi.player.SpoutPlayer; import org.getspout.spoutapi.player.SpoutPlayer;
import org.getspout.spoutapi.SpoutManager;
import java.util.HashMap;
import java.util.Map;
public class SpoutMainListener implements Listener public class SpoutMainListener implements Listener {
{ @EventHandler(priority = EventPriority.NORMAL)
@EventHandler(priority = EventPriority.NORMAL) public void onSpoutCraftEnable(SpoutCraftEnableEvent event) {
public void onSpoutCraftEnable(SpoutCraftEnableEvent event) final FPlayer me = FPlayers.i.get(event.getPlayer());
{
final FPlayer me = FPlayers.i.get(event.getPlayer());
SpoutFeatures.updateAppearances(me.getPlayer()); SpoutFeatures.updateAppearances(me.getPlayer());
updateTerritoryDisplay(me, true); updateTerritoryDisplay(me, true);
} }
//-----------------------------------------------------------------------------------------// //-----------------------------------------------------------------------------------------//
// Everything below this is handled in here to prevent errors on servers not running Spout // Everything below this is handled in here to prevent errors on servers not running Spout
//-----------------------------------------------------------------------------------------// //-----------------------------------------------------------------------------------------//
private transient static Map<String, GenericLabel> territoryLabels = new HashMap<String, GenericLabel>(); private transient static Map<String, GenericLabel> territoryLabels = new HashMap<String, GenericLabel>();
private transient static Map<String, NoticeLabel> territoryChangeLabels = new HashMap<String, NoticeLabel>(); private transient static Map<String, NoticeLabel> territoryChangeLabels = new HashMap<String, NoticeLabel>();
private transient static Map<String, GenericLabel> ownerLabels = new HashMap<String, GenericLabel>(); private transient static Map<String, GenericLabel> ownerLabels = new HashMap<String, GenericLabel>();
private final static int SCREEN_WIDTH = 427; private final static int SCREEN_WIDTH = 427;
// private final static int SCREEN_HEIGHT = 240; // private final static int SCREEN_HEIGHT = 240;
public boolean updateTerritoryDisplay(FPlayer player, boolean notify) public boolean updateTerritoryDisplay(FPlayer player, boolean notify) {
{ Player p = player.getPlayer();
Player p = player.getPlayer(); if (p == null)
if (p == null) return false;
return false;
SpoutPlayer sPlayer = SpoutManager.getPlayer(p); SpoutPlayer sPlayer = SpoutManager.getPlayer(p);
if (!sPlayer.isSpoutCraftEnabled() || (Conf.spoutTerritoryDisplaySize <= 0 && ! Conf.spoutTerritoryNoticeShow)) if (!sPlayer.isSpoutCraftEnabled() || (Conf.spoutTerritoryDisplaySize <= 0 && !Conf.spoutTerritoryNoticeShow))
return false; return false;
doLabels(player, sPlayer, notify); doLabels(player, sPlayer, notify);
return true; return true;
} }
public void updateOwnerList(FPlayer player) public void updateOwnerList(FPlayer player) {
{ SpoutPlayer sPlayer = SpoutManager.getPlayer(player.getPlayer());
SpoutPlayer sPlayer = SpoutManager.getPlayer(player.getPlayer()); if (!sPlayer.isSpoutCraftEnabled() || (Conf.spoutTerritoryDisplaySize <= 0 && !Conf.spoutTerritoryNoticeShow))
if (!sPlayer.isSpoutCraftEnabled() || (Conf.spoutTerritoryDisplaySize <= 0 && ! Conf.spoutTerritoryNoticeShow)) return;
return;
FLocation here = player.getLastStoodAt(); FLocation here = player.getLastStoodAt();
Faction factionHere = Board.getFactionAt(here); Faction factionHere = Board.getFactionAt(here);
doOwnerList(player, sPlayer, here, factionHere); doOwnerList(player, sPlayer, here, factionHere);
return; return;
} }
public void removeTerritoryLabels(String playerName) public void removeTerritoryLabels(String playerName) {
{ territoryLabels.remove(playerName);
territoryLabels.remove(playerName); territoryChangeLabels.remove(playerName);
territoryChangeLabels.remove(playerName); ownerLabels.remove(playerName);
ownerLabels.remove(playerName); }
}
private void doLabels(FPlayer player, SpoutPlayer sPlayer, boolean notify) private void doLabels(FPlayer player, SpoutPlayer sPlayer, boolean notify) {
{ FLocation here = player.getLastStoodAt();
FLocation here = player.getLastStoodAt(); Faction factionHere = Board.getFactionAt(here);
Faction factionHere = Board.getFactionAt(here); String tag = factionHere.getColorTo(player).toString() + factionHere.getTag();
String tag = factionHere.getColorTo(player).toString() + factionHere.getTag();
// ---------------------- // ----------------------
// Main territory display // Main territory display
// ---------------------- // ----------------------
if (Conf.spoutTerritoryDisplayPosition > 0 && Conf.spoutTerritoryDisplaySize > 0) if (Conf.spoutTerritoryDisplayPosition > 0 && Conf.spoutTerritoryDisplaySize > 0) {
{ GenericLabel label;
GenericLabel label; if (territoryLabels.containsKey(player.getName()))
if (territoryLabels.containsKey(player.getName())) label = territoryLabels.get(player.getName());
label = territoryLabels.get(player.getName()); else {
else label = new GenericLabel();
{ label.setWidth(1).setHeight(1); // prevent Spout's questionable new "no default size" warning
label = new GenericLabel(); label.setScale(Conf.spoutTerritoryDisplaySize);
label.setWidth(1).setHeight(1); // prevent Spout's questionable new "no default size" warning
label.setScale(Conf.spoutTerritoryDisplaySize);
sPlayer.getMainScreen().attachWidget(P.p, label); sPlayer.getMainScreen().attachWidget(P.p, label);
territoryLabels.put(player.getName(), label); territoryLabels.put(player.getName(), label);
} }
String msg = tag; String msg = tag;
if (Conf.spoutTerritoryDisplayShowDescription && !factionHere.getDescription().isEmpty()) if (Conf.spoutTerritoryDisplayShowDescription && !factionHere.getDescription().isEmpty())
msg += " - " + factionHere.getDescription(); msg += " - " + factionHere.getDescription();
label.setText(msg); label.setText(msg);
alignLabel(label, msg); alignLabel(label, msg);
label.setDirty(true); label.setDirty(true);
} }
// ----------------------- // -----------------------
// Fading territory notice // Fading territory notice
// ----------------------- // -----------------------
if (notify && Conf.spoutTerritoryNoticeShow && Conf.spoutTerritoryNoticeSize > 0) if (notify && Conf.spoutTerritoryNoticeShow && Conf.spoutTerritoryNoticeSize > 0) {
{ NoticeLabel label;
NoticeLabel label; if (territoryChangeLabels.containsKey(player.getName()))
if (territoryChangeLabels.containsKey(player.getName())) label = territoryChangeLabels.get(player.getName());
label = territoryChangeLabels.get(player.getName()); else {
else label = new NoticeLabel(Conf.spoutTerritoryNoticeLeaveAfterSeconds);
{ label.setWidth(1).setHeight(1); // prevent Spout's questionable new "no default size" warning
label = new NoticeLabel(Conf.spoutTerritoryNoticeLeaveAfterSeconds); label.setScale(Conf.spoutTerritoryNoticeSize);
label.setWidth(1).setHeight(1); // prevent Spout's questionable new "no default size" warning label.setY(Conf.spoutTerritoryNoticeTop);
label.setScale(Conf.spoutTerritoryNoticeSize); sPlayer.getMainScreen().attachWidget(P.p, label);
label.setY(Conf.spoutTerritoryNoticeTop); territoryChangeLabels.put(player.getName(), label);
sPlayer.getMainScreen().attachWidget(P.p, label); }
territoryChangeLabels.put(player.getName(), label);
}
String msg = tag; String msg = tag;
if (Conf.spoutTerritoryNoticeShowDescription && !factionHere.getDescription().isEmpty()) if (Conf.spoutTerritoryNoticeShowDescription && !factionHere.getDescription().isEmpty())
msg += " - " + factionHere.getDescription(); msg += " - " + factionHere.getDescription();
label.setText(msg); label.setText(msg);
alignLabel(label, msg, 2); alignLabel(label, msg, 2);
label.resetNotice(); label.resetNotice();
label.setDirty(true); label.setDirty(true);
} }
// and owner list, of course // and owner list, of course
doOwnerList(player, sPlayer, here, factionHere); doOwnerList(player, sPlayer, here, factionHere);
} }
private void doOwnerList(FPlayer player, SpoutPlayer sPlayer, FLocation here, Faction factionHere)
{
// ----------
// Owner list
// ----------
if (Conf.spoutTerritoryDisplayPosition > 0 && Conf.spoutTerritoryDisplaySize > 0 && Conf.spoutTerritoryOwnersShow && Conf.ownedAreasEnabled)
{
GenericLabel label;
if (ownerLabels.containsKey(player.getName()))
label = ownerLabels.get(player.getName());
else
{
label = new GenericLabel();
label.setWidth(1).setHeight(1); // prevent Spout's questionable new "no default size" warning
label.setScale(Conf.spoutTerritoryDisplaySize);
label.setY((int)(10 * Conf.spoutTerritoryDisplaySize));
sPlayer.getMainScreen().attachWidget(P.p, label);
ownerLabels.put(player.getName(), label);
}
String msg = ""; private void doOwnerList(FPlayer player, SpoutPlayer sPlayer, FLocation here, Faction factionHere) {
// ----------
// Owner list
// ----------
if (Conf.spoutTerritoryDisplayPosition > 0 && Conf.spoutTerritoryDisplaySize > 0 && Conf.spoutTerritoryOwnersShow && Conf.ownedAreasEnabled) {
GenericLabel label;
if (ownerLabels.containsKey(player.getName()))
label = ownerLabels.get(player.getName());
else {
label = new GenericLabel();
label.setWidth(1).setHeight(1); // prevent Spout's questionable new "no default size" warning
label.setScale(Conf.spoutTerritoryDisplaySize);
label.setY((int) (10 * Conf.spoutTerritoryDisplaySize));
sPlayer.getMainScreen().attachWidget(P.p, label);
ownerLabels.put(player.getName(), label);
}
if (player.getFaction() == factionHere) String msg = "";
{
msg = factionHere.getOwnerListString(here);
if (!msg.isEmpty()) if (player.getFaction() == factionHere) {
msg = Conf.ownedLandMessage + msg; msg = factionHere.getOwnerListString(here);
}
label.setText(msg); if (!msg.isEmpty())
alignLabel(label, msg); msg = Conf.ownedLandMessage + msg;
label.setDirty(true); }
}
} label.setText(msg);
alignLabel(label, msg);
label.setDirty(true);
}
}
// this is only necessary because Spout text size scaling is currently bugged and breaks their built-in alignment methods // this is only necessary because Spout text size scaling is currently bugged and breaks their built-in alignment methods
public void alignLabel(GenericLabel label, String text) public void alignLabel(GenericLabel label, String text) {
{ alignLabel(label, text, Conf.spoutTerritoryDisplayPosition);
alignLabel(label, text, Conf.spoutTerritoryDisplayPosition); }
}
public void alignLabel(GenericLabel label, String text, int alignment)
{
int labelWidth = (int)((float)GenericLabel.getStringWidth(text) * Conf.spoutTerritoryDisplaySize);
if (labelWidth > SCREEN_WIDTH)
{
label.setX(0);
return;
}
switch (alignment) public void alignLabel(GenericLabel label, String text, int alignment) {
{ int labelWidth = (int) ((float) GenericLabel.getStringWidth(text) * Conf.spoutTerritoryDisplaySize);
case 1: // left aligned if (labelWidth > SCREEN_WIDTH) {
label.setX(0); label.setX(0);
break; return;
case 2: // center aligned }
label.setX((SCREEN_WIDTH - labelWidth) / 2);
break; switch (alignment) {
default: // right aligned case 1: // left aligned
label.setX(SCREEN_WIDTH - labelWidth); label.setX(0);
} break;
} case 2: // center aligned
label.setX((SCREEN_WIDTH - labelWidth) / 2);
break;
default: // right aligned
label.setX(SCREEN_WIDTH - labelWidth);
}
}
private static class NoticeLabel extends GenericLabel private static class NoticeLabel extends GenericLabel {
{ private int initial;
private int initial; private int countdown; // current delay countdown
private int countdown; // current delay countdown
public NoticeLabel(float secondsOfLife) public NoticeLabel(float secondsOfLife) {
{ initial = (int) (secondsOfLife * 20);
initial = (int)(secondsOfLife * 20); resetNotice();
resetNotice(); }
}
public final void resetNotice() public final void resetNotice() {
{ countdown = initial;
countdown = initial; }
}
@Override @Override
public void onTick() public void onTick() {
{ if (countdown <= 0)
if (countdown <= 0) return;
return;
this.countdown -= 1; this.countdown -= 1;
if (this.countdown <= 0) if (this.countdown <= 0) {
{ this.setText("");
this.setText(""); this.setDirty(true);
this.setDirty(true); }
} }
} }
}
} }

View File

@ -1,152 +1,133 @@
package com.massivecraft.factions.integration; package com.massivecraft.factions.integration;
import com.massivecraft.factions.P; import com.massivecraft.factions.P;
import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.flags.DefaultFlag;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import static com.sk89q.worldguard.bukkit.BukkitUtil.*; import static com.sk89q.worldguard.bukkit.BukkitUtil.*;
import com.sk89q.worldguard.protection.flags.DefaultFlag;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.BlockVector;
import org.bukkit.World;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.plugin.Plugin;
import org.bukkit.entity.Player;
/* /*
* Worldguard Region Checking * Worldguard Region Checking
* Author: Spathizilla * Author: Spathizilla
*/ */
public class Worldguard public class Worldguard {
{ private static WorldGuardPlugin wg;
private static WorldGuardPlugin wg; private static boolean enabled = false;
private static boolean enabled = false;
public static void init(Plugin plugin) public static void init(Plugin plugin) {
{ Plugin wgplug = plugin.getServer().getPluginManager().getPlugin("WorldGuard");
Plugin wgplug = plugin.getServer().getPluginManager().getPlugin("WorldGuard"); if (wgplug == null || !(wgplug instanceof WorldGuardPlugin)) {
if (wgplug == null || !(wgplug instanceof WorldGuardPlugin)) enabled = false;
{ wg = null;
enabled = false; P.p.log("Could not hook to WorldGuard. WorldGuard checks are disabled.");
wg = null; } else {
P.p.log("Could not hook to WorldGuard. WorldGuard checks are disabled."); wg = (WorldGuardPlugin) wgplug;
} enabled = true;
else P.p.log("Successfully hooked to WorldGuard.");
{ }
wg = (WorldGuardPlugin) wgplug; }
enabled = true;
P.p.log("Successfully hooked to WorldGuard.");
}
}
public static boolean isEnabled() public static boolean isEnabled() {
{ return enabled;
return enabled; }
}
// PVP Flag check // PVP Flag check
// Returns: // Returns:
// True: PVP is allowed // True: PVP is allowed
// False: PVP is disallowed // False: PVP is disallowed
public static boolean isPVP(Player player) public static boolean isPVP(Player player) {
{ if (!enabled) {
if( ! enabled) // No WG hooks so we'll always bypass this check.
{ return true;
// No WG hooks so we'll always bypass this check. }
return true;
}
Location loc = player.getLocation(); Location loc = player.getLocation();
World world = loc.getWorld(); World world = loc.getWorld();
Vector pt = toVector(loc); Vector pt = toVector(loc);
RegionManager regionManager = wg.getRegionManager(world); RegionManager regionManager = wg.getRegionManager(world);
ApplicableRegionSet set = regionManager.getApplicableRegions(pt); ApplicableRegionSet set = regionManager.getApplicableRegions(pt);
return set.allows(DefaultFlag.PVP); return set.allows(DefaultFlag.PVP);
} }
// Check if player can build at location by worldguards rules. // Check if player can build at location by worldguards rules.
// Returns: // Returns:
// True: Player can build in the region. // True: Player can build in the region.
// False: Player can not build in the region. // False: Player can not build in the region.
public static boolean playerCanBuild(Player player, Location loc) public static boolean playerCanBuild(Player player, Location loc) {
{ if (!enabled) {
if( ! enabled) // No WG hooks so we'll always bypass this check.
{ return false;
// No WG hooks so we'll always bypass this check. }
return false;
}
World world = loc.getWorld();
Vector pt = toVector(loc);
if (wg.getRegionManager(world).getApplicableRegions(pt).size() > 0)
return wg.canBuild(player, loc);
return false;
}
// Check for Regions in chunk the chunk World world = loc.getWorld();
// Returns: Vector pt = toVector(loc);
// True: Regions found within chunk
// False: No regions found within chunk
public static boolean checkForRegionsInChunk(Location loc)
{
if( ! enabled)
{
// No WG hooks so we'll always bypass this check.
return false;
}
World world = loc.getWorld(); if (wg.getRegionManager(world).getApplicableRegions(pt).size() > 0)
Chunk chunk = world.getChunkAt(loc); return wg.canBuild(player, loc);
int minChunkX = chunk.getX() << 4; return false;
int minChunkZ = chunk.getZ() << 4; }
int maxChunkX = minChunkX + 15;
int maxChunkZ = minChunkZ + 15;
int worldHeight = world.getMaxHeight(); // Allow for heights other than default // Check for Regions in chunk the chunk
// Returns:
// True: Regions found within chunk
// False: No regions found within chunk
public static boolean checkForRegionsInChunk(Location loc) {
if (!enabled) {
// No WG hooks so we'll always bypass this check.
return false;
}
BlockVector minChunk = new BlockVector(minChunkX, 0, minChunkZ); World world = loc.getWorld();
BlockVector maxChunk = new BlockVector(maxChunkX, worldHeight, maxChunkZ); Chunk chunk = world.getChunkAt(loc);
int minChunkX = chunk.getX() << 4;
int minChunkZ = chunk.getZ() << 4;
int maxChunkX = minChunkX + 15;
int maxChunkZ = minChunkZ + 15;
RegionManager regionManager = wg.getRegionManager(world); int worldHeight = world.getMaxHeight(); // Allow for heights other than default
ProtectedCuboidRegion region = new ProtectedCuboidRegion("wgfactionoverlapcheck", minChunk, maxChunk);
Map<String, ProtectedRegion> allregions = regionManager.getRegions();
List<ProtectedRegion> allregionslist = new ArrayList<ProtectedRegion>(allregions.values());
List<ProtectedRegion> overlaps;
boolean foundregions = false;
try BlockVector minChunk = new BlockVector(minChunkX, 0, minChunkZ);
{ BlockVector maxChunk = new BlockVector(maxChunkX, worldHeight, maxChunkZ);
overlaps = region.getIntersectingRegions(allregionslist);
if(overlaps == null || overlaps.isEmpty())
{
foundregions = false;
}
else
{
foundregions = true;
}
}
catch (Exception e)
{
e.printStackTrace();
}
region = null; RegionManager regionManager = wg.getRegionManager(world);
allregionslist = null; ProtectedCuboidRegion region = new ProtectedCuboidRegion("wgfactionoverlapcheck", minChunk, maxChunk);
overlaps = null; Map<String, ProtectedRegion> allregions = regionManager.getRegions();
List<ProtectedRegion> allregionslist = new ArrayList<ProtectedRegion>(allregions.values());
List<ProtectedRegion> overlaps;
boolean foundregions = false;
return foundregions; try {
} overlaps = region.getIntersectingRegions(allregionslist);
if (overlaps == null || overlaps.isEmpty()) {
foundregions = false;
} else {
foundregions = true;
}
} catch (Exception e) {
e.printStackTrace();
}
region = null;
allregionslist = null;
overlaps = null;
return foundregions;
}
} }

View File

@ -1,19 +1,15 @@
package com.massivecraft.factions.integration.capi; package com.massivecraft.factions.integration.capi;
import com.massivecraft.factions.P;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import com.massivecraft.factions.P; public class CapiFeatures {
public static void setup() {
public class CapiFeatures Plugin plug = Bukkit.getServer().getPluginManager().getPlugin("capi");
{ if (plug != null && plug.getClass().getName().equals("com.massivecraft.capi.P")) {
public static void setup() P.p.log("Integration with the CAPI plugin was successful");
{ Bukkit.getPluginManager().registerEvents(new PluginCapiListener(P.p), P.p);
Plugin plug = Bukkit.getServer().getPluginManager().getPlugin("capi"); }
if (plug != null && plug.getClass().getName().equals("com.massivecraft.capi.P")) }
{
P.p.log("Integration with the CAPI plugin was successful");
Bukkit.getPluginManager().registerEvents(new PluginCapiListener(P.p), P.p);
}
}
} }

View File

@ -1,14 +1,5 @@
package com.massivecraft.factions.integration.capi; package com.massivecraft.factions.integration.capi;
import java.util.LinkedHashSet;
import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import com.massivecraft.capi.Channel; import com.massivecraft.capi.Channel;
import com.massivecraft.capi.Channels; import com.massivecraft.capi.Channels;
import com.massivecraft.capi.events.CAPIListChannelsEvent; import com.massivecraft.capi.events.CAPIListChannelsEvent;
@ -20,106 +11,99 @@ import com.massivecraft.factions.FPlayers;
import com.massivecraft.factions.Faction; import com.massivecraft.factions.Faction;
import com.massivecraft.factions.P; import com.massivecraft.factions.P;
import com.massivecraft.factions.struct.Relation; import com.massivecraft.factions.struct.Relation;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
public class PluginCapiListener implements Listener import java.util.LinkedHashSet;
{ import java.util.Set;
P p;
Set<String> myChannelIds = new LinkedHashSet<String>();
public PluginCapiListener(P p)
{
this.p = p;
myChannelIds.add("faction");
myChannelIds.add("allies");
}
private String replacePlayerTags(String format, FPlayer me, FPlayer you)
{
String meFactionTag = me.getChatTag(you);
format = format.replace("{ME_FACTIONTAG}", meFactionTag.length() == 0 ? "" : meFactionTag);
format = format.replace("{ME_FACTIONTAG_PADR}", meFactionTag.length() == 0 ? "" : meFactionTag+" ");
format = format.replace("{ME_FACTIONTAG_PADL}", meFactionTag.length() == 0 ? "" : " "+meFactionTag);
format = format.replace("{ME_FACTIONTAG_PADB}", meFactionTag.length() == 0 ? "" : " "+meFactionTag+" ");
String youFactionTag = you.getChatTag(me); public class PluginCapiListener implements Listener {
format = format.replace("{YOU_FACTIONTAG}", youFactionTag.length() == 0 ? "" : youFactionTag); P p;
format = format.replace("{YOU_FACTIONTAG_PADR}", youFactionTag.length() == 0 ? "" : youFactionTag+" ");
format = format.replace("{YOU_FACTIONTAG_PADL}", youFactionTag.length() == 0 ? "" : " "+youFactionTag);
format = format.replace("{YOU_FACTIONTAG_PADB}", youFactionTag.length() == 0 ? "" : " "+youFactionTag+" ");
return format;
}
@EventHandler(priority = EventPriority.NORMAL)
public void onListChannelsEvent(CAPIListChannelsEvent event)
{
for (Channel c : Channels.i.getAll())
{
if (myChannelIds.contains(c.getId()))
{
event.getChannels().add(c);
}
}
}
@EventHandler(priority = EventPriority.NORMAL)
public void onMessageToChannel(CAPIMessageToChannelEvent event)
{
if (event.isCancelled()) return;
if ( ! myChannelIds.contains(event.getChannel().getId())) return;
Player me = event.getMe();
FPlayer fme = FPlayers.i.get(me);
Faction myFaction = fme.getFaction();
if (event.getChannel().getId().equals("faction") && myFaction.isNormal())
{
event.getThem().addAll(myFaction.getOnlinePlayers());
// Send to any players who are spying chat... could probably be implemented better than this Set<String> myChannelIds = new LinkedHashSet<String>();
for (FPlayer fplayer : FPlayers.i.getOnline())
{ public PluginCapiListener(P p) {
if(fplayer.isSpyingChat() && fplayer.getFaction() != myFaction) this.p = p;
fplayer.sendMessage("[FCspy] "+myFaction.getTag()+": "+event.getMessage());
} myChannelIds.add("faction");
} myChannelIds.add("allies");
else if (event.getChannel().getId().equals("allies")) }
{
for (Player somePlayer : Bukkit.getServer().getOnlinePlayers()) private String replacePlayerTags(String format, FPlayer me, FPlayer you) {
{ String meFactionTag = me.getChatTag(you);
FPlayer someFPlayer = FPlayers.i.get(somePlayer); format = format.replace("{ME_FACTIONTAG}", meFactionTag.length() == 0 ? "" : meFactionTag);
if (someFPlayer.getRelationTo(fme).isAtLeast(Relation.ALLY)) format = format.replace("{ME_FACTIONTAG_PADR}", meFactionTag.length() == 0 ? "" : meFactionTag + " ");
event.getThem().add(somePlayer); format = format.replace("{ME_FACTIONTAG_PADL}", meFactionTag.length() == 0 ? "" : " " + meFactionTag);
// Send to any players who are spying chat format = format.replace("{ME_FACTIONTAG_PADB}", meFactionTag.length() == 0 ? "" : " " + meFactionTag + " ");
else if(someFPlayer.isSpyingChat())
someFPlayer.sendMessage("[ACspy]: " + event.getMessage()); String youFactionTag = you.getChatTag(me);
} format = format.replace("{YOU_FACTIONTAG}", youFactionTag.length() == 0 ? "" : youFactionTag);
} format = format.replace("{YOU_FACTIONTAG_PADR}", youFactionTag.length() == 0 ? "" : youFactionTag + " ");
} format = format.replace("{YOU_FACTIONTAG_PADL}", youFactionTag.length() == 0 ? "" : " " + youFactionTag);
format = format.replace("{YOU_FACTIONTAG_PADB}", youFactionTag.length() == 0 ? "" : " " + youFactionTag + " ");
@EventHandler(priority = EventPriority.NORMAL)
public void onMessageToPlayer(CAPIMessageToPlayerEvent event) return format;
{ }
if (event.isCancelled()) return;
event.setFormat(this.replacePlayerTags(event.getFormat(), FPlayers.i.get(event.getMe()), FPlayers.i.get(event.getYou()))); @EventHandler(priority = EventPriority.NORMAL)
} public void onListChannelsEvent(CAPIListChannelsEvent event) {
for (Channel c : Channels.i.getAll()) {
@EventHandler(priority = EventPriority.NORMAL) if (myChannelIds.contains(c.getId())) {
public void onSelectChannel(CAPISelectChannelEvent event) event.getChannels().add(c);
{ }
if (event.isCancelled()) return; }
String channelId = event.getChannel().getId(); }
if ( ! myChannelIds.contains(channelId)) return;
@EventHandler(priority = EventPriority.NORMAL)
Player me = event.getMe(); public void onMessageToChannel(CAPIMessageToChannelEvent event) {
FPlayer fme = FPlayers.i.get(me); if (event.isCancelled()) return;
if (!myChannelIds.contains(event.getChannel().getId())) return;
if ( ! fme.hasFaction())
{ Player me = event.getMe();
event.setFailMessage(p.txt.parse("<b>You must be member in a faction to use this channel.")); FPlayer fme = FPlayers.i.get(me);
event.setCancelled(true); Faction myFaction = fme.getFaction();
}
} if (event.getChannel().getId().equals("faction") && myFaction.isNormal()) {
event.getThem().addAll(myFaction.getOnlinePlayers());
// Send to any players who are spying chat... could probably be implemented better than this
for (FPlayer fplayer : FPlayers.i.getOnline()) {
if (fplayer.isSpyingChat() && fplayer.getFaction() != myFaction)
fplayer.sendMessage("[FCspy] " + myFaction.getTag() + ": " + event.getMessage());
}
} else if (event.getChannel().getId().equals("allies")) {
for (Player somePlayer : Bukkit.getServer().getOnlinePlayers()) {
FPlayer someFPlayer = FPlayers.i.get(somePlayer);
if (someFPlayer.getRelationTo(fme).isAtLeast(Relation.ALLY))
event.getThem().add(somePlayer);
// Send to any players who are spying chat
else if (someFPlayer.isSpyingChat())
someFPlayer.sendMessage("[ACspy]: " + event.getMessage());
}
}
}
@EventHandler(priority = EventPriority.NORMAL)
public void onMessageToPlayer(CAPIMessageToPlayerEvent event) {
if (event.isCancelled()) return;
event.setFormat(this.replacePlayerTags(event.getFormat(), FPlayers.i.get(event.getMe()), FPlayers.i.get(event.getYou())));
}
@EventHandler(priority = EventPriority.NORMAL)
public void onSelectChannel(CAPISelectChannelEvent event) {
if (event.isCancelled()) return;
String channelId = event.getChannel().getId();
if (!myChannelIds.contains(channelId)) return;
Player me = event.getMe();
FPlayer fme = FPlayers.i.get(me);
if (!fme.hasFaction()) {
event.setFailMessage(p.txt.parse("<b>You must be member in a faction to use this channel."));
event.setCancelled(true);
}
}
} }

View File

@ -1,5 +1,9 @@
package com.massivecraft.factions.listeners; package com.massivecraft.factions.listeners;
import com.massivecraft.factions.*;
import com.massivecraft.factions.integration.Worldguard;
import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.struct.Relation;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
@ -7,253 +11,208 @@ import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.*;
import org.bukkit.event.block.BlockDamageEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.block.BlockPistonExtendEvent;
import org.bukkit.event.block.BlockPistonRetractEvent;
import com.massivecraft.factions.Board;
import com.massivecraft.factions.Conf;
import com.massivecraft.factions.FLocation;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.FPlayers;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.P;
import com.massivecraft.factions.integration.Worldguard;
import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.struct.Relation;
public class FactionsBlockListener implements Listener public class FactionsBlockListener implements Listener {
{ public P p;
public P p;
public FactionsBlockListener(P p)
{
this.p = p;
}
@EventHandler(priority = EventPriority.NORMAL)
public void onBlockPlace(BlockPlaceEvent event)
{
if (event.isCancelled()) return;
if ( ! event.canBuild()) return;
// special case for flint&steel, which should only be prevented by DenyUsage list
if (event.getBlockPlaced().getType() == Material.FIRE)
{
return;
}
if ( ! playerCanBuildDestroyBlock(event.getPlayer(), event.getBlock().getLocation(), "build", false)) public FactionsBlockListener(P p) {
event.setCancelled(true); this.p = p;
} }
@EventHandler(priority = EventPriority.NORMAL) @EventHandler(priority = EventPriority.NORMAL)
public void onBlockBreak(BlockBreakEvent event) public void onBlockPlace(BlockPlaceEvent event) {
{ if (event.isCancelled()) return;
if (event.isCancelled()) return; if (!event.canBuild()) return;
if ( ! playerCanBuildDestroyBlock(event.getPlayer(), event.getBlock().getLocation(), "destroy", false)) // special case for flint&steel, which should only be prevented by DenyUsage list
{ if (event.getBlockPlaced().getType() == Material.FIRE) {
event.setCancelled(true); return;
} }
}
@EventHandler(priority = EventPriority.NORMAL) if (!playerCanBuildDestroyBlock(event.getPlayer(), event.getBlock().getLocation(), "build", false))
public void onBlockDamage(BlockDamageEvent event) event.setCancelled(true);
{ }
if (event.isCancelled()) return;
if (event.getInstaBreak() && ! playerCanBuildDestroyBlock(event.getPlayer(), event.getBlock().getLocation(), "destroy", false)) @EventHandler(priority = EventPriority.NORMAL)
{ public void onBlockBreak(BlockBreakEvent event) {
event.setCancelled(true); if (event.isCancelled()) return;
}
}
@EventHandler(priority = EventPriority.NORMAL) if (!playerCanBuildDestroyBlock(event.getPlayer(), event.getBlock().getLocation(), "destroy", false)) {
public void onBlockPistonExtend(BlockPistonExtendEvent event) event.setCancelled(true);
{ }
if (event.isCancelled()) return; }
if ( ! Conf.pistonProtectionThroughDenyBuild) return;
Faction pistonFaction = Board.getFactionAt(new FLocation(event.getBlock())); @EventHandler(priority = EventPriority.NORMAL)
public void onBlockDamage(BlockDamageEvent event) {
if (event.isCancelled()) return;
// target end-of-the-line empty (air) block which is being pushed into, including if piston itself would extend into air if (event.getInstaBreak() && !playerCanBuildDestroyBlock(event.getPlayer(), event.getBlock().getLocation(), "destroy", false)) {
Block targetBlock = event.getBlock().getRelative(event.getDirection(), event.getLength() + 1); event.setCancelled(true);
}
}
// if potentially pushing into air/water/lava in another territory, we need to check it out @EventHandler(priority = EventPriority.NORMAL)
if ((targetBlock.isEmpty() || targetBlock.isLiquid()) && !canPistonMoveBlock(pistonFaction, targetBlock.getLocation())) public void onBlockPistonExtend(BlockPistonExtendEvent event) {
{ if (event.isCancelled()) return;
event.setCancelled(true); if (!Conf.pistonProtectionThroughDenyBuild) return;
return;
} Faction pistonFaction = Board.getFactionAt(new FLocation(event.getBlock()));
// target end-of-the-line empty (air) block which is being pushed into, including if piston itself would extend into air
Block targetBlock = event.getBlock().getRelative(event.getDirection(), event.getLength() + 1);
// if potentially pushing into air/water/lava in another territory, we need to check it out
if ((targetBlock.isEmpty() || targetBlock.isLiquid()) && !canPistonMoveBlock(pistonFaction, targetBlock.getLocation())) {
event.setCancelled(true);
return;
}
/* /*
* note that I originally was testing the territory of each affected block, but since I found that pistons can only push * note that I originally was testing the territory of each affected block, but since I found that pistons can only push
* up to 12 blocks and the width of any territory is 16 blocks, it should be safe (and much more lightweight) to test * up to 12 blocks and the width of any territory is 16 blocks, it should be safe (and much more lightweight) to test
* only the final target block as done above * only the final target block as done above
*/ */
} }
@EventHandler(priority = EventPriority.NORMAL) @EventHandler(priority = EventPriority.NORMAL)
public void onBlockPistonRetract(BlockPistonRetractEvent event) public void onBlockPistonRetract(BlockPistonRetractEvent event) {
{ // if not a sticky piston, retraction should be fine
// if not a sticky piston, retraction should be fine if (event.isCancelled() || !event.isSticky() || !Conf.pistonProtectionThroughDenyBuild) {
if (event.isCancelled() || !event.isSticky() || !Conf.pistonProtectionThroughDenyBuild) return;
{ }
return;
}
Location targetLoc = event.getRetractLocation(); Location targetLoc = event.getRetractLocation();
// if potentially retracted block is just air/water/lava, no worries // if potentially retracted block is just air/water/lava, no worries
if (targetLoc.getBlock().isEmpty() || targetLoc.getBlock().isLiquid()) if (targetLoc.getBlock().isEmpty() || targetLoc.getBlock().isLiquid()) {
{ return;
return; }
}
Faction pistonFaction = Board.getFactionAt(new FLocation(event.getBlock())); Faction pistonFaction = Board.getFactionAt(new FLocation(event.getBlock()));
if (!canPistonMoveBlock(pistonFaction, targetLoc)) if (!canPistonMoveBlock(pistonFaction, targetLoc)) {
{ event.setCancelled(true);
event.setCancelled(true); return;
return; }
} }
}
private boolean canPistonMoveBlock(Faction pistonFaction, Location target) private boolean canPistonMoveBlock(Faction pistonFaction, Location target) {
{
Faction otherFaction = Board.getFactionAt(new FLocation(target)); Faction otherFaction = Board.getFactionAt(new FLocation(target));
if (pistonFaction == otherFaction) if (pistonFaction == otherFaction)
return true; return true;
if (otherFaction.isNone()) if (otherFaction.isNone()) {
{ if (!Conf.wildernessDenyBuild || Conf.worldsNoWildernessProtection.contains(target.getWorld().getName()))
if (!Conf.wildernessDenyBuild || Conf.worldsNoWildernessProtection.contains(target.getWorld().getName())) return true;
return true;
return false; return false;
} } else if (otherFaction.isSafeZone()) {
else if (otherFaction.isSafeZone()) if (!Conf.safeZoneDenyBuild)
{ return true;
if ( ! Conf.safeZoneDenyBuild)
return true;
return false; return false;
} } else if (otherFaction.isWarZone()) {
else if (otherFaction.isWarZone()) if (!Conf.warZoneDenyBuild)
{ return true;
if ( ! Conf.warZoneDenyBuild)
return true;
return false; return false;
} }
Relation rel = pistonFaction.getRelationTo(otherFaction); Relation rel = pistonFaction.getRelationTo(otherFaction);
if (rel.confDenyBuild(otherFaction.hasPlayersOnline())) if (rel.confDenyBuild(otherFaction.hasPlayersOnline()))
return false; return false;
return true; return true;
} }
public static boolean playerCanBuildDestroyBlock(Player player, Location location, String action, boolean justCheck) public static boolean playerCanBuildDestroyBlock(Player player, Location location, String action, boolean justCheck) {
{ String name = player.getName();
String name = player.getName(); if (Conf.playersWhoBypassAllProtection.contains(name)) return true;
if (Conf.playersWhoBypassAllProtection.contains(name)) return true;
FPlayer me = FPlayers.i.get(name); FPlayer me = FPlayers.i.get(name);
if (me.isAdminBypassing()) return true; if (me.isAdminBypassing()) return true;
FLocation loc = new FLocation(location); FLocation loc = new FLocation(location);
Faction otherFaction = Board.getFactionAt(loc); Faction otherFaction = Board.getFactionAt(loc);
if (otherFaction.isNone()) if (otherFaction.isNone()) {
{ if (Conf.worldGuardBuildPriority && Worldguard.playerCanBuild(player, location))
if (Conf.worldGuardBuildPriority && Worldguard.playerCanBuild(player, location)) return true;
return true;
if (!Conf.wildernessDenyBuild || Conf.worldsNoWildernessProtection.contains(location.getWorld().getName())) if (!Conf.wildernessDenyBuild || Conf.worldsNoWildernessProtection.contains(location.getWorld().getName()))
return true; // This is not faction territory. Use whatever you like here. return true; // This is not faction territory. Use whatever you like here.
if (!justCheck) if (!justCheck)
me.msg("<b>You can't "+action+" in the wilderness."); me.msg("<b>You can't " + action + " in the wilderness.");
return false; return false;
} } else if (otherFaction.isSafeZone()) {
else if (otherFaction.isSafeZone()) if (Conf.worldGuardBuildPriority && Worldguard.playerCanBuild(player, location))
{ return true;
if (Conf.worldGuardBuildPriority && Worldguard.playerCanBuild(player, location))
return true;
if (!Conf.safeZoneDenyBuild || Permission.MANAGE_SAFE_ZONE.has(player)) if (!Conf.safeZoneDenyBuild || Permission.MANAGE_SAFE_ZONE.has(player))
return true; return true;
if (!justCheck) if (!justCheck)
me.msg("<b>You can't "+action+" in a safe zone."); me.msg("<b>You can't " + action + " in a safe zone.");
return false; return false;
} } else if (otherFaction.isWarZone()) {
else if (otherFaction.isWarZone()) if (Conf.worldGuardBuildPriority && Worldguard.playerCanBuild(player, location))
{ return true;
if (Conf.worldGuardBuildPriority && Worldguard.playerCanBuild(player, location))
return true;
if (!Conf.warZoneDenyBuild || Permission.MANAGE_WAR_ZONE.has(player)) if (!Conf.warZoneDenyBuild || Permission.MANAGE_WAR_ZONE.has(player))
return true; return true;
if (!justCheck) if (!justCheck)
me.msg("<b>You can't "+action+" in a war zone."); me.msg("<b>You can't " + action + " in a war zone.");
return false; return false;
} }
Faction myFaction = me.getFaction(); Faction myFaction = me.getFaction();
Relation rel = myFaction.getRelationTo(otherFaction); Relation rel = myFaction.getRelationTo(otherFaction);
boolean online = otherFaction.hasPlayersOnline(); boolean online = otherFaction.hasPlayersOnline();
boolean pain = !justCheck && rel.confPainBuild(online); boolean pain = !justCheck && rel.confPainBuild(online);
boolean deny = rel.confDenyBuild(online); boolean deny = rel.confDenyBuild(online);
// hurt the player for building/destroying in other territory? // hurt the player for building/destroying in other territory?
if (pain) if (pain) {
{ player.damage(Conf.actionDeniedPainAmount);
player.damage(Conf.actionDeniedPainAmount);
if (!deny) if (!deny)
me.msg("<b>It is painful to try to "+action+" in the territory of "+otherFaction.getTag(myFaction)); me.msg("<b>It is painful to try to " + action + " in the territory of " + otherFaction.getTag(myFaction));
} }
// cancel building/destroying in other territory? // cancel building/destroying in other territory?
if (deny) if (deny) {
{ if (!justCheck)
if (!justCheck) me.msg("<b>You can't " + action + " in the territory of " + otherFaction.getTag(myFaction));
me.msg("<b>You can't "+action+" in the territory of "+otherFaction.getTag(myFaction));
return false; return false;
} }
// Also cancel and/or cause pain if player doesn't have ownership rights for this claim // Also cancel and/or cause pain if player doesn't have ownership rights for this claim
if (Conf.ownedAreasEnabled && (Conf.ownedAreaDenyBuild || Conf.ownedAreaPainBuild) && !otherFaction.playerHasOwnershipRights(me, loc)) if (Conf.ownedAreasEnabled && (Conf.ownedAreaDenyBuild || Conf.ownedAreaPainBuild) && !otherFaction.playerHasOwnershipRights(me, loc)) {
{ if (!pain && Conf.ownedAreaPainBuild && !justCheck) {
if (!pain && Conf.ownedAreaPainBuild && !justCheck) player.damage(Conf.actionDeniedPainAmount);
{
player.damage(Conf.actionDeniedPainAmount);
if (!Conf.ownedAreaDenyBuild) if (!Conf.ownedAreaDenyBuild)
me.msg("<b>It is painful to try to "+action+" in this territory, it is owned by: "+otherFaction.getOwnerListString(loc)); me.msg("<b>It is painful to try to " + action + " in this territory, it is owned by: " + otherFaction.getOwnerListString(loc));
} }
if (Conf.ownedAreaDenyBuild) if (Conf.ownedAreaDenyBuild) {
{ if (!justCheck)
if (!justCheck) me.msg("<b>You can't " + action + " in this territory, it is owned by: " + otherFaction.getOwnerListString(loc));
me.msg("<b>You can't "+action+" in this territory, it is owned by: "+otherFaction.getOwnerListString(loc));
return false; return false;
} }
} }
return true; return true;
} }
} }

View File

@ -1,8 +1,8 @@
package com.massivecraft.factions.listeners; package com.massivecraft.factions.listeners;
import java.util.logging.Level; import com.massivecraft.factions.*;
import java.util.UnknownFormatConversionException; import com.massivecraft.factions.struct.ChatMode;
import com.massivecraft.factions.struct.Relation;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -11,175 +11,146 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerChatEvent; import org.bukkit.event.player.PlayerChatEvent;
import com.massivecraft.factions.Conf; import java.util.UnknownFormatConversionException;
import com.massivecraft.factions.FPlayer; import java.util.logging.Level;
import com.massivecraft.factions.FPlayers;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.P;
import com.massivecraft.factions.struct.ChatMode;
import com.massivecraft.factions.struct.Relation;
public class FactionsChatListener implements Listener public class FactionsChatListener implements Listener {
{ public P p;
public P p;
public FactionsChatListener(P p)
{
this.p = p;
}
// this is for handling slashless command usage and faction/alliance chat, set at lowest priority so Factions gets to them first
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerEarlyChat(PlayerChatEvent event)
{
if (event.isCancelled()) return;
Player talkingPlayer = event.getPlayer();
String msg = event.getMessage();
FPlayer me = FPlayers.i.get(talkingPlayer);
ChatMode chat = me.getChatMode();
// slashless factions commands need to be handled here if the user isn't in public chat mode public FactionsChatListener(P p) {
if (chat != ChatMode.PUBLIC && p.handleCommand(talkingPlayer, msg, false, true)) this.p = p;
{ }
if (Conf.logPlayerCommands)
Bukkit.getLogger().log(Level.INFO, "[PLAYER_COMMAND] "+talkingPlayer.getName()+": "+msg);
event.setCancelled(true);
return;
}
// Is it a faction chat message? // this is for handling slashless command usage and faction/alliance chat, set at lowest priority so Factions gets to them first
if (chat == ChatMode.FACTION) @EventHandler(priority = EventPriority.LOWEST)
{ public void onPlayerEarlyChat(PlayerChatEvent event) {
Faction myFaction = me.getFaction(); if (event.isCancelled()) return;
String message = String.format(Conf.factionChatFormat, me.describeTo(myFaction), msg);
myFaction.sendMessage(message);
Bukkit.getLogger().log(Level.INFO, ChatColor.stripColor("FactionChat "+myFaction.getTag()+": "+message));
//Send to any players who are spying chat Player talkingPlayer = event.getPlayer();
for (FPlayer fplayer : FPlayers.i.getOnline()) String msg = event.getMessage();
{ FPlayer me = FPlayers.i.get(talkingPlayer);
if(fplayer.isSpyingChat() && fplayer.getFaction() != myFaction) ChatMode chat = me.getChatMode();
fplayer.sendMessage("[FCspy] "+myFaction.getTag()+": "+message);
}
event.setCancelled(true); // slashless factions commands need to be handled here if the user isn't in public chat mode
return; if (chat != ChatMode.PUBLIC && p.handleCommand(talkingPlayer, msg, false, true)) {
} if (Conf.logPlayerCommands)
else if (chat == ChatMode.ALLIANCE) Bukkit.getLogger().log(Level.INFO, "[PLAYER_COMMAND] " + talkingPlayer.getName() + ": " + msg);
{ event.setCancelled(true);
Faction myFaction = me.getFaction(); return;
}
String message = String.format(Conf.allianceChatFormat, ChatColor.stripColor(me.getNameAndTag()), msg);
//Send message to our own faction
myFaction.sendMessage(message);
//Send to all our allies // Is it a faction chat message?
for (FPlayer fplayer : FPlayers.i.getOnline()) if (chat == ChatMode.FACTION) {
{ Faction myFaction = me.getFaction();
if(myFaction.getRelationTo(fplayer) == Relation.ALLY)
fplayer.sendMessage(message);
//Send to any players who are spying chat String message = String.format(Conf.factionChatFormat, me.describeTo(myFaction), msg);
else if(fplayer.isSpyingChat()) myFaction.sendMessage(message);
fplayer.sendMessage("[ACspy]: " + message);
}
Bukkit.getLogger().log(Level.INFO, ChatColor.stripColor("AllianceChat: "+message));
event.setCancelled(true);
return;
}
}
// this is for handling insertion of the player's faction tag, set at highest priority to give other plugins a chance to modify chat first Bukkit.getLogger().log(Level.INFO, ChatColor.stripColor("FactionChat " + myFaction.getTag() + ": " + message));
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerChat(PlayerChatEvent event)
{
if (event.isCancelled()) return;
// Are we to insert the Faction tag into the format? //Send to any players who are spying chat
// If we are not to insert it - we are done. for (FPlayer fplayer : FPlayers.i.getOnline()) {
if ( ! Conf.chatTagEnabled || Conf.chatTagHandledByAnotherPlugin) return; if (fplayer.isSpyingChat() && fplayer.getFaction() != myFaction)
fplayer.sendMessage("[FCspy] " + myFaction.getTag() + ": " + message);
}
Player talkingPlayer = event.getPlayer(); event.setCancelled(true);
String msg = event.getMessage(); return;
String eventFormat = event.getFormat(); } else if (chat == ChatMode.ALLIANCE) {
FPlayer me = FPlayers.i.get(talkingPlayer); Faction myFaction = me.getFaction();
int InsertIndex = 0;
String message = String.format(Conf.allianceChatFormat, ChatColor.stripColor(me.getNameAndTag()), msg);
if (!Conf.chatTagReplaceString.isEmpty() && eventFormat.contains(Conf.chatTagReplaceString))
{ //Send message to our own faction
// we're using the "replace" method of inserting the faction tags myFaction.sendMessage(message);
// if they stuck "[FACTION_TITLE]" in there, go ahead and do it too
if (eventFormat.contains("[FACTION_TITLE]")) //Send to all our allies
{ for (FPlayer fplayer : FPlayers.i.getOnline()) {
eventFormat = eventFormat.replace("[FACTION_TITLE]", me.getTitle()); if (myFaction.getRelationTo(fplayer) == Relation.ALLY)
} fplayer.sendMessage(message);
InsertIndex = eventFormat.indexOf(Conf.chatTagReplaceString);
eventFormat = eventFormat.replace(Conf.chatTagReplaceString, ""); //Send to any players who are spying chat
Conf.chatTagPadAfter = false; else if (fplayer.isSpyingChat())
Conf.chatTagPadBefore = false; fplayer.sendMessage("[ACspy]: " + message);
} }
else if (!Conf.chatTagInsertAfterString.isEmpty() && eventFormat.contains(Conf.chatTagInsertAfterString))
{ Bukkit.getLogger().log(Level.INFO, ChatColor.stripColor("AllianceChat: " + message));
// we're using the "insert after string" method
InsertIndex = eventFormat.indexOf(Conf.chatTagInsertAfterString) + Conf.chatTagInsertAfterString.length(); event.setCancelled(true);
} return;
else if (!Conf.chatTagInsertBeforeString.isEmpty() && eventFormat.contains(Conf.chatTagInsertBeforeString)) }
{ }
// we're using the "insert before string" method
InsertIndex = eventFormat.indexOf(Conf.chatTagInsertBeforeString); // this is for handling insertion of the player's faction tag, set at highest priority to give other plugins a chance to modify chat first
} @EventHandler(priority = EventPriority.HIGHEST)
else public void onPlayerChat(PlayerChatEvent event) {
{ if (event.isCancelled()) return;
// we'll fall back to using the index place method
InsertIndex = Conf.chatTagInsertIndex; // Are we to insert the Faction tag into the format?
if (InsertIndex > eventFormat.length()) // If we are not to insert it - we are done.
return; if (!Conf.chatTagEnabled || Conf.chatTagHandledByAnotherPlugin) return;
}
Player talkingPlayer = event.getPlayer();
String formatStart = eventFormat.substring(0, InsertIndex) + ((Conf.chatTagPadBefore && !me.getChatTag().isEmpty()) ? " " : ""); String msg = event.getMessage();
String formatEnd = ((Conf.chatTagPadAfter && !me.getChatTag().isEmpty()) ? " " : "") + eventFormat.substring(InsertIndex); String eventFormat = event.getFormat();
FPlayer me = FPlayers.i.get(talkingPlayer);
String nonColoredMsgFormat = formatStart + me.getChatTag().trim() + formatEnd; int InsertIndex = 0;
// Relation Colored? if (!Conf.chatTagReplaceString.isEmpty() && eventFormat.contains(Conf.chatTagReplaceString)) {
if (Conf.chatTagRelationColored) // we're using the "replace" method of inserting the faction tags
{ // if they stuck "[FACTION_TITLE]" in there, go ahead and do it too
// We must choke the standard message and send out individual messages to all players if (eventFormat.contains("[FACTION_TITLE]")) {
// Why? Because the relations will differ. eventFormat = eventFormat.replace("[FACTION_TITLE]", me.getTitle());
event.setCancelled(true); }
InsertIndex = eventFormat.indexOf(Conf.chatTagReplaceString);
for (Player listeningPlayer : event.getRecipients()) eventFormat = eventFormat.replace(Conf.chatTagReplaceString, "");
{ Conf.chatTagPadAfter = false;
FPlayer you = FPlayers.i.get(listeningPlayer); Conf.chatTagPadBefore = false;
String yourFormat = formatStart + me.getChatTag(you).trim() + formatEnd; } else if (!Conf.chatTagInsertAfterString.isEmpty() && eventFormat.contains(Conf.chatTagInsertAfterString)) {
try // we're using the "insert after string" method
{ InsertIndex = eventFormat.indexOf(Conf.chatTagInsertAfterString) + Conf.chatTagInsertAfterString.length();
listeningPlayer.sendMessage(String.format(yourFormat, talkingPlayer.getDisplayName(), msg)); } else if (!Conf.chatTagInsertBeforeString.isEmpty() && eventFormat.contains(Conf.chatTagInsertBeforeString)) {
} // we're using the "insert before string" method
catch (UnknownFormatConversionException ex) InsertIndex = eventFormat.indexOf(Conf.chatTagInsertBeforeString);
{ } else {
Conf.chatTagInsertIndex = 0; // we'll fall back to using the index place method
P.p.log(Level.SEVERE, "Critical error in chat message formatting!"); InsertIndex = Conf.chatTagInsertIndex;
P.p.log(Level.SEVERE, "NOTE: This has been automatically fixed right now by setting chatTagInsertIndex to 0."); if (InsertIndex > eventFormat.length())
P.p.log(Level.SEVERE, "For a more proper fix, please read this regarding chat configuration: http://massivecraft.com/plugins/factions/config#Chat_configuration"); return;
return; }
}
} String formatStart = eventFormat.substring(0, InsertIndex) + ((Conf.chatTagPadBefore && !me.getChatTag().isEmpty()) ? " " : "");
String formatEnd = ((Conf.chatTagPadAfter && !me.getChatTag().isEmpty()) ? " " : "") + eventFormat.substring(InsertIndex);
// Write to the log... We will write the non colored message.
String nonColoredMsg = ChatColor.stripColor(String.format(nonColoredMsgFormat, talkingPlayer.getDisplayName(), msg)); String nonColoredMsgFormat = formatStart + me.getChatTag().trim() + formatEnd;
Bukkit.getLogger().log(Level.INFO, nonColoredMsg);
} // Relation Colored?
else if (Conf.chatTagRelationColored) {
{ // We must choke the standard message and send out individual messages to all players
// No relation color. // Why? Because the relations will differ.
event.setFormat(nonColoredMsgFormat); event.setCancelled(true);
}
} for (Player listeningPlayer : event.getRecipients()) {
FPlayer you = FPlayers.i.get(listeningPlayer);
String yourFormat = formatStart + me.getChatTag(you).trim() + formatEnd;
try {
listeningPlayer.sendMessage(String.format(yourFormat, talkingPlayer.getDisplayName(), msg));
} catch (UnknownFormatConversionException ex) {
Conf.chatTagInsertIndex = 0;
P.p.log(Level.SEVERE, "Critical error in chat message formatting!");
P.p.log(Level.SEVERE, "NOTE: This has been automatically fixed right now by setting chatTagInsertIndex to 0.");
P.p.log(Level.SEVERE, "For a more proper fix, please read this regarding chat configuration: http://massivecraft.com/plugins/factions/config#Chat_configuration");
return;
}
}
// Write to the log... We will write the non colored message.
String nonColoredMsg = ChatColor.stripColor(String.format(nonColoredMsgFormat, talkingPlayer.getDisplayName(), msg));
Bukkit.getLogger().log(Level.INFO, nonColoredMsg);
} else {
// No relation color.
event.setFormat(nonColoredMsgFormat);
}
}
} }

View File

@ -1,69 +1,63 @@
package com.massivecraft.factions.listeners; package com.massivecraft.factions.listeners;
import org.bukkit.block.Block; import com.massivecraft.factions.Conf;
import org.bukkit.event.block.BlockFromToEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block;
import com.massivecraft.factions.Conf; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockFromToEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
public class FactionsExploitListener implements Listener public class FactionsExploitListener implements Listener {
{ @EventHandler(priority = EventPriority.NORMAL)
@EventHandler(priority = EventPriority.NORMAL) public void obsidianGenerator(BlockFromToEvent event) {
public void obsidianGenerator(BlockFromToEvent event) if (event.isCancelled() == true || !Conf.handleExploitObsidianGenerators) return;
{
if (event.isCancelled() == true || ! Conf.handleExploitObsidianGenerators) return;
// thanks to ObGenBlocker and WorldGuard for this method // thanks to ObGenBlocker and WorldGuard for this method
Block block = event.getToBlock(); Block block = event.getToBlock();
int source = event.getBlock().getTypeId(); int source = event.getBlock().getTypeId();
int target = block.getTypeId(); int target = block.getTypeId();
if ((target == 55 || target == 132) && (source == 0 || source == 10 || source == 11)) if ((target == 55 || target == 132) && (source == 0 || source == 10 || source == 11))
block.setTypeId(0); block.setTypeId(0);
} }
@EventHandler(priority = EventPriority.NORMAL) @EventHandler(priority = EventPriority.NORMAL)
public void enderPearlTeleport(PlayerTeleportEvent event) public void enderPearlTeleport(PlayerTeleportEvent event) {
{ if (event.isCancelled() == true || !Conf.handleExploitEnderPearlClipping) return;
if (event.isCancelled() == true || ! Conf.handleExploitEnderPearlClipping) return; if (event.getCause() != PlayerTeleportEvent.TeleportCause.ENDER_PEARL) return;
if (event.getCause() != PlayerTeleportEvent.TeleportCause.ENDER_PEARL) return;
// this exploit works when the target location is within 0.31 blocks or so of a door or glass block or similar... // this exploit works when the target location is within 0.31 blocks or so of a door or glass block or similar...
Location target = event.getTo(); Location target = event.getTo();
Location from = event.getFrom(); Location from = event.getFrom();
// blocks who occupy less than 1 block width or length wise need to be handled differently // blocks who occupy less than 1 block width or length wise need to be handled differently
Material mat = event.getTo().getBlock().getType(); Material mat = event.getTo().getBlock().getType();
if ( if (
((mat == Material.THIN_GLASS || mat == Material.IRON_FENCE) && clippingThrough(target, from, 0.65)) ((mat == Material.THIN_GLASS || mat == Material.IRON_FENCE) && clippingThrough(target, from, 0.65))
|| ((mat == Material.FENCE || mat == Material.NETHER_FENCE) && clippingThrough(target, from, 0.45)) || ((mat == Material.FENCE || mat == Material.NETHER_FENCE) && clippingThrough(target, from, 0.45))
) ) {
{ event.setTo(from);
event.setTo(from); return;
return; }
}
// simple fix otherwise: ender pearl target locations are standardized to be in the center (X/Z) of the target block, not at the edges // simple fix otherwise: ender pearl target locations are standardized to be in the center (X/Z) of the target block, not at the edges
target.setX(target.getBlockX() + 0.5); target.setX(target.getBlockX() + 0.5);
target.setZ(target.getBlockZ() + 0.5); target.setZ(target.getBlockZ() + 0.5);
event.setTo(target); event.setTo(target);
}
public static boolean clippingThrough(Location target, Location from, double thickness) }
{
return public static boolean clippingThrough(Location target, Location from, double thickness) {
( return
(from.getX() > target.getX() && (from.getX() - target.getX() < thickness)) (
|| (target.getX() > from.getX() && (target.getX() - from.getX() < thickness)) (from.getX() > target.getX() && (from.getX() - target.getX() < thickness))
|| (from.getZ() > target.getZ() && (from.getZ() - target.getZ() < thickness)) || (target.getX() > from.getX() && (target.getX() - from.getX() < thickness))
|| (target.getZ() > from.getZ() && (target.getZ() - from.getZ() < thickness)) || (from.getZ() > target.getZ() && (from.getZ() - target.getZ() < thickness))
); || (target.getZ() > from.getZ() && (target.getZ() - from.getZ() < thickness))
} );
}
} }

View File

@ -1,42 +1,36 @@
package com.massivecraft.factions.listeners; package com.massivecraft.factions.listeners;
import org.bukkit.plugin.Plugin; import com.massivecraft.factions.P;
import com.massivecraft.factions.integration.SpoutFeatures;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.server.PluginDisableEvent; import org.bukkit.event.server.PluginDisableEvent;
import org.bukkit.event.server.PluginEnableEvent; import org.bukkit.event.server.PluginEnableEvent;
import org.bukkit.plugin.Plugin;
import com.massivecraft.factions.P;
import com.massivecraft.factions.integration.SpoutFeatures;
public class FactionsServerListener implements Listener public class FactionsServerListener implements Listener {
{ public P p;
public P p;
public FactionsServerListener(P p)
{
this.p = p;
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPluginDisable(PluginDisableEvent event)
{
String name = event.getPlugin().getDescription().getName();
if (name.equals("Spout"))
{
SpoutFeatures.setAvailable(false, "");
}
}
@EventHandler(priority = EventPriority.MONITOR) public FactionsServerListener(P p) {
public void onPluginEnable(PluginEnableEvent event) this.p = p;
{ }
Plugin plug = event.getPlugin();
String name = plug.getDescription().getName(); @EventHandler(priority = EventPriority.MONITOR)
if (name.equals("Spout")) public void onPluginDisable(PluginDisableEvent event) {
{ String name = event.getPlugin().getDescription().getName();
SpoutFeatures.setAvailable(true, plug.getDescription().getFullName()); if (name.equals("Spout")) {
} SpoutFeatures.setAvailable(false, "");
} }
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPluginEnable(PluginEnableEvent event) {
Plugin plug = event.getPlugin();
String name = plug.getDescription().getName();
if (name.equals("Spout")) {
SpoutFeatures.setAvailable(true, plug.getDescription().getFullName());
}
}
} }

View File

@ -1,40 +1,34 @@
package com.massivecraft.factions.struct; package com.massivecraft.factions.struct;
public enum ChatMode public enum ChatMode {
{ FACTION(2, "faction chat"),
FACTION(2, "faction chat"), ALLIANCE(1, "alliance chat"),
ALLIANCE(1, "alliance chat"), PUBLIC(0, "public chat");
PUBLIC(0, "public chat");
public final int value;
public final String nicename;
private ChatMode(final int value, final String nicename)
{
this.value = value;
this.nicename = nicename;
}
public boolean isAtLeast(ChatMode role)
{
return this.value >= role.value;
}
public boolean isAtMost(ChatMode role)
{
return this.value <= role.value;
}
@Override public final int value;
public String toString() public final String nicename;
{
return this.nicename; private ChatMode(final int value, final String nicename) {
} this.value = value;
this.nicename = nicename;
public ChatMode getNext() }
{
if (this == PUBLIC) return ALLIANCE; public boolean isAtLeast(ChatMode role) {
if (this == ALLIANCE)return FACTION; return this.value >= role.value;
return PUBLIC; }
}
public boolean isAtMost(ChatMode role) {
return this.value <= role.value;
}
@Override
public String toString() {
return this.nicename;
}
public ChatMode getNext() {
if (this == PUBLIC) return ALLIANCE;
if (this == ALLIANCE) return FACTION;
return PUBLIC;
}
} }

View File

@ -1,87 +1,81 @@
package com.massivecraft.factions.struct; package com.massivecraft.factions.struct;
import com.massivecraft.factions.P;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import com.massivecraft.factions.P; public enum Permission {
MANAGE_SAFE_ZONE("managesafezone"),
MANAGE_WAR_ZONE("managewarzone"),
OWNERSHIP_BYPASS("ownershipbypass"),
ADMIN("admin"),
ADMIN_ANY("admin.any"),
AUTOCLAIM("autoclaim"),
BYPASS("bypass"),
CHAT("chat"),
CHATSPY("chatspy"),
CLAIM("claim"),
CLAIM_RADIUS("claim.radius"),
CONFIG("config"),
CREATE("create"),
DEINVITE("deinvite"),
DESCRIPTION("description"),
DISBAND("disband"),
DISBAND_ANY("disband.any"),
HELP("help"),
HOME("home"),
INVITE("invite"),
JOIN("join"),
JOIN_ANY("join.any"),
JOIN_OTHERS("join.others"),
KICK("kick"),
KICK_ANY("kick.any"),
LEAVE("leave"),
LIST("list"),
LOCK("lock"),
MAP("map"),
MOD("mod"),
MOD_ANY("mod.any"),
MONEY_BALANCE("money.balance"),
MONEY_BALANCE_ANY("money.balance.any"),
MONEY_DEPOSIT("money.deposit"),
MONEY_WITHDRAW("money.withdraw"),
MONEY_WITHDRAW_ANY("money.withdraw.any"),
MONEY_F2F("money.f2f"),
MONEY_F2P("money.f2p"),
MONEY_P2F("money.p2f"),
NO_BOOM("noboom"),
OPEN("open"),
OWNER("owner"),
OWNERLIST("ownerlist"),
SET_PEACEFUL("setpeaceful"),
SET_PERMANENT("setpermanent"),
SET_PERMANENTPOWER("setpermanentpower"),
POWERBOOST("powerboost"),
POWER("power"),
POWER_ANY("power.any"),
RELATION("relation"),
RELOAD("reload"),
SAVE("save"),
SETHOME("sethome"),
SETHOME_ANY("sethome.any"),
SHOW("show"),
TAG("tag"),
TITLE("title"),
UNCLAIM("unclaim"),
UNCLAIM_ALL("unclaimall"),
VERSION("version"),;
public enum Permission public final String node;
{
MANAGE_SAFE_ZONE("managesafezone"), Permission(final String node) {
MANAGE_WAR_ZONE("managewarzone"), this.node = "factions." + node;
OWNERSHIP_BYPASS("ownershipbypass"), }
ADMIN("admin"),
ADMIN_ANY("admin.any"), public boolean has(CommandSender sender, boolean informSenderIfNot) {
AUTOCLAIM("autoclaim"), return P.p.perm.has(sender, this.node, informSenderIfNot);
BYPASS("bypass"), }
CHAT("chat"),
CHATSPY("chatspy"), public boolean has(CommandSender sender) {
CLAIM("claim"), return has(sender, false);
CLAIM_RADIUS("claim.radius"), }
CONFIG("config"),
CREATE("create"),
DEINVITE("deinvite"),
DESCRIPTION("description"),
DISBAND("disband"),
DISBAND_ANY("disband.any"),
HELP("help"),
HOME("home"),
INVITE("invite"),
JOIN("join"),
JOIN_ANY("join.any"),
JOIN_OTHERS("join.others"),
KICK("kick"),
KICK_ANY("kick.any"),
LEAVE("leave"),
LIST("list"),
LOCK("lock"),
MAP("map"),
MOD("mod"),
MOD_ANY("mod.any"),
MONEY_BALANCE("money.balance"),
MONEY_BALANCE_ANY("money.balance.any"),
MONEY_DEPOSIT("money.deposit"),
MONEY_WITHDRAW("money.withdraw"),
MONEY_WITHDRAW_ANY("money.withdraw.any"),
MONEY_F2F("money.f2f"),
MONEY_F2P("money.f2p"),
MONEY_P2F("money.p2f"),
NO_BOOM("noboom"),
OPEN("open"),
OWNER("owner"),
OWNERLIST("ownerlist"),
SET_PEACEFUL("setpeaceful"),
SET_PERMANENT("setpermanent"),
SET_PERMANENTPOWER("setpermanentpower"),
POWERBOOST("powerboost"),
POWER("power"),
POWER_ANY("power.any"),
RELATION("relation"),
RELOAD("reload"),
SAVE("save"),
SETHOME("sethome"),
SETHOME_ANY("sethome.any"),
SHOW("show"),
TAG("tag"),
TITLE("title"),
UNCLAIM("unclaim"),
UNCLAIM_ALL("unclaimall"),
VERSION("version"),
;
public final String node;
Permission(final String node)
{
this.node = "factions."+node;
}
public boolean has(CommandSender sender, boolean informSenderIfNot)
{
return P.p.perm.has(sender, this.node, informSenderIfNot);
}
public boolean has(CommandSender sender)
{
return has(sender, false);
}
} }

View File

@ -1,146 +1,125 @@
package com.massivecraft.factions.struct; package com.massivecraft.factions.struct;
import com.massivecraft.factions.Conf;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import com.massivecraft.factions.Conf;
public enum Relation {
MEMBER(3, "member"),
ALLY(2, "ally"),
NEUTRAL(1, "neutral"),
ENEMY(0, "enemy");
public enum Relation public final int value;
{ public final String nicename;
MEMBER(3, "member"),
ALLY(2, "ally"),
NEUTRAL(1, "neutral"),
ENEMY(0, "enemy");
public final int value;
public final String nicename;
private Relation(final int value, final String nicename)
{
this.value = value;
this.nicename = nicename;
}
@Override
public String toString()
{
return this.nicename;
}
public boolean isMember()
{
return this == MEMBER;
}
public boolean isAlly()
{
return this == ALLY;
}
public boolean isNeutral()
{
return this == NEUTRAL;
}
public boolean isEnemy()
{
return this == ENEMY;
}
public boolean isAtLeast(Relation relation)
{
return this.value >= relation.value;
}
public boolean isAtMost(Relation relation)
{
return this.value <= relation.value;
}
public ChatColor getColor()
{
if (this == MEMBER)
return Conf.colorMember;
else if (this == ALLY)
return Conf.colorAlly;
else if (this == NEUTRAL)
return Conf.colorNeutral;
else
return Conf.colorEnemy;
}
// return appropriate Conf setting for DenyBuild based on this relation and their online status private Relation(final int value, final String nicename) {
public boolean confDenyBuild(boolean online) this.value = value;
{ this.nicename = nicename;
if (isMember()) }
return false;
if (online) @Override
{ public String toString() {
if (isEnemy()) return this.nicename;
return Conf.territoryEnemyDenyBuild; }
else if (isAlly())
return Conf.territoryAllyDenyBuild;
else
return Conf.territoryDenyBuild;
}
else
{
if (isEnemy())
return Conf.territoryEnemyDenyBuildWhenOffline;
else if (isAlly())
return Conf.territoryAllyDenyBuildWhenOffline;
else
return Conf.territoryDenyBuildWhenOffline;
}
}
// return appropriate Conf setting for PainBuild based on this relation and their online status public boolean isMember() {
public boolean confPainBuild(boolean online) return this == MEMBER;
{ }
if (isMember())
return false;
if (online) public boolean isAlly() {
{ return this == ALLY;
if (isEnemy()) }
return Conf.territoryEnemyPainBuild;
else if (isAlly())
return Conf.territoryAllyPainBuild;
else
return Conf.territoryPainBuild;
}
else
{
if (isEnemy())
return Conf.territoryEnemyPainBuildWhenOffline;
else if (isAlly())
return Conf.territoryAllyPainBuildWhenOffline;
else
return Conf.territoryPainBuildWhenOffline;
}
}
// return appropriate Conf setting for DenyUseage based on this relation public boolean isNeutral() {
public boolean confDenyUseage() return this == NEUTRAL;
{ }
if (isMember())
return false; public boolean isEnemy() {
else if (isEnemy()) return this == ENEMY;
return Conf.territoryEnemyDenyUseage; }
else if (isAlly())
return Conf.territoryAllyDenyUseage; public boolean isAtLeast(Relation relation) {
else return this.value >= relation.value;
return Conf.territoryDenyUseage; }
}
public boolean isAtMost(Relation relation) {
public double getRelationCost() return this.value <= relation.value;
{ }
if (isEnemy())
return Conf.econCostEnemy; public ChatColor getColor() {
else if (isAlly()) if (this == MEMBER)
return Conf.econCostAlly; return Conf.colorMember;
else else if (this == ALLY)
return Conf.econCostNeutral; return Conf.colorAlly;
} else if (this == NEUTRAL)
return Conf.colorNeutral;
else
return Conf.colorEnemy;
}
// return appropriate Conf setting for DenyBuild based on this relation and their online status
public boolean confDenyBuild(boolean online) {
if (isMember())
return false;
if (online) {
if (isEnemy())
return Conf.territoryEnemyDenyBuild;
else if (isAlly())
return Conf.territoryAllyDenyBuild;
else
return Conf.territoryDenyBuild;
} else {
if (isEnemy())
return Conf.territoryEnemyDenyBuildWhenOffline;
else if (isAlly())
return Conf.territoryAllyDenyBuildWhenOffline;
else
return Conf.territoryDenyBuildWhenOffline;
}
}
// return appropriate Conf setting for PainBuild based on this relation and their online status
public boolean confPainBuild(boolean online) {
if (isMember())
return false;
if (online) {
if (isEnemy())
return Conf.territoryEnemyPainBuild;
else if (isAlly())
return Conf.territoryAllyPainBuild;
else
return Conf.territoryPainBuild;
} else {
if (isEnemy())
return Conf.territoryEnemyPainBuildWhenOffline;
else if (isAlly())
return Conf.territoryAllyPainBuildWhenOffline;
else
return Conf.territoryPainBuildWhenOffline;
}
}
// return appropriate Conf setting for DenyUseage based on this relation
public boolean confDenyUseage() {
if (isMember())
return false;
else if (isEnemy())
return Conf.territoryEnemyDenyUseage;
else if (isAlly())
return Conf.territoryAllyDenyUseage;
else
return Conf.territoryDenyUseage;
}
public double getRelationCost() {
if (isEnemy())
return Conf.econCostEnemy;
else if (isAlly())
return Conf.econCostAlly;
else
return Conf.econCostNeutral;
}
} }

View File

@ -2,49 +2,41 @@ package com.massivecraft.factions.struct;
import com.massivecraft.factions.Conf; import com.massivecraft.factions.Conf;
public enum Role public enum Role {
{ ADMIN(2, "admin"),
ADMIN(2, "admin"), MODERATOR(1, "moderator"),
MODERATOR(1, "moderator"), NORMAL(0, "normal member");
NORMAL(0, "normal member");
public final int value;
public final String nicename;
private Role(final int value, final String nicename)
{
this.value = value;
this.nicename = nicename;
}
public boolean isAtLeast(Role role)
{
return this.value >= role.value;
}
public boolean isAtMost(Role role)
{
return this.value <= role.value;
}
@Override public final int value;
public String toString() public final String nicename;
{
return this.nicename; private Role(final int value, final String nicename) {
} this.value = value;
this.nicename = nicename;
public String getPrefix() }
{
if (this == Role.ADMIN) public boolean isAtLeast(Role role) {
{ return this.value >= role.value;
return Conf.prefixAdmin; }
}
public boolean isAtMost(Role role) {
if (this == Role.MODERATOR) return this.value <= role.value;
{ }
return Conf.prefixMod;
} @Override
public String toString() {
return ""; return this.nicename;
} }
public String getPrefix() {
if (this == Role.ADMIN) {
return Conf.prefixAdmin;
}
if (this == Role.MODERATOR) {
return Conf.prefixMod;
}
return "";
}
} }

View File

@ -1,97 +1,89 @@
package com.massivecraft.factions.util; package com.massivecraft.factions.util;
import java.util.*;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
public class AsciiCompass import java.util.ArrayList;
{
public enum Point
{
N('N'),
NE('/'),
E('E'),
SE('\\'),
S('S'),
SW('/'),
W('W'),
NW('\\');
public final char asciiChar;
private Point(final char asciiChar)
{
this.asciiChar = asciiChar;
}
@Override
public String toString()
{
return String.valueOf(this.asciiChar);
}
public String toString(boolean isActive, ChatColor colorActive, String colorDefault)
{
return (isActive ? colorActive : colorDefault)+String.valueOf(this.asciiChar);
}
}
public static AsciiCompass.Point getCompassPointForDirection(double inDegrees)
{
double degrees = (inDegrees - 180) % 360 ;
if (degrees < 0)
degrees += 360;
if (0 <= degrees && degrees < 22.5)
return AsciiCompass.Point.N;
else if (22.5 <= degrees && degrees < 67.5)
return AsciiCompass.Point.NE;
else if (67.5 <= degrees && degrees < 112.5)
return AsciiCompass.Point.E;
else if (112.5 <= degrees && degrees < 157.5)
return AsciiCompass.Point.SE;
else if (157.5 <= degrees && degrees < 202.5)
return AsciiCompass.Point.S;
else if (202.5 <= degrees && degrees < 247.5)
return AsciiCompass.Point.SW;
else if (247.5 <= degrees && degrees < 292.5)
return AsciiCompass.Point.W;
else if (292.5 <= degrees && degrees < 337.5)
return AsciiCompass.Point.NW;
else if (337.5 <= degrees && degrees < 360.0)
return AsciiCompass.Point.N;
else
return null;
}
public static ArrayList<String> getAsciiCompass(Point point, ChatColor colorActive, String colorDefault)
{
ArrayList<String> ret = new ArrayList<String>();
String row;
row = "";
row += Point.NW.toString(Point.NW == point, colorActive, colorDefault);
row += Point.N.toString(Point.N == point, colorActive, colorDefault);
row += Point.NE.toString(Point.NE == point, colorActive, colorDefault);
ret.add(row);
row = "";
row += Point.W.toString(Point.W == point, colorActive, colorDefault);
row += colorDefault+"+";
row += Point.E.toString(Point.E == point, colorActive, colorDefault);
ret.add(row);
row = "";
row += Point.SW.toString(Point.SW == point, colorActive, colorDefault);
row += Point.S.toString(Point.S == point, colorActive, colorDefault);
row += Point.SE.toString(Point.SE == point, colorActive, colorDefault);
ret.add(row);
return ret; public class AsciiCompass {
} public enum Point {
N('N'),
public static ArrayList<String> getAsciiCompass(double inDegrees, ChatColor colorActive, String colorDefault) NE('/'),
{ E('E'),
return getAsciiCompass(getCompassPointForDirection(inDegrees), colorActive, colorDefault); SE('\\'),
} S('S'),
SW('/'),
W('W'),
NW('\\');
public final char asciiChar;
private Point(final char asciiChar) {
this.asciiChar = asciiChar;
}
@Override
public String toString() {
return String.valueOf(this.asciiChar);
}
public String toString(boolean isActive, ChatColor colorActive, String colorDefault) {
return (isActive ? colorActive : colorDefault) + String.valueOf(this.asciiChar);
}
}
public static AsciiCompass.Point getCompassPointForDirection(double inDegrees) {
double degrees = (inDegrees - 180) % 360;
if (degrees < 0)
degrees += 360;
if (0 <= degrees && degrees < 22.5)
return AsciiCompass.Point.N;
else if (22.5 <= degrees && degrees < 67.5)
return AsciiCompass.Point.NE;
else if (67.5 <= degrees && degrees < 112.5)
return AsciiCompass.Point.E;
else if (112.5 <= degrees && degrees < 157.5)
return AsciiCompass.Point.SE;
else if (157.5 <= degrees && degrees < 202.5)
return AsciiCompass.Point.S;
else if (202.5 <= degrees && degrees < 247.5)
return AsciiCompass.Point.SW;
else if (247.5 <= degrees && degrees < 292.5)
return AsciiCompass.Point.W;
else if (292.5 <= degrees && degrees < 337.5)
return AsciiCompass.Point.NW;
else if (337.5 <= degrees && degrees < 360.0)
return AsciiCompass.Point.N;
else
return null;
}
public static ArrayList<String> getAsciiCompass(Point point, ChatColor colorActive, String colorDefault) {
ArrayList<String> ret = new ArrayList<String>();
String row;
row = "";
row += Point.NW.toString(Point.NW == point, colorActive, colorDefault);
row += Point.N.toString(Point.N == point, colorActive, colorDefault);
row += Point.NE.toString(Point.NE == point, colorActive, colorDefault);
ret.add(row);
row = "";
row += Point.W.toString(Point.W == point, colorActive, colorDefault);
row += colorDefault + "+";
row += Point.E.toString(Point.E == point, colorActive, colorDefault);
ret.add(row);
row = "";
row += Point.SW.toString(Point.SW == point, colorActive, colorDefault);
row += Point.S.toString(Point.S == point, colorActive, colorDefault);
row += Point.SE.toString(Point.SE == point, colorActive, colorDefault);
ret.add(row);
return ret;
}
public static ArrayList<String> getAsciiCompass(double inDegrees, ChatColor colorActive, String colorDefault) {
return getAsciiCompass(getCompassPointForDirection(inDegrees), colorActive, colorDefault);
}
} }

View File

@ -1,94 +1,79 @@
package com.massivecraft.factions.util; package com.massivecraft.factions.util;
import com.massivecraft.factions.*;
import com.massivecraft.factions.struct.Role;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.ListIterator; import java.util.ListIterator;
import org.bukkit.scheduler.BukkitRunnable; public class AutoLeaveProcessTask extends BukkitRunnable {
private transient boolean readyToGo = false;
private transient boolean finished = false;
private transient ArrayList<FPlayer> fplayers;
private transient ListIterator<FPlayer> iterator;
private transient double toleranceMillis;
import com.massivecraft.factions.Conf; public AutoLeaveProcessTask() {
import com.massivecraft.factions.Faction; fplayers = new ArrayList<FPlayer>(FPlayers.i.get());
import com.massivecraft.factions.FPlayer; this.iterator = fplayers.listIterator();
import com.massivecraft.factions.FPlayers; this.toleranceMillis = Conf.autoLeaveAfterDaysOfInactivity * 24 * 60 * 60 * 1000;
import com.massivecraft.factions.P; this.readyToGo = true;
import com.massivecraft.factions.struct.Role; this.finished = false;
}
public class AutoLeaveProcessTask extends BukkitRunnable public void run() {
{ if (Conf.autoLeaveAfterDaysOfInactivity <= 0.0 || Conf.autoLeaveRoutineMaxMillisecondsPerTick <= 0.0) {
private transient boolean readyToGo = false; this.stop();
private transient boolean finished = false; return;
private transient ArrayList<FPlayer> fplayers; }
private transient ListIterator<FPlayer> iterator;
private transient double toleranceMillis;
public AutoLeaveProcessTask() if (!readyToGo) return;
{ // this is set so it only does one iteration at a time, no matter how frequently the timer fires
fplayers = new ArrayList<FPlayer>(FPlayers.i.get()); readyToGo = false;
this.iterator = fplayers.listIterator(); // and this is tracked to keep one iteration from dragging on too long and possibly choking the system if there are a very large number of players to go through
this.toleranceMillis = Conf.autoLeaveAfterDaysOfInactivity * 24 * 60 * 60 * 1000; long loopStartTime = System.currentTimeMillis();
this.readyToGo = true;
this.finished = false;
}
public void run() while (iterator.hasNext()) {
{ long now = System.currentTimeMillis();
if (Conf.autoLeaveAfterDaysOfInactivity <= 0.0 || Conf.autoLeaveRoutineMaxMillisecondsPerTick <= 0.0)
{
this.stop();
return;
}
if ( ! readyToGo) return; // if this iteration has been running for maximum time, stop to take a breather until next tick
// this is set so it only does one iteration at a time, no matter how frequently the timer fires if (now > loopStartTime + Conf.autoLeaveRoutineMaxMillisecondsPerTick) {
readyToGo = false; readyToGo = true;
// and this is tracked to keep one iteration from dragging on too long and possibly choking the system if there are a very large number of players to go through return;
long loopStartTime = System.currentTimeMillis(); }
while(iterator.hasNext()) FPlayer fplayer = iterator.next();
{ if (fplayer.isOffline() && now - fplayer.getLastLoginTime() > toleranceMillis) {
long now = System.currentTimeMillis(); if (Conf.logFactionLeave || Conf.logFactionKick)
P.p.log("Player " + fplayer.getName() + " was auto-removed due to inactivity.");
// if this iteration has been running for maximum time, stop to take a breather until next tick // if player is faction admin, sort out the faction since he's going away
if (now > loopStartTime + Conf.autoLeaveRoutineMaxMillisecondsPerTick) if (fplayer.getRole() == Role.ADMIN) {
{ Faction faction = fplayer.getFaction();
readyToGo = true; if (faction != null)
return; fplayer.getFaction().promoteNewLeader();
} }
FPlayer fplayer = iterator.next(); fplayer.leave(false);
if (fplayer.isOffline() && now - fplayer.getLastLoginTime() > toleranceMillis) iterator.remove(); // go ahead and remove this list's link to the FPlayer object
{ fplayer.detach();
if (Conf.logFactionLeave || Conf.logFactionKick) }
P.p.log("Player "+fplayer.getName()+" was auto-removed due to inactivity."); }
// if player is faction admin, sort out the faction since he's going away // looks like we've finished
if (fplayer.getRole() == Role.ADMIN) this.stop();
{ }
Faction faction = fplayer.getFaction();
if (faction != null)
fplayer.getFaction().promoteNewLeader();
}
fplayer.leave(false); // we're done, shut down
iterator.remove(); // go ahead and remove this list's link to the FPlayer object public void stop() {
fplayer.detach(); readyToGo = false;
} finished = true;
}
// looks like we've finished this.cancel();
this.stop(); }
}
// we're done, shut down public boolean isFinished() {
public void stop() return finished;
{ }
readyToGo = false;
finished = true;
this.cancel();
}
public boolean isFinished()
{
return finished;
}
} }

View File

@ -3,26 +3,23 @@ package com.massivecraft.factions.util;
import com.massivecraft.factions.Conf; import com.massivecraft.factions.Conf;
import com.massivecraft.factions.P; import com.massivecraft.factions.P;
public class AutoLeaveTask implements Runnable public class AutoLeaveTask implements Runnable {
{ private static AutoLeaveProcessTask task;
private static AutoLeaveProcessTask task; double rate;
double rate;
public AutoLeaveTask() public AutoLeaveTask() {
{ this.rate = Conf.autoLeaveRoutineRunsEveryXMinutes;
this.rate = Conf.autoLeaveRoutineRunsEveryXMinutes; }
}
public synchronized void run() public synchronized void run() {
{ if (task != null && !task.isFinished())
if (task != null && ! task.isFinished()) return;
return;
task = new AutoLeaveProcessTask(); task = new AutoLeaveProcessTask();
task.runTaskTimer(P.p, 1, 1); task.runTaskTimer(P.p, 1, 1);
// maybe setting has been changed? if so, restart this task at new rate // maybe setting has been changed? if so, restart this task at new rate
if (this.rate != Conf.autoLeaveRoutineRunsEveryXMinutes) if (this.rate != Conf.autoLeaveRoutineRunsEveryXMinutes)
P.p.startAutoLeaveTask(true); P.p.startAutoLeaveTask(true);
} }
} }

View File

@ -9,99 +9,86 @@ import org.bukkit.World;
* yet when an object of this class is created, only when the Location is first accessed. * yet when an object of this class is created, only when the Location is first accessed.
*/ */
public class LazyLocation public class LazyLocation {
{ private Location location = null;
private Location location = null; private String worldName;
private String worldName; private double x;
private double x; private double y;
private double y; private double z;
private double z; private float pitch;
private float pitch; private float yaw;
private float yaw;
public LazyLocation(Location loc) public LazyLocation(Location loc) {
{ setLocation(loc);
setLocation(loc); }
}
public LazyLocation(final String worldName, final double x, final double y, final double z) public LazyLocation(final String worldName, final double x, final double y, final double z) {
{ this(worldName, x, y, z, 0, 0);
this(worldName, x, y, z, 0, 0); }
}
public LazyLocation(final String worldName, final double x, final double y, final double z, final float yaw, final float pitch) public LazyLocation(final String worldName, final double x, final double y, final double z, final float yaw, final float pitch) {
{ this.worldName = worldName;
this.worldName = worldName; this.x = x;
this.x = x; this.y = y;
this.y = y; this.z = z;
this.z = z; this.yaw = yaw;
this.yaw = yaw; this.pitch = pitch;
this.pitch = pitch; }
}
// This returns the actual Location // This returns the actual Location
public final Location getLocation() public final Location getLocation() {
{ // make sure Location is initialized before returning it
// make sure Location is initialized before returning it initLocation();
initLocation(); return location;
return location; }
}
// change the Location // change the Location
public final void setLocation(Location loc) public final void setLocation(Location loc) {
{ this.location = loc;
this.location = loc; this.worldName = loc.getWorld().getName();
this.worldName = loc.getWorld().getName(); this.x = loc.getX();
this.x = loc.getX(); this.y = loc.getY();
this.y = loc.getY(); this.z = loc.getZ();
this.z = loc.getZ(); this.yaw = loc.getYaw();
this.yaw = loc.getYaw(); this.pitch = loc.getPitch();
this.pitch = loc.getPitch(); }
}
// This initializes the Location // This initializes the Location
private void initLocation() private void initLocation() {
{ // if location is already initialized, simply return
// if location is already initialized, simply return if (location != null) return;
if (location != null) return;
// get World; hopefully it's initialized at this point // get World; hopefully it's initialized at this point
World world = Bukkit.getWorld(worldName); World world = Bukkit.getWorld(worldName);
if (world == null) return; if (world == null) return;
// store the Location for future calls, and pass it on // store the Location for future calls, and pass it on
location = new Location(world, x, y, z, yaw, pitch); location = new Location(world, x, y, z, yaw, pitch);
} }
public final String getWorldName() public final String getWorldName() {
{ return worldName;
return worldName; }
}
public final double getX() public final double getX() {
{ return x;
return x; }
}
public final double getY() public final double getY() {
{ return y;
return y; }
}
public final double getZ() public final double getZ() {
{ return z;
return z; }
}
public final double getPitch() public final double getPitch() {
{ return pitch;
return pitch; }
}
public final double getYaw() public final double getYaw() {
{ return yaw;
return yaw; }
}
} }

View File

@ -1,128 +1,104 @@
package com.massivecraft.factions.util; package com.massivecraft.factions.util;
import com.massivecraft.factions.FLocation;
import com.massivecraft.factions.P;
import org.bukkit.craftbukkit.libs.com.google.gson.*;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.concurrent.ConcurrentHashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set;
import org.bukkit.craftbukkit.libs.com.google.gson.JsonArray; import java.util.concurrent.ConcurrentHashMap;
import org.bukkit.craftbukkit.libs.com.google.gson.JsonDeserializationContext; import java.util.logging.Level;
import org.bukkit.craftbukkit.libs.com.google.gson.JsonDeserializer;
import org.bukkit.craftbukkit.libs.com.google.gson.JsonElement;
import org.bukkit.craftbukkit.libs.com.google.gson.JsonObject;
import org.bukkit.craftbukkit.libs.com.google.gson.JsonParseException;
import org.bukkit.craftbukkit.libs.com.google.gson.JsonPrimitive;
import org.bukkit.craftbukkit.libs.com.google.gson.JsonSerializationContext;
import org.bukkit.craftbukkit.libs.com.google.gson.JsonSerializer;
import com.massivecraft.factions.FLocation;
import com.massivecraft.factions.P;
public class MapFLocToStringSetTypeAdapter implements JsonDeserializer<Map<FLocation, Set<String>>>, JsonSerializer<Map<FLocation, Set<String>>> public class MapFLocToStringSetTypeAdapter implements JsonDeserializer<Map<FLocation, Set<String>>>, JsonSerializer<Map<FLocation, Set<String>>> {
{
@Override @Override
public Map<FLocation, Set<String>> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException public Map<FLocation, Set<String>> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
{ try {
try { JsonObject obj = json.getAsJsonObject();
JsonObject obj = json.getAsJsonObject(); if (obj == null) {
if (obj == null) return null;
{ }
return null;
}
Map<FLocation, Set<String>> locationMap = new ConcurrentHashMap<FLocation, Set<String>>(); Map<FLocation, Set<String>> locationMap = new ConcurrentHashMap<FLocation, Set<String>>();
Set<String> nameSet; Set<String> nameSet;
Iterator<JsonElement> iter; Iterator<JsonElement> iter;
String worldName; String worldName;
String[] coords; String[] coords;
int x, z; int x, z;
for (Entry<String, JsonElement> entry : obj.entrySet()) for (Entry<String, JsonElement> entry : obj.entrySet()) {
{ worldName = entry.getKey();
worldName = entry.getKey(); for (Entry<String, JsonElement> entry2 : entry.getValue().getAsJsonObject().entrySet()) {
for (Entry<String, JsonElement> entry2 : entry.getValue().getAsJsonObject().entrySet()) coords = entry2.getKey().trim().split("[,\\s]+");
{ x = Integer.parseInt(coords[0]);
coords = entry2.getKey().trim().split("[,\\s]+"); z = Integer.parseInt(coords[1]);
x = Integer.parseInt(coords[0]);
z = Integer.parseInt(coords[1]);
nameSet = new HashSet<String>(); nameSet = new HashSet<String>();
iter = entry2.getValue().getAsJsonArray().iterator(); iter = entry2.getValue().getAsJsonArray().iterator();
while (iter.hasNext()) while (iter.hasNext()) {
{ nameSet.add(iter.next().getAsString());
nameSet.add(iter.next().getAsString()); }
}
locationMap.put(new FLocation(worldName, x, z), nameSet); locationMap.put(new FLocation(worldName, x, z), nameSet);
} }
} }
return locationMap; return locationMap;
} } catch (Exception ex) {
catch (Exception ex) ex.printStackTrace();
{ P.p.log(Level.WARNING, "Error encountered while deserializing a Map of FLocations to String Sets.");
ex.printStackTrace(); return null;
P.p.log(Level.WARNING, "Error encountered while deserializing a Map of FLocations to String Sets."); }
return null; }
}
}
@Override @Override
public JsonElement serialize(Map<FLocation, Set<String>> src, Type typeOfSrc, JsonSerializationContext context) public JsonElement serialize(Map<FLocation, Set<String>> src, Type typeOfSrc, JsonSerializationContext context) {
{ JsonObject obj = new JsonObject();
JsonObject obj = new JsonObject();
try { try {
if (src != null) if (src != null) {
{ FLocation loc;
FLocation loc; String locWorld;
String locWorld; Set<String> nameSet;
Set<String> nameSet; Iterator<String> iter;
Iterator<String> iter; JsonArray nameArray;
JsonArray nameArray; JsonPrimitive nameElement;
JsonPrimitive nameElement;
for (Entry<FLocation, Set<String>> entry : src.entrySet()) for (Entry<FLocation, Set<String>> entry : src.entrySet()) {
{ loc = entry.getKey();
loc = entry.getKey(); locWorld = loc.getWorldName();
locWorld = loc.getWorldName(); nameSet = entry.getValue();
nameSet = entry.getValue();
if (nameSet == null || nameSet.isEmpty()) if (nameSet == null || nameSet.isEmpty()) {
{ continue;
continue; }
}
nameArray = new JsonArray(); nameArray = new JsonArray();
iter = nameSet.iterator(); iter = nameSet.iterator();
while (iter.hasNext()) while (iter.hasNext()) {
{ nameElement = new JsonPrimitive(iter.next());
nameElement = new JsonPrimitive(iter.next()); nameArray.add(nameElement);
nameArray.add(nameElement); }
}
if ( ! obj.has(locWorld)) if (!obj.has(locWorld)) {
{ obj.add(locWorld, new JsonObject());
obj.add(locWorld, new JsonObject()); }
}
obj.get(locWorld).getAsJsonObject().add(loc.getCoordString(), nameArray); obj.get(locWorld).getAsJsonObject().add(loc.getCoordString(), nameArray);
} }
} }
return obj; return obj;
} } catch (Exception ex) {
catch (Exception ex) ex.printStackTrace();
{ P.p.log(Level.WARNING, "Error encountered while serializing a Map of FLocations to String Sets.");
ex.printStackTrace(); return obj;
P.p.log(Level.WARNING, "Error encountered while serializing a Map of FLocations to String Sets."); }
return obj; }
}
}
} }

Some files were not shown because too many files have changed in this diff Show More