Mavenize
This commit is contained in:
BIN
src/main/.DS_Store
vendored
Normal file
BIN
src/main/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
src/main/java/.DS_Store
vendored
Normal file
BIN
src/main/java/.DS_Store
vendored
Normal file
Binary file not shown.
400
src/main/java/com/massivecraft/factions/Board.java
Normal file
400
src/main/java/com/massivecraft/factions/Board.java
Normal file
@@ -0,0 +1,400 @@
|
||||
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.struct.Relation;
|
||||
import com.massivecraft.factions.util.AsciiCompass;
|
||||
import com.massivecraft.factions.zcore.util.DiscUtil;
|
||||
|
||||
|
||||
public class Board
|
||||
{
|
||||
private static transient File file = new File(P.p.getDataFolder(), "board.json");
|
||||
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")
|
||||
{
|
||||
removeAt(flocation);
|
||||
}
|
||||
|
||||
flocationIds.put(flocation, id);
|
||||
}
|
||||
|
||||
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();
|
||||
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?
|
||||
// Simpler: Is there any nearby coord with a faction other than the faction here?
|
||||
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 boolean isConnectedLocation(FLocation flocation, Faction faction)
|
||||
{
|
||||
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
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
385
src/main/java/com/massivecraft/factions/Conf.java
Normal file
385
src/main/java/com/massivecraft/factions/Conf.java
Normal file
@@ -0,0 +1,385 @@
|
||||
package com.massivecraft.factions;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import org.bukkit.*;
|
||||
import org.bukkit.entity.EntityType;
|
||||
|
||||
public class Conf
|
||||
{
|
||||
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 static int factionMemberLimit = 0;
|
||||
|
||||
// what faction ID to start new players in when they first join the server; default is 0, "no faction"
|
||||
public static String newPlayerStartingFactionID = "0";
|
||||
|
||||
public static boolean showMapFactionKey = true;
|
||||
public static boolean showNeutralFactionsOnMap = true;
|
||||
public static boolean showEnemyFactionsOnMap = true;
|
||||
|
||||
// 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;
|
||||
|
||||
public static double saveToFileEveryXMinutes = 30.0;
|
||||
|
||||
public static double autoLeaveAfterDaysOfInactivity = 10.0;
|
||||
public static double autoLeaveRoutineRunsEveryXMinutes = 5.0;
|
||||
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 boolean worldGuardChecking = 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
|
||||
public static boolean logFactionCreate = true;
|
||||
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
|
||||
public static boolean handleExploitObsidianGenerators = true;
|
||||
public static boolean handleExploitEnderPearlClipping = true;
|
||||
public static boolean handleExploitInteractionSpam = true;
|
||||
public static boolean handleExploitTNTWaterlog = false;
|
||||
|
||||
public static boolean homesEnabled = true;
|
||||
public static boolean homesMustBeInClaimedTerritory = true;
|
||||
public static boolean homesTeleportToOnDeath = 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;
|
||||
public static boolean peacefulTerritoryDisableMonsters = false;
|
||||
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
|
||||
public static int radiusClaimFailureLimit = 9;
|
||||
|
||||
public static double considerFactionsReallyOfflineAfterXMinutes = 0.0;
|
||||
|
||||
public static int actionDeniedPainAmount = 1;
|
||||
|
||||
// commands which will be prevented if the player is a member of a permanent faction
|
||||
public static Set<String> permanentFactionMemberDenyCommands = new LinkedHashSet<String>();
|
||||
|
||||
// commands which will be prevented when in claimed territory of another faction
|
||||
public static Set<String> territoryNeutralDenyCommands = new LinkedHashSet<String>();
|
||||
public static Set<String> territoryEnemyDenyCommands = new LinkedHashSet<String>();
|
||||
|
||||
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 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);
|
||||
}
|
||||
}
|
||||
|
||||
221
src/main/java/com/massivecraft/factions/FLocation.java
Normal file
221
src/main/java/com/massivecraft/factions/FLocation.java
Normal file
@@ -0,0 +1,221 @@
|
||||
package com.massivecraft.factions;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.massivecraft.factions.util.MiscUtil;
|
||||
|
||||
public class FLocation
|
||||
{
|
||||
|
||||
private String worldName = "world";
|
||||
private int x = 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()
|
||||
{
|
||||
return Bukkit.getWorld(worldName);
|
||||
}
|
||||
|
||||
public void setWorldName(String worldName)
|
||||
{
|
||||
this.worldName = worldName;
|
||||
}
|
||||
|
||||
public long getX()
|
||||
{
|
||||
return x;
|
||||
}
|
||||
|
||||
public void setX(int x)
|
||||
{
|
||||
this.x = x;
|
||||
}
|
||||
|
||||
public long getZ()
|
||||
{
|
||||
return z;
|
||||
}
|
||||
|
||||
public void setZ(int z)
|
||||
{
|
||||
this.z = z;
|
||||
}
|
||||
|
||||
public String getCoordString()
|
||||
{
|
||||
return ""+x+","+z;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "["+this.getWorldName()+","+this.getCoordString()+"]";
|
||||
}
|
||||
|
||||
//----------------------------------------------//
|
||||
// Block/Chunk/Region Value Transformation
|
||||
//----------------------------------------------//
|
||||
|
||||
// bit-shifting is used because it's much faster than standard division and multiplication
|
||||
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) );
|
||||
}
|
||||
}
|
||||
862
src/main/java/com/massivecraft/factions/FPlayer.java
Normal file
862
src/main/java/com/massivecraft/factions/FPlayer.java
Normal file
@@ -0,0 +1,862 @@
|
||||
package com.massivecraft.factions;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.massivecraft.factions.event.FPlayerLeaveEvent;
|
||||
import com.massivecraft.factions.event.LandClaimEvent;
|
||||
import com.massivecraft.factions.iface.EconomyParticipator;
|
||||
import com.massivecraft.factions.iface.RelationParticipator;
|
||||
import com.massivecraft.factions.integration.Econ;
|
||||
import com.massivecraft.factions.integration.LWCFeatures;
|
||||
import com.massivecraft.factions.integration.SpoutFeatures;
|
||||
import com.massivecraft.factions.integration.Worldguard;
|
||||
import com.massivecraft.factions.struct.ChatMode;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
import com.massivecraft.factions.struct.Relation;
|
||||
import com.massivecraft.factions.struct.Role;
|
||||
import com.massivecraft.factions.util.RelationUtil;
|
||||
import com.massivecraft.factions.zcore.persist.PlayerEntity;
|
||||
|
||||
|
||||
/**
|
||||
* Logged in players always have exactly one FPlayer instance.
|
||||
* Logged out players may or may not have an FPlayer instance. They will always have one if they are part of a faction.
|
||||
* This is because only players with a faction are saved to disk (in order to not waste disk space).
|
||||
*
|
||||
* The FPlayer is linked to a minecraft player using the player name.
|
||||
*
|
||||
* The same instance is always returned for the same player.
|
||||
* This means you can use the == operator. No .equals method necessary.
|
||||
*/
|
||||
|
||||
public class FPlayer extends PlayerEntity implements EconomyParticipator
|
||||
{
|
||||
//private transient String playerName;
|
||||
private transient FLocation lastStoodAt = new FLocation(); // Where did this player stand the last time we checked?
|
||||
|
||||
// FIELD: factionId
|
||||
private String factionId;
|
||||
public Faction getFaction() { if(this.factionId == null) {return null;} return Factions.i.get(this.factionId); }
|
||||
public String getFactionId() { return this.factionId; }
|
||||
public boolean hasFaction() { return ! factionId.equals("0"); }
|
||||
public void setFaction(Faction faction)
|
||||
{
|
||||
Faction oldFaction = this.getFaction();
|
||||
if (oldFaction != null) oldFaction.removeFPlayer(this);
|
||||
faction.addFPlayer(this);
|
||||
this.factionId = faction.getId();
|
||||
SpoutFeatures.updateAppearances(this.getPlayer());
|
||||
}
|
||||
|
||||
// FIELD: role
|
||||
private Role role;
|
||||
public Role getRole() { return this.role; }
|
||||
public void setRole(Role role) { this.role = role; SpoutFeatures.updateAppearances(this.getPlayer()); }
|
||||
|
||||
// FIELD: title
|
||||
private String title;
|
||||
|
||||
// FIELD: power
|
||||
private double power;
|
||||
|
||||
// FIELD: powerBoost
|
||||
// special increase/decrease to min and max power for this player
|
||||
private double powerBoost;
|
||||
public double getPowerBoost() { return this.powerBoost; }
|
||||
public void setPowerBoost(double powerBoost) { this.powerBoost = powerBoost; }
|
||||
|
||||
// FIELD: lastPowerUpdateTime
|
||||
private long lastPowerUpdateTime;
|
||||
|
||||
// FIELD: lastLoginTime
|
||||
private long lastLoginTime;
|
||||
|
||||
// FIELD: mapAutoUpdating
|
||||
private transient boolean mapAutoUpdating;
|
||||
|
||||
// FIELD: autoClaimEnabled
|
||||
private transient Faction autoClaimFor;
|
||||
public Faction getAutoClaimFor()
|
||||
{
|
||||
return autoClaimFor;
|
||||
}
|
||||
public void setAutoClaimFor(Faction faction)
|
||||
{
|
||||
this.autoClaimFor = faction;
|
||||
if (this.autoClaimFor != null)
|
||||
{
|
||||
// TODO: merge these into same autoclaim
|
||||
this.autoSafeZoneEnabled = false;
|
||||
this.autoWarZoneEnabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
// FIELD: autoSafeZoneEnabled
|
||||
private transient boolean autoSafeZoneEnabled;
|
||||
public boolean isAutoSafeClaimEnabled() { return autoSafeZoneEnabled; }
|
||||
public void setIsAutoSafeClaimEnabled(boolean enabled)
|
||||
{
|
||||
this.autoSafeZoneEnabled = enabled;
|
||||
if (enabled)
|
||||
{
|
||||
this.autoClaimFor = null;
|
||||
this.autoWarZoneEnabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
// FIELD: autoWarZoneEnabled
|
||||
private transient boolean autoWarZoneEnabled;
|
||||
public boolean isAutoWarClaimEnabled() { return autoWarZoneEnabled; }
|
||||
public void setIsAutoWarClaimEnabled(boolean enabled)
|
||||
{
|
||||
this.autoWarZoneEnabled = enabled;
|
||||
if (enabled)
|
||||
{
|
||||
this.autoClaimFor = null;
|
||||
this.autoSafeZoneEnabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
private transient boolean isAdminBypassing = false;
|
||||
public boolean isAdminBypassing() { return this.isAdminBypassing; }
|
||||
public void setIsAdminBypassing(boolean val) { this.isAdminBypassing = val; }
|
||||
|
||||
// FIELD: loginPvpDisabled
|
||||
private transient boolean loginPvpDisabled;
|
||||
|
||||
// FIELD: deleteMe
|
||||
private transient boolean deleteMe;
|
||||
|
||||
// FIELD: chatMode
|
||||
private ChatMode chatMode;
|
||||
public void setChatMode(ChatMode chatMode) { this.chatMode = chatMode; }
|
||||
public ChatMode getChatMode()
|
||||
{
|
||||
if(this.factionId.equals("0") || ! Conf.factionOnlyChat)
|
||||
{
|
||||
this.chatMode = ChatMode.PUBLIC;
|
||||
}
|
||||
return chatMode;
|
||||
}
|
||||
|
||||
// FIELD: chatSpy
|
||||
private transient boolean spyingChat = false;
|
||||
public void setSpyingChat(boolean chatSpying) { this.spyingChat = chatSpying; }
|
||||
public boolean isSpyingChat() { return spyingChat; }
|
||||
|
||||
// FIELD: account
|
||||
public String getAccountId() { return this.getId(); }
|
||||
|
||||
// -------------------------------------------- //
|
||||
// Construct
|
||||
// -------------------------------------------- //
|
||||
|
||||
// GSON need this noarg constructor.
|
||||
public FPlayer()
|
||||
{
|
||||
this.resetFactionData(false);
|
||||
this.power = Conf.powerPlayerStarting;
|
||||
this.lastPowerUpdateTime = System.currentTimeMillis();
|
||||
this.lastLoginTime = System.currentTimeMillis();
|
||||
this.mapAutoUpdating = false;
|
||||
this.autoClaimFor = null;
|
||||
this.autoSafeZoneEnabled = false;
|
||||
this.autoWarZoneEnabled = false;
|
||||
this.loginPvpDisabled = (Conf.noPVPDamageToOthersForXSecondsAfterLogin > 0) ? true : false;
|
||||
this.deleteMe = false;
|
||||
this.powerBoost = 0.0;
|
||||
|
||||
if ( ! Conf.newPlayerStartingFactionID.equals("0") && Factions.i.exists(Conf.newPlayerStartingFactionID))
|
||||
{
|
||||
this.factionId = Conf.newPlayerStartingFactionID;
|
||||
}
|
||||
}
|
||||
|
||||
public final void resetFactionData(boolean doSpoutUpdate)
|
||||
{
|
||||
// clean up any territory ownership in old faction, if there is one
|
||||
if (Factions.i.exists(this.getFactionId()))
|
||||
{
|
||||
Faction currentFaction = this.getFaction();
|
||||
currentFaction.removeFPlayer(this);
|
||||
if (currentFaction.isNormal())
|
||||
{
|
||||
currentFaction.clearClaimOwnership(this.getId());
|
||||
}
|
||||
}
|
||||
|
||||
this.factionId = "0"; // The default neutral faction
|
||||
this.chatMode = ChatMode.PUBLIC;
|
||||
this.role = Role.NORMAL;
|
||||
this.title = "";
|
||||
this.autoClaimFor = null;
|
||||
|
||||
if (doSpoutUpdate)
|
||||
{
|
||||
SpoutFeatures.updateAppearances(this.getPlayer());
|
||||
}
|
||||
}
|
||||
|
||||
public void resetFactionData()
|
||||
{
|
||||
this.resetFactionData(true);
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// Getters And Setters
|
||||
// -------------------------------------------- //
|
||||
|
||||
|
||||
|
||||
|
||||
public long getLastLoginTime()
|
||||
{
|
||||
return lastLoginTime;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void setLastLoginTime(long lastLoginTime)
|
||||
{
|
||||
losePowerFromBeingOffline();
|
||||
this.lastLoginTime = lastLoginTime;
|
||||
this.lastPowerUpdateTime = lastLoginTime;
|
||||
if (Conf.noPVPDamageToOthersForXSecondsAfterLogin > 0)
|
||||
{
|
||||
this.loginPvpDisabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isMapAutoUpdating()
|
||||
{
|
||||
return mapAutoUpdating;
|
||||
}
|
||||
|
||||
public void setMapAutoUpdating(boolean mapAutoUpdating)
|
||||
{
|
||||
this.mapAutoUpdating = mapAutoUpdating;
|
||||
}
|
||||
|
||||
public boolean hasLoginPvpDisabled()
|
||||
{
|
||||
if (!loginPvpDisabled)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (this.lastLoginTime + (Conf.noPVPDamageToOthersForXSecondsAfterLogin * 1000) < System.currentTimeMillis())
|
||||
{
|
||||
this.loginPvpDisabled = false;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public FLocation getLastStoodAt()
|
||||
{
|
||||
return this.lastStoodAt;
|
||||
}
|
||||
|
||||
public void setLastStoodAt(FLocation flocation)
|
||||
{
|
||||
this.lastStoodAt = flocation;
|
||||
}
|
||||
|
||||
public void markForDeletion(boolean delete)
|
||||
{
|
||||
deleteMe = delete;
|
||||
}
|
||||
|
||||
//----------------------------------------------//
|
||||
// Title, Name, Faction Tag and Chat
|
||||
//----------------------------------------------//
|
||||
|
||||
// Base:
|
||||
|
||||
public String getTitle()
|
||||
{
|
||||
return this.title;
|
||||
}
|
||||
|
||||
public void setTitle(String title)
|
||||
{
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public String getName()
|
||||
{
|
||||
return this.getId(); // TODO: ... display name or remove completeley
|
||||
}
|
||||
|
||||
public String getTag()
|
||||
{
|
||||
if ( ! this.hasFaction())
|
||||
{
|
||||
return "";
|
||||
}
|
||||
return this.getFaction().getTag();
|
||||
}
|
||||
|
||||
// Base concatenations:
|
||||
|
||||
public String getNameAndSomething(String something)
|
||||
{
|
||||
String ret = this.role.getPrefix();
|
||||
if (something.length() > 0) {
|
||||
ret += something+" ";
|
||||
}
|
||||
ret += this.getName();
|
||||
return ret;
|
||||
}
|
||||
|
||||
public String getNameAndTitle()
|
||||
{
|
||||
return this.getNameAndSomething(this.getTitle());
|
||||
}
|
||||
|
||||
public String getNameAndTag()
|
||||
{
|
||||
return this.getNameAndSomething(this.getTag());
|
||||
}
|
||||
|
||||
// Colored concatenations:
|
||||
// These are used in information messages
|
||||
|
||||
public String getNameAndTitle(Faction faction)
|
||||
{
|
||||
return this.getColorTo(faction)+this.getNameAndTitle();
|
||||
}
|
||||
public String getNameAndTitle(FPlayer fplayer)
|
||||
{
|
||||
return this.getColorTo(fplayer)+this.getNameAndTitle();
|
||||
}
|
||||
|
||||
/*public String getNameAndTag(Faction faction)
|
||||
{
|
||||
return this.getRelationColor(faction)+this.getNameAndTag();
|
||||
}
|
||||
public String getNameAndTag(FPlayer fplayer)
|
||||
{
|
||||
return this.getRelationColor(fplayer)+this.getNameAndTag();
|
||||
}*/
|
||||
|
||||
// TODO: REmovded for refactoring.
|
||||
|
||||
/*public String getNameAndRelevant(Faction faction)
|
||||
{
|
||||
// Which relation?
|
||||
Relation rel = this.getRelationTo(faction);
|
||||
|
||||
// For member we show title
|
||||
if (rel == Relation.MEMBER) {
|
||||
return rel.getColor() + this.getNameAndTitle();
|
||||
}
|
||||
|
||||
// For non members we show tag
|
||||
return rel.getColor() + this.getNameAndTag();
|
||||
}
|
||||
public String getNameAndRelevant(FPlayer fplayer)
|
||||
{
|
||||
return getNameAndRelevant(fplayer.getFaction());
|
||||
}*/
|
||||
|
||||
// Chat Tag:
|
||||
// These are injected into the format of global chat messages.
|
||||
|
||||
public String getChatTag()
|
||||
{
|
||||
if ( ! this.hasFaction()) {
|
||||
return "";
|
||||
}
|
||||
|
||||
return String.format(Conf.chatTagFormat, this.role.getPrefix()+this.getTag());
|
||||
}
|
||||
|
||||
// Colored Chat Tag
|
||||
public String getChatTag(Faction faction)
|
||||
{
|
||||
if ( ! this.hasFaction()) {
|
||||
return "";
|
||||
}
|
||||
|
||||
return this.getRelationTo(faction).getColor()+getChatTag();
|
||||
}
|
||||
|
||||
public String getChatTag(FPlayer fplayer)
|
||||
{
|
||||
if ( ! this.hasFaction())
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
return this.getColorTo(fplayer)+getChatTag();
|
||||
}
|
||||
|
||||
// -------------------------------
|
||||
// Relation and relation colors
|
||||
// -------------------------------
|
||||
|
||||
@Override
|
||||
public String describeTo(RelationParticipator that, boolean ucfirst)
|
||||
{
|
||||
return RelationUtil.describeThatToMe(this, that, ucfirst);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String describeTo(RelationParticipator that)
|
||||
{
|
||||
return RelationUtil.describeThatToMe(this, that);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Relation getRelationTo(RelationParticipator rp)
|
||||
{
|
||||
return RelationUtil.getRelationTo(this, rp);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Relation getRelationTo(RelationParticipator rp, boolean ignorePeaceful)
|
||||
{
|
||||
return RelationUtil.getRelationTo(this, rp, ignorePeaceful);
|
||||
}
|
||||
|
||||
public Relation getRelationToLocation()
|
||||
{
|
||||
return Board.getFactionAt(new FLocation(this)).getRelationTo(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChatColor getColorTo(RelationParticipator rp)
|
||||
{
|
||||
return RelationUtil.getColorOfThatToMe(this, rp);
|
||||
}
|
||||
|
||||
//----------------------------------------------//
|
||||
// Health
|
||||
//----------------------------------------------//
|
||||
public void heal(int amnt)
|
||||
{
|
||||
Player player = this.getPlayer();
|
||||
if (player == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
player.setHealth(player.getHealth() + amnt);
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------//
|
||||
// Power
|
||||
//----------------------------------------------//
|
||||
public double getPower()
|
||||
{
|
||||
this.updatePower();
|
||||
return this.power;
|
||||
}
|
||||
|
||||
protected void alterPower(double delta)
|
||||
{
|
||||
this.power += delta;
|
||||
if (this.power > this.getPowerMax())
|
||||
this.power = this.getPowerMax();
|
||||
else if (this.power < this.getPowerMin())
|
||||
this.power = this.getPowerMin();
|
||||
}
|
||||
|
||||
public double getPowerMax()
|
||||
{
|
||||
return Conf.powerPlayerMax + this.powerBoost;
|
||||
}
|
||||
|
||||
public double getPowerMin()
|
||||
{
|
||||
return Conf.powerPlayerMin + this.powerBoost;
|
||||
}
|
||||
|
||||
public int getPowerRounded()
|
||||
{
|
||||
return (int) Math.round(this.getPower());
|
||||
}
|
||||
|
||||
public int getPowerMaxRounded()
|
||||
{
|
||||
return (int) Math.round(this.getPowerMax());
|
||||
}
|
||||
|
||||
public int getPowerMinRounded()
|
||||
{
|
||||
return (int) Math.round(this.getPowerMin());
|
||||
}
|
||||
|
||||
protected void updatePower()
|
||||
{
|
||||
if (this.isOffline())
|
||||
{
|
||||
losePowerFromBeingOffline();
|
||||
if (!Conf.powerRegenOffline)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
long now = System.currentTimeMillis();
|
||||
long millisPassed = now - this.lastPowerUpdateTime;
|
||||
this.lastPowerUpdateTime = now;
|
||||
|
||||
Player thisPlayer = this.getPlayer();
|
||||
if (thisPlayer != null && thisPlayer.isDead()) return; // don't let dead players regain power until they respawn
|
||||
|
||||
int millisPerMinute = 60*1000;
|
||||
this.alterPower(millisPassed * Conf.powerPerMinute / millisPerMinute);
|
||||
}
|
||||
|
||||
protected void losePowerFromBeingOffline()
|
||||
{
|
||||
if (Conf.powerOfflineLossPerDay > 0.0 && this.power > Conf.powerOfflineLossLimit)
|
||||
{
|
||||
long now = System.currentTimeMillis();
|
||||
long millisPassed = now - this.lastPowerUpdateTime;
|
||||
this.lastPowerUpdateTime = now;
|
||||
|
||||
double loss = millisPassed * Conf.powerOfflineLossPerDay / (24*60*60*1000);
|
||||
if (this.power - loss < Conf.powerOfflineLossLimit)
|
||||
{
|
||||
loss = this.power;
|
||||
}
|
||||
this.alterPower(-loss);
|
||||
}
|
||||
}
|
||||
|
||||
public void onDeath()
|
||||
{
|
||||
this.updatePower();
|
||||
this.alterPower(-Conf.powerPerDeath);
|
||||
}
|
||||
|
||||
//----------------------------------------------//
|
||||
// Territory
|
||||
//----------------------------------------------//
|
||||
public boolean isInOwnTerritory()
|
||||
{
|
||||
return Board.getFactionAt(new FLocation(this)) == this.getFaction();
|
||||
}
|
||||
|
||||
public boolean isInOthersTerritory()
|
||||
{
|
||||
Faction factionHere = Board.getFactionAt(new FLocation(this));
|
||||
return factionHere != null && factionHere.isNormal() && factionHere != this.getFaction();
|
||||
}
|
||||
|
||||
public boolean isInAllyTerritory()
|
||||
{
|
||||
return Board.getFactionAt(new FLocation(this)).getRelationTo(this).isAlly();
|
||||
}
|
||||
|
||||
public boolean isInNeutralTerritory()
|
||||
{
|
||||
return Board.getFactionAt(new FLocation(this)).getRelationTo(this).isNeutral();
|
||||
}
|
||||
|
||||
public boolean isInEnemyTerritory()
|
||||
{
|
||||
return Board.getFactionAt(new FLocation(this)).getRelationTo(this).isEnemy();
|
||||
}
|
||||
|
||||
public void sendFactionHereMessage()
|
||||
{
|
||||
if (SpoutFeatures.updateTerritoryDisplay(this))
|
||||
{
|
||||
return;
|
||||
}
|
||||
Faction factionHere = Board.getFactionAt(this.getLastStoodAt());
|
||||
String msg = P.p.txt.parse("<i>")+" ~ "+factionHere.getTag(this);
|
||||
if (factionHere.getDescription().length() > 0)
|
||||
{
|
||||
msg += " - "+factionHere.getDescription();
|
||||
}
|
||||
this.sendMessage(msg);
|
||||
}
|
||||
|
||||
// -------------------------------
|
||||
// Actions
|
||||
// -------------------------------
|
||||
|
||||
public void leave(boolean makePay)
|
||||
{
|
||||
Faction myFaction = this.getFaction();
|
||||
makePay = makePay && Econ.shouldBeUsed() && ! this.isAdminBypassing();
|
||||
|
||||
if (myFaction == null)
|
||||
{
|
||||
resetFactionData();
|
||||
return;
|
||||
}
|
||||
|
||||
boolean perm = myFaction.isPermanent();
|
||||
|
||||
if (!perm && this.getRole() == Role.ADMIN && myFaction.getFPlayers().size() > 1)
|
||||
{
|
||||
msg("<b>You must give the admin role to someone else first.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Conf.canLeaveWithNegativePower && this.getPower() < 0)
|
||||
{
|
||||
msg("<b>You cannot leave until your power is positive.");
|
||||
return;
|
||||
}
|
||||
|
||||
// if economy is enabled and they're not on the bypass list, make sure they can pay
|
||||
if (makePay && ! Econ.hasAtLeast(this, Conf.econCostLeave, "to leave your faction.")) return;
|
||||
|
||||
FPlayerLeaveEvent leaveEvent = new FPlayerLeaveEvent(this,myFaction,FPlayerLeaveEvent.PlayerLeaveReason.LEAVE);
|
||||
Bukkit.getServer().getPluginManager().callEvent(leaveEvent);
|
||||
if (leaveEvent.isCancelled()) return;
|
||||
|
||||
// then make 'em pay (if applicable)
|
||||
if (makePay && ! Econ.modifyMoney(this, -Conf.econCostLeave, "to leave your faction.", "for leaving your faction.")) return;
|
||||
|
||||
// Am I the last one in the faction?
|
||||
if (myFaction.getFPlayers().size() == 1)
|
||||
{
|
||||
// Transfer all money
|
||||
if (Econ.shouldBeUsed())
|
||||
Econ.transferMoney(this, myFaction, this, Econ.getBalance(myFaction.getAccountId()));
|
||||
}
|
||||
|
||||
if (myFaction.isNormal())
|
||||
{
|
||||
for (FPlayer fplayer : myFaction.getFPlayersWhereOnline(true))
|
||||
{
|
||||
fplayer.msg("%s<i> left %s<i>.", this.describeTo(fplayer, true), myFaction.describeTo(fplayer));
|
||||
}
|
||||
|
||||
if (Conf.logFactionLeave)
|
||||
P.p.log(this.getName()+" left the faction: "+myFaction.getTag());
|
||||
}
|
||||
|
||||
this.resetFactionData();
|
||||
|
||||
if (myFaction.isNormal() && !perm && myFaction.getFPlayers().isEmpty())
|
||||
{
|
||||
// Remove this faction
|
||||
for (FPlayer fplayer : FPlayers.i.getOnline())
|
||||
{
|
||||
fplayer.msg("<i>%s<i> was disbanded.", myFaction.describeTo(fplayer, true));
|
||||
}
|
||||
|
||||
myFaction.detach();
|
||||
if (Conf.logFactionDisband)
|
||||
P.p.log("The faction "+myFaction.getTag()+" ("+myFaction.getId()+") was disbanded due to the last player ("+this.getName()+") leaving.");
|
||||
}
|
||||
}
|
||||
|
||||
public boolean canClaimForFaction(Faction forFaction)
|
||||
{
|
||||
if (forFaction.isNone()) return false;
|
||||
|
||||
if
|
||||
(
|
||||
this.isAdminBypassing()
|
||||
|| (forFaction == this.getFaction() && this.getRole().isAtLeast(Role.MODERATOR))
|
||||
|| (forFaction.isSafeZone() && Permission.MANAGE_SAFE_ZONE.has(getPlayer()))
|
||||
|| (forFaction.isWarZone() && Permission.MANAGE_WAR_ZONE.has(getPlayer()))
|
||||
)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean canClaimForFactionAtLocation(Faction forFaction, Location location, boolean notifyFailure)
|
||||
{
|
||||
String error = null;
|
||||
FLocation flocation = new FLocation(location);
|
||||
Faction myFaction = getFaction();
|
||||
Faction currentFaction = Board.getFactionAt(flocation);
|
||||
int ownedLand = forFaction.getLandRounded();
|
||||
|
||||
if (Conf.worldGuardChecking && Worldguard.checkForRegionsInChunk(location))
|
||||
{
|
||||
// Checks for WorldGuard regions in the chunk attempting to be claimed
|
||||
error = P.p.txt.parse("<b>This land is protected");
|
||||
}
|
||||
else if (Conf.worldsNoClaiming.contains(flocation.getWorldName()))
|
||||
{
|
||||
error = P.p.txt.parse("<b>Sorry, this world has land claiming disabled.");
|
||||
}
|
||||
else if (this.isAdminBypassing())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if (forFaction.isSafeZone() && Permission.MANAGE_SAFE_ZONE.has(getPlayer()))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if (forFaction.isWarZone() && Permission.MANAGE_WAR_ZONE.has(getPlayer()))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if (myFaction != forFaction)
|
||||
{
|
||||
error = P.p.txt.parse("<b>You can't claim land for <h>%s<b>.", forFaction.describeTo(this));
|
||||
}
|
||||
else if (forFaction == currentFaction)
|
||||
{
|
||||
error = P.p.txt.parse("%s<i> already own this land.", forFaction.describeTo(this, true));
|
||||
}
|
||||
else if (this.getRole().value < Role.MODERATOR.value)
|
||||
{
|
||||
error = P.p.txt.parse("<b>You must be <h>%s<b> to claim land.", Role.MODERATOR.toString());
|
||||
}
|
||||
else if (forFaction.getFPlayers().size() < Conf.claimsRequireMinFactionMembers)
|
||||
{
|
||||
error = P.p.txt.parse("Factions must have at least <h>%s<b> members to claim land.", Conf.claimsRequireMinFactionMembers);
|
||||
}
|
||||
else if (currentFaction.isSafeZone())
|
||||
{
|
||||
error = P.p.txt.parse("<b>You can not claim a Safe Zone.");
|
||||
}
|
||||
else if (currentFaction.isWarZone())
|
||||
{
|
||||
error = P.p.txt.parse("<b>You can not claim a War Zone.");
|
||||
}
|
||||
else if (ownedLand >= forFaction.getPowerRounded())
|
||||
{
|
||||
error = P.p.txt.parse("<b>You can't claim more land! You need more power!");
|
||||
}
|
||||
else if (Conf.claimedLandsMax != 0 && ownedLand >= Conf.claimedLandsMax && forFaction.isNormal())
|
||||
{
|
||||
error = P.p.txt.parse("<b>Limit reached. You can't claim more land!");
|
||||
}
|
||||
else if (currentFaction.getRelationTo(forFaction) == Relation.ALLY)
|
||||
{
|
||||
error = P.p.txt.parse("<b>You can't claim the land of your allies.");
|
||||
}
|
||||
else if
|
||||
(
|
||||
Conf.claimsMustBeConnected
|
||||
&& ! this.isAdminBypassing()
|
||||
&& myFaction.getLandRoundedInWorld(flocation.getWorldName()) > 0
|
||||
&& !Board.isConnectedLocation(flocation, myFaction)
|
||||
&& (!Conf.claimsCanBeUnconnectedIfOwnedByOtherFaction || !currentFaction.isNormal())
|
||||
)
|
||||
{
|
||||
if (Conf.claimsCanBeUnconnectedIfOwnedByOtherFaction)
|
||||
error = P.p.txt.parse("<b>You can only claim additional land which is connected to your first claim or controlled by another faction!");
|
||||
else
|
||||
error = P.p.txt.parse("<b>You can only claim additional land which is connected to your first claim!");
|
||||
}
|
||||
else if (currentFaction.isNormal())
|
||||
{
|
||||
if (myFaction.isPeaceful())
|
||||
{
|
||||
error = P.p.txt.parse("%s<i> owns this land. Your faction is peaceful, so you cannot claim land from other factions.", currentFaction.getTag(this));
|
||||
}
|
||||
else if (currentFaction.isPeaceful())
|
||||
{
|
||||
error = P.p.txt.parse("%s<i> owns this land, and is a peaceful faction. You cannot claim land from them.", currentFaction.getTag(this));
|
||||
}
|
||||
else if ( ! currentFaction.hasLandInflation())
|
||||
{
|
||||
// TODO more messages WARN current faction most importantly
|
||||
error = P.p.txt.parse("%s<i> owns this land and is strong enough to keep it.", currentFaction.getTag(this));
|
||||
}
|
||||
else if ( ! Board.isBorderLocation(flocation))
|
||||
{
|
||||
error = P.p.txt.parse("<b>You must start claiming land at the border of the territory.");
|
||||
}
|
||||
}
|
||||
|
||||
if (notifyFailure && error != null)
|
||||
{
|
||||
msg(error);
|
||||
}
|
||||
return error == null;
|
||||
}
|
||||
|
||||
public boolean attemptClaim(Faction forFaction, Location location, boolean notifyFailure)
|
||||
{
|
||||
// notifyFailure is false if called by auto-claim; no need to notify on every failure for it
|
||||
// return value is false on failure, true on success
|
||||
|
||||
FLocation flocation = new FLocation(location);
|
||||
Faction currentFaction = Board.getFactionAt(flocation);
|
||||
|
||||
int ownedLand = forFaction.getLandRounded();
|
||||
|
||||
if ( ! this.canClaimForFactionAtLocation(forFaction, location, notifyFailure)) return false;
|
||||
|
||||
// if economy is enabled and they're not on the bypass list, make sure they can pay
|
||||
boolean mustPay = Econ.shouldBeUsed() && ! this.isAdminBypassing() && ! forFaction.isSafeZone() && ! forFaction.isWarZone();
|
||||
double cost = 0.0;
|
||||
EconomyParticipator payee = null;
|
||||
if (mustPay)
|
||||
{
|
||||
cost = Econ.calculateClaimCost(ownedLand, currentFaction.isNormal());
|
||||
|
||||
if (Conf.econClaimUnconnectedFee != 0.0 && forFaction.getLandRoundedInWorld(flocation.getWorldName()) > 0 && !Board.isConnectedLocation(flocation, forFaction))
|
||||
cost += Conf.econClaimUnconnectedFee;
|
||||
|
||||
if(Conf.bankEnabled && Conf.bankFactionPaysLandCosts && this.hasFaction())
|
||||
payee = this.getFaction();
|
||||
else
|
||||
payee = this;
|
||||
|
||||
if ( ! Econ.hasAtLeast(payee, cost, "to claim this land")) return false;
|
||||
}
|
||||
|
||||
LandClaimEvent claimEvent = new LandClaimEvent(flocation, forFaction, this);
|
||||
Bukkit.getServer().getPluginManager().callEvent(claimEvent);
|
||||
if(claimEvent.isCancelled()) return false;
|
||||
|
||||
// then make 'em pay (if applicable)
|
||||
if (mustPay && ! Econ.modifyMoney(payee, -cost, "to claim this land", "for claiming this land")) return false;
|
||||
|
||||
if (LWCFeatures.getEnabled() && forFaction.isNormal() && Conf.onCaptureResetLwcLocks)
|
||||
{
|
||||
LWCFeatures.clearOtherChests(flocation, this.getFaction());
|
||||
}
|
||||
|
||||
// announce success
|
||||
Set<FPlayer> informTheseFPlayers = new HashSet<FPlayer>();
|
||||
informTheseFPlayers.add(this);
|
||||
informTheseFPlayers.addAll(forFaction.getFPlayersWhereOnline(true));
|
||||
for (FPlayer fp : informTheseFPlayers)
|
||||
{
|
||||
fp.msg("<h>%s<i> claimed land for <h>%s<i> from <h>%s<i>.", this.describeTo(fp, true), forFaction.describeTo(fp), currentFaction.describeTo(fp));
|
||||
}
|
||||
|
||||
Board.setFactionAt(forFaction, flocation);
|
||||
SpoutFeatures.updateTerritoryDisplayLoc(flocation);
|
||||
|
||||
if (Conf.logLandClaims)
|
||||
P.p.log(this.getName()+" claimed land at ("+flocation.getCoordString()+") for the faction: "+forFaction.getTag());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// Persistance
|
||||
// -------------------------------------------- //
|
||||
|
||||
@Override
|
||||
public boolean shouldBeSaved()
|
||||
{
|
||||
if (!this.hasFaction() &&
|
||||
(this.getPowerRounded() == this.getPowerMaxRounded() || this.getPowerRounded() == (int) Math.round(Conf.powerPlayerStarting))
|
||||
)
|
||||
return false;
|
||||
return ! this.deleteMe;
|
||||
}
|
||||
|
||||
public void msg(String str, Object... args)
|
||||
{
|
||||
this.sendMessage(P.p.txt.parse(str, args));
|
||||
}
|
||||
}
|
||||
50
src/main/java/com/massivecraft/factions/FPlayers.java
Normal file
50
src/main/java/com/massivecraft/factions/FPlayers.java
Normal file
@@ -0,0 +1,50 @@
|
||||
package com.massivecraft.factions;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentSkipListMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
import org.bukkit.craftbukkit.libs.com.google.gson.reflect.TypeToken;
|
||||
import com.massivecraft.factions.struct.Role;
|
||||
import com.massivecraft.factions.zcore.persist.PlayerEntityCollection;
|
||||
|
||||
public class FPlayers extends PlayerEntityCollection<FPlayer>
|
||||
{
|
||||
public static FPlayers i = new FPlayers();
|
||||
|
||||
P p = P.p;
|
||||
|
||||
private FPlayers()
|
||||
{
|
||||
super
|
||||
(
|
||||
FPlayer.class,
|
||||
new CopyOnWriteArrayList<FPlayer>(),
|
||||
new ConcurrentSkipListMap<String, FPlayer>(String.CASE_INSENSITIVE_ORDER),
|
||||
new File(P.p.getDataFolder(), "players.json"),
|
||||
P.p.gson
|
||||
);
|
||||
|
||||
this.setCreative(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getMapType()
|
||||
{
|
||||
return new TypeToken<Map<String, FPlayer>>(){}.getType();
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
719
src/main/java/com/massivecraft/factions/Faction.java
Normal file
719
src/main/java/com/massivecraft/factions/Faction.java
Normal file
@@ -0,0 +1,719 @@
|
||||
package com.massivecraft.factions;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.massivecraft.factions.iface.EconomyParticipator;
|
||||
import com.massivecraft.factions.iface.RelationParticipator;
|
||||
import com.massivecraft.factions.integration.Econ;
|
||||
import com.massivecraft.factions.integration.LWCFeatures;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
import com.massivecraft.factions.struct.Relation;
|
||||
import com.massivecraft.factions.struct.Role;
|
||||
import com.massivecraft.factions.util.*;
|
||||
import com.massivecraft.factions.zcore.persist.Entity;
|
||||
|
||||
|
||||
public class Faction extends Entity implements EconomyParticipator
|
||||
{
|
||||
// FIELD: relationWish
|
||||
private Map<String, Relation> relationWish;
|
||||
|
||||
// FIELD: claimOwnership
|
||||
private Map<FLocation, Set<String>> claimOwnership = new ConcurrentHashMap<FLocation, Set<String>>();
|
||||
|
||||
// FIELD: fplayers
|
||||
// speedy lookup of players in faction
|
||||
private transient Set<FPlayer> fplayers = new HashSet<FPlayer>();
|
||||
|
||||
// FIELD: invites
|
||||
// Where string is a lowercase player name
|
||||
private Set<String> invites;
|
||||
public void invite(FPlayer fplayer) { this.invites.add(fplayer.getName().toLowerCase()); }
|
||||
public void deinvite(FPlayer fplayer) { this.invites.remove(fplayer.getName().toLowerCase()); }
|
||||
public boolean isInvited(FPlayer fplayer) { return this.invites.contains(fplayer.getName().toLowerCase()); }
|
||||
|
||||
// FIELD: open
|
||||
private boolean open;
|
||||
public boolean getOpen() { return open; }
|
||||
public void setOpen(boolean isOpen) { open = isOpen; }
|
||||
|
||||
// FIELD: peaceful
|
||||
// "peaceful" status can only be set by server admins/moderators/ops, and prevents PvP and land capture to/from the faction
|
||||
private boolean peaceful;
|
||||
public boolean isPeaceful() { return this.peaceful; }
|
||||
public void setPeaceful(boolean isPeaceful) { this.peaceful = isPeaceful; }
|
||||
|
||||
// FIELD: peacefulExplosionsEnabled
|
||||
private boolean peacefulExplosionsEnabled;
|
||||
public void setPeacefulExplosionsEnabled(boolean val) { peacefulExplosionsEnabled = val; }
|
||||
public boolean getPeacefulExplosionsEnabled(){ return this.peacefulExplosionsEnabled; }
|
||||
|
||||
public boolean noExplosionsInTerritory() { return this.peaceful && ! peacefulExplosionsEnabled; }
|
||||
|
||||
// FIELD: permanent
|
||||
// "permanent" status can only be set by server admins/moderators/ops, and allows the faction to remain even with 0 members
|
||||
private boolean permanent;
|
||||
public boolean isPermanent() { return permanent || !this.isNormal(); }
|
||||
public void setPermanent(boolean isPermanent) { permanent = isPermanent; }
|
||||
|
||||
// FIELD: tag
|
||||
private String tag;
|
||||
public String getTag() { return this.tag; }
|
||||
public String getTag(String prefix) { return prefix+this.tag; }
|
||||
public String getTag(Faction otherFaction)
|
||||
{
|
||||
if (otherFaction == null)
|
||||
{
|
||||
return getTag();
|
||||
}
|
||||
return this.getTag(this.getColorTo(otherFaction).toString());
|
||||
}
|
||||
public String getTag(FPlayer otherFplayer) {
|
||||
if (otherFplayer == null)
|
||||
{
|
||||
return getTag();
|
||||
}
|
||||
return this.getTag(this.getColorTo(otherFplayer).toString());
|
||||
}
|
||||
public void setTag(String str)
|
||||
{
|
||||
if (Conf.factionTagForceUpperCase)
|
||||
{
|
||||
str = str.toUpperCase();
|
||||
}
|
||||
this.tag = str;
|
||||
}
|
||||
public String getComparisonTag() { return MiscUtil.getComparisonString(this.tag); }
|
||||
|
||||
// FIELD: description
|
||||
private String description;
|
||||
public String getDescription() { return this.description; }
|
||||
public void setDescription(String value) { this.description = value; }
|
||||
|
||||
// FIELD: home
|
||||
private LazyLocation home;
|
||||
public void setHome(Location home) { this.home = new LazyLocation(home); }
|
||||
public boolean hasHome() { return this.getHome() != null; }
|
||||
public Location getHome()
|
||||
{
|
||||
confirmValidHome();
|
||||
return (this.home != null) ? this.home.getLocation() : null;
|
||||
}
|
||||
public void confirmValidHome()
|
||||
{
|
||||
if (!Conf.homesMustBeInClaimedTerritory || this.home == null || (this.home.getLocation() != null && Board.getFactionAt(new FLocation(this.home.getLocation())) == this))
|
||||
return;
|
||||
|
||||
msg("<b>Your faction home has been un-set since it is no longer in your territory.");
|
||||
this.home = null;
|
||||
}
|
||||
|
||||
// FIELD: lastPlayerLoggedOffTime
|
||||
private transient long lastPlayerLoggedOffTime;
|
||||
|
||||
// FIELD: account (fake field)
|
||||
// Bank functions
|
||||
public double money;
|
||||
public String getAccountId()
|
||||
{
|
||||
String aid = "faction-"+this.getId();
|
||||
|
||||
// We need to override the default money given to players.
|
||||
if ( ! Econ.hasAccount(aid))
|
||||
Econ.setBalance(aid, 0);
|
||||
|
||||
return aid;
|
||||
}
|
||||
|
||||
// FIELD: permanentPower
|
||||
private Integer permanentPower;
|
||||
public Integer getPermanentPower() { return this.permanentPower; }
|
||||
public void setPermanentPower(Integer permanentPower) { this.permanentPower = permanentPower; }
|
||||
public boolean hasPermanentPower() { return this.permanentPower != null; }
|
||||
|
||||
// FIELD: powerBoost
|
||||
// special increase/decrease to default and max power for this faction
|
||||
private double powerBoost;
|
||||
public double getPowerBoost() { return this.powerBoost; }
|
||||
public void setPowerBoost(double powerBoost) { this.powerBoost = powerBoost; }
|
||||
|
||||
|
||||
// -------------------------------------------- //
|
||||
// Construct
|
||||
// -------------------------------------------- //
|
||||
|
||||
public Faction()
|
||||
{
|
||||
this.relationWish = new HashMap<String, Relation>();
|
||||
this.invites = new HashSet<String>();
|
||||
this.open = Conf.newFactionsDefaultOpen;
|
||||
this.tag = "???";
|
||||
this.description = "Default faction description :(";
|
||||
this.lastPlayerLoggedOffTime = 0;
|
||||
this.peaceful = false;
|
||||
this.peacefulExplosionsEnabled = false;
|
||||
this.permanent = false;
|
||||
this.money = 0.0;
|
||||
this.powerBoost = 0.0;
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// Extra Getters And Setters
|
||||
// -------------------------------------------- //
|
||||
|
||||
public boolean noPvPInTerritory() { return isSafeZone() || (peaceful && Conf.peacefulTerritoryDisablePVP); }
|
||||
|
||||
public boolean noMonstersInTerritory() { return isSafeZone() || (peaceful && Conf.peacefulTerritoryDisableMonsters); }
|
||||
|
||||
|
||||
|
||||
// -------------------------------
|
||||
// Understand the types
|
||||
// -------------------------------
|
||||
|
||||
public boolean isNormal()
|
||||
{
|
||||
return ! (this.isNone() || this.isSafeZone() || this.isWarZone());
|
||||
}
|
||||
|
||||
public boolean isNone()
|
||||
{
|
||||
return this.getId().equals("0");
|
||||
}
|
||||
|
||||
public boolean isSafeZone()
|
||||
{
|
||||
return this.getId().equals("-1");
|
||||
}
|
||||
|
||||
public boolean isWarZone()
|
||||
{
|
||||
return this.getId().equals("-2");
|
||||
}
|
||||
|
||||
public boolean isPlayerFreeType()
|
||||
{
|
||||
return this.isSafeZone() || this.isWarZone();
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------
|
||||
// Relation and relation colors
|
||||
// -------------------------------
|
||||
|
||||
@Override
|
||||
public String describeTo(RelationParticipator that, boolean ucfirst)
|
||||
{
|
||||
return RelationUtil.describeThatToMe(this, that, ucfirst);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String describeTo(RelationParticipator that)
|
||||
{
|
||||
return RelationUtil.describeThatToMe(this, that);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Relation getRelationTo(RelationParticipator rp)
|
||||
{
|
||||
return RelationUtil.getRelationTo(this, rp);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Relation getRelationTo(RelationParticipator rp, boolean ignorePeaceful)
|
||||
{
|
||||
return RelationUtil.getRelationTo(this, rp, ignorePeaceful);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChatColor getColorTo(RelationParticipator rp)
|
||||
{
|
||||
return RelationUtil.getColorOfThatToMe(this, rp);
|
||||
}
|
||||
|
||||
public Relation getRelationWish(Faction otherFaction)
|
||||
{
|
||||
if (this.relationWish.containsKey(otherFaction.getId()))
|
||||
{
|
||||
return this.relationWish.get(otherFaction.getId());
|
||||
}
|
||||
return Relation.NEUTRAL;
|
||||
}
|
||||
|
||||
public void setRelationWish(Faction otherFaction, Relation relation)
|
||||
{
|
||||
if (this.relationWish.containsKey(otherFaction.getId()) && relation.equals(Relation.NEUTRAL))
|
||||
{
|
||||
this.relationWish.remove(otherFaction.getId());
|
||||
}
|
||||
else
|
||||
{
|
||||
this.relationWish.put(otherFaction.getId(), relation);
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------//
|
||||
// Power
|
||||
//----------------------------------------------//
|
||||
public double getPower()
|
||||
{
|
||||
if (this.hasPermanentPower())
|
||||
{
|
||||
return this.getPermanentPower();
|
||||
}
|
||||
|
||||
double ret = 0;
|
||||
for (FPlayer fplayer : fplayers)
|
||||
{
|
||||
ret += fplayer.getPower();
|
||||
}
|
||||
if (Conf.powerFactionMax > 0 && ret > Conf.powerFactionMax)
|
||||
{
|
||||
ret = Conf.powerFactionMax;
|
||||
}
|
||||
return ret + this.powerBoost;
|
||||
}
|
||||
|
||||
public double getPowerMax()
|
||||
{
|
||||
if (this.hasPermanentPower())
|
||||
{
|
||||
return this.getPermanentPower();
|
||||
}
|
||||
|
||||
double ret = 0;
|
||||
for (FPlayer fplayer : fplayers)
|
||||
{
|
||||
ret += fplayer.getPowerMax();
|
||||
}
|
||||
if (Conf.powerFactionMax > 0 && ret > Conf.powerFactionMax)
|
||||
{
|
||||
ret = Conf.powerFactionMax;
|
||||
}
|
||||
return ret + this.powerBoost;
|
||||
}
|
||||
|
||||
public int getPowerRounded()
|
||||
{
|
||||
return (int) Math.round(this.getPower());
|
||||
}
|
||||
|
||||
public int getPowerMaxRounded()
|
||||
{
|
||||
return (int) Math.round(this.getPowerMax());
|
||||
}
|
||||
|
||||
public int getLandRounded() {
|
||||
return Board.getFactionCoordCount(this);
|
||||
}
|
||||
|
||||
public int getLandRoundedInWorld(String worldName)
|
||||
{
|
||||
return Board.getFactionCoordCountInWorld(this, worldName);
|
||||
}
|
||||
|
||||
public boolean hasLandInflation()
|
||||
{
|
||||
return this.getLandRounded() > this.getPowerRounded();
|
||||
}
|
||||
|
||||
// -------------------------------
|
||||
// FPlayers
|
||||
// -------------------------------
|
||||
|
||||
// maintain the reference list of FPlayers in this faction
|
||||
public void refreshFPlayers()
|
||||
{
|
||||
fplayers.clear();
|
||||
if (this.isPlayerFreeType()) return;
|
||||
|
||||
for (FPlayer fplayer : FPlayers.i.get())
|
||||
{
|
||||
if (fplayer.getFaction() == this)
|
||||
{
|
||||
fplayers.add(fplayer);
|
||||
}
|
||||
}
|
||||
}
|
||||
protected boolean addFPlayer(FPlayer fplayer)
|
||||
{
|
||||
if (this.isPlayerFreeType()) return false;
|
||||
|
||||
return fplayers.add(fplayer);
|
||||
}
|
||||
protected boolean removeFPlayer(FPlayer fplayer)
|
||||
{
|
||||
if (this.isPlayerFreeType()) return false;
|
||||
|
||||
return fplayers.remove(fplayer);
|
||||
}
|
||||
|
||||
public Set<FPlayer> getFPlayers()
|
||||
{
|
||||
// return a shallow copy of the FPlayer list, to prevent tampering and concurrency issues
|
||||
Set<FPlayer> ret = new HashSet<FPlayer>(fplayers);
|
||||
return ret;
|
||||
}
|
||||
|
||||
public Set<FPlayer> getFPlayersWhereOnline(boolean online)
|
||||
{
|
||||
Set<FPlayer> ret = new HashSet<FPlayer>();
|
||||
|
||||
for (FPlayer fplayer : fplayers)
|
||||
{
|
||||
if (fplayer.isOnline() == online)
|
||||
{
|
||||
ret.add(fplayer);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
public FPlayer getFPlayerAdmin()
|
||||
{
|
||||
if ( ! this.isNormal()) return null;
|
||||
|
||||
for (FPlayer fplayer : fplayers)
|
||||
{
|
||||
if (fplayer.getRole() == Role.ADMIN)
|
||||
{
|
||||
return fplayer;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public ArrayList<FPlayer> getFPlayersWhereRole(Role role)
|
||||
{
|
||||
ArrayList<FPlayer> ret = new ArrayList<FPlayer>();
|
||||
if ( ! this.isNormal()) return ret;
|
||||
|
||||
for (FPlayer fplayer : fplayers)
|
||||
{
|
||||
if (fplayer.getRole() == role)
|
||||
{
|
||||
ret.add(fplayer);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
public ArrayList<Player> getOnlinePlayers()
|
||||
{
|
||||
ArrayList<Player> ret = new ArrayList<Player>();
|
||||
if (this.isPlayerFreeType()) return ret;
|
||||
|
||||
for (Player player: P.p.getServer().getOnlinePlayers())
|
||||
{
|
||||
FPlayer fplayer = FPlayers.i.get(player);
|
||||
if (fplayer.getFaction() == this)
|
||||
{
|
||||
ret.add(player);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// slightly faster check than getOnlinePlayers() if you just want to see if there are any players online
|
||||
public boolean hasPlayersOnline()
|
||||
{
|
||||
// only real factions can have players online, not safe zone / war zone
|
||||
if (this.isPlayerFreeType()) return false;
|
||||
|
||||
for (Player player: P.p.getServer().getOnlinePlayers())
|
||||
{
|
||||
FPlayer fplayer = FPlayers.i.get(player);
|
||||
if (fplayer.getFaction() == this)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// even if all players are technically logged off, maybe someone was on recently enough to not consider them officially offline yet
|
||||
if (Conf.considerFactionsReallyOfflineAfterXMinutes > 0 && System.currentTimeMillis() < lastPlayerLoggedOffTime + (Conf.considerFactionsReallyOfflineAfterXMinutes * 60000))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void memberLoggedOff()
|
||||
{
|
||||
if (this.isNormal())
|
||||
{
|
||||
lastPlayerLoggedOffTime = System.currentTimeMillis();
|
||||
}
|
||||
}
|
||||
|
||||
// used when current leader is about to be removed from the faction; promotes new leader, or disbands faction if no other members left
|
||||
public void promoteNewLeader()
|
||||
{
|
||||
if (! this.isNormal()) return;
|
||||
if (this.isPermanent() && Conf.permanentFactionsDisableLeaderPromotion) return;
|
||||
|
||||
FPlayer oldLeader = this.getFPlayerAdmin();
|
||||
|
||||
// get list of moderators, or list of normal members if there are no moderators
|
||||
ArrayList<FPlayer> replacements = this.getFPlayersWhereRole(Role.MODERATOR);
|
||||
if (replacements == null || replacements.isEmpty())
|
||||
replacements = this.getFPlayersWhereRole(Role.NORMAL);
|
||||
|
||||
if (replacements == null || replacements.isEmpty())
|
||||
{ // faction admin is the only member; one-man faction
|
||||
if (this.isPermanent())
|
||||
{
|
||||
if (oldLeader != null)
|
||||
oldLeader.setRole(Role.NORMAL);
|
||||
return;
|
||||
}
|
||||
|
||||
// no members left and faction isn't permanent, so disband it
|
||||
if (Conf.logFactionDisband)
|
||||
P.p.log("The faction "+this.getTag()+" ("+this.getId()+") has been disbanded since it has no members left.");
|
||||
|
||||
for (FPlayer fplayer : FPlayers.i.getOnline())
|
||||
{
|
||||
fplayer.msg("The faction %s<i> was disbanded.", this.getTag(fplayer));
|
||||
}
|
||||
|
||||
this.detach();
|
||||
}
|
||||
else
|
||||
{ // promote new faction admin
|
||||
if (oldLeader != null)
|
||||
oldLeader.setRole(Role.NORMAL);
|
||||
replacements.get(0).setRole(Role.ADMIN);
|
||||
this.msg("<i>Faction admin <h>%s<i> has been removed. %s<i> has been promoted as the new faction admin.", oldLeader == null ? "" : oldLeader.getName(), replacements.get(0).getName());
|
||||
P.p.log("Faction "+this.getTag()+" ("+this.getId()+") admin was removed. Replacement admin: "+replacements.get(0).getName());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------//
|
||||
// Messages
|
||||
//----------------------------------------------//
|
||||
public void msg(String message, Object... args)
|
||||
{
|
||||
message = P.p.txt.parse(message, args);
|
||||
|
||||
for (FPlayer fplayer : this.getFPlayersWhereOnline(true))
|
||||
{
|
||||
fplayer.sendMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
public void sendMessage(String message)
|
||||
{
|
||||
for (FPlayer fplayer : this.getFPlayersWhereOnline(true))
|
||||
{
|
||||
fplayer.sendMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
public void sendMessage(List<String> messages)
|
||||
{
|
||||
for (FPlayer fplayer : this.getFPlayersWhereOnline(true))
|
||||
{
|
||||
fplayer.sendMessage(messages);
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------//
|
||||
// Ownership of specific claims
|
||||
//----------------------------------------------//
|
||||
|
||||
public void clearAllClaimOwnership()
|
||||
{
|
||||
claimOwnership.clear();
|
||||
}
|
||||
|
||||
public void clearClaimOwnership(FLocation loc)
|
||||
{
|
||||
if(Conf.onUnclaimResetLwcLocks && LWCFeatures.getEnabled())
|
||||
{
|
||||
LWCFeatures.clearAllChests(loc);
|
||||
}
|
||||
claimOwnership.remove(loc);
|
||||
}
|
||||
|
||||
public void clearClaimOwnership(String playerName)
|
||||
{
|
||||
if (playerName == null || playerName.isEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Set<String> ownerData;
|
||||
String player = playerName.toLowerCase();
|
||||
|
||||
for (Entry<FLocation, Set<String>> entry : claimOwnership.entrySet())
|
||||
{
|
||||
ownerData = entry.getValue();
|
||||
|
||||
if (ownerData == null) continue;
|
||||
|
||||
Iterator<String> iter = ownerData.iterator();
|
||||
while (iter.hasNext())
|
||||
{
|
||||
if (iter.next().equals(player))
|
||||
{
|
||||
iter.remove();
|
||||
}
|
||||
}
|
||||
|
||||
if (ownerData.isEmpty())
|
||||
{
|
||||
if(Conf.onUnclaimResetLwcLocks && LWCFeatures.getEnabled())
|
||||
{
|
||||
LWCFeatures.clearAllChests(entry.getKey());
|
||||
}
|
||||
claimOwnership.remove(entry.getKey());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int getCountOfClaimsWithOwners()
|
||||
{
|
||||
return claimOwnership.isEmpty() ? 0 : claimOwnership.size();
|
||||
}
|
||||
|
||||
public boolean doesLocationHaveOwnersSet(FLocation loc)
|
||||
{
|
||||
if (claimOwnership.isEmpty() || !claimOwnership.containsKey(loc))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Set<String> ownerData = claimOwnership.get(loc);
|
||||
return ownerData != null && !ownerData.isEmpty();
|
||||
}
|
||||
|
||||
public boolean isPlayerInOwnerList(String playerName, FLocation loc)
|
||||
{
|
||||
if (claimOwnership.isEmpty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
Set<String> ownerData = claimOwnership.get(loc);
|
||||
if (ownerData == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (ownerData.contains(playerName.toLowerCase()))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public void setPlayerAsOwner(String playerName, FLocation loc)
|
||||
{
|
||||
Set<String> ownerData = claimOwnership.get(loc);
|
||||
if (ownerData == null)
|
||||
{
|
||||
ownerData = new HashSet<String>();
|
||||
}
|
||||
ownerData.add(playerName.toLowerCase());
|
||||
claimOwnership.put(loc, ownerData);
|
||||
}
|
||||
|
||||
public void removePlayerAsOwner(String playerName, FLocation loc)
|
||||
{
|
||||
Set<String> ownerData = claimOwnership.get(loc);
|
||||
if (ownerData == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
ownerData.remove(playerName.toLowerCase());
|
||||
claimOwnership.put(loc, ownerData);
|
||||
}
|
||||
|
||||
public Set<String> getOwnerList(FLocation loc)
|
||||
{
|
||||
return claimOwnership.get(loc);
|
||||
}
|
||||
|
||||
public String getOwnerListString(FLocation loc)
|
||||
{
|
||||
Set<String> ownerData = claimOwnership.get(loc);
|
||||
if (ownerData == null || ownerData.isEmpty())
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
String ownerList = "";
|
||||
|
||||
Iterator<String> iter = ownerData.iterator();
|
||||
while (iter.hasNext()) {
|
||||
if (!ownerList.isEmpty())
|
||||
{
|
||||
ownerList += ", ";
|
||||
}
|
||||
ownerList += iter.next();
|
||||
}
|
||||
return ownerList;
|
||||
}
|
||||
|
||||
public boolean playerHasOwnershipRights(FPlayer fplayer, FLocation loc)
|
||||
{
|
||||
// in own faction, with sufficient role or permission to bypass ownership?
|
||||
if
|
||||
(
|
||||
fplayer.getFaction() == this
|
||||
&&
|
||||
(
|
||||
fplayer.getRole().isAtLeast(Conf.ownedAreaModeratorsBypass ? Role.MODERATOR : Role.ADMIN)
|
||||
||
|
||||
Permission.OWNERSHIP_BYPASS.has(fplayer.getPlayer())
|
||||
)
|
||||
)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// make sure claimOwnership is initialized
|
||||
if (claimOwnership.isEmpty())
|
||||
return true;
|
||||
|
||||
// need to check the ownership list, then
|
||||
Set<String> ownerData = claimOwnership.get(loc);
|
||||
|
||||
// if no owner list, owner list is empty, or player is in owner list, they're allowed
|
||||
if (ownerData == null || ownerData.isEmpty() || ownerData.contains(fplayer.getName().toLowerCase()))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------//
|
||||
// Persistance and entity management
|
||||
//----------------------------------------------//
|
||||
|
||||
|
||||
@Override
|
||||
public void postDetach()
|
||||
{
|
||||
if (Econ.shouldBeUsed())
|
||||
{
|
||||
Econ.setBalance(getAccountId(), 0);
|
||||
}
|
||||
|
||||
// Clean the board
|
||||
Board.clean();
|
||||
|
||||
// Clean the fplayers
|
||||
FPlayers.i.clean();
|
||||
}
|
||||
}
|
||||
189
src/main/java/com/massivecraft/factions/Factions.java
Normal file
189
src/main/java/com/massivecraft/factions/Factions.java
Normal file
@@ -0,0 +1,189 @@
|
||||
package com.massivecraft.factions;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
|
||||
import org.bukkit.craftbukkit.libs.com.google.gson.reflect.TypeToken;
|
||||
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>
|
||||
{
|
||||
public static Factions i = new Factions();
|
||||
|
||||
P p = P.p;
|
||||
|
||||
private Factions()
|
||||
{
|
||||
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
|
||||
for (Faction faction : i.get())
|
||||
{
|
||||
faction.refreshFPlayers();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------//
|
||||
// GET
|
||||
//----------------------------------------------//
|
||||
|
||||
@Override
|
||||
public Faction get(String id)
|
||||
{
|
||||
if ( ! this.exists(id))
|
||||
{
|
||||
p.log(Level.WARNING, "Non existing factionId "+id+" requested! Issuing cleaning!");
|
||||
Board.clean();
|
||||
FPlayers.i.clean();
|
||||
}
|
||||
|
||||
return super.get(id);
|
||||
}
|
||||
|
||||
public Faction getNone()
|
||||
{
|
||||
return this.get("0");
|
||||
}
|
||||
|
||||
public Faction getSafeZone()
|
||||
{
|
||||
return this.get("-1");
|
||||
}
|
||||
|
||||
public Faction getWarZone()
|
||||
{
|
||||
return this.get("-2");
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------//
|
||||
// Faction tag
|
||||
//----------------------------------------------//
|
||||
|
||||
public static ArrayList<String> validateTag(String str)
|
||||
{
|
||||
ArrayList<String> errors = new ArrayList<String>();
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
if(str.length() > Conf.factionTagLengthMax)
|
||||
{
|
||||
errors.add(P.p.txt.parse("<i>The faction tag can't be longer than <h>%s<i> chars.", Conf.factionTagLengthMax));
|
||||
}
|
||||
|
||||
for (char c : str.toCharArray())
|
||||
{
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
return errors;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
369
src/main/java/com/massivecraft/factions/P.java
Normal file
369
src/main/java/com/massivecraft/factions/P.java
Normal file
@@ -0,0 +1,369 @@
|
||||
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.FCmdRoot;
|
||||
import com.massivecraft.factions.integration.Econ;
|
||||
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.listeners.FactionsBlockListener;
|
||||
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.util.AutoLeaveTask;
|
||||
import com.massivecraft.factions.util.LazyLocation;
|
||||
import com.massivecraft.factions.util.MapFLocToStringSetTypeAdapter;
|
||||
import com.massivecraft.factions.util.MyLocationTypeAdapter;
|
||||
import com.massivecraft.factions.zcore.MPlugin;
|
||||
import com.massivecraft.factions.zcore.util.TextUtil;
|
||||
|
||||
import java.util.logging.Level;
|
||||
import org.bukkit.craftbukkit.libs.com.google.gson.GsonBuilder;
|
||||
import org.bukkit.craftbukkit.libs.com.google.gson.reflect.TypeToken;
|
||||
|
||||
|
||||
public class P extends MPlugin
|
||||
{
|
||||
// Our single plugin instance
|
||||
public static P p;
|
||||
|
||||
// Listeners
|
||||
public final FactionsPlayerListener playerListener;
|
||||
public final FactionsChatListener chatListener;
|
||||
public final FactionsEntityListener entityListener;
|
||||
public final FactionsExploitListener exploitListener;
|
||||
public final FactionsBlockListener blockListener;
|
||||
public final FactionsServerListener serverListener;
|
||||
|
||||
// Persistance related
|
||||
private boolean locked = false;
|
||||
public boolean getLocked() {return this.locked;}
|
||||
public void setLocked(boolean val) {this.locked = val; this.setAutoSave(val);}
|
||||
private Integer AutoLeaveTask = null;
|
||||
|
||||
// Commands
|
||||
public FCmdRoot cmdBase;
|
||||
public CmdAutoHelp cmdAutoHelp;
|
||||
|
||||
public P()
|
||||
{
|
||||
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
|
||||
public void onEnable()
|
||||
{
|
||||
// bit of (apparently absolutely necessary) idiot-proofing for CB version support due to changed GSON lib package name
|
||||
try
|
||||
{
|
||||
Class.forName("org.bukkit.craftbukkit.libs.com.google.gson.reflect.TypeToken");
|
||||
}
|
||||
catch (ClassNotFoundException ex)
|
||||
{
|
||||
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;
|
||||
this.loadSuccessful = false;
|
||||
|
||||
// Load Conf from disk
|
||||
Conf.load();
|
||||
FPlayers.i.loadFromDisc();
|
||||
Factions.i.loadFromDisc();
|
||||
Board.load();
|
||||
|
||||
// Add Base Commands
|
||||
this.cmdBase = new FCmdRoot();
|
||||
this.cmdAutoHelp = new CmdAutoHelp();
|
||||
this.getBaseCommands().add(cmdBase);
|
||||
|
||||
EssentialsFeatures.setup();
|
||||
SpoutFeatures.setup();
|
||||
Econ.setup();
|
||||
CapiFeatures.setup();
|
||||
LWCFeatures.setup();
|
||||
|
||||
if(Conf.worldGuardChecking || Conf.worldGuardBuildPriority)
|
||||
{
|
||||
Worldguard.init(this);
|
||||
}
|
||||
|
||||
// start up task which runs the autoLeaveAfterDaysOfInactivity routine
|
||||
startAutoLeaveTask(false);
|
||||
|
||||
// Register Event Handlers
|
||||
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);
|
||||
|
||||
// since some other plugins execute commands directly through this command interface, provide it
|
||||
this.getCommand(this.refCommand).setExecutor(this);
|
||||
|
||||
postEnable();
|
||||
this.loadSuccessful = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GsonBuilder getGsonBuilder()
|
||||
{
|
||||
Type mapFLocToStringSetType = new TypeToken<Map<FLocation, Set<String>>>(){}.getType();
|
||||
|
||||
return new GsonBuilder()
|
||||
.setPrettyPrinting()
|
||||
.disableHtmlEscaping()
|
||||
.excludeFieldsWithModifiers(Modifier.TRANSIENT, Modifier.VOLATILE)
|
||||
.registerTypeAdapter(LazyLocation.class, new MyLocationTypeAdapter())
|
||||
.registerTypeAdapter(mapFLocToStringSetType, new MapFLocToStringSetTypeAdapter());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable()
|
||||
{
|
||||
// only save data if plugin actually completely loaded successfully
|
||||
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)
|
||||
{
|
||||
if (AutoLeaveTask != null)
|
||||
{
|
||||
if ( ! restartIfRunning) return;
|
||||
this.getServer().getScheduler().cancelTask(AutoLeaveTask);
|
||||
}
|
||||
|
||||
if (Conf.autoLeaveRoutineRunsEveryXMinutes > 0.0)
|
||||
{
|
||||
long ticks = (long)(20 * 60 * Conf.autoLeaveRoutineRunsEveryXMinutes);
|
||||
AutoLeaveTask = getServer().getScheduler().scheduleSyncRepeatingTask(this, new AutoLeaveTask(), ticks, ticks);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postAutoSave()
|
||||
{
|
||||
Board.save();
|
||||
Conf.save();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean logPlayerCommands()
|
||||
{
|
||||
return Conf.logPlayerCommands;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean handleCommand(CommandSender sender, String commandString, boolean testOnly)
|
||||
{
|
||||
if (sender instanceof Player && FactionsPlayerListener.preventCommand(commandString, (Player)sender)) return true;
|
||||
|
||||
return super.handleCommand(sender, commandString, testOnly);
|
||||
}
|
||||
|
||||
@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
|
||||
public int hookSupportVersion()
|
||||
{
|
||||
return 3;
|
||||
}
|
||||
|
||||
// If another plugin is handling insertion of chat tags, this should be used to notify Factions
|
||||
public void handleFactionTagExternally(boolean notByFactions)
|
||||
{
|
||||
Conf.chatTagHandledByAnotherPlugin = notByFactions;
|
||||
}
|
||||
|
||||
// Simply put, should this chat event be left for Factions to handle? For now, that means players with Faction Chat
|
||||
// enabled or use of the Factions f command without a slash; combination of isPlayerFactionChatting() and isFactionsCommand()
|
||||
|
||||
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,
|
||||
// local chat, or anything else which targets individual recipients, so Faction Chat can be done
|
||||
public boolean isPlayerFactionChatting(Player player)
|
||||
{
|
||||
if (player == null) return false;
|
||||
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?
|
||||
|
||||
// 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
|
||||
public String getPlayerFactionTag(Player player)
|
||||
{
|
||||
return getPlayerFactionTagRelation(player, null);
|
||||
}
|
||||
|
||||
// Same as above, but with relation (enemy/neutral/ally) coloring potentially added to the tag
|
||||
public String getPlayerFactionTagRelation(Player speaker, Player listener)
|
||||
{
|
||||
String tag = "~";
|
||||
|
||||
if (speaker == null)
|
||||
return tag;
|
||||
|
||||
FPlayer me = FPlayers.i.get(speaker);
|
||||
if (me == null)
|
||||
return tag;
|
||||
|
||||
// if listener isn't set, or config option is disabled, give back uncolored tag
|
||||
if (listener == null || !Conf.chatTagRelationColored) {
|
||||
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 tag;
|
||||
}
|
||||
|
||||
// Get a player's title within their faction, mainly for usage by chat plugins for local/channel chat
|
||||
public String getPlayerTitle(Player player)
|
||||
{
|
||||
if (player == null)
|
||||
return "";
|
||||
|
||||
FPlayer me = FPlayers.i.get(player);
|
||||
if (me == null)
|
||||
return "";
|
||||
|
||||
return me.getTitle().trim();
|
||||
}
|
||||
|
||||
// Get a list of all faction tags (names)
|
||||
public Set<String> getFactionTags()
|
||||
{
|
||||
Set<String> tags = new HashSet<String>();
|
||||
for (Faction faction : Factions.i.get())
|
||||
{
|
||||
tags.add(faction.getTag());
|
||||
}
|
||||
return tags;
|
||||
}
|
||||
|
||||
// Get a list of all players in the specified faction
|
||||
public Set<String> getPlayersInFaction(String factionTag)
|
||||
{
|
||||
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
|
||||
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
|
||||
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);
|
||||
}
|
||||
}
|
||||
90
src/main/java/com/massivecraft/factions/cmd/CmdAdmin.java
Normal file
90
src/main/java/com/massivecraft/factions/cmd/CmdAdmin.java
Normal file
@@ -0,0 +1,90 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import com.massivecraft.factions.FPlayers;
|
||||
import com.massivecraft.factions.event.FPlayerJoinEvent;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
import com.massivecraft.factions.struct.Role;
|
||||
|
||||
public class CmdAdmin extends FCommand
|
||||
{
|
||||
public CmdAdmin()
|
||||
{
|
||||
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);
|
||||
Faction targetFaction = fyou.getFaction();
|
||||
|
||||
if (targetFaction != myFaction && !permAny)
|
||||
{
|
||||
msg("%s<i> is not a member in your faction.", fyou.describeTo(fme, true));
|
||||
return;
|
||||
}
|
||||
|
||||
if (fme != null && fme.getRole() != Role.ADMIN && !permAny)
|
||||
{
|
||||
msg("<b>You are not the faction admin.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (fyou == fme && !permAny)
|
||||
{
|
||||
msg("<b>The target player musn't be yourself.");
|
||||
return;
|
||||
}
|
||||
|
||||
// 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));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
import com.massivecraft.factions.struct.Role;
|
||||
|
||||
public class CmdAutoClaim extends FCommand
|
||||
{
|
||||
public CmdAutoClaim()
|
||||
{
|
||||
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
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
48
src/main/java/com/massivecraft/factions/cmd/CmdAutoHelp.java
Normal file
48
src/main/java/com/massivecraft/factions/cmd/CmdAutoHelp.java
Normal file
@@ -0,0 +1,48 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.massivecraft.factions.P;
|
||||
import com.massivecraft.factions.zcore.CommandVisibility;
|
||||
import com.massivecraft.factions.zcore.MCommand;
|
||||
|
||||
public class CmdAutoHelp extends MCommand<P>
|
||||
{
|
||||
public CmdAutoHelp()
|
||||
{
|
||||
super(P.p);
|
||||
this.aliases.add("?");
|
||||
this.aliases.add("h");
|
||||
this.aliases.add("help");
|
||||
|
||||
this.setHelpShort("");
|
||||
|
||||
this.optionalArgs.put("page","1");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void perform()
|
||||
{
|
||||
if (this.commandChain.size() == 0) return;
|
||||
MCommand<?> pcmd = this.commandChain.get(this.commandChain.size()-1);
|
||||
|
||||
ArrayList<String> lines = new ArrayList<String>();
|
||||
|
||||
lines.addAll(pcmd.helpLong);
|
||||
|
||||
for(MCommand<?> scmd : pcmd.subCommands)
|
||||
{
|
||||
if
|
||||
(
|
||||
scmd.visibility == CommandVisibility.VISIBLE
|
||||
||
|
||||
(scmd.visibility == CommandVisibility.SECRET && scmd.validSenderPermissions(sender, false))
|
||||
)
|
||||
{
|
||||
lines.add(scmd.getUseageTemplate(this.commandChain, true));
|
||||
}
|
||||
}
|
||||
|
||||
sendMessage(p.txt.getPage(lines, this.argAsInt(0, 1), "Help for command \""+pcmd.aliases.get(0)+"\""));
|
||||
}
|
||||
}
|
||||
44
src/main/java/com/massivecraft/factions/cmd/CmdBoom.java
Normal file
44
src/main/java/com/massivecraft/factions/cmd/CmdBoom.java
Normal file
@@ -0,0 +1,44 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
public class CmdBoom extends FCommand
|
||||
{
|
||||
public CmdBoom()
|
||||
{
|
||||
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
|
||||
public void perform()
|
||||
{
|
||||
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
|
||||
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));
|
||||
}
|
||||
}
|
||||
42
src/main/java/com/massivecraft/factions/cmd/CmdBypass.java
Normal file
42
src/main/java/com/massivecraft/factions/cmd/CmdBypass.java
Normal file
@@ -0,0 +1,42 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.P;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
public class CmdBypass extends FCommand
|
||||
{
|
||||
public CmdBypass()
|
||||
{
|
||||
super();
|
||||
this.aliases.add("bypass");
|
||||
|
||||
//this.requiredArgs.add("");
|
||||
this.optionalArgs.put("on/off", "flip");
|
||||
|
||||
this.permission = Permission.BYPASS.node;
|
||||
this.disableOnLock = false;
|
||||
|
||||
senderMustBePlayer = true;
|
||||
senderMustBeMember = false;
|
||||
senderMustBeModerator = false;
|
||||
senderMustBeAdmin = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void perform()
|
||||
{
|
||||
fme.setIsAdminBypassing(this.argAsBool(0, ! fme.isAdminBypassing()));
|
||||
|
||||
// TODO: Move this to a transient field in the model??
|
||||
if ( fme.isAdminBypassing())
|
||||
{
|
||||
fme.msg("<i>You have enabled admin bypass mode. You will be able to build or destroy anywhere.");
|
||||
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.");
|
||||
}
|
||||
}
|
||||
}
|
||||
77
src/main/java/com/massivecraft/factions/cmd/CmdChat.java
Normal file
77
src/main/java/com/massivecraft/factions/cmd/CmdChat.java
Normal file
@@ -0,0 +1,77 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.struct.ChatMode;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
public class CmdChat extends FCommand
|
||||
{
|
||||
|
||||
public CmdChat()
|
||||
{
|
||||
super();
|
||||
this.aliases.add("c");
|
||||
this.aliases.add("chat");
|
||||
|
||||
//this.requiredArgs.add("");
|
||||
this.optionalArgs.put("mode", "next");
|
||||
|
||||
this.permission = Permission.CHAT.node;
|
||||
this.disableOnLock = false;
|
||||
|
||||
senderMustBePlayer = true;
|
||||
senderMustBeMember = true;
|
||||
senderMustBeModerator = false;
|
||||
senderMustBeAdmin = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void perform()
|
||||
{
|
||||
if ( ! Conf.factionOnlyChat )
|
||||
{
|
||||
msg("<b>The built in chat chat channels are disabled on this server.");
|
||||
return;
|
||||
}
|
||||
|
||||
String modeString = this.argAsString(0);
|
||||
ChatMode modeTarget = fme.getChatMode().getNext();
|
||||
|
||||
if (modeString != null)
|
||||
{
|
||||
modeString.toLowerCase();
|
||||
if(modeString.startsWith("p"))
|
||||
{
|
||||
modeTarget = ChatMode.PUBLIC;
|
||||
}
|
||||
else if (modeString.startsWith("a"))
|
||||
{
|
||||
modeTarget = ChatMode.ALLIANCE;
|
||||
}
|
||||
else if(modeString.startsWith("f"))
|
||||
{
|
||||
modeTarget = ChatMode.FACTION;
|
||||
}
|
||||
else
|
||||
{
|
||||
msg("<b>Unrecognised chat mode. <i>Please enter either 'a','f' or 'p'");
|
||||
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.");
|
||||
}
|
||||
}
|
||||
}
|
||||
40
src/main/java/com/massivecraft/factions/cmd/CmdChatSpy.java
Normal file
40
src/main/java/com/massivecraft/factions/cmd/CmdChatSpy.java
Normal file
@@ -0,0 +1,40 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.P;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
public class CmdChatSpy extends FCommand
|
||||
{
|
||||
public CmdChatSpy()
|
||||
{
|
||||
super();
|
||||
this.aliases.add("chatspy");
|
||||
|
||||
this.optionalArgs.put("on/off", "flip");
|
||||
|
||||
this.permission = Permission.CHATSPY.node;
|
||||
this.disableOnLock = false;
|
||||
|
||||
senderMustBePlayer = true;
|
||||
senderMustBeMember = false;
|
||||
senderMustBeModerator = false;
|
||||
senderMustBeAdmin = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void perform()
|
||||
{
|
||||
fme.setSpyingChat(this.argAsBool(0, ! fme.isSpyingChat()));
|
||||
|
||||
if ( fme.isSpyingChat())
|
||||
{
|
||||
fme.msg("<i>You have enabled chat spying mode.");
|
||||
P.p.log(fme.getName() + " has ENABLED chat spying mode.");
|
||||
}
|
||||
else
|
||||
{
|
||||
fme.msg("<i>You have disabled chat spying mode.");
|
||||
P.p.log(fme.getName() + " DISABLED chat spying mode.");
|
||||
}
|
||||
}
|
||||
}
|
||||
81
src/main/java/com/massivecraft/factions/cmd/CmdClaim.java
Normal file
81
src/main/java/com/massivecraft/factions/cmd/CmdClaim.java
Normal file
@@ -0,0 +1,81 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.FLocation;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
import com.massivecraft.factions.util.SpiralTask;
|
||||
|
||||
|
||||
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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
302
src/main/java/com/massivecraft/factions/cmd/CmdConfig.java
Normal file
302
src/main/java/com/massivecraft/factions/cmd/CmdConfig.java
Normal file
@@ -0,0 +1,302 @@
|
||||
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.P;
|
||||
import com.massivecraft.factions.integration.SpoutFeatures;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
public class CmdConfig extends FCommand
|
||||
{
|
||||
private static HashMap<String, String> properFieldNames = new HashMap<String, String>();
|
||||
|
||||
public CmdConfig()
|
||||
{
|
||||
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 void perform()
|
||||
{
|
||||
// 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();
|
||||
if (field.startsWith("\"") && field.endsWith("\""))
|
||||
{
|
||||
field = field.substring(1, field.length() - 1);
|
||||
}
|
||||
String fieldName = properFieldNames.get(field);
|
||||
|
||||
if (fieldName == null || fieldName.isEmpty())
|
||||
{
|
||||
msg("<b>No configuration setting \"<h>%s<b>\" exists.", field);
|
||||
return;
|
||||
}
|
||||
|
||||
String success = "";
|
||||
|
||||
String value = args.get(1);
|
||||
for(int i = 2; i < args.size(); i++)
|
||||
{
|
||||
value += ' ' + args.get(i);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
Field target = Conf.class.getField(fieldName);
|
||||
|
||||
// boolean
|
||||
if (target.getType() == boolean.class)
|
||||
{
|
||||
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
|
||||
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
|
||||
else if (target.getType() == long.class)
|
||||
{
|
||||
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
|
||||
else if (target.getType() == double.class)
|
||||
{
|
||||
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
|
||||
else if (target.getType() == float.class)
|
||||
{
|
||||
try
|
||||
{
|
||||
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
|
||||
else if (target.getType() == String.class)
|
||||
{
|
||||
target.set(null, value);
|
||||
success = "\""+fieldName+"\" option set to \""+value+"\".";
|
||||
}
|
||||
|
||||
// ChatColor
|
||||
else if (target.getType() == ChatColor.class)
|
||||
{
|
||||
ChatColor newColor = null;
|
||||
try
|
||||
{
|
||||
newColor = ChatColor.valueOf(value.toUpperCase());
|
||||
}
|
||||
catch (IllegalArgumentException ex)
|
||||
{
|
||||
|
||||
}
|
||||
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
|
||||
else if (target.getGenericType() instanceof ParameterizedType)
|
||||
{
|
||||
ParameterizedType targSet = (ParameterizedType)target.getGenericType();
|
||||
Type innerType = targSet.getActualTypeArguments()[0];
|
||||
|
||||
// not a Set, somehow, and that should be the only collection we're using in Conf.java
|
||||
if (targSet.getRawType() != Set.class)
|
||||
{
|
||||
sendMessage("\""+fieldName+"\" is not a data collection type which can be modified with this command.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Set<Material>
|
||||
else if (innerType == Material.class)
|
||||
{
|
||||
Material newMat = null;
|
||||
try
|
||||
{
|
||||
newMat = Material.valueOf(value.toUpperCase());
|
||||
}
|
||||
catch (IllegalArgumentException ex)
|
||||
{
|
||||
|
||||
}
|
||||
if (newMat == null)
|
||||
{
|
||||
sendMessage("Cannot change \""+fieldName+"\" set: \""+value.toUpperCase()+"\" is not a valid material.");
|
||||
return;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
Set<Material> matSet = (Set<Material>)target.get(null);
|
||||
|
||||
// Material already present, so remove it
|
||||
if (matSet.contains(newMat))
|
||||
{
|
||||
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();
|
||||
}
|
||||
|
||||
}
|
||||
105
src/main/java/com/massivecraft/factions/cmd/CmdCreate.java
Normal file
105
src/main/java/com/massivecraft/factions/cmd/CmdCreate.java
Normal file
@@ -0,0 +1,105 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
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.FactionCreateEvent;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
import com.massivecraft.factions.struct.Role;
|
||||
|
||||
|
||||
public class CmdCreate extends FCommand
|
||||
{
|
||||
public CmdCreate()
|
||||
{
|
||||
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
|
||||
if ( ! canAffordCommand(Conf.econCostCreate, "to create a new faction")) return;
|
||||
|
||||
// trigger the faction creation event (cancellable)
|
||||
FactionCreateEvent createEvent = new FactionCreateEvent(me, tag);
|
||||
Bukkit.getServer().getPluginManager().callEvent(createEvent);
|
||||
if(createEvent.isCancelled()) return;
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
}
|
||||
47
src/main/java/com/massivecraft/factions/cmd/CmdDeinvite.java
Normal file
47
src/main/java/com/massivecraft/factions/cmd/CmdDeinvite.java
Normal file
@@ -0,0 +1,47 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
public class CmdDeinvite extends FCommand
|
||||
{
|
||||
|
||||
public CmdDeinvite()
|
||||
{
|
||||
super();
|
||||
this.aliases.add("deinvite");
|
||||
this.aliases.add("deinv");
|
||||
|
||||
this.requiredArgs.add("player name");
|
||||
//this.optionalArgs.put("", "");
|
||||
|
||||
this.permission = Permission.DEINVITE.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: %s", p.cmdBase.cmdKick.getUseageTemplate(false));
|
||||
return;
|
||||
}
|
||||
|
||||
myFaction.deinvite(you);
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import com.massivecraft.factions.FPlayers;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
import com.massivecraft.factions.zcore.util.TextUtil;
|
||||
|
||||
public class CmdDescription extends FCommand
|
||||
{
|
||||
public CmdDescription()
|
||||
{
|
||||
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
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
113
src/main/java/com/massivecraft/factions/cmd/CmdDisband.java
Normal file
113
src/main/java/com/massivecraft/factions/cmd/CmdDisband.java
Normal file
@@ -0,0 +1,113 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.event.FPlayerLeaveEvent;
|
||||
import com.massivecraft.factions.event.FactionDisbandEvent;
|
||||
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.struct.Permission;
|
||||
import com.massivecraft.factions.struct.Role;
|
||||
|
||||
|
||||
public class CmdDisband extends FCommand
|
||||
{
|
||||
public CmdDisband()
|
||||
{
|
||||
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())
|
||||
{
|
||||
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();
|
||||
}
|
||||
}
|
||||
190
src/main/java/com/massivecraft/factions/cmd/CmdHelp.java
Normal file
190
src/main/java/com/massivecraft/factions/cmd/CmdHelp.java
Normal file
@@ -0,0 +1,190 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.P;
|
||||
import com.massivecraft.factions.integration.Econ;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
|
||||
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>();
|
||||
pageLines.add( p.cmdBase.cmdHelp.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdList.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdShow.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdPower.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdJoin.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdLeave.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdChat.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdHome.getUseageTemplate(true) );
|
||||
pageLines.add( p.txt.parse("<i>Learn how to create a faction on the next page.") );
|
||||
helpPages.add(pageLines);
|
||||
|
||||
pageLines = new ArrayList<String>();
|
||||
pageLines.add( p.cmdBase.cmdCreate.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdDescription.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdTag.getUseageTemplate(true) );
|
||||
pageLines.add( p.txt.parse("<i>You might want to close it and use invitations:" ));
|
||||
pageLines.add( p.cmdBase.cmdOpen.getUseageTemplate(true) );
|
||||
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:" ));
|
||||
pageLines.add( p.cmdBase.cmdSethome.getUseageTemplate(true) );
|
||||
helpPages.add(pageLines);
|
||||
|
||||
if (Econ.isSetup() && Conf.econEnabled && Conf.bankEnabled)
|
||||
{
|
||||
pageLines = new ArrayList<String>();
|
||||
pageLines.add( "" );
|
||||
pageLines.add( p.txt.parse("<i>Your faction has a bank which is used to pay for certain" ));
|
||||
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." ));
|
||||
pageLines.add( "" );
|
||||
pageLines.add( p.cmdBase.cmdMoney.getUseageTemplate(true) );
|
||||
pageLines.add( "" );
|
||||
pageLines.add( "" );
|
||||
pageLines.add( "" );
|
||||
helpPages.add(pageLines);
|
||||
}
|
||||
|
||||
pageLines = new ArrayList<String>();
|
||||
pageLines.add( p.cmdBase.cmdClaim.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdAutoClaim.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdUnclaim.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdUnclaimall.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdKick.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdMod.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdAdmin.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdTitle.getUseageTemplate(true) );
|
||||
pageLines.add( p.txt.parse("<i>Player titles are just for fun. No rules connected to them." ));
|
||||
helpPages.add(pageLines);
|
||||
|
||||
pageLines = new ArrayList<String>();
|
||||
pageLines.add( p.cmdBase.cmdMap.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdBoom.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdOwner.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdOwnerList.getUseageTemplate(true) );
|
||||
pageLines.add(p.txt.parse("<i>Claimed land with ownership set is further protected so"));
|
||||
pageLines.add(p.txt.parse("<i>that only the owner(s), faction admin, and possibly the"));
|
||||
pageLines.add(p.txt.parse("<i>faction moderators have full access."));
|
||||
helpPages.add(pageLines);
|
||||
|
||||
pageLines = new ArrayList<String>();
|
||||
pageLines.add( p.cmdBase.cmdDisband.getUseageTemplate(true) );
|
||||
pageLines.add("");
|
||||
pageLines.add( p.cmdBase.cmdRelationAlly.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdRelationNeutral.getUseageTemplate(true) );
|
||||
pageLines.add( p.cmdBase.cmdRelationEnemy.getUseageTemplate(true) );
|
||||
pageLines.add(p.txt.parse("<i>Set the relation you WISH to have with another faction."));
|
||||
pageLines.add(p.txt.parse("<i>Your default relation with other factions will be neutral."));
|
||||
pageLines.add(p.txt.parse("<i>If BOTH factions choose \"ally\" you will be allies."));
|
||||
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>You can never hurt members or allies."));
|
||||
pageLines.add(p.txt.parse("<i>You can not hurt neutrals in their own territory."));
|
||||
pageLines.add(p.txt.parse("<i>You can always hurt enemies and players without faction."));
|
||||
pageLines.add("");
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
148
src/main/java/com/massivecraft/factions/cmd/CmdHome.java
Normal file
148
src/main/java/com/massivecraft/factions/cmd/CmdHome.java
Normal file
@@ -0,0 +1,148 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import java.util.ArrayList;
|
||||
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.struct.Permission;
|
||||
import com.massivecraft.factions.struct.Relation;
|
||||
import com.massivecraft.factions.struct.Role;
|
||||
import com.massivecraft.factions.zcore.util.SmokeUtil;
|
||||
|
||||
|
||||
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)
|
||||
{
|
||||
fme.msg("<b>Sorry, the ability to teleport to Faction homes is disabled on this server.");
|
||||
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())
|
||||
{
|
||||
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());
|
||||
}
|
||||
|
||||
}
|
||||
49
src/main/java/com/massivecraft/factions/cmd/CmdInvite.java
Normal file
49
src/main/java/com/massivecraft/factions/cmd/CmdInvite.java
Normal file
@@ -0,0 +1,49 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
public class CmdInvite extends FCommand
|
||||
{
|
||||
public CmdInvite()
|
||||
{
|
||||
super();
|
||||
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
|
||||
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));
|
||||
}
|
||||
|
||||
}
|
||||
114
src/main/java/com/massivecraft/factions/cmd/CmdJoin.java
Normal file
114
src/main/java/com/massivecraft/factions/cmd/CmdJoin.java
Normal file
@@ -0,0 +1,114 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
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.struct.Permission;
|
||||
|
||||
public class CmdJoin extends FCommand
|
||||
{
|
||||
public CmdJoin()
|
||||
{
|
||||
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);
|
||||
boolean samePlayer = fplayer == fme;
|
||||
|
||||
if (!samePlayer && ! Permission.JOIN_OTHERS.has(sender, false))
|
||||
{
|
||||
msg("<b>You do not have permission to move other players into a faction.");
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ! faction.isNormal())
|
||||
{
|
||||
msg("<b>Players may only join normal factions. This is a system faction.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (faction == fplayer.getFaction())
|
||||
{
|
||||
msg("<b>%s %s already a member of %s", fplayer.describeTo(fme, true), (samePlayer ? "are" : "is"), faction.getTag(fme));
|
||||
return;
|
||||
}
|
||||
|
||||
if (Conf.factionMemberLimit > 0 && faction.getFPlayers().size() >= Conf.factionMemberLimit)
|
||||
{
|
||||
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())
|
||||
{
|
||||
msg("<b>%s must leave %s current faction first.", fplayer.describeTo(fme, true), (samePlayer ? "your" : "their"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Conf.canLeaveWithNegativePower && fplayer.getPower() < 0)
|
||||
{
|
||||
msg("<b>%s cannot join a faction with a negative power level.", fplayer.describeTo(fme, true));
|
||||
return;
|
||||
}
|
||||
|
||||
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 economy is enabled, they're not on the bypass list, and this command has a cost set, make sure they can pay
|
||||
if (samePlayer && ! canAffordCommand(Conf.econCostJoin, "to join a faction")) return;
|
||||
|
||||
// trigger the join event (cancellable)
|
||||
FPlayerJoinEvent joinEvent = new FPlayerJoinEvent(FPlayers.i.get(me),faction,FPlayerJoinEvent.PlayerJoinReason.COMMAND);
|
||||
Bukkit.getServer().getPluginManager().callEvent(joinEvent);
|
||||
if (joinEvent.isCancelled()) return;
|
||||
|
||||
// then make 'em pay (if applicable)
|
||||
if (samePlayer && ! payForCommand(Conf.econCostJoin, "to join a faction", "for joining a faction")) return;
|
||||
|
||||
fme.msg("<i>%s successfully joined %s.", fplayer.describeTo(fme, true), faction.getTag(fme));
|
||||
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
99
src/main/java/com/massivecraft/factions/cmd/CmdKick.java
Normal file
99
src/main/java/com/massivecraft/factions/cmd/CmdKick.java
Normal file
@@ -0,0 +1,99 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.P;
|
||||
import com.massivecraft.factions.event.FPlayerLeaveEvent;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
import com.massivecraft.factions.struct.Role;
|
||||
|
||||
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();
|
||||
|
||||
// players with admin-level "disband" permission can bypass these requirements
|
||||
if ( ! Permission.KICK_ANY.has(sender))
|
||||
{
|
||||
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)
|
||||
{
|
||||
// TODO add more informative messages.
|
||||
msg("<b>Your rank is too low to kick this player.");
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ! Conf.canLeaveWithNegativePower && you.getPower() < 0)
|
||||
{
|
||||
msg("<b>You cannot kick that member until their power is positive.");
|
||||
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.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();
|
||||
}
|
||||
|
||||
}
|
||||
30
src/main/java/com/massivecraft/factions/cmd/CmdLeave.java
Normal file
30
src/main/java/com/massivecraft/factions/cmd/CmdLeave.java
Normal file
@@ -0,0 +1,30 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
public class CmdLeave extends FCommand {
|
||||
|
||||
public CmdLeave()
|
||||
{
|
||||
super();
|
||||
this.aliases.add("leave");
|
||||
|
||||
//this.requiredArgs.add("");
|
||||
//this.optionalArgs.put("", "");
|
||||
|
||||
this.permission = Permission.LEAVE.node;
|
||||
this.disableOnLock = true;
|
||||
|
||||
senderMustBePlayer = true;
|
||||
senderMustBeMember = true;
|
||||
senderMustBeModerator = false;
|
||||
senderMustBeAdmin = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void perform()
|
||||
{
|
||||
fme.leave(true);
|
||||
}
|
||||
|
||||
}
|
||||
127
src/main/java/com/massivecraft/factions/cmd/CmdList.java
Normal file
127
src/main/java/com/massivecraft/factions/cmd/CmdList.java
Normal file
@@ -0,0 +1,127 @@
|
||||
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.Faction;
|
||||
import com.massivecraft.factions.Factions;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
|
||||
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 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
|
||||
lines.add(p.txt.parse("<i>Factionless<i> %d online", Factions.i.getNone().getFPlayersWhereOnline(true).size()));
|
||||
for (Faction faction : factionList)
|
||||
{
|
||||
lines.add(p.txt.parse("%s<i> %d/%d online, %d/%d/%d",
|
||||
faction.getTag(fme),
|
||||
faction.getFPlayersWhereOnline(true).size(),
|
||||
faction.getFPlayers().size(),
|
||||
faction.getLandRounded(),
|
||||
faction.getPowerRounded(),
|
||||
faction.getPowerMaxRounded())
|
||||
);
|
||||
}
|
||||
|
||||
sendMessage(p.txt.getPage(lines, this.argAsInt(0, 1), "Faction List"));
|
||||
*/
|
||||
|
||||
factionList.add(0, Factions.i.getNone());
|
||||
|
||||
final int pageheight = 9;
|
||||
int pagenumber = this.argAsInt(0, 1);
|
||||
int pagecount = (factionList.size() / pageheight) + 1;
|
||||
if (pagenumber > pagecount)
|
||||
pagenumber = pagecount;
|
||||
else if (pagenumber < 1)
|
||||
pagenumber = 1;
|
||||
int start = (pagenumber - 1) * pageheight;
|
||||
int end = start + pageheight;
|
||||
if (end > factionList.size())
|
||||
end = factionList.size();
|
||||
|
||||
lines.add(p.txt.titleize("Faction List "+pagenumber+"/"+pagecount));
|
||||
|
||||
for (Faction faction : factionList.subList(start, end))
|
||||
{
|
||||
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("%s<i> %d/%d online, %d/%d/%d",
|
||||
faction.getTag(fme),
|
||||
faction.getFPlayersWhereOnline(true).size(),
|
||||
faction.getFPlayers().size(),
|
||||
faction.getLandRounded(),
|
||||
faction.getPowerRounded(),
|
||||
faction.getPowerMaxRounded())
|
||||
);
|
||||
}
|
||||
|
||||
sendMessage(lines);
|
||||
}
|
||||
}
|
||||
46
src/main/java/com/massivecraft/factions/cmd/CmdLock.java
Normal file
46
src/main/java/com/massivecraft/factions/cmd/CmdLock.java
Normal file
@@ -0,0 +1,46 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
public class CmdLock extends FCommand {
|
||||
|
||||
// TODO: This solution needs refactoring.
|
||||
/*
|
||||
factions.lock:
|
||||
description: use the /f lock [on/off] command to temporarily lock the data files from being overwritten
|
||||
default: op
|
||||
*/
|
||||
|
||||
public CmdLock()
|
||||
{
|
||||
super();
|
||||
this.aliases.add("lock");
|
||||
|
||||
//this.requiredArgs.add("");
|
||||
this.optionalArgs.put("on/off", "flip");
|
||||
|
||||
this.permission = Permission.LOCK.node;
|
||||
this.disableOnLock = false;
|
||||
|
||||
senderMustBePlayer = false;
|
||||
senderMustBeMember = false;
|
||||
senderMustBeModerator = false;
|
||||
senderMustBeAdmin = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void perform()
|
||||
{
|
||||
p.setLocked(this.argAsBool(0, ! p.getLocked()));
|
||||
|
||||
if( p.getLocked())
|
||||
{
|
||||
msg("<i>Factions is now locked");
|
||||
}
|
||||
else
|
||||
{
|
||||
msg("<i>Factions in now unlocked");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
67
src/main/java/com/massivecraft/factions/cmd/CmdMap.java
Normal file
67
src/main/java/com/massivecraft/factions/cmd/CmdMap.java
Normal file
@@ -0,0 +1,67 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Board;
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.FLocation;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
|
||||
public class CmdMap extends FCommand
|
||||
{
|
||||
public CmdMap()
|
||||
{
|
||||
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
|
||||
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()));
|
||||
}
|
||||
|
||||
}
|
||||
77
src/main/java/com/massivecraft/factions/cmd/CmdMod.java
Normal file
77
src/main/java/com/massivecraft/factions/cmd/CmdMod.java
Normal file
@@ -0,0 +1,77 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
import com.massivecraft.factions.struct.Role;
|
||||
|
||||
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);
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
47
src/main/java/com/massivecraft/factions/cmd/CmdMoney.java
Normal file
47
src/main/java/com/massivecraft/factions/cmd/CmdMoney.java
Normal file
@@ -0,0 +1,47 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.P;
|
||||
|
||||
public class CmdMoney extends FCommand
|
||||
{
|
||||
public CmdMoneyBalance cmdMoneyBalance = new CmdMoneyBalance();
|
||||
public CmdMoneyDeposit cmdMoneyDeposit = new CmdMoneyDeposit();
|
||||
public CmdMoneyWithdraw cmdMoneyWithdraw = new CmdMoneyWithdraw();
|
||||
public CmdMoneyTransferFf cmdMoneyTransferFf = new CmdMoneyTransferFf();
|
||||
public CmdMoneyTransferFp cmdMoneyTransferFp = new CmdMoneyTransferFp();
|
||||
public CmdMoneyTransferPf cmdMoneyTransferPf = new CmdMoneyTransferPf();
|
||||
|
||||
public CmdMoney()
|
||||
{
|
||||
super();
|
||||
this.aliases.add("money");
|
||||
|
||||
//this.requiredArgs.add("");
|
||||
//this.optionalArgs.put("","")
|
||||
|
||||
this.isMoneyCommand = true;
|
||||
|
||||
senderMustBePlayer = false;
|
||||
senderMustBeMember = false;
|
||||
senderMustBeModerator = false;
|
||||
senderMustBeAdmin = false;
|
||||
|
||||
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.cmdMoneyWithdraw);
|
||||
this.addSubCommand(this.cmdMoneyTransferFf);
|
||||
this.addSubCommand(this.cmdMoneyTransferFp);
|
||||
this.addSubCommand(this.cmdMoneyTransferPf);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void perform()
|
||||
{
|
||||
this.commandChain.add(this);
|
||||
P.p.cmdAutoHelp.execute(this.sender, this.args, this.commandChain);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.integration.Econ;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
import com.massivecraft.factions.Faction;
|
||||
|
||||
public class CmdMoneyBalance extends FCommand
|
||||
{
|
||||
public CmdMoneyBalance()
|
||||
{
|
||||
super();
|
||||
this.aliases.add("b");
|
||||
this.aliases.add("balance");
|
||||
|
||||
//this.requiredArgs.add("");
|
||||
this.optionalArgs.put("faction", "yours");
|
||||
|
||||
this.permission = Permission.MONEY_BALANCE.node;
|
||||
this.setHelpShort("show faction balance");
|
||||
|
||||
senderMustBePlayer = false;
|
||||
senderMustBeMember = false;
|
||||
senderMustBeModerator = false;
|
||||
senderMustBeAdmin = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void perform()
|
||||
{
|
||||
Faction faction = myFaction;
|
||||
if (this.argIsSet(0))
|
||||
{
|
||||
faction = this.argAsFaction(0);
|
||||
}
|
||||
|
||||
if (faction == null) return;
|
||||
if (faction != myFaction && ! Permission.MONEY_BALANCE_ANY.has(sender, true)) return;
|
||||
|
||||
Econ.sendBalanceInfo(fme, faction);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.P;
|
||||
import com.massivecraft.factions.iface.EconomyParticipator;
|
||||
import com.massivecraft.factions.integration.Econ;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
|
||||
|
||||
public class CmdMoneyDeposit extends FCommand
|
||||
{
|
||||
|
||||
public CmdMoneyDeposit()
|
||||
{
|
||||
super();
|
||||
this.aliases.add("d");
|
||||
this.aliases.add("deposit");
|
||||
|
||||
this.requiredArgs.add("amount");
|
||||
this.optionalArgs.put("faction", "yours");
|
||||
|
||||
this.permission = Permission.MONEY_DEPOSIT.node;
|
||||
this.setHelpShort("deposit 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, fme, faction, amount);
|
||||
|
||||
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))));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.iface.EconomyParticipator;
|
||||
import com.massivecraft.factions.P;
|
||||
import com.massivecraft.factions.integration.Econ;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
|
||||
|
||||
public class CmdMoneyTransferFf extends FCommand
|
||||
{
|
||||
public CmdMoneyTransferFf()
|
||||
{
|
||||
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)
|
||||
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))));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.iface.EconomyParticipator;
|
||||
import com.massivecraft.factions.P;
|
||||
import com.massivecraft.factions.integration.Econ;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
|
||||
|
||||
public class CmdMoneyTransferFp extends FCommand
|
||||
{
|
||||
public CmdMoneyTransferFp()
|
||||
{
|
||||
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)
|
||||
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))));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.iface.EconomyParticipator;
|
||||
import com.massivecraft.factions.P;
|
||||
import com.massivecraft.factions.integration.Econ;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
|
||||
|
||||
public class CmdMoneyTransferPf extends FCommand
|
||||
{
|
||||
public CmdMoneyTransferPf()
|
||||
{
|
||||
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)
|
||||
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))));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.iface.EconomyParticipator;
|
||||
import com.massivecraft.factions.P;
|
||||
import com.massivecraft.factions.integration.Econ;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
|
||||
|
||||
public class CmdMoneyWithdraw extends FCommand
|
||||
{
|
||||
public CmdMoneyWithdraw()
|
||||
{
|
||||
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)
|
||||
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))));
|
||||
}
|
||||
}
|
||||
49
src/main/java/com/massivecraft/factions/cmd/CmdOpen.java
Normal file
49
src/main/java/com/massivecraft/factions/cmd/CmdOpen.java
Normal file
@@ -0,0 +1,49 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.Factions;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
public class CmdOpen extends FCommand
|
||||
{
|
||||
public CmdOpen()
|
||||
{
|
||||
super();
|
||||
this.aliases.add("open");
|
||||
|
||||
//this.requiredArgs.add("");
|
||||
this.optionalArgs.put("yes/no", "flip");
|
||||
|
||||
this.permission = Permission.OPEN.node;
|
||||
this.disableOnLock = false;
|
||||
|
||||
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.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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
115
src/main/java/com/massivecraft/factions/cmd/CmdOwner.java
Normal file
115
src/main/java/com/massivecraft/factions/cmd/CmdOwner.java
Normal file
@@ -0,0 +1,115 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Board;
|
||||
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.struct.Permission;
|
||||
import com.massivecraft.factions.struct.Role;
|
||||
|
||||
|
||||
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)
|
||||
{
|
||||
fme.msg("<b>Sorry, but owned areas are disabled on this server.");
|
||||
return;
|
||||
}
|
||||
|
||||
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);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ! hasBypass && !assertMinRole(Conf.ownedAreasModeratorsCanSet ? Role.MODERATOR : Role.ADMIN))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
FLocation flocation = new FLocation(fme);
|
||||
|
||||
Faction factionHere = Board.getFactionAt(flocation);
|
||||
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())
|
||||
{
|
||||
fme.msg("<b>This land is not claimed by a faction. Ownership is not possible.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Board;
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.FLocation;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
|
||||
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())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ! Conf.ownedAreasEnabled)
|
||||
{
|
||||
fme.msg("<b>Owned areas are disabled on this server.");
|
||||
return;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
63
src/main/java/com/massivecraft/factions/cmd/CmdPeaceful.java
Normal file
63
src/main/java/com/massivecraft/factions/cmd/CmdPeaceful.java
Normal file
@@ -0,0 +1,63 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.FPlayers;
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import com.massivecraft.factions.integration.SpoutFeatures;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
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;
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.FPlayers;
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import com.massivecraft.factions.P;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
|
||||
public class CmdPermanent extends FCommand
|
||||
{
|
||||
public CmdPermanent()
|
||||
{
|
||||
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() + "\".");
|
||||
|
||||
// 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) + "\".");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
public class CmdPermanentPower extends FCommand
|
||||
{
|
||||
public CmdPermanentPower()
|
||||
{
|
||||
super();
|
||||
this.aliases.add("permanentpower");
|
||||
|
||||
this.requiredArgs.add("faction");
|
||||
this.optionalArgs.put("power", "reset");
|
||||
|
||||
this.permission = Permission.SET_PERMANENTPOWER.node;
|
||||
this.disableOnLock = true;
|
||||
|
||||
senderMustBePlayer = false;
|
||||
senderMustBeMember = false;
|
||||
senderMustBeModerator = false;
|
||||
senderMustBeAdmin = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void perform()
|
||||
{
|
||||
Faction targetFaction = this.argAsFaction(0);
|
||||
if (targetFaction == null) return;
|
||||
|
||||
Integer targetPower = this.argAsInt(1);
|
||||
|
||||
targetFaction.setPermanentPower(targetPower);
|
||||
|
||||
String change = "removed permanentpower status from";
|
||||
if(targetFaction.hasPermanentPower())
|
||||
{
|
||||
change = "added permanentpower status to";
|
||||
}
|
||||
|
||||
msg("<i>You %s <h>%s<i>.", change, targetFaction.describeTo(fme));
|
||||
|
||||
// Inform all players
|
||||
for (FPlayer fplayer : targetFaction.getFPlayersWhereOnline(true))
|
||||
{
|
||||
fplayer.msg((fme == null ? "A server admin" : fme.describeTo(fplayer, true))+"<i> "+change+" your faction.");
|
||||
}
|
||||
}
|
||||
}
|
||||
44
src/main/java/com/massivecraft/factions/cmd/CmdPower.java
Normal file
44
src/main/java/com/massivecraft/factions/cmd/CmdPower.java
Normal file
@@ -0,0 +1,44 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
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
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import com.massivecraft.factions.P;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
public class CmdPowerBoost extends FCommand
|
||||
{
|
||||
public CmdPowerBoost()
|
||||
{
|
||||
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;
|
||||
|
||||
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+".");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.struct.Relation;
|
||||
|
||||
public class CmdRelationAlly extends FRelationCommand
|
||||
{
|
||||
public CmdRelationAlly()
|
||||
{
|
||||
aliases.add("ally");
|
||||
targetRelation = Relation.ALLY;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.struct.Relation;
|
||||
|
||||
public class CmdRelationEnemy extends FRelationCommand
|
||||
{
|
||||
public CmdRelationEnemy()
|
||||
{
|
||||
aliases.add("enemy");
|
||||
targetRelation = Relation.ENEMY;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.struct.Relation;
|
||||
|
||||
public class CmdRelationNeutral extends FRelationCommand
|
||||
{
|
||||
public CmdRelationNeutral()
|
||||
{
|
||||
aliases.add("neutral");
|
||||
targetRelation = Relation.NEUTRAL;
|
||||
}
|
||||
}
|
||||
78
src/main/java/com/massivecraft/factions/cmd/CmdReload.java
Normal file
78
src/main/java/com/massivecraft/factions/cmd/CmdReload.java
Normal file
@@ -0,0 +1,78 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Board;
|
||||
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;
|
||||
|
||||
public class CmdReload extends FCommand
|
||||
{
|
||||
|
||||
public CmdReload()
|
||||
{
|
||||
super();
|
||||
this.aliases.add("reload");
|
||||
|
||||
//this.requiredArgs.add("");
|
||||
this.optionalArgs.put("file", "all");
|
||||
|
||||
this.permission = Permission.RELOAD.node;
|
||||
this.disableOnLock = false;
|
||||
|
||||
senderMustBePlayer = false;
|
||||
senderMustBeMember = false;
|
||||
senderMustBeModerator = false;
|
||||
senderMustBeAdmin = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void perform()
|
||||
{
|
||||
long timeInitStart = System.currentTimeMillis();
|
||||
String file = this.argAsString(0, "all").toLowerCase();
|
||||
|
||||
String fileName;
|
||||
|
||||
if (file.startsWith("c"))
|
||||
{
|
||||
Conf.load();
|
||||
fileName = "conf.json";
|
||||
}
|
||||
else if (file.startsWith("b"))
|
||||
{
|
||||
Board.load();
|
||||
fileName = "board.json";
|
||||
}
|
||||
else if (file.startsWith("f"))
|
||||
{
|
||||
Factions.i.loadFromDisc();
|
||||
fileName = "factions.json";
|
||||
}
|
||||
else if (file.startsWith("p"))
|
||||
{
|
||||
FPlayers.i.loadFromDisc();
|
||||
fileName = "players.json";
|
||||
}
|
||||
else if (file.startsWith("a"))
|
||||
{
|
||||
fileName = "all";
|
||||
Conf.load();
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Board;
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.Factions;
|
||||
import com.massivecraft.factions.P;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
public class CmdSafeunclaimall extends FCommand
|
||||
{
|
||||
|
||||
public CmdSafeunclaimall()
|
||||
{
|
||||
this.aliases.add("safeunclaimall");
|
||||
this.aliases.add("safedeclaimall");
|
||||
|
||||
//this.requiredArgs.add("");
|
||||
//this.optionalArgs.put("radius", "0");
|
||||
|
||||
this.permission = Permission.MANAGE_SAFE_ZONE.node;
|
||||
this.disableOnLock = true;
|
||||
|
||||
senderMustBePlayer = false;
|
||||
senderMustBeMember = false;
|
||||
senderMustBeModerator = false;
|
||||
senderMustBeAdmin = false;
|
||||
|
||||
this.setHelpShort("Unclaim all safezone land");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void perform()
|
||||
{
|
||||
Board.unclaimAll(Factions.i.getSafeZone().getId());
|
||||
msg("<i>You unclaimed ALL safe zone land.");
|
||||
|
||||
if (Conf.logLandUnclaims)
|
||||
P.p.log(fme.getName()+" unclaimed all safe zones.");
|
||||
}
|
||||
|
||||
}
|
||||
40
src/main/java/com/massivecraft/factions/cmd/CmdSaveAll.java
Normal file
40
src/main/java/com/massivecraft/factions/cmd/CmdSaveAll.java
Normal file
@@ -0,0 +1,40 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Board;
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.FPlayers;
|
||||
import com.massivecraft.factions.Factions;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
public class CmdSaveAll extends FCommand
|
||||
{
|
||||
|
||||
public CmdSaveAll()
|
||||
{
|
||||
super();
|
||||
this.aliases.add("saveall");
|
||||
this.aliases.add("save");
|
||||
|
||||
//this.requiredArgs.add("");
|
||||
//this.optionalArgs.put("", "");
|
||||
|
||||
this.permission = Permission.SAVE.node;
|
||||
this.disableOnLock = false;
|
||||
|
||||
senderMustBePlayer = false;
|
||||
senderMustBeMember = false;
|
||||
senderMustBeModerator = false;
|
||||
senderMustBeAdmin = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void perform()
|
||||
{
|
||||
FPlayers.i.saveToDisc();
|
||||
Factions.i.saveToDisc();
|
||||
Board.save();
|
||||
Conf.save();
|
||||
msg("<i>Factions saved to disk!");
|
||||
}
|
||||
|
||||
}
|
||||
77
src/main/java/com/massivecraft/factions/cmd/CmdSethome.java
Normal file
77
src/main/java/com/massivecraft/factions/cmd/CmdSethome.java
Normal file
@@ -0,0 +1,77 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Board;
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.FLocation;
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
import com.massivecraft.factions.struct.Role;
|
||||
|
||||
public class CmdSethome extends FCommand
|
||||
{
|
||||
public CmdSethome()
|
||||
{
|
||||
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
|
||||
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.");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
165
src/main/java/com/massivecraft/factions/cmd/CmdShow.java
Normal file
165
src/main/java/com/massivecraft/factions/cmd/CmdShow.java
Normal file
@@ -0,0 +1,165 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.integration.Econ;
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.Factions;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
import com.massivecraft.factions.struct.Role;
|
||||
import com.massivecraft.factions.struct.Relation;
|
||||
|
||||
public class CmdShow extends FCommand
|
||||
{
|
||||
|
||||
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 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
|
||||
if ( ! payForCommand(Conf.econCostShow, "to show faction information", "for showing faction information")) return;
|
||||
|
||||
Collection<FPlayer> admins = faction.getFPlayersWhereRole(Role.ADMIN);
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
85
src/main/java/com/massivecraft/factions/cmd/CmdTag.java
Normal file
85
src/main/java/com/massivecraft/factions/cmd/CmdTag.java
Normal file
@@ -0,0 +1,85 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.Factions;
|
||||
import com.massivecraft.factions.event.FactionRenameEvent;
|
||||
import com.massivecraft.factions.integration.SpoutFeatures;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
import com.massivecraft.factions.util.MiscUtil;
|
||||
|
||||
public class CmdTag extends FCommand
|
||||
{
|
||||
|
||||
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
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
52
src/main/java/com/massivecraft/factions/cmd/CmdTitle.java
Normal file
52
src/main/java/com/massivecraft/factions/cmd/CmdTitle.java
Normal file
@@ -0,0 +1,52 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import com.massivecraft.factions.integration.SpoutFeatures;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
import com.massivecraft.factions.zcore.util.TextUtil;
|
||||
|
||||
public class CmdTitle extends FCommand
|
||||
{
|
||||
public CmdTitle()
|
||||
{
|
||||
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
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
133
src/main/java/com/massivecraft/factions/cmd/CmdUnclaim.java
Normal file
133
src/main/java/com/massivecraft/factions/cmd/CmdUnclaim.java
Normal file
@@ -0,0 +1,133 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
import com.massivecraft.factions.Board;
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.event.LandUnclaimEvent;
|
||||
import com.massivecraft.factions.integration.Econ;
|
||||
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.Role;
|
||||
|
||||
public class CmdUnclaim extends FCommand
|
||||
{
|
||||
public CmdUnclaim()
|
||||
{
|
||||
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)
|
||||
P.p.log(fme.getName()+" unclaimed land at ("+flocation.getCoordString()+") from the faction: "+otherFaction.getTag());
|
||||
}
|
||||
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)
|
||||
P.p.log(fme.getName()+" unclaimed land at ("+flocation.getCoordString()+") from the faction: "+otherFaction.getTag());
|
||||
}
|
||||
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));
|
||||
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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
import com.massivecraft.factions.Board;
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.P;
|
||||
import com.massivecraft.factions.event.LandUnclaimAllEvent;
|
||||
import com.massivecraft.factions.integration.Econ;
|
||||
import com.massivecraft.factions.integration.SpoutFeatures;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
public class CmdUnclaimall extends FCommand
|
||||
{
|
||||
public CmdUnclaimall()
|
||||
{
|
||||
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);
|
||||
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());
|
||||
}
|
||||
|
||||
}
|
||||
30
src/main/java/com/massivecraft/factions/cmd/CmdVersion.java
Normal file
30
src/main/java/com/massivecraft/factions/cmd/CmdVersion.java
Normal file
@@ -0,0 +1,30 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.P;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
|
||||
public class CmdVersion extends FCommand
|
||||
{
|
||||
public CmdVersion()
|
||||
{
|
||||
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
|
||||
public void perform()
|
||||
{
|
||||
msg("<i>You are running "+P.p.getDescription().getFullName());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Board;
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.Factions;
|
||||
import com.massivecraft.factions.P;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
|
||||
public class CmdWarunclaimall extends FCommand
|
||||
{
|
||||
|
||||
public CmdWarunclaimall()
|
||||
{
|
||||
this.aliases.add("warunclaimall");
|
||||
this.aliases.add("wardeclaimall");
|
||||
|
||||
//this.requiredArgs.add("");
|
||||
//this.optionalArgs.put("", "");
|
||||
|
||||
this.permission = Permission.MANAGE_WAR_ZONE.node;
|
||||
this.disableOnLock = true;
|
||||
|
||||
senderMustBePlayer = false;
|
||||
senderMustBeMember = false;
|
||||
senderMustBeModerator = false;
|
||||
senderMustBeAdmin = false;
|
||||
|
||||
this.setHelpShort("unclaim all warzone land");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void perform()
|
||||
{
|
||||
Board.unclaimAll(Factions.i.getWarZone().getId());
|
||||
msg("<i>You unclaimed ALL war zone land.");
|
||||
|
||||
if (Conf.logLandUnclaims)
|
||||
P.p.log(fme.getName()+" unclaimed all war zones.");
|
||||
}
|
||||
|
||||
}
|
||||
131
src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java
Normal file
131
src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java
Normal file
@@ -0,0 +1,131 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
|
||||
public class FCmdRoot extends FCommand
|
||||
{
|
||||
public CmdAdmin cmdAdmin = new CmdAdmin();
|
||||
public CmdAutoClaim cmdAutoClaim = new CmdAutoClaim();
|
||||
public CmdBoom cmdBoom = new CmdBoom();
|
||||
public CmdBypass cmdBypass = new CmdBypass();
|
||||
public CmdChat cmdChat = new CmdChat();
|
||||
public CmdChatSpy cmdChatSpy = new CmdChatSpy();
|
||||
public CmdClaim cmdClaim = new CmdClaim();
|
||||
public CmdConfig cmdConfig = new CmdConfig();
|
||||
public CmdCreate cmdCreate = new CmdCreate();
|
||||
public CmdDeinvite cmdDeinvite = new CmdDeinvite();
|
||||
public CmdDescription cmdDescription = new CmdDescription();
|
||||
public CmdDisband cmdDisband = new CmdDisband();
|
||||
public CmdHelp cmdHelp = new CmdHelp();
|
||||
public CmdHome cmdHome = new CmdHome();
|
||||
public CmdInvite cmdInvite = new CmdInvite();
|
||||
public CmdJoin cmdJoin = new CmdJoin();
|
||||
public CmdKick cmdKick = new CmdKick();
|
||||
public CmdLeave cmdLeave = new CmdLeave();
|
||||
public CmdList cmdList = new CmdList();
|
||||
public CmdLock cmdLock = new CmdLock();
|
||||
public CmdMap cmdMap = new CmdMap();
|
||||
public CmdMod cmdMod = new CmdMod();
|
||||
public CmdMoney cmdMoney = new CmdMoney();
|
||||
public CmdOpen cmdOpen = new CmdOpen();
|
||||
public CmdOwner cmdOwner = new CmdOwner();
|
||||
public CmdOwnerList cmdOwnerList = new CmdOwnerList();
|
||||
public CmdPeaceful cmdPeaceful = new CmdPeaceful();
|
||||
public CmdPermanent cmdPermanent = new CmdPermanent();
|
||||
public CmdPermanentPower cmdPermanentPower = new CmdPermanentPower();
|
||||
public CmdPowerBoost cmdPowerBoost = new CmdPowerBoost();
|
||||
public CmdPower cmdPower = new CmdPower();
|
||||
public CmdRelationAlly cmdRelationAlly = new CmdRelationAlly();
|
||||
public CmdRelationEnemy cmdRelationEnemy = new CmdRelationEnemy();
|
||||
public CmdRelationNeutral cmdRelationNeutral = new CmdRelationNeutral();
|
||||
public CmdReload cmdReload = new CmdReload();
|
||||
public CmdSafeunclaimall cmdSafeunclaimall = new CmdSafeunclaimall();
|
||||
public CmdSaveAll cmdSaveAll = new CmdSaveAll();
|
||||
public CmdSethome cmdSethome = new CmdSethome();
|
||||
public CmdShow cmdShow = new CmdShow();
|
||||
public CmdTag cmdTag = new CmdTag();
|
||||
public CmdTitle cmdTitle = new CmdTitle();
|
||||
public CmdUnclaim cmdUnclaim = new CmdUnclaim();
|
||||
public CmdUnclaimall cmdUnclaimall = new CmdUnclaimall();
|
||||
public CmdVersion cmdVersion = new CmdVersion();
|
||||
public CmdWarunclaimall cmdWarunclaimall = new CmdWarunclaimall();
|
||||
|
||||
public FCmdRoot()
|
||||
{
|
||||
super();
|
||||
this.aliases.addAll(Conf.baseCommandAliases);
|
||||
this.aliases.removeAll(Collections.singletonList(null)); // remove any nulls from extra commas
|
||||
this.allowNoSlashAccess = Conf.allowNoSlashCommand;
|
||||
|
||||
//this.requiredArgs.add("");
|
||||
//this.optionalArgs.put("","")
|
||||
|
||||
senderMustBePlayer = false;
|
||||
senderMustBeMember = false;
|
||||
senderMustBeModerator = false;
|
||||
senderMustBeAdmin = false;
|
||||
|
||||
this.disableOnLock = false;
|
||||
|
||||
this.setHelpShort("The faction base command");
|
||||
this.helpLong.add(p.txt.parseTags("<i>This command contains all faction stuff."));
|
||||
|
||||
//this.subCommands.add(p.cmdHelp);
|
||||
|
||||
this.addSubCommand(this.cmdAdmin);
|
||||
this.addSubCommand(this.cmdAutoClaim);
|
||||
this.addSubCommand(this.cmdBoom);
|
||||
this.addSubCommand(this.cmdBypass);
|
||||
this.addSubCommand(this.cmdChat);
|
||||
this.addSubCommand(this.cmdChatSpy);
|
||||
this.addSubCommand(this.cmdClaim);
|
||||
this.addSubCommand(this.cmdConfig);
|
||||
this.addSubCommand(this.cmdCreate);
|
||||
this.addSubCommand(this.cmdDeinvite);
|
||||
this.addSubCommand(this.cmdDescription);
|
||||
this.addSubCommand(this.cmdDisband);
|
||||
this.addSubCommand(this.cmdHelp);
|
||||
this.addSubCommand(this.cmdHome);
|
||||
this.addSubCommand(this.cmdInvite);
|
||||
this.addSubCommand(this.cmdJoin);
|
||||
this.addSubCommand(this.cmdKick);
|
||||
this.addSubCommand(this.cmdLeave);
|
||||
this.addSubCommand(this.cmdList);
|
||||
this.addSubCommand(this.cmdLock);
|
||||
this.addSubCommand(this.cmdMap);
|
||||
this.addSubCommand(this.cmdMod);
|
||||
this.addSubCommand(this.cmdMoney);
|
||||
this.addSubCommand(this.cmdOpen);
|
||||
this.addSubCommand(this.cmdOwner);
|
||||
this.addSubCommand(this.cmdOwnerList);
|
||||
this.addSubCommand(this.cmdPeaceful);
|
||||
this.addSubCommand(this.cmdPermanent);
|
||||
this.addSubCommand(this.cmdPermanentPower);
|
||||
this.addSubCommand(this.cmdPower);
|
||||
this.addSubCommand(this.cmdPowerBoost);
|
||||
this.addSubCommand(this.cmdRelationAlly);
|
||||
this.addSubCommand(this.cmdRelationEnemy);
|
||||
this.addSubCommand(this.cmdRelationNeutral);
|
||||
this.addSubCommand(this.cmdReload);
|
||||
this.addSubCommand(this.cmdSafeunclaimall);
|
||||
this.addSubCommand(this.cmdSaveAll);
|
||||
this.addSubCommand(this.cmdSethome);
|
||||
this.addSubCommand(this.cmdShow);
|
||||
this.addSubCommand(this.cmdTag);
|
||||
this.addSubCommand(this.cmdTitle);
|
||||
this.addSubCommand(this.cmdUnclaim);
|
||||
this.addSubCommand(this.cmdUnclaimall);
|
||||
this.addSubCommand(this.cmdVersion);
|
||||
this.addSubCommand(this.cmdWarunclaimall);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void perform()
|
||||
{
|
||||
this.commandChain.add(this);
|
||||
this.cmdHelp.execute(this.sender, this.args, this.commandChain);
|
||||
}
|
||||
|
||||
}
|
||||
337
src/main/java/com/massivecraft/factions/cmd/FCommand.java
Normal file
337
src/main/java/com/massivecraft/factions/cmd/FCommand.java
Normal file
@@ -0,0 +1,337 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
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 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()
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.event.FactionRelationEvent;
|
||||
import com.massivecraft.factions.integration.SpoutFeatures;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
import com.massivecraft.factions.struct.Relation;
|
||||
|
||||
public abstract class FRelationCommand extends FCommand
|
||||
{
|
||||
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)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package com.massivecraft.factions.event;
|
||||
|
||||
import org.bukkit.event.Cancellable;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import com.massivecraft.factions.Faction;
|
||||
|
||||
public class FPlayerJoinEvent extends Event implements Cancellable
|
||||
{
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
|
||||
FPlayer fplayer;
|
||||
Faction faction;
|
||||
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()
|
||||
{
|
||||
return fplayer;
|
||||
}
|
||||
public Faction getFaction()
|
||||
{
|
||||
return faction;
|
||||
}
|
||||
public PlayerJoinReason getReason()
|
||||
{
|
||||
return reason;
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
package com.massivecraft.factions.event;
|
||||
|
||||
import org.bukkit.event.Cancellable;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import com.massivecraft.factions.Faction;
|
||||
|
||||
public class FPlayerLeaveEvent extends Event implements Cancellable
|
||||
{
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
private PlayerLeaveReason reason;
|
||||
FPlayer FPlayer;
|
||||
Faction Faction;
|
||||
boolean cancelled = false;
|
||||
|
||||
public enum PlayerLeaveReason
|
||||
{
|
||||
KICKED, DISBAND, RESET, JOINOTHER, LEAVE
|
||||
}
|
||||
|
||||
public FPlayerLeaveEvent(FPlayer p, Faction f, PlayerLeaveReason r)
|
||||
{
|
||||
FPlayer = p;
|
||||
Faction = f;
|
||||
reason = r;
|
||||
}
|
||||
|
||||
public HandlerList getHandlers()
|
||||
{
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public static HandlerList getHandlerList()
|
||||
{
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public PlayerLeaveReason getReason()
|
||||
{
|
||||
return reason;
|
||||
}
|
||||
|
||||
public FPlayer getFPlayer()
|
||||
{
|
||||
return FPlayer;
|
||||
}
|
||||
|
||||
public Faction getFaction()
|
||||
{
|
||||
return Faction;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCancelled()
|
||||
{
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCancelled(boolean c)
|
||||
{
|
||||
if (reason == PlayerLeaveReason.DISBAND || reason == PlayerLeaveReason.RESET)
|
||||
{
|
||||
cancelled = false;
|
||||
return;
|
||||
}
|
||||
cancelled = c;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
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.FPlayers;
|
||||
import com.massivecraft.factions.Factions;
|
||||
|
||||
public class FactionCreateEvent extends Event implements Cancellable
|
||||
{
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
|
||||
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()
|
||||
{
|
||||
return factionTag;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
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.FPlayers;
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.Factions;
|
||||
|
||||
public class FactionDisbandEvent extends Event implements Cancellable
|
||||
{
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
|
||||
private boolean cancelled;
|
||||
private String id;
|
||||
private Player sender;
|
||||
|
||||
public FactionDisbandEvent(Player sender, String factionId)
|
||||
{
|
||||
cancelled = false;
|
||||
this.sender = sender;
|
||||
this.id = factionId;
|
||||
}
|
||||
|
||||
public HandlerList getHandlers()
|
||||
{
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public static HandlerList getHandlerList()
|
||||
{
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public Faction getFaction()
|
||||
{
|
||||
return Factions.i.get(id);
|
||||
}
|
||||
|
||||
public FPlayer getFPlayer()
|
||||
{
|
||||
return FPlayers.i.get(sender);
|
||||
}
|
||||
|
||||
public Player getPlayer()
|
||||
{
|
||||
return sender;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCancelled()
|
||||
{
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCancelled(boolean c)
|
||||
{
|
||||
cancelled = c;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
package com.massivecraft.factions.event;
|
||||
|
||||
import org.bukkit.event.Event;
|
||||
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();
|
||||
|
||||
private Faction fsender;
|
||||
private Faction ftarget;
|
||||
private Relation foldrel;
|
||||
private Relation frel;
|
||||
|
||||
public FactionRelationEvent(Faction sender, Faction target, Relation oldrel, Relation rel)
|
||||
{
|
||||
fsender = sender;
|
||||
ftarget = target;
|
||||
foldrel = oldrel;
|
||||
frel = rel;
|
||||
}
|
||||
|
||||
public HandlerList getHandlers()
|
||||
{
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public static HandlerList getHandlerList()
|
||||
{
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public Relation getOldRelation()
|
||||
{
|
||||
return foldrel;
|
||||
}
|
||||
|
||||
public Relation getRelation()
|
||||
{
|
||||
return frel;
|
||||
}
|
||||
|
||||
public Faction getFaction()
|
||||
{
|
||||
return fsender;
|
||||
}
|
||||
|
||||
public Faction getTargetFaction()
|
||||
{
|
||||
return ftarget;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
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.Faction;
|
||||
|
||||
public class FactionRenameEvent extends Event implements Cancellable
|
||||
{
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
|
||||
private boolean cancelled;
|
||||
private FPlayer fplayer;
|
||||
private Faction faction;
|
||||
private String tag;
|
||||
|
||||
public FactionRenameEvent(FPlayer sender, String newTag)
|
||||
{
|
||||
fplayer = sender;
|
||||
faction = sender.getFaction();
|
||||
tag = newTag;
|
||||
this.cancelled = false;
|
||||
}
|
||||
|
||||
public Faction getFaction()
|
||||
{
|
||||
return(faction);
|
||||
}
|
||||
|
||||
public FPlayer getFPlayer()
|
||||
{
|
||||
return(fplayer);
|
||||
}
|
||||
|
||||
public Player getPlayer()
|
||||
{
|
||||
return(fplayer.getPlayer());
|
||||
}
|
||||
|
||||
public String getOldFactionTag()
|
||||
{
|
||||
return(faction.getTag());
|
||||
}
|
||||
|
||||
public String getFactionTag()
|
||||
{
|
||||
return(tag);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
package com.massivecraft.factions.event;
|
||||
|
||||
import org.bukkit.event.Cancellable;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
|
||||
import com.massivecraft.factions.FLocation;
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class LandClaimEvent extends Event implements Cancellable
|
||||
{
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
|
||||
private boolean cancelled;
|
||||
private FLocation location;
|
||||
private Faction faction;
|
||||
private FPlayer fplayer;
|
||||
|
||||
public LandClaimEvent(FLocation loc, Faction f, FPlayer p)
|
||||
{
|
||||
cancelled = false;
|
||||
location = loc;
|
||||
faction = f;
|
||||
fplayer = p;
|
||||
}
|
||||
|
||||
public HandlerList getHandlers()
|
||||
{
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public static HandlerList getHandlerList()
|
||||
{
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public FLocation getLocation()
|
||||
{
|
||||
return this.location;
|
||||
}
|
||||
|
||||
public Faction getFaction()
|
||||
{
|
||||
return faction;
|
||||
}
|
||||
|
||||
public String getFactionId()
|
||||
{
|
||||
return faction.getId();
|
||||
}
|
||||
|
||||
public String getFactionTag()
|
||||
{
|
||||
return faction.getTag();
|
||||
}
|
||||
|
||||
public FPlayer getFPlayer()
|
||||
{
|
||||
return fplayer;
|
||||
}
|
||||
|
||||
public Player getPlayer()
|
||||
{
|
||||
return fplayer.getPlayer();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCancelled()
|
||||
{
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCancelled(boolean c)
|
||||
{
|
||||
this.cancelled = c;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
package com.massivecraft.factions.event;
|
||||
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class LandUnclaimAllEvent extends Event
|
||||
{
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
|
||||
private Faction faction;
|
||||
private FPlayer fplayer;
|
||||
|
||||
public LandUnclaimAllEvent(Faction f, FPlayer p)
|
||||
{
|
||||
faction = f;
|
||||
fplayer = p;
|
||||
}
|
||||
|
||||
public HandlerList getHandlers()
|
||||
{
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public static HandlerList getHandlerList()
|
||||
{
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public Faction getFaction()
|
||||
{
|
||||
return faction;
|
||||
}
|
||||
|
||||
public String getFactionId()
|
||||
{
|
||||
return faction.getId();
|
||||
}
|
||||
|
||||
public String getFactionTag()
|
||||
{
|
||||
return faction.getTag();
|
||||
}
|
||||
|
||||
public FPlayer getFPlayer()
|
||||
{
|
||||
return fplayer;
|
||||
}
|
||||
|
||||
public Player getPlayer()
|
||||
{
|
||||
return fplayer.getPlayer();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
package com.massivecraft.factions.event;
|
||||
|
||||
import org.bukkit.event.Cancellable;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
|
||||
import com.massivecraft.factions.FLocation;
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class LandUnclaimEvent extends Event implements Cancellable
|
||||
{
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
|
||||
private boolean cancelled;
|
||||
private FLocation location;
|
||||
private Faction faction;
|
||||
private FPlayer fplayer;
|
||||
|
||||
public LandUnclaimEvent(FLocation loc, Faction f, FPlayer p)
|
||||
{
|
||||
cancelled = false;
|
||||
location = loc;
|
||||
faction = f;
|
||||
fplayer = p;
|
||||
}
|
||||
|
||||
public HandlerList getHandlers()
|
||||
{
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public static HandlerList getHandlerList()
|
||||
{
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public FLocation getLocation()
|
||||
{
|
||||
return this.location;
|
||||
}
|
||||
|
||||
public Faction getFaction()
|
||||
{
|
||||
return faction;
|
||||
}
|
||||
|
||||
public String getFactionId()
|
||||
{
|
||||
return faction.getId();
|
||||
}
|
||||
|
||||
public String getFactionTag()
|
||||
{
|
||||
return faction.getTag();
|
||||
}
|
||||
|
||||
public FPlayer getFPlayer()
|
||||
{
|
||||
return fplayer;
|
||||
}
|
||||
|
||||
public Player getPlayer()
|
||||
{
|
||||
return fplayer.getPlayer();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCancelled()
|
||||
{
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCancelled(boolean c) {
|
||||
cancelled = c;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
package com.massivecraft.factions.event;
|
||||
|
||||
import org.bukkit.event.Cancellable;
|
||||
import org.bukkit.event.Event;
|
||||
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 PowerLossEvent(Faction f, FPlayer p)
|
||||
{
|
||||
cancelled = false;
|
||||
faction = f;
|
||||
fplayer = p;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HandlerList getHandlers()
|
||||
{
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public static HandlerList getHandlerList()
|
||||
{
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public Faction getFaction()
|
||||
{
|
||||
return faction;
|
||||
}
|
||||
|
||||
public String getFactionId()
|
||||
{
|
||||
return faction.getId();
|
||||
}
|
||||
|
||||
public String getFactionTag()
|
||||
{
|
||||
return faction.getTag();
|
||||
}
|
||||
|
||||
public FPlayer getFPlayer()
|
||||
{
|
||||
return fplayer;
|
||||
}
|
||||
|
||||
public Player getPlayer()
|
||||
{
|
||||
return fplayer.getPlayer();
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
public void setMessage(String message) {
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCancelled()
|
||||
{
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCancelled(boolean c)
|
||||
{
|
||||
this.cancelled = c;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.massivecraft.factions.iface;
|
||||
|
||||
public interface EconomyParticipator extends RelationParticipator
|
||||
{
|
||||
public String getAccountId();
|
||||
|
||||
public void msg(String str, Object... args);
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.massivecraft.factions.iface;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
|
||||
import com.massivecraft.factions.struct.Relation;
|
||||
|
||||
public interface RelationParticipator
|
||||
{
|
||||
public String describeTo(RelationParticipator that);
|
||||
public String describeTo(RelationParticipator that, boolean ucfirst);
|
||||
|
||||
public Relation getRelationTo(RelationParticipator that);
|
||||
public Relation getRelationTo(RelationParticipator that, boolean ignorePeaceful);
|
||||
|
||||
public ChatColor getColorTo(RelationParticipator to);
|
||||
}
|
||||
393
src/main/java/com/massivecraft/factions/integration/Econ.java
Normal file
393
src/main/java/com/massivecraft/factions/integration/Econ.java
Normal file
@@ -0,0 +1,393 @@
|
||||
package com.massivecraft.factions.integration;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
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;
|
||||
import net.milkbowl.vault.economy.EconomyResponse;
|
||||
|
||||
|
||||
public class Econ
|
||||
{
|
||||
private static Economy econ = null;
|
||||
|
||||
public static void setup()
|
||||
{
|
||||
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 static void modifyUniverseMoney(double delta)
|
||||
{
|
||||
if (!shouldBeUsed()) return;
|
||||
|
||||
if (Conf.econUniverseAccount == null) return;
|
||||
if (Conf.econUniverseAccount.length() == 0) return;
|
||||
if ( ! econ.hasAccount(Conf.econUniverseAccount)) return;
|
||||
|
||||
modifyBalance(Conf.econUniverseAccount, delta);
|
||||
}
|
||||
|
||||
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.
|
||||
// If the amount is negative we must flip and multiply amount with -1.
|
||||
if (amount < 0)
|
||||
{
|
||||
amount *= -1;
|
||||
EconomyParticipator temp = from;
|
||||
from = to;
|
||||
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;
|
||||
}
|
||||
|
||||
// Transfer money
|
||||
EconomyResponse erw = econ.withdrawPlayer(from.getAccountId(), amount);
|
||||
|
||||
if (erw.transactionSuccess()) {
|
||||
EconomyResponse erd = econ.depositPlayer(to.getAccountId(), amount);
|
||||
if (erd.transactionSuccess()) {
|
||||
if (notify) sendTransferInfo(invoker, from, to, amount);
|
||||
return true;
|
||||
} else {
|
||||
// transaction failed, refund account
|
||||
econ.depositPlayer(from.getAccountId(), amount);
|
||||
}
|
||||
}
|
||||
|
||||
// if we get here something with the transaction failed
|
||||
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;
|
||||
}
|
||||
|
||||
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 ( ! 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
|
||||
return true;
|
||||
}
|
||||
|
||||
if (delta > 0)
|
||||
{
|
||||
// The player should gain money
|
||||
// The account might not have enough space
|
||||
EconomyResponse er = econ.depositPlayer(acc, delta);
|
||||
if (er.transactionSuccess()) {
|
||||
modifyUniverseMoney(-delta);
|
||||
if (forDoingThis != null && !forDoingThis.isEmpty())
|
||||
ep.msg("<h>%s<i> gained <h>%s<i> %s.", You, moneyString(delta), forDoingThis);
|
||||
return true;
|
||||
} else {
|
||||
// transfer to account failed
|
||||
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);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 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"
|
||||
public static String moneyString(double amount)
|
||||
{
|
||||
return econ.format(amount);
|
||||
}
|
||||
|
||||
public static void oldMoneyDoTransfer()
|
||||
{
|
||||
if ( ! shouldBeUsed()) return;
|
||||
|
||||
for (Faction faction : Factions.i.get())
|
||||
{
|
||||
if (faction.money > 0)
|
||||
{
|
||||
econ.depositPlayer(faction.getAccountId(), faction.money);
|
||||
faction.money = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// calculate the cost for claiming land
|
||||
public static double calculateClaimCost(int ownedLand, boolean takingFromAnotherFaction)
|
||||
{
|
||||
if ( ! shouldBeUsed())
|
||||
{
|
||||
return 0d;
|
||||
}
|
||||
|
||||
// basic claim cost, plus land inflation cost, minus the potential bonus given for claiming from another faction
|
||||
return Conf.econCostClaimWilderness
|
||||
+ (Conf.econCostClaimWilderness * Conf.econClaimAdditionalMultiplier * ownedLand)
|
||||
- (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
|
||||
// -------------------------------------------- //
|
||||
|
||||
public static boolean hasAccount(String name)
|
||||
{
|
||||
return econ.hasAccount(name);
|
||||
}
|
||||
|
||||
public static double getBalance(String account)
|
||||
{
|
||||
return econ.getBalance(account);
|
||||
}
|
||||
|
||||
public static boolean setBalance(String account, double amount)
|
||||
{
|
||||
double current = econ.getBalance(account);
|
||||
if (current > amount)
|
||||
return econ.withdrawPlayer(account, current - amount).transactionSuccess();
|
||||
else
|
||||
return econ.depositPlayer(account, amount - current).transactionSuccess();
|
||||
}
|
||||
|
||||
public static boolean modifyBalance(String account, double amount)
|
||||
{
|
||||
if (amount < 0)
|
||||
return econ.withdrawPlayer(account, -amount).transactionSuccess();
|
||||
else
|
||||
return econ.depositPlayer(account, amount).transactionSuccess();
|
||||
}
|
||||
|
||||
public static boolean deposit(String account, double amount)
|
||||
{
|
||||
return econ.depositPlayer(account, amount).transactionSuccess();
|
||||
}
|
||||
|
||||
public static boolean withdraw(String account, double amount)
|
||||
{
|
||||
return econ.withdrawPlayer(account, amount).transactionSuccess();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
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.Teleport;
|
||||
import com.earth2me.essentials.Trade;
|
||||
import com.earth2me.essentials.chat.EssentialsChat;
|
||||
import com.earth2me.essentials.chat.EssentialsLocalChatEvent;
|
||||
|
||||
|
||||
/*
|
||||
* This Essentials integration handler is for newer 3.x.x versions of Essentials which don't have "IEssentialsChatListener"
|
||||
* If an older version is detected in the setup() method below, handling is passed off to EssentialsOldVersionFeatures
|
||||
*/
|
||||
|
||||
// silence deprecation warnings with this old interface
|
||||
@SuppressWarnings("deprecation")
|
||||
public class EssentialsFeatures
|
||||
{
|
||||
private static EssentialsChat essChat;
|
||||
private static IEssentials essentials;
|
||||
|
||||
public static void setup()
|
||||
{
|
||||
// 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
|
||||
if (essentials == null)
|
||||
{
|
||||
Plugin ess = Bukkit.getPluginManager().getPlugin("Essentials");
|
||||
if (ess != null && ess.isEnabled())
|
||||
essentials = (IEssentials)ess;
|
||||
}
|
||||
|
||||
// integrate chat
|
||||
if (essChat != null) return;
|
||||
|
||||
Plugin test = Bukkit.getServer().getPluginManager().getPlugin("EssentialsChat");
|
||||
if (test == null || !test.isEnabled()) return;
|
||||
|
||||
essChat = (EssentialsChat)test;
|
||||
|
||||
// try newer Essentials 3.x integration method
|
||||
try
|
||||
{
|
||||
Class.forName("com.earth2me.essentials.chat.EssentialsLocalChatEvent");
|
||||
integrateChat(essChat);
|
||||
}
|
||||
catch (ClassNotFoundException ex)
|
||||
{
|
||||
// no? try older Essentials 2.x integration method
|
||||
try
|
||||
{
|
||||
EssentialsOldVersionFeatures.integrateChat(essChat);
|
||||
}
|
||||
catch (NoClassDefFoundError ex2) { /* no known integration method, then */ }
|
||||
}
|
||||
}
|
||||
|
||||
public static void unhookChat()
|
||||
{
|
||||
if (essChat == null) return;
|
||||
|
||||
try
|
||||
{
|
||||
EssentialsOldVersionFeatures.unhookChat();
|
||||
}
|
||||
catch (NoClassDefFoundError ex) {}
|
||||
}
|
||||
|
||||
|
||||
// return false if feature is disabled or Essentials isn't available
|
||||
public static boolean handleTeleport(Player player, Location loc)
|
||||
{
|
||||
if ( ! Conf.homesTeleportCommandEssentialsIntegration || essentials == null) return false;
|
||||
|
||||
Teleport teleport = (Teleport) essentials.getUser(player).getTeleport();
|
||||
Trade trade = new Trade(Conf.econCostHome, essentials);
|
||||
try
|
||||
{
|
||||
teleport.teleport(loc, trade);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
player.sendMessage(ChatColor.RED.toString()+e.getMessage());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public static void integrateChat(EssentialsChat instance)
|
||||
{
|
||||
essChat = instance;
|
||||
try
|
||||
{
|
||||
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
|
||||
if (Conf.chatTagReplaceString.contains("{"))
|
||||
{
|
||||
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.");
|
||||
}
|
||||
}
|
||||
catch (NoSuchMethodError ex)
|
||||
{
|
||||
essChat = null;
|
||||
}
|
||||
}
|
||||
|
||||
private static class LocalChatListener implements Listener
|
||||
{
|
||||
@SuppressWarnings("unused")
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPlayerChat(EssentialsLocalChatEvent event)
|
||||
{
|
||||
Player speaker = event.getPlayer();
|
||||
String format = event.getFormat();
|
||||
format = format.replace(Conf.chatTagReplaceString, P.p.getPlayerFactionTag(speaker)).replace("[FACTION_TITLE]", P.p.getPlayerTitle(speaker));
|
||||
event.setFormat(format);
|
||||
// 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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
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.IEssentialsChatListener;
|
||||
|
||||
|
||||
/*
|
||||
* This Essentials integration handler is for older 2.x.x versions of Essentials which have "IEssentialsChatListener"
|
||||
*/
|
||||
|
||||
public class EssentialsOldVersionFeatures
|
||||
{
|
||||
private static EssentialsChat essChat;
|
||||
|
||||
public static void integrateChat(EssentialsChat instance)
|
||||
{
|
||||
essChat = instance;
|
||||
try
|
||||
{
|
||||
essChat.addEssentialsChatListener("Factions", new IEssentialsChatListener()
|
||||
{
|
||||
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
|
||||
if (essChat.getDescription().getVersion().startsWith("2.8.") && Conf.chatTagReplaceString.contains("{"))
|
||||
{
|
||||
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.");
|
||||
}
|
||||
}
|
||||
catch (NoSuchMethodError ex)
|
||||
{
|
||||
essChat = null;
|
||||
}
|
||||
}
|
||||
|
||||
public static void unhookChat()
|
||||
{
|
||||
if (essChat != null)
|
||||
{
|
||||
essChat.removeEssentialsChatListener("Factions");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
package com.massivecraft.factions.integration;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Chunk;
|
||||
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;
|
||||
import com.griefcraft.lwc.LWCPlugin;
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.FLocation;
|
||||
import com.massivecraft.factions.FPlayers;
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.P;
|
||||
|
||||
public class LWCFeatures
|
||||
{
|
||||
private static LWC lwc;
|
||||
|
||||
public static void setup()
|
||||
{
|
||||
Plugin test = Bukkit.getServer().getPluginManager().getPlugin("LWC");
|
||||
if(test == null || !test.isEnabled()) return;
|
||||
|
||||
lwc = ((LWCPlugin)test).getLWC();
|
||||
P.p.log("Successfully hooked into LWC!"+(Conf.lwcIntegration ? "" : " Integration is currently disabled, though (\"lwcIntegration\")."));
|
||||
}
|
||||
|
||||
public static boolean getEnabled()
|
||||
{
|
||||
return Conf.lwcIntegration && lwc != null;
|
||||
}
|
||||
|
||||
public static void clearOtherChests(FLocation flocation, Faction faction)
|
||||
{
|
||||
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)
|
||||
{
|
||||
if(!faction.getFPlayers().contains(FPlayers.i.get(lwc.findProtection(chests.get(x)).getOwner())))
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,329 @@
|
||||
package com.massivecraft.factions.integration;
|
||||
|
||||
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;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.massivecraft.factions.struct.Relation;
|
||||
import com.massivecraft.factions.struct.Role;
|
||||
|
||||
import org.getspout.spoutapi.gui.Color;
|
||||
import org.getspout.spoutapi.player.SpoutPlayer;
|
||||
import org.getspout.spoutapi.SpoutManager;
|
||||
|
||||
|
||||
public class SpoutFeatures
|
||||
{
|
||||
private transient static boolean spoutMe = false;
|
||||
private transient static SpoutMainListener mainListener;
|
||||
private transient static boolean listenersHooked;
|
||||
|
||||
public static void setup()
|
||||
{
|
||||
Plugin test = Bukkit.getServer().getPluginManager().getPlugin("Spout");
|
||||
if (test == null || !test.isEnabled()) return;
|
||||
|
||||
setAvailable(true, test.getDescription().getFullName());
|
||||
}
|
||||
|
||||
// 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();
|
||||
}
|
||||
|
||||
|
||||
// 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)
|
||||
{
|
||||
if (!enabled())
|
||||
return;
|
||||
|
||||
Set<FPlayer> players = FPlayers.i.getOnline();
|
||||
|
||||
for (FPlayer player : players)
|
||||
{
|
||||
if (fLoc == null)
|
||||
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
|
||||
public static boolean updateTerritoryDisplay(FPlayer player)
|
||||
{
|
||||
if (!enabled())
|
||||
return false;
|
||||
|
||||
return mainListener.updateTerritoryDisplay(player, true);
|
||||
}
|
||||
|
||||
// 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)
|
||||
{
|
||||
if (!enabled())
|
||||
return;
|
||||
|
||||
Set<FPlayer> players = FPlayers.i.getOnline();
|
||||
|
||||
for (FPlayer player : players)
|
||||
{
|
||||
if (fLoc == null || player.getLastStoodAt().equals(fLoc))
|
||||
mainListener.updateOwnerList(player);
|
||||
}
|
||||
}
|
||||
|
||||
// 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 all appearances between every player
|
||||
public static void updateAppearances()
|
||||
{
|
||||
if (!enabled())
|
||||
return;
|
||||
|
||||
Set<FPlayer> players = FPlayers.i.getOnline();
|
||||
|
||||
for (FPlayer playerA : players)
|
||||
{
|
||||
for (FPlayer playerB : players)
|
||||
{
|
||||
updateSingle(playerB, playerA);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// update all appearances related to a specific player
|
||||
public static void updateAppearances(Player player)
|
||||
{
|
||||
if (!enabled() || player == null)
|
||||
return;
|
||||
|
||||
Set<FPlayer> players = FPlayers.i.getOnline();
|
||||
FPlayer playerA = FPlayers.i.get(player);
|
||||
|
||||
for (FPlayer playerB : players)
|
||||
{
|
||||
updateSingle(playerB, playerA);
|
||||
updateSingle(playerA, playerB);
|
||||
}
|
||||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
// update all appearances related to a single faction
|
||||
public static void updateAppearances(Faction faction)
|
||||
{
|
||||
if (!enabled() || faction == null)
|
||||
return;
|
||||
|
||||
Set<FPlayer> players = FPlayers.i.getOnline();
|
||||
Faction factionA;
|
||||
|
||||
for (FPlayer playerA : players)
|
||||
{
|
||||
factionA = playerA.getFaction();
|
||||
|
||||
for (FPlayer playerB : players)
|
||||
{
|
||||
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
|
||||
private static void updateSingle(FPlayer viewer, FPlayer viewed)
|
||||
{
|
||||
if (viewer == null || viewed == null)
|
||||
return;
|
||||
|
||||
Faction viewedFaction = viewed.getFaction();
|
||||
if (viewedFaction == null)
|
||||
return;
|
||||
|
||||
// these still end up returning null on occasion at this point, mucking up the SpoutManager.getPlayer() method
|
||||
if (viewer.getPlayer() == null || viewed.getPlayer() == null)
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,247 @@
|
||||
package com.massivecraft.factions.integration;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
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.gui.GenericLabel;
|
||||
import org.getspout.spoutapi.player.SpoutPlayer;
|
||||
import org.getspout.spoutapi.SpoutManager;
|
||||
|
||||
|
||||
public class SpoutMainListener implements Listener
|
||||
{
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onSpoutCraftEnable(SpoutCraftEnableEvent event)
|
||||
{
|
||||
final FPlayer me = FPlayers.i.get(event.getPlayer());
|
||||
|
||||
SpoutFeatures.updateAppearances(me.getPlayer());
|
||||
updateTerritoryDisplay(me, true);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------------------//
|
||||
// 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, NoticeLabel> territoryChangeLabels = new HashMap<String, NoticeLabel>();
|
||||
private transient static Map<String, GenericLabel> ownerLabels = new HashMap<String, GenericLabel>();
|
||||
private final static int SCREEN_WIDTH = 427;
|
||||
// private final static int SCREEN_HEIGHT = 240;
|
||||
|
||||
|
||||
public boolean updateTerritoryDisplay(FPlayer player, boolean notify)
|
||||
{
|
||||
Player p = player.getPlayer();
|
||||
if (p == null)
|
||||
return false;
|
||||
|
||||
SpoutPlayer sPlayer = SpoutManager.getPlayer(p);
|
||||
if (!sPlayer.isSpoutCraftEnabled() || (Conf.spoutTerritoryDisplaySize <= 0 && ! Conf.spoutTerritoryNoticeShow))
|
||||
return false;
|
||||
|
||||
doLabels(player, sPlayer, notify);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void updateOwnerList(FPlayer player)
|
||||
{
|
||||
SpoutPlayer sPlayer = SpoutManager.getPlayer(player.getPlayer());
|
||||
if (!sPlayer.isSpoutCraftEnabled() || (Conf.spoutTerritoryDisplaySize <= 0 && ! Conf.spoutTerritoryNoticeShow))
|
||||
return;
|
||||
|
||||
FLocation here = player.getLastStoodAt();
|
||||
Faction factionHere = Board.getFactionAt(here);
|
||||
|
||||
doOwnerList(player, sPlayer, here, factionHere);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
public void removeTerritoryLabels(String playerName)
|
||||
{
|
||||
territoryLabels.remove(playerName);
|
||||
territoryChangeLabels.remove(playerName);
|
||||
ownerLabels.remove(playerName);
|
||||
}
|
||||
|
||||
|
||||
private void doLabels(FPlayer player, SpoutPlayer sPlayer, boolean notify)
|
||||
{
|
||||
FLocation here = player.getLastStoodAt();
|
||||
Faction factionHere = Board.getFactionAt(here);
|
||||
String tag = factionHere.getColorTo(player).toString() + factionHere.getTag();
|
||||
|
||||
// ----------------------
|
||||
// Main territory display
|
||||
// ----------------------
|
||||
if (Conf.spoutTerritoryDisplayPosition > 0 && Conf.spoutTerritoryDisplaySize > 0)
|
||||
{
|
||||
GenericLabel label;
|
||||
if (territoryLabels.containsKey(player.getName()))
|
||||
label = territoryLabels.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);
|
||||
|
||||
sPlayer.getMainScreen().attachWidget(P.p, label);
|
||||
territoryLabels.put(player.getName(), label);
|
||||
}
|
||||
|
||||
String msg = tag;
|
||||
|
||||
if (Conf.spoutTerritoryDisplayShowDescription && !factionHere.getDescription().isEmpty())
|
||||
msg += " - " + factionHere.getDescription();
|
||||
|
||||
label.setText(msg);
|
||||
alignLabel(label, msg);
|
||||
label.setDirty(true);
|
||||
}
|
||||
|
||||
// -----------------------
|
||||
// Fading territory notice
|
||||
// -----------------------
|
||||
if (notify && Conf.spoutTerritoryNoticeShow && Conf.spoutTerritoryNoticeSize > 0)
|
||||
{
|
||||
NoticeLabel label;
|
||||
if (territoryChangeLabels.containsKey(player.getName()))
|
||||
label = territoryChangeLabels.get(player.getName());
|
||||
else
|
||||
{
|
||||
label = new NoticeLabel(Conf.spoutTerritoryNoticeLeaveAfterSeconds);
|
||||
label.setWidth(1).setHeight(1); // prevent Spout's questionable new "no default size" warning
|
||||
label.setScale(Conf.spoutTerritoryNoticeSize);
|
||||
label.setY(Conf.spoutTerritoryNoticeTop);
|
||||
sPlayer.getMainScreen().attachWidget(P.p, label);
|
||||
territoryChangeLabels.put(player.getName(), label);
|
||||
}
|
||||
|
||||
String msg = tag;
|
||||
|
||||
if (Conf.spoutTerritoryNoticeShowDescription && !factionHere.getDescription().isEmpty())
|
||||
msg += " - " + factionHere.getDescription();
|
||||
|
||||
label.setText(msg);
|
||||
alignLabel(label, msg, 2);
|
||||
label.resetNotice();
|
||||
label.setDirty(true);
|
||||
}
|
||||
|
||||
// and owner list, of course
|
||||
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 = "";
|
||||
|
||||
if (player.getFaction() == factionHere)
|
||||
{
|
||||
msg = factionHere.getOwnerListString(here);
|
||||
|
||||
if (!msg.isEmpty())
|
||||
msg = Conf.ownedLandMessage + msg;
|
||||
}
|
||||
|
||||
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
|
||||
public void alignLabel(GenericLabel label, String text)
|
||||
{
|
||||
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)
|
||||
{
|
||||
case 1: // left aligned
|
||||
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 int initial;
|
||||
private int countdown; // current delay countdown
|
||||
|
||||
public NoticeLabel(float secondsOfLife)
|
||||
{
|
||||
initial = (int)(secondsOfLife * 20);
|
||||
resetNotice();
|
||||
}
|
||||
|
||||
public final void resetNotice()
|
||||
{
|
||||
countdown = initial;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTick()
|
||||
{
|
||||
if (countdown <= 0)
|
||||
return;
|
||||
|
||||
this.countdown -= 1;
|
||||
|
||||
if (this.countdown <= 0)
|
||||
{
|
||||
this.setText("");
|
||||
this.setDirty(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,152 @@
|
||||
package com.massivecraft.factions.integration;
|
||||
|
||||
import com.massivecraft.factions.P;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
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 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
|
||||
* Author: Spathizilla
|
||||
*/
|
||||
|
||||
public class Worldguard
|
||||
{
|
||||
private static WorldGuardPlugin wg;
|
||||
private static boolean enabled = false;
|
||||
|
||||
public static void init(Plugin plugin)
|
||||
{
|
||||
Plugin wgplug = plugin.getServer().getPluginManager().getPlugin("WorldGuard");
|
||||
if (wgplug == null || !(wgplug instanceof WorldGuardPlugin))
|
||||
{
|
||||
enabled = false;
|
||||
wg = null;
|
||||
P.p.log("Could not hook to WorldGuard. WorldGuard checks are disabled.");
|
||||
}
|
||||
else
|
||||
{
|
||||
wg = (WorldGuardPlugin) wgplug;
|
||||
enabled = true;
|
||||
P.p.log("Successfully hooked to WorldGuard.");
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isEnabled()
|
||||
{
|
||||
return enabled;
|
||||
}
|
||||
|
||||
// PVP Flag check
|
||||
// Returns:
|
||||
// True: PVP is allowed
|
||||
// False: PVP is disallowed
|
||||
public static boolean isPVP(Player player)
|
||||
{
|
||||
if( ! enabled)
|
||||
{
|
||||
// No WG hooks so we'll always bypass this check.
|
||||
return true;
|
||||
}
|
||||
|
||||
Location loc = player.getLocation();
|
||||
World world = loc.getWorld();
|
||||
Vector pt = toVector(loc);
|
||||
|
||||
RegionManager regionManager = wg.getRegionManager(world);
|
||||
ApplicableRegionSet set = regionManager.getApplicableRegions(pt);
|
||||
return set.allows(DefaultFlag.PVP);
|
||||
}
|
||||
|
||||
// Check if player can build at location by worldguards rules.
|
||||
// Returns:
|
||||
// True: Player can build in the region.
|
||||
// False: Player can not build in the region.
|
||||
public static boolean playerCanBuild(Player player, Location loc)
|
||||
{
|
||||
if( ! enabled)
|
||||
{
|
||||
// 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
|
||||
// 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;
|
||||
}
|
||||
|
||||
World world = loc.getWorld();
|
||||
Chunk chunk = world.getChunkAt(loc);
|
||||
int minChunkX = chunk.getX() << 4;
|
||||
int minChunkZ = chunk.getZ() << 4;
|
||||
int maxChunkX = minChunkX + 15;
|
||||
int maxChunkZ = minChunkZ + 15;
|
||||
|
||||
int worldHeight = world.getMaxHeight(); // Allow for heights other than default
|
||||
|
||||
BlockVector minChunk = new BlockVector(minChunkX, 0, minChunkZ);
|
||||
BlockVector maxChunk = new BlockVector(maxChunkX, worldHeight, maxChunkZ);
|
||||
|
||||
RegionManager regionManager = wg.getRegionManager(world);
|
||||
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
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.massivecraft.factions.integration.capi;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
import com.massivecraft.factions.P;
|
||||
|
||||
public class CapiFeatures
|
||||
{
|
||||
public static void setup()
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
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.Channels;
|
||||
import com.massivecraft.capi.events.CAPIListChannelsEvent;
|
||||
import com.massivecraft.capi.events.CAPIMessageToChannelEvent;
|
||||
import com.massivecraft.capi.events.CAPIMessageToPlayerEvent;
|
||||
import com.massivecraft.capi.events.CAPISelectChannelEvent;
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import com.massivecraft.factions.FPlayers;
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.P;
|
||||
import com.massivecraft.factions.struct.Relation;
|
||||
|
||||
public class PluginCapiListener implements Listener
|
||||
{
|
||||
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);
|
||||
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+" ");
|
||||
|
||||
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
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,259 @@
|
||||
package com.massivecraft.factions.listeners;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.BlockBreakEvent;
|
||||
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 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))
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onBlockBreak(BlockBreakEvent event)
|
||||
{
|
||||
if (event.isCancelled()) return;
|
||||
|
||||
if ( ! playerCanBuildDestroyBlock(event.getPlayer(), event.getBlock().getLocation(), "destroy", false))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onBlockDamage(BlockDamageEvent event)
|
||||
{
|
||||
if (event.isCancelled()) return;
|
||||
|
||||
if (event.getInstaBreak() && ! playerCanBuildDestroyBlock(event.getPlayer(), event.getBlock().getLocation(), "destroy", false))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onBlockPistonExtend(BlockPistonExtendEvent event)
|
||||
{
|
||||
if (event.isCancelled()) return;
|
||||
if ( ! Conf.pistonProtectionThroughDenyBuild) 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
|
||||
* 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
|
||||
*/
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onBlockPistonRetract(BlockPistonRetractEvent event)
|
||||
{
|
||||
// if not a sticky piston, retraction should be fine
|
||||
if (event.isCancelled() || !event.isSticky() || !Conf.pistonProtectionThroughDenyBuild)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Location targetLoc = event.getRetractLocation();
|
||||
|
||||
// if potentially retracted block is just air/water/lava, no worries
|
||||
if (targetLoc.getBlock().isEmpty() || targetLoc.getBlock().isLiquid())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Faction pistonFaction = Board.getFactionAt(new FLocation(event.getBlock()));
|
||||
|
||||
if (!canPistonMoveBlock(pistonFaction, targetLoc))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean canPistonMoveBlock(Faction pistonFaction, Location target)
|
||||
{
|
||||
|
||||
Faction otherFaction = Board.getFactionAt(new FLocation(target));
|
||||
|
||||
if (pistonFaction == otherFaction)
|
||||
return true;
|
||||
|
||||
if (otherFaction.isNone())
|
||||
{
|
||||
if (!Conf.wildernessDenyBuild || Conf.worldsNoWildernessProtection.contains(target.getWorld().getName()))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
else if (otherFaction.isSafeZone())
|
||||
{
|
||||
if ( ! Conf.safeZoneDenyBuild)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
else if (otherFaction.isWarZone())
|
||||
{
|
||||
if ( ! Conf.warZoneDenyBuild)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
Relation rel = pistonFaction.getRelationTo(otherFaction);
|
||||
|
||||
if (rel.confDenyBuild(otherFaction.hasPlayersOnline()))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean playerCanBuildDestroyBlock(Player player, Location location, String action, boolean justCheck)
|
||||
{
|
||||
String name = player.getName();
|
||||
if (Conf.playersWhoBypassAllProtection.contains(name)) return true;
|
||||
|
||||
FPlayer me = FPlayers.i.get(name);
|
||||
if (me.isAdminBypassing()) return true;
|
||||
|
||||
FLocation loc = new FLocation(location);
|
||||
Faction otherFaction = Board.getFactionAt(loc);
|
||||
|
||||
if (otherFaction.isNone())
|
||||
{
|
||||
if (Conf.worldGuardBuildPriority && Worldguard.playerCanBuild(player, location))
|
||||
return true;
|
||||
|
||||
if (!Conf.wildernessDenyBuild || Conf.worldsNoWildernessProtection.contains(location.getWorld().getName()))
|
||||
return true; // This is not faction territory. Use whatever you like here.
|
||||
|
||||
if (!justCheck)
|
||||
me.msg("<b>You can't "+action+" in the wilderness.");
|
||||
|
||||
return false;
|
||||
}
|
||||
else if (otherFaction.isSafeZone())
|
||||
{
|
||||
if (Conf.worldGuardBuildPriority && Worldguard.playerCanBuild(player, location))
|
||||
return true;
|
||||
|
||||
if (!Conf.safeZoneDenyBuild || Permission.MANAGE_SAFE_ZONE.has(player))
|
||||
return true;
|
||||
|
||||
if (!justCheck)
|
||||
me.msg("<b>You can't "+action+" in a safe zone.");
|
||||
|
||||
return false;
|
||||
}
|
||||
else if (otherFaction.isWarZone())
|
||||
{
|
||||
if (Conf.worldGuardBuildPriority && Worldguard.playerCanBuild(player, location))
|
||||
return true;
|
||||
|
||||
if (!Conf.warZoneDenyBuild || Permission.MANAGE_WAR_ZONE.has(player))
|
||||
return true;
|
||||
|
||||
if (!justCheck)
|
||||
me.msg("<b>You can't "+action+" in a war zone.");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
Faction myFaction = me.getFaction();
|
||||
Relation rel = myFaction.getRelationTo(otherFaction);
|
||||
boolean online = otherFaction.hasPlayersOnline();
|
||||
boolean pain = !justCheck && rel.confPainBuild(online);
|
||||
boolean deny = rel.confDenyBuild(online);
|
||||
|
||||
// hurt the player for building/destroying in other territory?
|
||||
if (pain)
|
||||
{
|
||||
player.damage(Conf.actionDeniedPainAmount);
|
||||
|
||||
if (!deny)
|
||||
me.msg("<b>It is painful to try to "+action+" in the territory of "+otherFaction.getTag(myFaction));
|
||||
}
|
||||
|
||||
// cancel building/destroying in other territory?
|
||||
if (deny)
|
||||
{
|
||||
if (!justCheck)
|
||||
me.msg("<b>You can't "+action+" in the territory of "+otherFaction.getTag(myFaction));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// 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 (!pain && Conf.ownedAreaPainBuild && !justCheck)
|
||||
{
|
||||
player.damage(Conf.actionDeniedPainAmount);
|
||||
|
||||
if (!Conf.ownedAreaDenyBuild)
|
||||
me.msg("<b>It is painful to try to "+action+" in this territory, it is owned by: "+otherFaction.getOwnerListString(loc));
|
||||
}
|
||||
if (Conf.ownedAreaDenyBuild)
|
||||
{
|
||||
if (!justCheck)
|
||||
me.msg("<b>You can't "+action+" in this territory, it is owned by: "+otherFaction.getOwnerListString(loc));
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,185 @@
|
||||
package com.massivecraft.factions.listeners;
|
||||
|
||||
import java.util.logging.Level;
|
||||
import java.util.UnknownFormatConversionException;
|
||||
|
||||
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.event.player.PlayerChatEvent;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
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 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
|
||||
if (chat != ChatMode.PUBLIC && p.handleCommand(talkingPlayer, msg, false, true))
|
||||
{
|
||||
if (Conf.logPlayerCommands)
|
||||
Bukkit.getLogger().log(Level.INFO, "[PLAYER_COMMAND] "+talkingPlayer.getName()+": "+msg);
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
// Is it a faction chat message?
|
||||
if (chat == ChatMode.FACTION)
|
||||
{
|
||||
Faction myFaction = me.getFaction();
|
||||
|
||||
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
|
||||
for (FPlayer fplayer : FPlayers.i.getOnline())
|
||||
{
|
||||
if(fplayer.isSpyingChat() && fplayer.getFaction() != myFaction)
|
||||
fplayer.sendMessage("[FCspy] "+myFaction.getTag()+": "+message);
|
||||
}
|
||||
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
else if (chat == ChatMode.ALLIANCE)
|
||||
{
|
||||
Faction myFaction = me.getFaction();
|
||||
|
||||
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
|
||||
for (FPlayer fplayer : FPlayers.i.getOnline())
|
||||
{
|
||||
if(myFaction.getRelationTo(fplayer) == Relation.ALLY)
|
||||
fplayer.sendMessage(message);
|
||||
|
||||
//Send to any players who are spying chat
|
||||
else if(fplayer.isSpyingChat())
|
||||
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
|
||||
@EventHandler(priority = EventPriority.HIGHEST)
|
||||
public void onPlayerChat(PlayerChatEvent event)
|
||||
{
|
||||
if (event.isCancelled()) return;
|
||||
|
||||
// Are we to insert the Faction tag into the format?
|
||||
// If we are not to insert it - we are done.
|
||||
if ( ! Conf.chatTagEnabled || Conf.chatTagHandledByAnotherPlugin) return;
|
||||
|
||||
Player talkingPlayer = event.getPlayer();
|
||||
String msg = event.getMessage();
|
||||
String eventFormat = event.getFormat();
|
||||
FPlayer me = FPlayers.i.get(talkingPlayer);
|
||||
int InsertIndex = 0;
|
||||
|
||||
if (!Conf.chatTagReplaceString.isEmpty() && eventFormat.contains(Conf.chatTagReplaceString))
|
||||
{
|
||||
// we're using the "replace" method of inserting the faction tags
|
||||
// if they stuck "[FACTION_TITLE]" in there, go ahead and do it too
|
||||
if (eventFormat.contains("[FACTION_TITLE]"))
|
||||
{
|
||||
eventFormat = eventFormat.replace("[FACTION_TITLE]", me.getTitle());
|
||||
}
|
||||
InsertIndex = eventFormat.indexOf(Conf.chatTagReplaceString);
|
||||
eventFormat = eventFormat.replace(Conf.chatTagReplaceString, "");
|
||||
Conf.chatTagPadAfter = false;
|
||||
Conf.chatTagPadBefore = false;
|
||||
}
|
||||
else if (!Conf.chatTagInsertAfterString.isEmpty() && eventFormat.contains(Conf.chatTagInsertAfterString))
|
||||
{
|
||||
// we're using the "insert after string" method
|
||||
InsertIndex = eventFormat.indexOf(Conf.chatTagInsertAfterString) + Conf.chatTagInsertAfterString.length();
|
||||
}
|
||||
else if (!Conf.chatTagInsertBeforeString.isEmpty() && eventFormat.contains(Conf.chatTagInsertBeforeString))
|
||||
{
|
||||
// we're using the "insert before string" method
|
||||
InsertIndex = eventFormat.indexOf(Conf.chatTagInsertBeforeString);
|
||||
}
|
||||
else
|
||||
{
|
||||
// we'll fall back to using the index place method
|
||||
InsertIndex = Conf.chatTagInsertIndex;
|
||||
if (InsertIndex > eventFormat.length())
|
||||
return;
|
||||
}
|
||||
|
||||
String formatStart = eventFormat.substring(0, InsertIndex) + ((Conf.chatTagPadBefore && !me.getChatTag().isEmpty()) ? " " : "");
|
||||
String formatEnd = ((Conf.chatTagPadAfter && !me.getChatTag().isEmpty()) ? " " : "") + eventFormat.substring(InsertIndex);
|
||||
|
||||
String nonColoredMsgFormat = formatStart + me.getChatTag().trim() + formatEnd;
|
||||
|
||||
// Relation Colored?
|
||||
if (Conf.chatTagRelationColored)
|
||||
{
|
||||
// We must choke the standard message and send out individual messages to all players
|
||||
// Why? Because the relations will differ.
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,666 @@
|
||||
package com.massivecraft.factions.listeners;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Set;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Creeper;
|
||||
import org.bukkit.entity.Enderman;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Fireball;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.minecart.ExplosiveMinecart;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Projectile;
|
||||
import org.bukkit.entity.TNTPrimed;
|
||||
import org.bukkit.entity.Wither;
|
||||
import org.bukkit.entity.WitherSkull;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.CreatureSpawnEvent;
|
||||
import org.bukkit.event.entity.EntityChangeBlockEvent;
|
||||
import org.bukkit.event.entity.EntityCombustByEntityEvent;
|
||||
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||
import org.bukkit.event.entity.EntityDamageEvent;
|
||||
import org.bukkit.event.entity.EntityDeathEvent;
|
||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||
import org.bukkit.event.entity.EntityTargetEvent;
|
||||
import org.bukkit.event.entity.PotionSplashEvent;
|
||||
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
|
||||
import org.bukkit.event.hanging.HangingBreakEvent;
|
||||
import org.bukkit.event.hanging.HangingBreakEvent.RemoveCause;
|
||||
import org.bukkit.event.hanging.HangingPlaceEvent;
|
||||
import org.bukkit.potion.PotionEffect;
|
||||
import org.bukkit.potion.PotionEffectType;
|
||||
|
||||
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.event.PowerLossEvent;
|
||||
import com.massivecraft.factions.struct.Relation;
|
||||
import com.massivecraft.factions.util.MiscUtil;
|
||||
|
||||
|
||||
public class FactionsEntityListener implements Listener
|
||||
{
|
||||
public P p;
|
||||
public FactionsEntityListener(P p)
|
||||
{
|
||||
this.p = p;
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onEntityDeath(EntityDeathEvent event)
|
||||
{
|
||||
Entity entity = event.getEntity();
|
||||
if ( ! (entity instanceof Player))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = (Player) entity;
|
||||
FPlayer fplayer = FPlayers.i.get(player);
|
||||
Faction faction = Board.getFactionAt(new FLocation(player.getLocation()));
|
||||
|
||||
PowerLossEvent powerLossEvent = new PowerLossEvent(faction,fplayer);
|
||||
// Check for no power loss conditions
|
||||
if (faction.isWarZone())
|
||||
{
|
||||
// war zones always override worldsNoPowerLoss either way, thus this layout
|
||||
if (! Conf.warZonePowerLoss)
|
||||
{
|
||||
powerLossEvent.setMessage("<i>You didn't lose any power since you were in a war zone.");
|
||||
powerLossEvent.setCancelled(true);
|
||||
}
|
||||
if (Conf.worldsNoPowerLoss.contains(player.getWorld().getName()))
|
||||
{
|
||||
powerLossEvent.setMessage("<b>The world you are in has power loss normally disabled, but you still lost power since you were in a war zone.\n<i>Your power is now <h>%d / %d");
|
||||
}
|
||||
}
|
||||
else if (faction.isNone() && !Conf.wildernessPowerLoss && !Conf.worldsNoWildernessProtection.contains(player.getWorld().getName()))
|
||||
{
|
||||
powerLossEvent.setMessage("<i>You didn't lose any power since you were in the wilderness.");
|
||||
powerLossEvent.setCancelled(true);
|
||||
}
|
||||
else if (Conf.worldsNoPowerLoss.contains(player.getWorld().getName()))
|
||||
{
|
||||
powerLossEvent.setMessage("<i>You didn't lose any power due to the world you died in.");
|
||||
powerLossEvent.setCancelled(true);
|
||||
}
|
||||
else if (Conf.peacefulMembersDisablePowerLoss && fplayer.hasFaction() && fplayer.getFaction().isPeaceful())
|
||||
{
|
||||
powerLossEvent.setMessage("<i>You didn't lose any power since you are in a peaceful faction.");
|
||||
powerLossEvent.setCancelled(true);
|
||||
}
|
||||
else {
|
||||
powerLossEvent.setMessage("<i>Your power is now <h>%d / %d");
|
||||
}
|
||||
|
||||
// call Event
|
||||
Bukkit.getPluginManager().callEvent(powerLossEvent);
|
||||
|
||||
// Call player onDeath if the event is not cancelled
|
||||
if(!powerLossEvent.isCancelled())
|
||||
{
|
||||
fplayer.onDeath();
|
||||
}
|
||||
// Send the message from the powerLossEvent
|
||||
final String msg = powerLossEvent.getMessage();
|
||||
if (msg != null && !msg.isEmpty())
|
||||
{
|
||||
fplayer.msg(msg,fplayer.getPowerRounded(),fplayer.getPowerMaxRounded());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Who can I hurt?
|
||||
* I can never hurt members or allies.
|
||||
* I can always hurt enemies.
|
||||
* I can hurt neutrals as long as they are outside their own territory.
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onEntityDamage(EntityDamageEvent event)
|
||||
{
|
||||
if (event.isCancelled()) return;
|
||||
|
||||
if (event instanceof EntityDamageByEntityEvent)
|
||||
{
|
||||
EntityDamageByEntityEvent sub = (EntityDamageByEntityEvent)event;
|
||||
if ( ! this.canDamagerHurtDamagee(sub, true))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
else if (Conf.safeZonePreventAllDamageToPlayers && isPlayerInSafeZone(event.getEntity()))
|
||||
{
|
||||
// Players can not take any damage in a Safe Zone
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onEntityExplode(EntityExplodeEvent event)
|
||||
{
|
||||
if (event.isCancelled()) return;
|
||||
|
||||
Location loc = event.getLocation();
|
||||
Entity boomer = event.getEntity();
|
||||
Faction faction = Board.getFactionAt(new FLocation(loc));
|
||||
|
||||
if (faction.noExplosionsInTerritory())
|
||||
{
|
||||
// faction is peaceful and has explosions set to disabled
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
boolean online = faction.hasPlayersOnline();
|
||||
|
||||
if
|
||||
(
|
||||
boomer instanceof Creeper
|
||||
&&
|
||||
(
|
||||
(faction.isNone() && Conf.wildernessBlockCreepers && !Conf.worldsNoWildernessProtection.contains(loc.getWorld().getName()))
|
||||
||
|
||||
(faction.isNormal() && (online ? Conf.territoryBlockCreepers : Conf.territoryBlockCreepersWhenOffline))
|
||||
||
|
||||
(faction.isWarZone() && Conf.warZoneBlockCreepers)
|
||||
||
|
||||
faction.isSafeZone()
|
||||
)
|
||||
)
|
||||
{
|
||||
// creeper which needs prevention
|
||||
event.setCancelled(true);
|
||||
}
|
||||
else if
|
||||
(
|
||||
// it's a bit crude just using fireball protection for Wither boss too, but I'd rather not add in a whole new set of xxxBlockWitherExplosion or whatever
|
||||
(boomer instanceof Fireball || boomer instanceof WitherSkull || boomer instanceof Wither)
|
||||
&&
|
||||
(
|
||||
(faction.isNone() && Conf.wildernessBlockFireballs && !Conf.worldsNoWildernessProtection.contains(loc.getWorld().getName()))
|
||||
||
|
||||
(faction.isNormal() && (online ? Conf.territoryBlockFireballs : Conf.territoryBlockFireballsWhenOffline))
|
||||
||
|
||||
(faction.isWarZone() && Conf.warZoneBlockFireballs)
|
||||
||
|
||||
faction.isSafeZone()
|
||||
)
|
||||
)
|
||||
{
|
||||
// ghast fireball which needs prevention
|
||||
event.setCancelled(true);
|
||||
}
|
||||
else if
|
||||
(
|
||||
(boomer instanceof TNTPrimed || boomer instanceof ExplosiveMinecart)
|
||||
&&
|
||||
(
|
||||
(faction.isNone() && Conf.wildernessBlockTNT && ! Conf.worldsNoWildernessProtection.contains(loc.getWorld().getName()))
|
||||
||
|
||||
(faction.isNormal() && ( online ? Conf.territoryBlockTNT : Conf.territoryBlockTNTWhenOffline ))
|
||||
||
|
||||
(faction.isWarZone() && Conf.warZoneBlockTNT)
|
||||
||
|
||||
(faction.isSafeZone() && Conf.safeZoneBlockTNT)
|
||||
)
|
||||
)
|
||||
{
|
||||
// TNT which needs prevention
|
||||
event.setCancelled(true);
|
||||
}
|
||||
else if ((boomer instanceof TNTPrimed || boomer instanceof ExplosiveMinecart) && Conf.handleExploitTNTWaterlog)
|
||||
{
|
||||
// TNT in water/lava doesn't normally destroy any surrounding blocks, which is usually desired behavior, but...
|
||||
// this change below provides workaround for waterwalling providing perfect protection,
|
||||
// and makes cheap (non-obsidian) TNT cannons require minor maintenance between shots
|
||||
Block center = loc.getBlock();
|
||||
if (center.isLiquid())
|
||||
{
|
||||
// a single surrounding block in all 6 directions is broken if the material is weak enough
|
||||
List<Block> targets = new ArrayList<Block>();
|
||||
targets.add(center.getRelative(0, 0, 1));
|
||||
targets.add(center.getRelative(0, 0, -1));
|
||||
targets.add(center.getRelative(0, 1, 0));
|
||||
targets.add(center.getRelative(0, -1, 0));
|
||||
targets.add(center.getRelative(1, 0, 0));
|
||||
targets.add(center.getRelative(-1, 0, 0));
|
||||
for (Block target : targets)
|
||||
{
|
||||
int id = target.getTypeId();
|
||||
// ignore air, bedrock, water, lava, obsidian, enchanting table, etc.... too bad we can't get a blast resistance value through Bukkit yet
|
||||
if (id != 0 && (id < 7 || id > 11) && id != 49 && id != 90 && id != 116 && id != 119 && id != 120 && id != 130)
|
||||
target.breakNaturally();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// mainly for flaming arrows; don't want allies or people in safe zones to be ignited even after damage event is cancelled
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onEntityCombustByEntity(EntityCombustByEntityEvent event)
|
||||
{
|
||||
if (event.isCancelled()) return;
|
||||
|
||||
EntityDamageByEntityEvent sub = new EntityDamageByEntityEvent(event.getCombuster(), event.getEntity(), EntityDamageEvent.DamageCause.FIRE, 0);
|
||||
if ( ! this.canDamagerHurtDamagee(sub, false))
|
||||
event.setCancelled(true);
|
||||
sub = null;
|
||||
}
|
||||
|
||||
private static final Set<PotionEffectType> badPotionEffects = new LinkedHashSet<PotionEffectType>(Arrays.asList(
|
||||
PotionEffectType.BLINDNESS, PotionEffectType.CONFUSION, PotionEffectType.HARM, PotionEffectType.HUNGER,
|
||||
PotionEffectType.POISON, PotionEffectType.SLOW, PotionEffectType.SLOW_DIGGING, PotionEffectType.WEAKNESS,
|
||||
PotionEffectType.WITHER
|
||||
));
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPotionSplashEvent(PotionSplashEvent event)
|
||||
{
|
||||
if (event.isCancelled()) return;
|
||||
|
||||
// see if the potion has a harmful effect
|
||||
boolean badjuju = false;
|
||||
for (PotionEffect effect : event.getPotion().getEffects())
|
||||
{
|
||||
if (badPotionEffects.contains(effect.getType()))
|
||||
{
|
||||
badjuju = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( ! badjuju) return;
|
||||
|
||||
Entity thrower = event.getPotion().getShooter();
|
||||
|
||||
// scan through affected entities to make sure they're all valid targets
|
||||
Iterator<LivingEntity> iter = event.getAffectedEntities().iterator();
|
||||
while (iter.hasNext())
|
||||
{
|
||||
LivingEntity target = iter.next();
|
||||
EntityDamageByEntityEvent sub = new EntityDamageByEntityEvent(thrower, target, EntityDamageEvent.DamageCause.CUSTOM, 0);
|
||||
if ( ! this.canDamagerHurtDamagee(sub, true))
|
||||
event.setIntensity(target, 0.0); // affected entity list doesn't accept modification (so no iter.remove()), but this works
|
||||
sub = null;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isPlayerInSafeZone(Entity damagee)
|
||||
{
|
||||
if ( ! (damagee instanceof Player))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (Board.getFactionAt(new FLocation(damagee.getLocation())).isSafeZone())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean canDamagerHurtDamagee(EntityDamageByEntityEvent sub)
|
||||
{
|
||||
return canDamagerHurtDamagee(sub, true);
|
||||
}
|
||||
|
||||
public boolean canDamagerHurtDamagee(EntityDamageByEntityEvent sub, boolean notify)
|
||||
{
|
||||
Entity damager = sub.getDamager();
|
||||
Entity damagee = sub.getEntity();
|
||||
int damage = sub.getDamage();
|
||||
|
||||
if ( ! (damagee instanceof Player))
|
||||
return true;
|
||||
|
||||
FPlayer defender = FPlayers.i.get((Player)damagee);
|
||||
|
||||
if (defender == null || defender.getPlayer() == null)
|
||||
return true;
|
||||
|
||||
Location defenderLoc = defender.getPlayer().getLocation();
|
||||
Faction defLocFaction = Board.getFactionAt(new FLocation(defenderLoc));
|
||||
|
||||
// for damage caused by projectiles, getDamager() returns the projectile... what we need to know is the source
|
||||
if (damager instanceof Projectile)
|
||||
damager = ((Projectile)damager).getShooter();
|
||||
|
||||
if (damager == damagee) // ender pearl usage and other self-inflicted damage
|
||||
return true;
|
||||
|
||||
// Players can not take attack damage in a SafeZone, or possibly peaceful territory
|
||||
if (defLocFaction.noPvPInTerritory()) {
|
||||
if (damager instanceof Player)
|
||||
{
|
||||
if (notify)
|
||||
{
|
||||
FPlayer attacker = FPlayers.i.get((Player)damager);
|
||||
attacker.msg("<i>You can't hurt other players in "+(defLocFaction.isSafeZone() ? "a SafeZone." : "peaceful territory."));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return !defLocFaction.noMonstersInTerritory();
|
||||
}
|
||||
|
||||
if ( ! (damager instanceof Player))
|
||||
return true;
|
||||
|
||||
FPlayer attacker = FPlayers.i.get((Player)damager);
|
||||
|
||||
if (attacker == null || attacker.getPlayer() == null)
|
||||
return true;
|
||||
|
||||
if (Conf.playersWhoBypassAllProtection.contains(attacker.getName())) return true;
|
||||
|
||||
if (attacker.hasLoginPvpDisabled())
|
||||
{
|
||||
if (notify) attacker.msg("<i>You can't hurt other players for " + Conf.noPVPDamageToOthersForXSecondsAfterLogin + " seconds after logging in.");
|
||||
return false;
|
||||
}
|
||||
|
||||
Faction locFaction = Board.getFactionAt(new FLocation(attacker));
|
||||
|
||||
// so we know from above that the defender isn't in a safezone... what about the attacker, sneaky dog that he might be?
|
||||
if (locFaction.noPvPInTerritory())
|
||||
{
|
||||
if (notify) attacker.msg("<i>You can't hurt other players while you are in "+(locFaction.isSafeZone() ? "a SafeZone." : "peaceful territory."));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (locFaction.isWarZone() && Conf.warZoneFriendlyFire)
|
||||
return true;
|
||||
|
||||
if (Conf.worldsIgnorePvP.contains(defenderLoc.getWorld().getName()))
|
||||
return true;
|
||||
|
||||
Faction defendFaction = defender.getFaction();
|
||||
Faction attackFaction = attacker.getFaction();
|
||||
|
||||
if (attackFaction.isNone() && Conf.disablePVPForFactionlessPlayers)
|
||||
{
|
||||
if (notify) attacker.msg("<i>You can't hurt other players until you join a faction.");
|
||||
return false;
|
||||
}
|
||||
else if (defendFaction.isNone())
|
||||
{
|
||||
if (defLocFaction == attackFaction && Conf.enablePVPAgainstFactionlessInAttackersLand)
|
||||
{
|
||||
// Allow PVP vs. Factionless in attacker's faction territory
|
||||
return true;
|
||||
}
|
||||
else if (Conf.disablePVPForFactionlessPlayers)
|
||||
{
|
||||
if (notify) attacker.msg("<i>You can't hurt players who are not currently in a faction.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (defendFaction.isPeaceful())
|
||||
{
|
||||
if (notify) attacker.msg("<i>You can't hurt players who are in a peaceful faction.");
|
||||
return false;
|
||||
}
|
||||
else if (attackFaction.isPeaceful())
|
||||
{
|
||||
if (notify) attacker.msg("<i>You can't hurt players while you are in a peaceful faction.");
|
||||
return false;
|
||||
}
|
||||
|
||||
Relation relation = defendFaction.getRelationTo(attackFaction);
|
||||
|
||||
// You can not hurt neutral factions
|
||||
if (Conf.disablePVPBetweenNeutralFactions && relation.isNeutral())
|
||||
{
|
||||
if (notify) attacker.msg("<i>You can't hurt neutral factions. Declare them as an enemy.");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Players without faction may be hurt anywhere
|
||||
if (!defender.hasFaction())
|
||||
return true;
|
||||
|
||||
// You can never hurt faction members or allies
|
||||
if (relation.isMember() || relation.isAlly())
|
||||
{
|
||||
if (notify) attacker.msg("<i>You can't hurt %s<i>.", defender.describeTo(attacker));
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean ownTerritory = defender.isInOwnTerritory();
|
||||
|
||||
// You can not hurt neutrals in their own territory.
|
||||
if (ownTerritory && relation.isNeutral())
|
||||
{
|
||||
if (notify)
|
||||
{
|
||||
attacker.msg("<i>You can't hurt %s<i> in their own territory unless you declare them as an enemy.", defender.describeTo(attacker));
|
||||
defender.msg("%s<i> tried to hurt you.", attacker.describeTo(defender, true));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Damage will be dealt. However check if the damage should be reduced.
|
||||
if (damage > 0.0 && ownTerritory && Conf.territoryShieldFactor > 0)
|
||||
{
|
||||
int newDamage = (int)Math.ceil(damage * (1D - Conf.territoryShieldFactor));
|
||||
sub.setDamage(newDamage);
|
||||
|
||||
// Send message
|
||||
if (notify)
|
||||
{
|
||||
String perc = MessageFormat.format("{0,number,#%}", (Conf.territoryShieldFactor)); // TODO does this display correctly??
|
||||
defender.msg("<i>Enemy damage reduced by <rose>%s<i>.", perc);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onCreatureSpawn(CreatureSpawnEvent event)
|
||||
{
|
||||
if (event.isCancelled() || event.getLocation() == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (Conf.safeZoneNerfedCreatureTypes.contains(event.getEntityType()) && Board.getFactionAt(new FLocation(event.getLocation())).noMonstersInTerritory())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onEntityTarget(EntityTargetEvent event)
|
||||
{
|
||||
if (event.isCancelled()) return;
|
||||
|
||||
// if there is a target
|
||||
Entity target = event.getTarget();
|
||||
if (target == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// We are interested in blocking targeting for certain mobs:
|
||||
if ( ! Conf.safeZoneNerfedCreatureTypes.contains(MiscUtil.creatureTypeFromEntity(event.getEntity())))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// in case the target is in a safe zone.
|
||||
if (Board.getFactionAt(new FLocation(target.getLocation())).noMonstersInTerritory())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPaintingBreak(HangingBreakEvent event)
|
||||
{
|
||||
if (event.isCancelled()) return;
|
||||
if (event.getCause() == RemoveCause.EXPLOSION)
|
||||
{
|
||||
Location loc = event.getEntity().getLocation();
|
||||
Faction faction = Board.getFactionAt(new FLocation(loc));
|
||||
if (faction.noExplosionsInTerritory())
|
||||
{
|
||||
// faction is peaceful and has explosions set to disabled
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
boolean online = faction.hasPlayersOnline();
|
||||
|
||||
if
|
||||
(
|
||||
(
|
||||
faction.isNone()
|
||||
&& !Conf.worldsNoWildernessProtection.contains(loc.getWorld().getName())
|
||||
&& (Conf.wildernessBlockCreepers || Conf.wildernessBlockFireballs || Conf.wildernessBlockTNT)
|
||||
)
|
||||
||
|
||||
(
|
||||
faction.isNormal()
|
||||
&&
|
||||
( online
|
||||
? (Conf.territoryBlockCreepers || Conf.territoryBlockFireballs || Conf.territoryBlockTNT)
|
||||
: (Conf.territoryBlockCreepersWhenOffline || Conf.territoryBlockFireballsWhenOffline || Conf.territoryBlockTNTWhenOffline)
|
||||
)
|
||||
)
|
||||
||
|
||||
(
|
||||
faction.isWarZone()
|
||||
&& (Conf.warZoneBlockCreepers || Conf.warZoneBlockFireballs || Conf.warZoneBlockTNT)
|
||||
)
|
||||
||
|
||||
faction.isSafeZone()
|
||||
)
|
||||
{
|
||||
// explosion which needs prevention
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
if (! (event instanceof HangingBreakByEntityEvent))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Entity breaker = ((HangingBreakByEntityEvent)event).getRemover();
|
||||
if (! (breaker instanceof Player))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ! FactionsBlockListener.playerCanBuildDestroyBlock((Player)breaker, event.getEntity().getLocation(), "remove paintings", false))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPaintingPlace(HangingPlaceEvent event)
|
||||
{
|
||||
if (event.isCancelled()) return;
|
||||
|
||||
if ( ! FactionsBlockListener.playerCanBuildDestroyBlock(event.getPlayer(), event.getBlock().getLocation(), "place paintings", false) )
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onEntityChangeBlock(EntityChangeBlockEvent event)
|
||||
{
|
||||
if (event.isCancelled()) return;
|
||||
|
||||
Entity entity = event.getEntity();
|
||||
|
||||
// for now, only interested in Enderman and Wither boss tomfoolery
|
||||
if (!(entity instanceof Enderman) && !(entity instanceof Wither)) return;
|
||||
|
||||
Location loc = event.getBlock().getLocation();
|
||||
|
||||
if (entity instanceof Enderman)
|
||||
{
|
||||
if (stopEndermanBlockManipulation(loc))
|
||||
event.setCancelled(true);
|
||||
}
|
||||
else if (entity instanceof Wither)
|
||||
{
|
||||
Faction faction = Board.getFactionAt(new FLocation(loc));
|
||||
// it's a bit crude just using fireball protection, but I'd rather not add in a whole new set of xxxBlockWitherExplosion or whatever
|
||||
if
|
||||
(
|
||||
(faction.isNone() && Conf.wildernessBlockFireballs && !Conf.worldsNoWildernessProtection.contains(loc.getWorld().getName()))
|
||||
||
|
||||
(faction.isNormal() && (faction.hasPlayersOnline() ? Conf.territoryBlockFireballs : Conf.territoryBlockFireballsWhenOffline))
|
||||
||
|
||||
(faction.isWarZone() && Conf.warZoneBlockFireballs)
|
||||
||
|
||||
faction.isSafeZone()
|
||||
)
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean stopEndermanBlockManipulation(Location loc)
|
||||
{
|
||||
if (loc == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
// quick check to see if all Enderman deny options are enabled; if so, no need to check location
|
||||
if
|
||||
(
|
||||
Conf.wildernessDenyEndermanBlocks
|
||||
&&
|
||||
Conf.territoryDenyEndermanBlocks
|
||||
&&
|
||||
Conf.territoryDenyEndermanBlocksWhenOffline
|
||||
&&
|
||||
Conf.safeZoneDenyEndermanBlocks
|
||||
&&
|
||||
Conf.warZoneDenyEndermanBlocks
|
||||
)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
FLocation fLoc = new FLocation(loc);
|
||||
Faction claimFaction = Board.getFactionAt(fLoc);
|
||||
|
||||
if (claimFaction.isNone())
|
||||
{
|
||||
return Conf.wildernessDenyEndermanBlocks;
|
||||
}
|
||||
else if (claimFaction.isNormal())
|
||||
{
|
||||
return claimFaction.hasPlayersOnline() ? Conf.territoryDenyEndermanBlocks : Conf.territoryDenyEndermanBlocksWhenOffline;
|
||||
}
|
||||
else if (claimFaction.isSafeZone())
|
||||
{
|
||||
return Conf.safeZoneDenyEndermanBlocks;
|
||||
}
|
||||
else if (claimFaction.isWarZone())
|
||||
{
|
||||
return Conf.warZoneDenyEndermanBlocks;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
package com.massivecraft.factions.listeners;
|
||||
|
||||
import org.bukkit.block.Block;
|
||||
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.Material;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
|
||||
|
||||
public class FactionsExploitListener implements Listener
|
||||
{
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void obsidianGenerator(BlockFromToEvent event)
|
||||
{
|
||||
if (event.isCancelled() == true || ! Conf.handleExploitObsidianGenerators) return;
|
||||
|
||||
// thanks to ObGenBlocker and WorldGuard for this method
|
||||
Block block = event.getToBlock();
|
||||
int source = event.getBlock().getTypeId();
|
||||
int target = block.getTypeId();
|
||||
if ((target == 55 || target == 132) && (source == 0 || source == 10 || source == 11))
|
||||
block.setTypeId(0);
|
||||
}
|
||||
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void enderPearlTeleport(PlayerTeleportEvent event)
|
||||
{
|
||||
if (event.isCancelled() == true || ! Conf.handleExploitEnderPearlClipping) 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...
|
||||
Location target = event.getTo();
|
||||
Location from = event.getFrom();
|
||||
|
||||
// blocks who occupy less than 1 block width or length wise need to be handled differently
|
||||
Material mat = event.getTo().getBlock().getType();
|
||||
if (
|
||||
((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))
|
||||
)
|
||||
{
|
||||
event.setTo(from);
|
||||
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
|
||||
target.setX(target.getBlockX() + 0.5);
|
||||
target.setZ(target.getBlockZ() + 0.5);
|
||||
event.setTo(target);
|
||||
|
||||
}
|
||||
|
||||
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.getZ() > target.getZ() && (from.getZ() - target.getZ() < thickness))
|
||||
|| (target.getZ() > from.getZ() && (target.getZ() - from.getZ() < thickness))
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,595 @@
|
||||
package com.massivecraft.factions.listeners;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.player.PlayerBucketEmptyEvent;
|
||||
import org.bukkit.event.player.PlayerBucketFillEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerKickEvent;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.event.player.PlayerRespawnEvent;
|
||||
import org.bukkit.util.NumberConversions;
|
||||
|
||||
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.Factions;
|
||||
import com.massivecraft.factions.P;
|
||||
import com.massivecraft.factions.integration.SpoutFeatures;
|
||||
import com.massivecraft.factions.struct.Permission;
|
||||
import com.massivecraft.factions.struct.Relation;
|
||||
import com.massivecraft.factions.struct.Role;
|
||||
import com.massivecraft.factions.zcore.util.TextUtil;
|
||||
|
||||
|
||||
public class FactionsPlayerListener implements Listener
|
||||
{
|
||||
public P p;
|
||||
public FactionsPlayerListener(P p)
|
||||
{
|
||||
this.p = p;
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPlayerJoin(PlayerJoinEvent event)
|
||||
{
|
||||
// Make sure that all online players do have a fplayer.
|
||||
final FPlayer me = FPlayers.i.get(event.getPlayer());
|
||||
|
||||
// Update the lastLoginTime for this fplayer
|
||||
me.setLastLoginTime(System.currentTimeMillis());
|
||||
|
||||
// Store player's current FLocation and notify them where they are
|
||||
me.setLastStoodAt(new FLocation(event.getPlayer().getLocation()));
|
||||
if ( ! SpoutFeatures.updateTerritoryDisplay(me))
|
||||
me.sendFactionHereMessage();
|
||||
|
||||
SpoutFeatures.updateAppearancesShortly(event.getPlayer());
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPlayerQuit(PlayerQuitEvent event)
|
||||
{
|
||||
FPlayer me = FPlayers.i.get(event.getPlayer());
|
||||
|
||||
// Make sure player's power is up to date when they log off.
|
||||
me.getPower();
|
||||
// and update their last login time to point to when the logged off, for auto-remove routine
|
||||
me.setLastLoginTime(System.currentTimeMillis());
|
||||
|
||||
Faction myFaction = me.getFaction();
|
||||
if (myFaction != null)
|
||||
{
|
||||
myFaction.memberLoggedOff();
|
||||
}
|
||||
SpoutFeatures.playerDisconnect(me);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onPlayerMove(PlayerMoveEvent event)
|
||||
{
|
||||
if (event.isCancelled()) return;
|
||||
|
||||
// quick check to make sure player is moving between chunks; good performance boost
|
||||
if
|
||||
(
|
||||
event.getFrom().getBlockX() >> 4 == event.getTo().getBlockX() >> 4
|
||||
&&
|
||||
event.getFrom().getBlockZ() >> 4 == event.getTo().getBlockZ() >> 4
|
||||
&&
|
||||
event.getFrom().getWorld() == event.getTo().getWorld()
|
||||
)
|
||||
return;
|
||||
|
||||
Player player = event.getPlayer();
|
||||
FPlayer me = FPlayers.i.get(player);
|
||||
|
||||
// Did we change coord?
|
||||
FLocation from = me.getLastStoodAt();
|
||||
FLocation to = new FLocation(event.getTo());
|
||||
|
||||
if (from.equals(to))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Yes we did change coord (:
|
||||
|
||||
me.setLastStoodAt(to);
|
||||
|
||||
// Did we change "host"(faction)?
|
||||
boolean spoutClient = SpoutFeatures.availableFor(player);
|
||||
Faction factionFrom = Board.getFactionAt(from);
|
||||
Faction factionTo = Board.getFactionAt(to);
|
||||
boolean changedFaction = (factionFrom != factionTo);
|
||||
|
||||
if (changedFaction && SpoutFeatures.updateTerritoryDisplay(me))
|
||||
changedFaction = false;
|
||||
|
||||
if (me.isMapAutoUpdating())
|
||||
{
|
||||
me.sendMessage(Board.getMap(me.getFaction(), to, player.getLocation().getYaw()));
|
||||
|
||||
if (spoutClient && Conf.spoutTerritoryOwnersShow)
|
||||
SpoutFeatures.updateOwnerList(me);
|
||||
}
|
||||
else
|
||||
{
|
||||
Faction myFaction = me.getFaction();
|
||||
String ownersTo = myFaction.getOwnerListString(to);
|
||||
|
||||
if (changedFaction)
|
||||
{
|
||||
me.sendFactionHereMessage();
|
||||
if
|
||||
(
|
||||
Conf.ownedAreasEnabled
|
||||
&&
|
||||
Conf.ownedMessageOnBorder
|
||||
&&
|
||||
(
|
||||
!spoutClient
|
||||
||
|
||||
!Conf.spoutTerritoryOwnersShow
|
||||
)
|
||||
&&
|
||||
myFaction == factionTo
|
||||
&&
|
||||
!ownersTo.isEmpty()
|
||||
)
|
||||
{
|
||||
me.sendMessage(Conf.ownedLandMessage+ownersTo);
|
||||
}
|
||||
}
|
||||
else if (spoutClient && Conf.spoutTerritoryOwnersShow)
|
||||
{
|
||||
SpoutFeatures.updateOwnerList(me);
|
||||
}
|
||||
else if
|
||||
(
|
||||
Conf.ownedAreasEnabled
|
||||
&&
|
||||
Conf.ownedMessageInsideTerritory
|
||||
&&
|
||||
factionFrom == factionTo
|
||||
&&
|
||||
myFaction == factionTo
|
||||
)
|
||||
{
|
||||
String ownersFrom = myFaction.getOwnerListString(from);
|
||||
if (Conf.ownedMessageByChunk || !ownersFrom.equals(ownersTo))
|
||||
{
|
||||
if (!ownersTo.isEmpty())
|
||||
me.sendMessage(Conf.ownedLandMessage+ownersTo);
|
||||
else if (!Conf.publicLandMessage.isEmpty())
|
||||
me.sendMessage(Conf.publicLandMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (me.getAutoClaimFor() != null)
|
||||
{
|
||||
me.attemptClaim(me.getAutoClaimFor(), event.getTo(), true);
|
||||
}
|
||||
else if (me.isAutoSafeClaimEnabled())
|
||||
{
|
||||
if ( ! Permission.MANAGE_SAFE_ZONE.has(player))
|
||||
{
|
||||
me.setIsAutoSafeClaimEnabled(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!Board.getFactionAt(to).isSafeZone())
|
||||
{
|
||||
Board.setFactionAt(Factions.i.getSafeZone(), to);
|
||||
me.msg("<i>This land is now a safe zone.");
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (me.isAutoWarClaimEnabled())
|
||||
{
|
||||
if ( ! Permission.MANAGE_WAR_ZONE.has(player))
|
||||
{
|
||||
me.setIsAutoWarClaimEnabled(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!Board.getFactionAt(to).isWarZone())
|
||||
{
|
||||
Board.setFactionAt(Factions.i.getWarZone(), to);
|
||||
me.msg("<i>This land is now a war zone.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPlayerInteract(PlayerInteractEvent event)
|
||||
{
|
||||
if (event.isCancelled()) return;
|
||||
// only need to check right-clicks and physical as of MC 1.4+; good performance boost
|
||||
if (event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.PHYSICAL) return;
|
||||
|
||||
Block block = event.getClickedBlock();
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if (block == null) return; // clicked in air, apparently
|
||||
|
||||
if ( ! canPlayerUseBlock(player, block, false))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
if (Conf.handleExploitInteractionSpam)
|
||||
{
|
||||
String name = player.getName();
|
||||
InteractAttemptSpam attempt = interactSpammers.get(name);
|
||||
if (attempt == null)
|
||||
{
|
||||
attempt = new InteractAttemptSpam();
|
||||
interactSpammers.put(name, attempt);
|
||||
}
|
||||
int count = attempt.increment();
|
||||
if (count >= 10)
|
||||
{
|
||||
FPlayer me = FPlayers.i.get(name);
|
||||
me.msg("<b>Ouch, that is starting to hurt. You should give it a rest.");
|
||||
player.damage(NumberConversions.floor((double)count / 10));
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return; // only interested on right-clicks for below
|
||||
|
||||
if ( ! playerCanUseItemHere(player, block.getLocation(), event.getMaterial(), false))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// for handling people who repeatedly spam attempts to open a door (or similar) in another faction's territory
|
||||
private Map<String, InteractAttemptSpam> interactSpammers = new HashMap<String, InteractAttemptSpam>();
|
||||
private static class InteractAttemptSpam
|
||||
{
|
||||
private int attempts = 0;
|
||||
private long lastAttempt = System.currentTimeMillis();
|
||||
|
||||
// returns the current attempt count
|
||||
public int increment()
|
||||
{
|
||||
long Now = System.currentTimeMillis();
|
||||
if (Now > lastAttempt + 2000)
|
||||
attempts = 1;
|
||||
else
|
||||
attempts++;
|
||||
lastAttempt = Now;
|
||||
return attempts;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static boolean playerCanUseItemHere(Player player, Location location, Material material, boolean justCheck)
|
||||
{
|
||||
String name = player.getName();
|
||||
if (Conf.playersWhoBypassAllProtection.contains(name)) return true;
|
||||
|
||||
FPlayer me = FPlayers.i.get(name);
|
||||
if (me.isAdminBypassing()) return true;
|
||||
|
||||
FLocation loc = new FLocation(location);
|
||||
Faction otherFaction = Board.getFactionAt(loc);
|
||||
|
||||
if (otherFaction.hasPlayersOnline())
|
||||
{
|
||||
if ( ! Conf.territoryDenyUseageMaterials.contains(material))
|
||||
return true; // Item isn't one we're preventing for online factions.
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( ! Conf.territoryDenyUseageMaterialsWhenOffline.contains(material))
|
||||
return true; // Item isn't one we're preventing for offline factions.
|
||||
}
|
||||
|
||||
if (otherFaction.isNone())
|
||||
{
|
||||
if (!Conf.wildernessDenyUseage || Conf.worldsNoWildernessProtection.contains(location.getWorld().getName()))
|
||||
return true; // This is not faction territory. Use whatever you like here.
|
||||
|
||||
if (!justCheck)
|
||||
me.msg("<b>You can't use <h>%s<b> in the wilderness.", TextUtil.getMaterialName(material));
|
||||
|
||||
return false;
|
||||
}
|
||||
else if (otherFaction.isSafeZone())
|
||||
{
|
||||
if (!Conf.safeZoneDenyUseage || Permission.MANAGE_SAFE_ZONE.has(player))
|
||||
return true;
|
||||
|
||||
if (!justCheck)
|
||||
me.msg("<b>You can't use <h>%s<b> in a safe zone.", TextUtil.getMaterialName(material));
|
||||
|
||||
return false;
|
||||
}
|
||||
else if (otherFaction.isWarZone())
|
||||
{
|
||||
if (!Conf.warZoneDenyUseage || Permission.MANAGE_WAR_ZONE.has(player))
|
||||
return true;
|
||||
|
||||
if (!justCheck)
|
||||
me.msg("<b>You can't use <h>%s<b> in a war zone.", TextUtil.getMaterialName(material));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
Faction myFaction = me.getFaction();
|
||||
Relation rel = myFaction.getRelationTo(otherFaction);
|
||||
|
||||
// Cancel if we are not in our own territory
|
||||
if (rel.confDenyUseage())
|
||||
{
|
||||
if (!justCheck)
|
||||
me.msg("<b>You can't use <h>%s<b> in the territory of <h>%s<b>.", TextUtil.getMaterialName(material), otherFaction.getTag(myFaction));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Also cancel if player doesn't have ownership rights for this claim
|
||||
if (Conf.ownedAreasEnabled && Conf.ownedAreaDenyUseage && !otherFaction.playerHasOwnershipRights(me, loc))
|
||||
{
|
||||
if (!justCheck)
|
||||
me.msg("<b>You can't use <h>%s<b> in this territory, it is owned by: %s<b>.", TextUtil.getMaterialName(material), otherFaction.getOwnerListString(loc));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean canPlayerUseBlock(Player player, Block block, boolean justCheck)
|
||||
{
|
||||
String name = player.getName();
|
||||
if (Conf.playersWhoBypassAllProtection.contains(name)) return true;
|
||||
|
||||
FPlayer me = FPlayers.i.get(name);
|
||||
if (me.isAdminBypassing()) return true;
|
||||
|
||||
Material material = block.getType();
|
||||
FLocation loc = new FLocation(block);
|
||||
Faction otherFaction = Board.getFactionAt(loc);
|
||||
|
||||
// no door/chest/whatever protection in wilderness, war zones, or safe zones
|
||||
if (!otherFaction.isNormal())
|
||||
return true;
|
||||
|
||||
// We only care about some material types.
|
||||
if (otherFaction.hasPlayersOnline())
|
||||
{
|
||||
if ( ! Conf.territoryProtectedMaterials.contains(material))
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( ! Conf.territoryProtectedMaterialsWhenOffline.contains(material))
|
||||
return true;
|
||||
}
|
||||
|
||||
Faction myFaction = me.getFaction();
|
||||
Relation rel = myFaction.getRelationTo(otherFaction);
|
||||
|
||||
// You may use any block unless it is another faction's territory...
|
||||
if (rel.isNeutral() || (rel.isEnemy() && Conf.territoryEnemyProtectMaterials) || (rel.isAlly() && Conf.territoryAllyProtectMaterials))
|
||||
{
|
||||
if (!justCheck)
|
||||
me.msg("<b>You can't %s <h>%s<b> in the territory of <h>%s<b>.", (material == Material.SOIL ? "trample" : "use"), TextUtil.getMaterialName(material), otherFaction.getTag(myFaction));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Also cancel if player doesn't have ownership rights for this claim
|
||||
if (Conf.ownedAreasEnabled && Conf.ownedAreaProtectMaterials && !otherFaction.playerHasOwnershipRights(me, loc))
|
||||
{
|
||||
if (!justCheck)
|
||||
me.msg("<b>You can't use <h>%s<b> in this territory, it is owned by: %s<b>.", TextUtil.getMaterialName(material), otherFaction.getOwnerListString(loc));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onPlayerRespawn(PlayerRespawnEvent event)
|
||||
{
|
||||
FPlayer me = FPlayers.i.get(event.getPlayer());
|
||||
|
||||
me.getPower(); // update power, so they won't have gained any while dead
|
||||
|
||||
Location home = me.getFaction().getHome();
|
||||
if
|
||||
(
|
||||
Conf.homesEnabled
|
||||
&&
|
||||
Conf.homesTeleportToOnDeath
|
||||
&&
|
||||
home != null
|
||||
&&
|
||||
(
|
||||
Conf.homesRespawnFromNoPowerLossWorlds
|
||||
||
|
||||
! Conf.worldsNoPowerLoss.contains(event.getPlayer().getWorld().getName())
|
||||
)
|
||||
)
|
||||
{
|
||||
event.setRespawnLocation(home);
|
||||
}
|
||||
}
|
||||
|
||||
// For some reason onPlayerInteract() sometimes misses bucket events depending on distance (something like 2-3 blocks away isn't detected),
|
||||
// but these separate bucket events below always fire without fail
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event)
|
||||
{
|
||||
if (event.isCancelled()) return;
|
||||
|
||||
Block block = event.getBlockClicked();
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if ( ! playerCanUseItemHere(player, block.getLocation(), event.getBucket(), false))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPlayerBucketFill(PlayerBucketFillEvent event)
|
||||
{
|
||||
if (event.isCancelled()) return;
|
||||
|
||||
Block block = event.getBlockClicked();
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if ( ! playerCanUseItemHere(player, block.getLocation(), event.getBucket(), false))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean preventCommand(String fullCmd, Player player)
|
||||
{
|
||||
if ((Conf.territoryNeutralDenyCommands.isEmpty() && Conf.territoryEnemyDenyCommands.isEmpty() && Conf.permanentFactionMemberDenyCommands.isEmpty()))
|
||||
return false;
|
||||
|
||||
fullCmd = fullCmd.toLowerCase();
|
||||
|
||||
FPlayer me = FPlayers.i.get(player);
|
||||
|
||||
String shortCmd; // command without the slash at the beginning
|
||||
if (fullCmd.startsWith("/"))
|
||||
shortCmd = fullCmd.substring(1);
|
||||
else
|
||||
{
|
||||
shortCmd = fullCmd;
|
||||
fullCmd = "/" + fullCmd;
|
||||
}
|
||||
|
||||
if
|
||||
(
|
||||
me.hasFaction()
|
||||
&&
|
||||
! me.isAdminBypassing()
|
||||
&&
|
||||
! Conf.permanentFactionMemberDenyCommands.isEmpty()
|
||||
&&
|
||||
me.getFaction().isPermanent()
|
||||
&&
|
||||
isCommandInList(fullCmd, shortCmd, Conf.permanentFactionMemberDenyCommands.iterator())
|
||||
)
|
||||
{
|
||||
me.msg("<b>You can't use the command \""+fullCmd+"\" because you are in a permanent faction.");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!me.isInOthersTerritory())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Relation rel = me.getRelationToLocation();
|
||||
if (rel.isAtLeast(Relation.ALLY))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if
|
||||
(
|
||||
rel.isNeutral()
|
||||
&&
|
||||
! Conf.territoryNeutralDenyCommands.isEmpty()
|
||||
&&
|
||||
! me.isAdminBypassing()
|
||||
&&
|
||||
isCommandInList(fullCmd, shortCmd, Conf.territoryNeutralDenyCommands.iterator())
|
||||
)
|
||||
{
|
||||
me.msg("<b>You can't use the command \""+fullCmd+"\" in neutral territory.");
|
||||
return true;
|
||||
}
|
||||
|
||||
if
|
||||
(
|
||||
rel.isEnemy()
|
||||
&&
|
||||
! Conf.territoryEnemyDenyCommands.isEmpty()
|
||||
&&
|
||||
! me.isAdminBypassing()
|
||||
&&
|
||||
isCommandInList(fullCmd, shortCmd, Conf.territoryEnemyDenyCommands.iterator())
|
||||
)
|
||||
{
|
||||
me.msg("<b>You can't use the command \""+fullCmd+"\" in enemy territory.");
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private static boolean isCommandInList(String fullCmd, String shortCmd, Iterator<String> iter)
|
||||
{
|
||||
String cmdCheck;
|
||||
while (iter.hasNext())
|
||||
{
|
||||
cmdCheck = iter.next();
|
||||
if (cmdCheck == null)
|
||||
{
|
||||
iter.remove();
|
||||
continue;
|
||||
}
|
||||
|
||||
cmdCheck = cmdCheck.toLowerCase();
|
||||
if (fullCmd.startsWith(cmdCheck) || shortCmd.startsWith(cmdCheck))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPlayerKick(PlayerKickEvent event)
|
||||
{
|
||||
if (event.isCancelled()) return;
|
||||
|
||||
FPlayer badGuy = FPlayers.i.get(event.getPlayer());
|
||||
if (badGuy == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
SpoutFeatures.playerDisconnect(badGuy);
|
||||
|
||||
// if player was banned (not just kicked), get rid of their stored info
|
||||
if (Conf.removePlayerDataWhenBanned && event.getReason().equals("Banned by admin."))
|
||||
{
|
||||
if (badGuy.getRole() == Role.ADMIN)
|
||||
badGuy.getFaction().promoteNewLeader();
|
||||
|
||||
badGuy.leave(false);
|
||||
badGuy.detach();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package com.massivecraft.factions.listeners;
|
||||
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.server.PluginDisableEvent;
|
||||
import org.bukkit.event.server.PluginEnableEvent;
|
||||
|
||||
import com.massivecraft.factions.P;
|
||||
import com.massivecraft.factions.integration.SpoutFeatures;
|
||||
|
||||
|
||||
public class FactionsServerListener implements Listener
|
||||
{
|
||||
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 void onPluginEnable(PluginEnableEvent event)
|
||||
{
|
||||
Plugin plug = event.getPlugin();
|
||||
String name = plug.getDescription().getName();
|
||||
if (name.equals("Spout"))
|
||||
{
|
||||
SpoutFeatures.setAvailable(true, plug.getDescription().getFullName());
|
||||
}
|
||||
}
|
||||
}
|
||||
40
src/main/java/com/massivecraft/factions/struct/ChatMode.java
Normal file
40
src/main/java/com/massivecraft/factions/struct/ChatMode.java
Normal file
@@ -0,0 +1,40 @@
|
||||
package com.massivecraft.factions.struct;
|
||||
|
||||
public enum ChatMode
|
||||
{
|
||||
FACTION(2, "faction chat"),
|
||||
ALLIANCE(1, "alliance 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 String toString()
|
||||
{
|
||||
return this.nicename;
|
||||
}
|
||||
|
||||
public ChatMode getNext()
|
||||
{
|
||||
if (this == PUBLIC) return ALLIANCE;
|
||||
if (this == ALLIANCE)return FACTION;
|
||||
return PUBLIC;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
package com.massivecraft.factions.struct;
|
||||
|
||||
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 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);
|
||||
}
|
||||
}
|
||||
146
src/main/java/com/massivecraft/factions/struct/Relation.java
Normal file
146
src/main/java/com/massivecraft/factions/struct/Relation.java
Normal file
@@ -0,0 +1,146 @@
|
||||
package com.massivecraft.factions.struct;
|
||||
|
||||
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 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
|
||||
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;
|
||||
}
|
||||
}
|
||||
50
src/main/java/com/massivecraft/factions/struct/Role.java
Normal file
50
src/main/java/com/massivecraft/factions/struct/Role.java
Normal file
@@ -0,0 +1,50 @@
|
||||
package com.massivecraft.factions.struct;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
|
||||
public enum Role
|
||||
{
|
||||
ADMIN(2, "admin"),
|
||||
MODERATOR(1, "moderator"),
|
||||
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 String toString()
|
||||
{
|
||||
return this.nicename;
|
||||
}
|
||||
|
||||
public String getPrefix()
|
||||
{
|
||||
if (this == Role.ADMIN)
|
||||
{
|
||||
return Conf.prefixAdmin;
|
||||
}
|
||||
|
||||
if (this == Role.MODERATOR)
|
||||
{
|
||||
return Conf.prefixMod;
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
package com.massivecraft.factions.util;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
|
||||
public class AsciiCompass
|
||||
{
|
||||
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 static ArrayList<String> getAsciiCompass(double inDegrees, ChatColor colorActive, String colorDefault)
|
||||
{
|
||||
return getAsciiCompass(getCompassPointForDirection(inDegrees), colorActive, colorDefault);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
package com.massivecraft.factions.util;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.ListIterator;
|
||||
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.Faction;
|
||||
import com.massivecraft.factions.FPlayer;
|
||||
import com.massivecraft.factions.FPlayers;
|
||||
import com.massivecraft.factions.P;
|
||||
import com.massivecraft.factions.struct.Role;
|
||||
|
||||
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;
|
||||
|
||||
public AutoLeaveProcessTask()
|
||||
{
|
||||
fplayers = new ArrayList<FPlayer>(FPlayers.i.get());
|
||||
this.iterator = fplayers.listIterator();
|
||||
this.toleranceMillis = Conf.autoLeaveAfterDaysOfInactivity * 24 * 60 * 60 * 1000;
|
||||
this.readyToGo = true;
|
||||
this.finished = false;
|
||||
}
|
||||
|
||||
public void run()
|
||||
{
|
||||
if (Conf.autoLeaveAfterDaysOfInactivity <= 0.0 || Conf.autoLeaveRoutineMaxMillisecondsPerTick <= 0.0)
|
||||
{
|
||||
this.stop();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ! readyToGo) return;
|
||||
// this is set so it only does one iteration at a time, no matter how frequently the timer fires
|
||||
readyToGo = false;
|
||||
// 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
|
||||
long loopStartTime = System.currentTimeMillis();
|
||||
|
||||
while(iterator.hasNext())
|
||||
{
|
||||
long now = System.currentTimeMillis();
|
||||
|
||||
// if this iteration has been running for maximum time, stop to take a breather until next tick
|
||||
if (now > loopStartTime + Conf.autoLeaveRoutineMaxMillisecondsPerTick)
|
||||
{
|
||||
readyToGo = true;
|
||||
return;
|
||||
}
|
||||
|
||||
FPlayer fplayer = iterator.next();
|
||||
if (fplayer.isOffline() && now - fplayer.getLastLoginTime() > toleranceMillis)
|
||||
{
|
||||
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
|
||||
if (fplayer.getRole() == Role.ADMIN)
|
||||
{
|
||||
Faction faction = fplayer.getFaction();
|
||||
if (faction != null)
|
||||
fplayer.getFaction().promoteNewLeader();
|
||||
}
|
||||
|
||||
fplayer.leave(false);
|
||||
iterator.remove(); // go ahead and remove this list's link to the FPlayer object
|
||||
fplayer.detach();
|
||||
}
|
||||
}
|
||||
|
||||
// looks like we've finished
|
||||
this.stop();
|
||||
}
|
||||
|
||||
// we're done, shut down
|
||||
public void stop()
|
||||
{
|
||||
readyToGo = false;
|
||||
finished = true;
|
||||
|
||||
this.cancel();
|
||||
}
|
||||
|
||||
public boolean isFinished()
|
||||
{
|
||||
return finished;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.massivecraft.factions.util;
|
||||
|
||||
import com.massivecraft.factions.Conf;
|
||||
import com.massivecraft.factions.P;
|
||||
|
||||
public class AutoLeaveTask implements Runnable
|
||||
{
|
||||
private static AutoLeaveProcessTask task;
|
||||
double rate;
|
||||
|
||||
public AutoLeaveTask()
|
||||
{
|
||||
this.rate = Conf.autoLeaveRoutineRunsEveryXMinutes;
|
||||
}
|
||||
|
||||
public synchronized void run()
|
||||
{
|
||||
if (task != null && ! task.isFinished())
|
||||
return;
|
||||
|
||||
task = new AutoLeaveProcessTask();
|
||||
task.runTaskTimer(P.p, 1, 1);
|
||||
|
||||
// maybe setting has been changed? if so, restart this task at new rate
|
||||
if (this.rate != Conf.autoLeaveRoutineRunsEveryXMinutes)
|
||||
P.p.startAutoLeaveTask(true);
|
||||
}
|
||||
}
|
||||
107
src/main/java/com/massivecraft/factions/util/LazyLocation.java
Normal file
107
src/main/java/com/massivecraft/factions/util/LazyLocation.java
Normal file
@@ -0,0 +1,107 @@
|
||||
package com.massivecraft.factions.util;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.World;
|
||||
|
||||
/*
|
||||
* This class provides a lazy-load Location, so that World doesn't need to be initialized
|
||||
* yet when an object of this class is created, only when the Location is first accessed.
|
||||
*/
|
||||
|
||||
public class LazyLocation
|
||||
{
|
||||
private Location location = null;
|
||||
private String worldName;
|
||||
private double x;
|
||||
private double y;
|
||||
private double z;
|
||||
private float pitch;
|
||||
private float yaw;
|
||||
|
||||
public LazyLocation(Location loc)
|
||||
{
|
||||
setLocation(loc);
|
||||
}
|
||||
|
||||
public LazyLocation(final String worldName, final double x, final double y, final double z)
|
||||
{
|
||||
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)
|
||||
{
|
||||
this.worldName = worldName;
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
this.yaw = yaw;
|
||||
this.pitch = pitch;
|
||||
}
|
||||
|
||||
// This returns the actual Location
|
||||
public final Location getLocation()
|
||||
{
|
||||
// make sure Location is initialized before returning it
|
||||
initLocation();
|
||||
return location;
|
||||
}
|
||||
|
||||
// change the Location
|
||||
public final void setLocation(Location loc)
|
||||
{
|
||||
this.location = loc;
|
||||
this.worldName = loc.getWorld().getName();
|
||||
this.x = loc.getX();
|
||||
this.y = loc.getY();
|
||||
this.z = loc.getZ();
|
||||
this.yaw = loc.getYaw();
|
||||
this.pitch = loc.getPitch();
|
||||
}
|
||||
|
||||
|
||||
// This initializes the Location
|
||||
private void initLocation()
|
||||
{
|
||||
// if location is already initialized, simply return
|
||||
if (location != null) return;
|
||||
|
||||
// get World; hopefully it's initialized at this point
|
||||
World world = Bukkit.getWorld(worldName);
|
||||
if (world == null) return;
|
||||
|
||||
// store the Location for future calls, and pass it on
|
||||
location = new Location(world, x, y, z, yaw, pitch);
|
||||
}
|
||||
|
||||
|
||||
public final String getWorldName()
|
||||
{
|
||||
return worldName;
|
||||
}
|
||||
|
||||
public final double getX()
|
||||
{
|
||||
return x;
|
||||
}
|
||||
|
||||
public final double getY()
|
||||
{
|
||||
return y;
|
||||
}
|
||||
|
||||
public final double getZ()
|
||||
{
|
||||
return z;
|
||||
}
|
||||
|
||||
public final double getPitch()
|
||||
{
|
||||
return pitch;
|
||||
}
|
||||
|
||||
public final double getYaw()
|
||||
{
|
||||
return yaw;
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user