Factions/src/com/massivecraft/factions/Faction.java

793 lines
19 KiB
Java
Raw Normal View History

2011-07-18 22:06:02 +02:00
package com.massivecraft.factions;
2011-02-06 13:36:11 +01:00
import java.io.*;
2011-03-18 17:33:23 +01:00
import java.lang.reflect.Type;
2011-02-06 13:36:11 +01:00
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
2011-03-18 17:33:23 +01:00
import java.util.Map.Entry;
import java.util.logging.Level;
2011-02-06 13:36:11 +01:00
import org.bukkit.ChatColor;
2011-03-23 17:39:56 +01:00
import org.bukkit.Location;
2011-02-06 13:36:11 +01:00
import org.bukkit.entity.Player;
2011-07-18 22:06:02 +02:00
2011-07-27 22:56:45 +02:00
import com.google.gson.reflect.TypeToken;
2011-07-18 22:06:02 +02:00
import com.massivecraft.factions.struct.Relation;
import com.massivecraft.factions.struct.Role;
import com.massivecraft.factions.util.*;
import com.massivecraft.factions.zcore.persist.Entity;
2011-02-06 13:36:11 +01:00
public class Faction extends Entity
{
// FIELD: relationWish
private Map<String, Relation> relationWish;
2011-02-06 13:36:11 +01:00
// FIELD: claimOwnership
private Map<FLocation, Set<String>> claimOwnership = new ConcurrentHashMap<FLocation, Set<String>>();
2011-03-22 17:20:21 +01:00
// 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()); }
2011-03-22 17:20:21 +01:00
// FIELD: open
2011-03-22 17:20:21 +01:00
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
New "peaceful" status for factions which can only be set by server admins/moderators. Members of peaceful factions cannot deal or receive PvP damage (unless in a war zone which has friendly fire enabled), cannot claim land from another faction and likewise can't have their land claimed, and cannot be considered as ally or enemy of any other faction. Faction admins and moderators of peaceful factions can enable/disable all explosions inside their faction's territory at will. The main purpose of this is to provide a way for more peaceful players who don't want to take part in faction wars (or just want to take a break from them) to still have fun on the server. It is also meant to allow groups of players to make protected buildings, monuments, grand constructions, and so forth without having to worry about another faction destroying them. New conf.json settings: "peacefulTerritoryDisablePVP" (default true) prevents PvP damage for anyone inside a peaceful faction's territory "peacefulTerritoryDisableMonsters" (default false) provides protection against monsters spawning or attacking inside a peaceful faction's territory "peacefulMembersDisablePowerLoss" (default true) which keeps members of peaceful factions from suffering power loss when they die. New commands: /f peaceful [faction tag] - toggle the indicated faction's "peaceful" status /f noboom - enable/disable explosions inside your faction's territory; only available to faction admin and faction moderators for peaceful factions New permission nodes: factions.setPeaceful - ability to use the /f peaceful command (admins) factions.peacefulExplosionToggle - ability to use /f noboom (everyone)
2011-08-05 10:50:47 +02:00
private boolean peaceful;
public boolean isPeaceful() { return this.peaceful; }
public void setPeaceful(boolean isPeaceful) { this.peaceful = isPeaceful; }
// FIELD: peacefulExplosionsEnabled
New "peaceful" status for factions which can only be set by server admins/moderators. Members of peaceful factions cannot deal or receive PvP damage (unless in a war zone which has friendly fire enabled), cannot claim land from another faction and likewise can't have their land claimed, and cannot be considered as ally or enemy of any other faction. Faction admins and moderators of peaceful factions can enable/disable all explosions inside their faction's territory at will. The main purpose of this is to provide a way for more peaceful players who don't want to take part in faction wars (or just want to take a break from them) to still have fun on the server. It is also meant to allow groups of players to make protected buildings, monuments, grand constructions, and so forth without having to worry about another faction destroying them. New conf.json settings: "peacefulTerritoryDisablePVP" (default true) prevents PvP damage for anyone inside a peaceful faction's territory "peacefulTerritoryDisableMonsters" (default false) provides protection against monsters spawning or attacking inside a peaceful faction's territory "peacefulMembersDisablePowerLoss" (default true) which keeps members of peaceful factions from suffering power loss when they die. New commands: /f peaceful [faction tag] - toggle the indicated faction's "peaceful" status /f noboom - enable/disable explosions inside your faction's territory; only available to faction admin and faction moderators for peaceful factions New permission nodes: factions.setPeaceful - ability to use the /f peaceful command (admins) factions.peacefulExplosionToggle - ability to use /f noboom (everyone)
2011-08-05 10:50:47 +02:00
private boolean peacefulExplosionsEnabled;
2011-10-09 18:35:39 +02:00
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; }
public void setPermanent(boolean isPermanent) { permanent = isPermanent; }
2011-02-06 13:36:11 +01:00
// 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(otherFaction.getRelationColor(this).toString());
}
2011-03-23 12:00:38 +01:00
public String getTag(FPlayer otherFplayer) {
if (otherFplayer == null)
{
return getTag();
}
return this.getTag(otherFplayer.getRelationColor(this).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; }
2011-03-23 17:39:56 +01:00
// FIELD: home
private Location home;
public void setHome(Location home) { this.home = home; }
public Location getHome() { confirmValidHome(); return home; }
public boolean hasHome() { return this.getHome() != null; }
public void confirmValidHome()
{
if (!Conf.homesMustBeInClaimedTerritory || this.home == null || Board.getFactionAt(new FLocation(this.home)) == this)
{
return;
}
sendMessage("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: money
// Bank functions
private double money;
public double getMoney() { return this.money; }
public boolean addMoney(double amount)
{
if ( amount > 0.0 )
{
this.money += amount;
return true;
}
return false;
}
public boolean removeMoney( double amount )
{
if (amount <= 0.0 ) return false;
if (amount > this.money ) return false;
this.money -= amount;
return true;
New "peaceful" status for factions which can only be set by server admins/moderators. Members of peaceful factions cannot deal or receive PvP damage (unless in a war zone which has friendly fire enabled), cannot claim land from another faction and likewise can't have their land claimed, and cannot be considered as ally or enemy of any other faction. Faction admins and moderators of peaceful factions can enable/disable all explosions inside their faction's territory at will. The main purpose of this is to provide a way for more peaceful players who don't want to take part in faction wars (or just want to take a break from them) to still have fun on the server. It is also meant to allow groups of players to make protected buildings, monuments, grand constructions, and so forth without having to worry about another faction destroying them. New conf.json settings: "peacefulTerritoryDisablePVP" (default true) prevents PvP damage for anyone inside a peaceful faction's territory "peacefulTerritoryDisableMonsters" (default false) provides protection against monsters spawning or attacking inside a peaceful faction's territory "peacefulMembersDisablePowerLoss" (default true) which keeps members of peaceful factions from suffering power loss when they die. New commands: /f peaceful [faction tag] - toggle the indicated faction's "peaceful" status /f noboom - enable/disable explosions inside your faction's territory; only available to faction admin and faction moderators for peaceful factions New permission nodes: factions.setPeaceful - ability to use the /f peaceful command (admins) factions.peacefulExplosionToggle - ability to use /f noboom (everyone)
2011-08-05 10:50:47 +02:00
}
// -------------------------------------------- //
// 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;
New "peaceful" status for factions which can only be set by server admins/moderators. Members of peaceful factions cannot deal or receive PvP damage (unless in a war zone which has friendly fire enabled), cannot claim land from another faction and likewise can't have their land claimed, and cannot be considered as ally or enemy of any other faction. Faction admins and moderators of peaceful factions can enable/disable all explosions inside their faction's territory at will. The main purpose of this is to provide a way for more peaceful players who don't want to take part in faction wars (or just want to take a break from them) to still have fun on the server. It is also meant to allow groups of players to make protected buildings, monuments, grand constructions, and so forth without having to worry about another faction destroying them. New conf.json settings: "peacefulTerritoryDisablePVP" (default true) prevents PvP damage for anyone inside a peaceful faction's territory "peacefulTerritoryDisableMonsters" (default false) provides protection against monsters spawning or attacking inside a peaceful faction's territory "peacefulMembersDisablePowerLoss" (default true) which keeps members of peaceful factions from suffering power loss when they die. New commands: /f peaceful [faction tag] - toggle the indicated faction's "peaceful" status /f noboom - enable/disable explosions inside your faction's territory; only available to faction admin and faction moderators for peaceful factions New permission nodes: factions.setPeaceful - ability to use the /f peaceful command (admins) factions.peacefulExplosionToggle - ability to use /f noboom (everyone)
2011-08-05 10:50:47 +02:00
}
// -------------------------------------------- //
// Extra Getters And Setters
// -------------------------------------------- //
New "peaceful" status for factions which can only be set by server admins/moderators. Members of peaceful factions cannot deal or receive PvP damage (unless in a war zone which has friendly fire enabled), cannot claim land from another faction and likewise can't have their land claimed, and cannot be considered as ally or enemy of any other faction. Faction admins and moderators of peaceful factions can enable/disable all explosions inside their faction's territory at will. The main purpose of this is to provide a way for more peaceful players who don't want to take part in faction wars (or just want to take a break from them) to still have fun on the server. It is also meant to allow groups of players to make protected buildings, monuments, grand constructions, and so forth without having to worry about another faction destroying them. New conf.json settings: "peacefulTerritoryDisablePVP" (default true) prevents PvP damage for anyone inside a peaceful faction's territory "peacefulTerritoryDisableMonsters" (default false) provides protection against monsters spawning or attacking inside a peaceful faction's territory "peacefulMembersDisablePowerLoss" (default true) which keeps members of peaceful factions from suffering power loss when they die. New commands: /f peaceful [faction tag] - toggle the indicated faction's "peaceful" status /f noboom - enable/disable explosions inside your faction's territory; only available to faction admin and faction moderators for peaceful factions New permission nodes: factions.setPeaceful - ability to use the /f peaceful command (admins) factions.peacefulExplosionToggle - ability to use /f noboom (everyone)
2011-08-05 10:50:47 +02:00
public boolean noPvPInTerritory() { return isSafeZone() || (peaceful && Conf.peacefulTerritoryDisablePVP); }
New "peaceful" status for factions which can only be set by server admins/moderators. Members of peaceful factions cannot deal or receive PvP damage (unless in a war zone which has friendly fire enabled), cannot claim land from another faction and likewise can't have their land claimed, and cannot be considered as ally or enemy of any other faction. Faction admins and moderators of peaceful factions can enable/disable all explosions inside their faction's territory at will. The main purpose of this is to provide a way for more peaceful players who don't want to take part in faction wars (or just want to take a break from them) to still have fun on the server. It is also meant to allow groups of players to make protected buildings, monuments, grand constructions, and so forth without having to worry about another faction destroying them. New conf.json settings: "peacefulTerritoryDisablePVP" (default true) prevents PvP damage for anyone inside a peaceful faction's territory "peacefulTerritoryDisableMonsters" (default false) provides protection against monsters spawning or attacking inside a peaceful faction's territory "peacefulMembersDisablePowerLoss" (default true) which keeps members of peaceful factions from suffering power loss when they die. New commands: /f peaceful [faction tag] - toggle the indicated faction's "peaceful" status /f noboom - enable/disable explosions inside your faction's territory; only available to faction admin and faction moderators for peaceful factions New permission nodes: factions.setPeaceful - ability to use the /f peaceful command (admins) factions.peacefulExplosionToggle - ability to use /f noboom (everyone)
2011-08-05 10:50:47 +02:00
public boolean noMonstersInTerritory() { return isSafeZone() || (peaceful && Conf.peacefulTerritoryDisableMonsters); }
New "peaceful" status for factions which can only be set by server admins/moderators. Members of peaceful factions cannot deal or receive PvP damage (unless in a war zone which has friendly fire enabled), cannot claim land from another faction and likewise can't have their land claimed, and cannot be considered as ally or enemy of any other faction. Faction admins and moderators of peaceful factions can enable/disable all explosions inside their faction's territory at will. The main purpose of this is to provide a way for more peaceful players who don't want to take part in faction wars (or just want to take a break from them) to still have fun on the server. It is also meant to allow groups of players to make protected buildings, monuments, grand constructions, and so forth without having to worry about another faction destroying them. New conf.json settings: "peacefulTerritoryDisablePVP" (default true) prevents PvP damage for anyone inside a peaceful faction's territory "peacefulTerritoryDisableMonsters" (default false) provides protection against monsters spawning or attacking inside a peaceful faction's territory "peacefulMembersDisablePowerLoss" (default true) which keeps members of peaceful factions from suffering power loss when they die. New commands: /f peaceful [faction tag] - toggle the indicated faction's "peaceful" status /f noboom - enable/disable explosions inside your faction's territory; only available to faction admin and faction moderators for peaceful factions New permission nodes: factions.setPeaceful - ability to use the /f peaceful command (admins) factions.peacefulExplosionToggle - ability to use /f noboom (everyone)
2011-08-05 10:50:47 +02:00
2011-10-09 18:35:39 +02:00
New "peaceful" status for factions which can only be set by server admins/moderators. Members of peaceful factions cannot deal or receive PvP damage (unless in a war zone which has friendly fire enabled), cannot claim land from another faction and likewise can't have their land claimed, and cannot be considered as ally or enemy of any other faction. Faction admins and moderators of peaceful factions can enable/disable all explosions inside their faction's territory at will. The main purpose of this is to provide a way for more peaceful players who don't want to take part in faction wars (or just want to take a break from them) to still have fun on the server. It is also meant to allow groups of players to make protected buildings, monuments, grand constructions, and so forth without having to worry about another faction destroying them. New conf.json settings: "peacefulTerritoryDisablePVP" (default true) prevents PvP damage for anyone inside a peaceful faction's territory "peacefulTerritoryDisableMonsters" (default false) provides protection against monsters spawning or attacking inside a peaceful faction's territory "peacefulMembersDisablePowerLoss" (default true) which keeps members of peaceful factions from suffering power loss when they die. New commands: /f peaceful [faction tag] - toggle the indicated faction's "peaceful" status /f noboom - enable/disable explosions inside your faction's territory; only available to faction admin and faction moderators for peaceful factions New permission nodes: factions.setPeaceful - ability to use the /f peaceful command (admins) factions.peacefulExplosionToggle - ability to use /f noboom (everyone)
2011-08-05 10:50:47 +02:00
2011-03-23 17:39:56 +01:00
// -------------------------------
// Understand the types
// -------------------------------
public boolean isNormal()
{
return ! (this.isNone() || this.isSafeZone() || this.isWarZone());
2011-03-23 17:39:56 +01:00
}
public boolean isNone()
{
return this.getId().equals("0");
2011-03-23 17:39:56 +01:00
}
public boolean isSafeZone()
{
return this.getId().equals("-1");
2011-03-23 17:39:56 +01:00
}
public boolean isWarZone()
{
return this.getId().equals("-2");
}
2011-03-22 17:20:21 +01:00
// -------------------------------
// Relation and relation colors TODO
// -------------------------------
public Relation getRelationWish(Faction otherFaction)
{
if (this.relationWish.containsKey(otherFaction.getId()))
{
2011-03-22 17:20:21 +01:00
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))
{
2011-03-22 17:20:21 +01:00
this.relationWish.remove(otherFaction.getId());
}
else
{
2011-03-22 17:20:21 +01:00
this.relationWish.put(otherFaction.getId(), relation);
}
}
public Relation getRelation(Faction otherFaction)
{
New "peaceful" status for factions which can only be set by server admins/moderators. Members of peaceful factions cannot deal or receive PvP damage (unless in a war zone which has friendly fire enabled), cannot claim land from another faction and likewise can't have their land claimed, and cannot be considered as ally or enemy of any other faction. Faction admins and moderators of peaceful factions can enable/disable all explosions inside their faction's territory at will. The main purpose of this is to provide a way for more peaceful players who don't want to take part in faction wars (or just want to take a break from them) to still have fun on the server. It is also meant to allow groups of players to make protected buildings, monuments, grand constructions, and so forth without having to worry about another faction destroying them. New conf.json settings: "peacefulTerritoryDisablePVP" (default true) prevents PvP damage for anyone inside a peaceful faction's territory "peacefulTerritoryDisableMonsters" (default false) provides protection against monsters spawning or attacking inside a peaceful faction's territory "peacefulMembersDisablePowerLoss" (default true) which keeps members of peaceful factions from suffering power loss when they die. New commands: /f peaceful [faction tag] - toggle the indicated faction's "peaceful" status /f noboom - enable/disable explosions inside your faction's territory; only available to faction admin and faction moderators for peaceful factions New permission nodes: factions.setPeaceful - ability to use the /f peaceful command (admins) factions.peacefulExplosionToggle - ability to use /f noboom (everyone)
2011-08-05 10:50:47 +02:00
return getRelation(otherFaction, false);
}
public Relation getRelation(Faction otherFaction, boolean ignorePeaceful)
{
if (!otherFaction.isNormal() || !this.isNormal())
{
2011-03-22 17:20:21 +01:00
return Relation.NEUTRAL;
}
if (otherFaction.equals(this))
{
2011-03-22 17:20:21 +01:00
return Relation.MEMBER;
}
if (!ignorePeaceful && (this.peaceful || otherFaction.isPeaceful()))
{
New "peaceful" status for factions which can only be set by server admins/moderators. Members of peaceful factions cannot deal or receive PvP damage (unless in a war zone which has friendly fire enabled), cannot claim land from another faction and likewise can't have their land claimed, and cannot be considered as ally or enemy of any other faction. Faction admins and moderators of peaceful factions can enable/disable all explosions inside their faction's territory at will. The main purpose of this is to provide a way for more peaceful players who don't want to take part in faction wars (or just want to take a break from them) to still have fun on the server. It is also meant to allow groups of players to make protected buildings, monuments, grand constructions, and so forth without having to worry about another faction destroying them. New conf.json settings: "peacefulTerritoryDisablePVP" (default true) prevents PvP damage for anyone inside a peaceful faction's territory "peacefulTerritoryDisableMonsters" (default false) provides protection against monsters spawning or attacking inside a peaceful faction's territory "peacefulMembersDisablePowerLoss" (default true) which keeps members of peaceful factions from suffering power loss when they die. New commands: /f peaceful [faction tag] - toggle the indicated faction's "peaceful" status /f noboom - enable/disable explosions inside your faction's territory; only available to faction admin and faction moderators for peaceful factions New permission nodes: factions.setPeaceful - ability to use the /f peaceful command (admins) factions.peacefulExplosionToggle - ability to use /f noboom (everyone)
2011-08-05 10:50:47 +02:00
return Relation.NEUTRAL;
}
if(this.getRelationWish(otherFaction).value >= otherFaction.getRelationWish(this).value)
{
2011-03-22 17:20:21 +01:00
return otherFaction.getRelationWish(this);
}
2011-03-22 17:20:21 +01:00
return this.getRelationWish(otherFaction);
}
public Relation getRelation(FPlayer fplayer)
{
if (fplayer == null)
return Relation.NEUTRAL;
else
return getRelation(fplayer.getFaction());
2011-03-22 17:20:21 +01:00
}
2011-02-06 13:36:11 +01:00
//----------------------------------------------//
// Power
//----------------------------------------------//
public double getPower()
{
double ret = 0;
2011-03-23 12:00:38 +01:00
for (FPlayer fplayer : this.getFPlayers()) {
ret += fplayer.getPower();
2011-02-06 13:36:11 +01:00
}
if (Conf.powerFactionMax > 0 && ret > Conf.powerFactionMax) {
ret = Conf.powerFactionMax;
}
2011-02-06 13:36:11 +01:00
return ret;
}
public double getPowerMax() {
double ret = 0;
2011-03-23 12:00:38 +01:00
for (FPlayer fplayer : this.getFPlayers()) {
ret += fplayer.getPowerMax();
2011-02-06 13:36:11 +01:00
}
if (Conf.powerFactionMax > 0 && ret > Conf.powerFactionMax) {
ret = Conf.powerFactionMax;
}
2011-02-06 13:36:11 +01:00
return ret;
}
public int getPowerRounded() {
return (int) Math.round(this.getPower());
}
public int getPowerMaxRounded() {
return (int) Math.round(this.getPowerMax());
}
public int getLandRounded() {
2011-03-22 17:20:21 +01:00
return Board.getFactionCoordCount(this);
2011-02-06 13:36:11 +01:00
}
public int getLandRoundedInWorld(String worldName) {
return Board.getFactionCoordCountInWorld(this, worldName);
}
2011-02-06 13:36:11 +01:00
public boolean hasLandInflation() {
return this.getLandRounded() > this.getPowerRounded();
2011-02-06 13:36:11 +01:00
}
// -------------------------------
2011-03-23 12:00:38 +01:00
// Fplayers
2011-02-06 13:36:11 +01:00
// -------------------------------
public ArrayList<FPlayer> getFPlayers()
{
2011-03-18 17:33:23 +01:00
ArrayList<FPlayer> ret = new ArrayList<FPlayer>();
if (id < 0) return ret;
for (FPlayer fplayer : FPlayers.i.get())
{
if (fplayer.getFaction() == this)
{
2011-03-23 12:00:38 +01:00
ret.add(fplayer);
2011-02-06 13:36:11 +01:00
}
}
2011-02-06 13:36:11 +01:00
return ret;
}
public ArrayList<FPlayer> getFPlayersWhereOnline(boolean online)
{
2011-03-18 17:33:23 +01:00
ArrayList<FPlayer> ret = new ArrayList<FPlayer>();
if (id < 0) return ret;
for (FPlayer fplayer : FPlayers.i.get())
{
if (fplayer.getFaction() == this && fplayer.isOnline() == online)
{
2011-03-22 17:20:21 +01:00
ret.add(fplayer);
2011-02-06 13:36:11 +01:00
}
}
2011-02-06 13:36:11 +01:00
return ret;
}
public FPlayer getFPlayerAdmin()
{
if (id <= 0) return null;
for (FPlayer fplayer : FPlayers.i.get())
{
if (fplayer.getFaction() == this && fplayer.getRole() == Role.ADMIN)
{
return fplayer;
}
}
return null;
}
2011-03-19 13:00:03 +01:00
public ArrayList<FPlayer> getFPlayersWhereRole(Role role) {
2011-03-18 17:33:23 +01:00
ArrayList<FPlayer> ret = new ArrayList<FPlayer>();
if (id <= 0) return ret;
2011-02-06 13:36:11 +01:00
for (FPlayer fplayer : FPlayers.i.get()) {
2011-03-22 17:20:21 +01:00
if (fplayer.getFaction() == this && fplayer.getRole() == role) {
ret.add(fplayer);
2011-02-06 13:36:11 +01:00
}
}
return ret;
}
public ArrayList<Player> getOnlinePlayers()
{
2011-02-06 13:36:11 +01:00
ArrayList<Player> ret = new ArrayList<Player>();
if (id < 0) return ret;
for (Player player: P.p.getServer().getOnlinePlayers())
{
FPlayer fplayer = FPlayers.i.get(player);
if (fplayer.getFaction() == this)
{
2011-02-06 13:36:11 +01:00
ret.add(player);
}
}
2011-02-06 13:36:11 +01:00
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 (id < 0) 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();
}
}
2011-02-06 13:36:11 +01:00
//----------------------------------------------//
2011-03-22 17:20:21 +01:00
// Messages
2011-02-06 13:36:11 +01:00
//----------------------------------------------//
public void sendMessageParsed(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))
{
2011-03-22 17:20:21 +01:00
fplayer.sendMessage(message);
2011-02-06 13:36:11 +01:00
}
}
public void sendMessage(List<String> messages)
{
for (FPlayer fplayer : this.getFPlayersWhereOnline(true))
{
2011-03-22 17:20:21 +01:00
fplayer.sendMessage(messages);
2011-02-06 13:36:11 +01:00
}
}
2011-03-22 17:20:21 +01:00
//----------------------------------------------//
// Mudd TODO
//----------------------------------------------//
2011-02-06 13:36:11 +01:00
public ChatColor getRelationColor(Faction otherFaction)
{
2011-02-06 13:36:11 +01:00
return this.getRelation(otherFaction).getColor();
}
public ChatColor getRelationColor(FPlayer fplayer)
{
2011-03-23 12:00:38 +01:00
return this.getRelation(fplayer).getColor();
2011-02-06 13:36:11 +01:00
}
2011-07-31 03:17:00 +02:00
//----------------------------------------------//
// Ownership of specific claims
//----------------------------------------------//
public void clearAllClaimOwnership()
{
2011-07-31 03:17:00 +02:00
claimOwnership.clear();
}
public void clearClaimOwnership(FLocation loc)
{
2011-07-31 03:17:00 +02:00
claimOwnership.remove(loc);
}
public void clearClaimOwnership(String playerName)
{
if (playerName == null || playerName.isEmpty())
{
2011-07-31 03:17:00 +02:00
return;
}
Set<String> ownerData;
String player = playerName.toLowerCase();
for (Entry<FLocation, Set<String>> entry : claimOwnership.entrySet())
{
2011-07-31 03:17:00 +02:00
ownerData = entry.getValue();
if (ownerData == null) continue;
2011-07-31 03:17:00 +02:00
Iterator<String> iter = ownerData.iterator();
while (iter.hasNext())
{
if (iter.next().equals(player))
{
2011-07-31 03:17:00 +02:00
iter.remove();
}
}
if (ownerData.isEmpty())
{
2011-07-31 03:17:00 +02:00
claimOwnership.remove(entry.getKey());
}
}
}
public int getCountOfClaimsWithOwners()
{
return claimOwnership.isEmpty() ? 0 : claimOwnership.size();
2011-07-31 03:17:00 +02:00
}
public boolean doesLocationHaveOwnersSet(FLocation loc)
{
if (claimOwnership.isEmpty() || !claimOwnership.containsKey(loc))
{
2011-07-31 03:17:00 +02:00
return false;
}
2011-07-31 03:17:00 +02:00
Set<String> ownerData = claimOwnership.get(loc);
return ownerData != null && !ownerData.isEmpty();
}
public boolean isPlayerInOwnerList(String playerName, FLocation loc)
{
if (claimOwnership.isEmpty())
{
2011-07-31 03:17:00 +02:00
return false;
}
Set<String> ownerData = claimOwnership.get(loc);
if (ownerData == null)
{
2011-07-31 03:17:00 +02:00
return false;
}
if (ownerData.contains(playerName.toLowerCase()))
{
2011-07-31 03:17:00 +02:00
return true;
}
2011-07-31 03:17:00 +02:00
return false;
}
public void setPlayerAsOwner(String playerName, FLocation loc)
{
2011-07-31 03:17:00 +02:00
Set<String> ownerData = claimOwnership.get(loc);
if (ownerData == null)
{
2011-07-31 03:17:00 +02:00
ownerData = new HashSet<String>();
}
ownerData.add(playerName.toLowerCase());
claimOwnership.put(loc, ownerData);
}
public void removePlayerAsOwner(String playerName, FLocation loc)
{
2011-07-31 03:17:00 +02:00
Set<String> ownerData = claimOwnership.get(loc);
if (ownerData == null) {
return;
}
ownerData.remove(playerName.toLowerCase());
claimOwnership.put(loc, ownerData);
}
public Set<String> getOwnerList(FLocation loc)
{
2011-07-31 03:17:00 +02:00
return claimOwnership.get(loc);
}
public String getOwnerListString(FLocation loc)
{
2011-07-31 03:17:00 +02:00
Set<String> ownerData = claimOwnership.get(loc);
if (ownerData == null || ownerData.isEmpty())
{
2011-07-31 03:17:00 +02:00
return "";
}
String ownerList = "";
Iterator<String> iter = ownerData.iterator();
while (iter.hasNext()) {
if (!ownerList.isEmpty())
{
2011-07-31 03:17:00 +02:00
ownerList += ", ";
}
ownerList += iter.next();
}
return ownerList;
}
public boolean playerHasOwnershipRights(FPlayer fplayer, FLocation loc)
{
2011-07-31 03:17:00 +02:00
// different faction?
if (fplayer.getFactionId() != this.getId())
{
2011-07-31 03:17:00 +02:00
return false;
}
// sufficient role to bypass ownership?
if (fplayer.getRole().isAtLeast(Conf.ownedAreaModeratorsBypass ? Role.MODERATOR : Role.ADMIN))
{
2011-07-31 03:17:00 +02:00
return true;
}
// make sure claimOwnership is initialized
if (claimOwnership.isEmpty())
{
2011-07-31 03:17:00 +02:00
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()))
{
2011-07-31 03:17:00 +02:00
return true;
}
return false;
}
2011-09-24 03:22:53 +02:00
2011-03-22 17:20:21 +01:00
2011-02-06 13:36:11 +01:00
//----------------------------------------------//
// Persistance and entity management
//----------------------------------------------//
/*public static boolean save() {
2011-03-22 22:31:04 +01:00
//Factions.log("Saving factions to disk");
2011-03-18 17:33:23 +01:00
try {
DiscUtil.write(file, P.p.gson.toJson(instances));
2011-03-18 17:33:23 +01:00
} catch (IOException e) {
e.printStackTrace();
P.log("Failed to save the factions to disk due to I/O exception.");
return false;
} catch (Exception e) {
2011-03-18 17:33:23 +01:00
e.printStackTrace();
P.log("Failed to save the factions to disk.");
2011-03-18 17:33:23 +01:00
return false;
}
return true;
}
*/
/*public static boolean load() {
P.log("Loading factions from disk");
2011-03-23 12:00:38 +01:00
2011-03-18 17:33:23 +01:00
if ( ! file.exists()) {
if ( ! loadOld())
P.log("No factions to load from disk. Creating new file.");
2011-03-18 17:33:23 +01:00
save();
}
try {
Type type = new TypeToken<Map<Integer, Faction>>(){}.getType();
Map<Integer, Faction> instancesFromFile = P.p.gson.fromJson(DiscUtil.read(file), type);
2011-03-23 12:00:38 +01:00
instances.clear();
instances.putAll(instancesFromFile);
} catch (Exception e) {
2011-03-18 17:33:23 +01:00
e.printStackTrace();
P.log("Failed to load the factions from disk.");
2011-03-18 17:33:23 +01:00
return false;
}
fillIds();
// Make sure the default neutral faction exists
if ( ! instances.containsKey(0)) {
Faction faction = new Faction();
faction.tag = ChatColor.DARK_GREEN+"Wilderness";
faction.description = "";
2011-03-18 17:33:23 +01:00
faction.id = 0;
instances.put(faction.id, faction);
}
// Make sure the safe zone faction exists
2011-03-23 17:39:56 +01:00
if ( ! instances.containsKey(-1)) {
Faction faction = new Faction();
faction.tag = ChatColor.GOLD+"Safe Zone";
faction.description = "Free from PVP and monsters";
faction.id = -1;
instances.put(faction.id, faction);
}
// Make sure the war zone faction exists
if ( ! instances.containsKey(-2)) {
Faction faction = new Faction();
faction.tag = ChatColor.DARK_RED+"War Zone";
faction.description = "Not the safest place to be";
faction.id = -2;
instances.put(faction.id, faction);
}
2011-03-18 17:33:23 +01:00
return true;
}*/
2011-03-18 17:33:23 +01:00
@Override
public void postDetach()
{
// Clean the board
Board.clean();
// Clean the fplayers
FPlayers.i.clean();
2011-03-18 17:33:23 +01:00
}
/*public static Faction get(Integer factionId)
{
if ( ! instances.containsKey(factionId))
{
P.log(Level.WARNING, "Non existing factionId "+factionId+" requested! Issuing cleaning!");
2011-03-22 17:20:21 +01:00
Board.clean();
2011-03-22 19:25:11 +01:00
FPlayer.clean();
2011-03-18 17:33:23 +01:00
}
return instances.get(factionId);
}*/
2011-03-18 17:33:23 +01:00
/*
2011-03-23 17:39:56 +01:00
public static Faction getNone() {
return instances.get(0);
}
public static Faction getSafeZone() {
return instances.get(-1);
}
public static Faction getWarZone() {
return instances.get(-2);
}*/
/*
2011-03-18 17:33:23 +01:00
public static boolean exists(Integer factionId) {
return instances.containsKey(factionId);
}
//TODO ta parametrar här. All info som behövs ska matas in här och så sparar vi i denna method.
public static Faction create()
{
2011-03-18 17:33:23 +01:00
Faction faction = new Faction();
faction.id = nextId;
nextId += 1;
instances.put(faction.id, faction);
P.log("created new faction "+faction.id);
2011-03-18 17:33:23 +01:00
//faction.save();
return faction;
}
2011-03-22 19:25:11 +01:00
public static void delete(Integer id) {
2011-03-18 17:33:23 +01:00
// Remove the faction
instances.remove(id);
2011-03-22 19:25:11 +01:00
// Clean the board
Board.clean();
// Clean the fplayers
FPlayer.clean();
2011-03-18 17:33:23 +01:00
}
private static boolean loadOld() {
File folderFaction = new File(P.p.getDataFolder(), "faction");
if ( ! folderFaction.isDirectory())
return false;
P.log("Factions file doesn't exist, attempting to load old pre-1.1 data.");
String ext = ".json";
class jsonFileFilter implements FileFilter {
@Override
public boolean accept(File file) {
return (file.getName().toLowerCase().endsWith(".json") && file.isFile());
}
}
File[] jsonFiles = folderFaction.listFiles(new jsonFileFilter());
for (File jsonFile : jsonFiles) {
// Extract the name from the filename. The name is filename minus ".json"
String name = jsonFile.getName();
name = name.substring(0, name.length() - ext.length());
int id = Integer.parseInt(name);
try {
Faction faction = P.p.gson.fromJson(DiscUtil.read(jsonFile), Faction.class);
faction.id = id;
instances.put(faction.id, faction);
P.log("loaded pre-1.1 faction "+id);
} catch (Exception e) {
e.printStackTrace();
P.log(Level.WARNING, "Failed to load faction "+id);
}
}
return true;
}*/
2011-02-06 13:36:11 +01:00
}