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

439 lines
10 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.util.*;
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-10-12 17:25:01 +02:00
import com.massivecraft.factions.iface.EconomyParticipator;
import com.massivecraft.factions.iface.RelationParticipator;
import com.massivecraft.factions.integration.Econ;
import com.massivecraft.factions.struct.FFlag;
2011-10-24 01:37:51 +02:00
import com.massivecraft.factions.struct.FPerm;
import com.massivecraft.factions.struct.Rel;
2011-07-18 22:06:02 +02:00
import com.massivecraft.factions.util.*;
import com.massivecraft.factions.zcore.persist.Entity;
2011-10-12 17:25:01 +02:00
import com.nijikokun.register.payment.Method.MethodAccount;
2011-02-06 13:36:11 +01:00
2011-10-12 17:25:01 +02:00
public class Faction extends Entity implements EconomyParticipator
{
// FIELD: relationWish
private Map<String, Rel> relationWish;
2011-02-06 13:36:11 +01:00
// FIELD: invites
// Where string is a lowercase player name
private Set<String> invites;
2011-10-24 03:02:25 +02:00
public void invite(FPlayer fplayer) { this.invites.add(fplayer.getId().toLowerCase()); }
public void deinvite(FPlayer fplayer) { this.invites.remove(fplayer.getId().toLowerCase()); }
public boolean isInvited(FPlayer fplayer) { return this.invites.contains(fplayer.getId().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: tag
private String tag;
public String getTag() { return this.tag; }
public String getTag(String prefix) { return prefix+this.tag; }
public String getTag(RelationParticipator observer)
{
if (observer == null)
{
return getTag();
}
return this.getTag(this.getColorTo(observer).toString());
}
2011-03-23 12:00:38 +01:00
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; }
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;
}
msg("<b>Your faction home has been un-set since it is no longer in your territory.");
this.home = null;
}
2011-10-12 17:25:01 +02:00
// FIELD: account (fake field)
// Bank functions
public double money;
2011-10-12 18:48:47 +02:00
public String getAccountId() { return "faction-"+this.getId(); }
2011-10-12 17:25:01 +02:00
public MethodAccount getAccount()
{
2011-10-12 18:48:47 +02:00
String aid = this.getAccountId();
// We need to override the default money given to players.
if ( ! Econ.getMethod().hasAccount(aid))
{
MethodAccount acc = Econ.getMethod().getAccount(aid);
acc.set(0);
}
return Econ.getMethod().getAccount(aid);
2011-10-12 17:25:01 +02:00
}
2011-10-23 20:50:49 +02:00
// FIELDS: Flag management
// TODO: This will save... defaults if they where changed to...
private Map<FFlag, Boolean> flagOverrides; // Contains the modifications to the default values
public boolean getFlag(FFlag flag)
2011-10-23 20:50:49 +02:00
{
Boolean ret = this.flagOverrides.get(flag);
if (ret == null) ret = flag.getDefault();
return ret;
}
public void setFlag(FFlag flag, boolean value)
2011-10-23 20:50:49 +02:00
{
if (Conf.factionFlagDefaults.get(flag).equals(value))
2011-10-23 20:50:49 +02:00
{
this.flagOverrides.remove(flag);
return;
}
this.flagOverrides.put(flag, value);
}
2011-10-23 20:50:49 +02:00
// FIELDS: Permission <-> Groups management
2011-10-24 01:37:51 +02:00
private Map<FPerm, Set<Rel>> permOverrides; // Contains the modifications to the default values
public Set<Rel> getPermittedRelations(FPerm perm)
{
Set<Rel> ret = this.permOverrides.get(perm);
if (ret == null) ret = perm.getDefault();
return ret;
}
public void setPermittedRelations(FPerm perm, Set<Rel> rels)
{
if (Conf.factionPermDefaults.get(perm).equals(rels))
{
this.permOverrides.remove(perm);
return;
}
this.permOverrides.put(perm, rels);
}
public void setPermittedRelations(FPerm perm, Rel... rels)
{
Set<Rel> temp = new HashSet<Rel>();
temp.addAll(Arrays.asList(rels));
this.setPermittedRelations(perm, temp);
}
2011-10-23 20:50:49 +02:00
2011-10-22 18:12:15 +02:00
// -------------------------------------------- //
// Construct
// -------------------------------------------- //
public Faction()
{
this.relationWish = new HashMap<String, Rel>();
this.invites = new HashSet<String>();
this.open = Conf.newFactionsDefaultOpen;
this.tag = "???";
this.description = "Default faction description :(";
this.money = 0.0;
this.flagOverrides = new LinkedHashMap<FFlag, Boolean>();
2011-10-24 01:37:51 +02:00
this.permOverrides = new LinkedHashMap<FPerm, Set<Rel>>();
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
}
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
// -------------------------------
2011-10-23 20:50:49 +02:00
// TODO: These should be gone after the refactoring...
public boolean isNormal()
{
2011-10-23 22:08:57 +02:00
//return ! (this.isNone() || this.isSafeZone() || this.isWarZone());
return ! this.isNone();
2011-03-23 17:39:56 +01:00
}
public boolean isNone()
{
return this.getId().equals("0");
2011-03-23 17:39:56 +01:00
}
2011-03-22 17:20:21 +01:00
// -------------------------------
2011-10-22 17:42:13 +02:00
// Relation and relation colors
2011-03-22 17:20:21 +01:00
// -------------------------------
2011-10-12 17:25:01 +02:00
@Override
public String describeTo(RelationParticipator that, boolean ucfirst)
{
return RelationUtil.describeThatToMe(this, that, ucfirst);
2011-10-12 17:25:01 +02:00
}
@Override
public String describeTo(RelationParticipator that)
{
return RelationUtil.describeThatToMe(this, that);
2011-10-12 17:25:01 +02:00
}
@Override
public Rel getRelationTo(RelationParticipator rp)
2011-10-12 17:25:01 +02:00
{
return RelationUtil.getRelationTo(this, rp);
2011-10-12 17:25:01 +02:00
}
@Override
public Rel getRelationTo(RelationParticipator rp, boolean ignorePeaceful)
2011-10-12 17:25:01 +02:00
{
return RelationUtil.getRelationTo(this, rp, ignorePeaceful);
2011-10-12 17:25:01 +02:00
}
@Override
public ChatColor getColorTo(RelationParticipator rp)
2011-10-12 17:25:01 +02:00
{
return RelationUtil.getColorOfThatToMe(this, rp);
2011-10-12 17:25:01 +02:00
}
public Rel getRelationWish(Faction otherFaction)
{
if (this.relationWish.containsKey(otherFaction.getId()))
{
2011-03-22 17:20:21 +01:00
return this.relationWish.get(otherFaction.getId());
}
return Rel.NEUTRAL;
2011-03-22 17:20:21 +01:00
}
public void setRelationWish(Faction otherFaction, Rel relation)
{
if (this.relationWish.containsKey(otherFaction.getId()) && relation.equals(Rel.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);
}
}
2011-10-24 03:02:25 +02:00
// TODO: Implement a has enough feature.
2011-02-06 13:36:11 +01:00
//----------------------------------------------//
// Power
//----------------------------------------------//
public double getPower()
{
if (this.getFlag(FFlag.INFPOWER))
2011-10-22 18:12:15 +02:00
{
2011-10-23 20:50:49 +02:00
return 999999;
2011-10-22 18:12:15 +02:00
}
double ret = 0;
for (FPlayer fplayer : this.getFPlayers())
{
2011-03-23 12:00:38 +01:00
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()
{
if (this.getFlag(FFlag.INFPOWER))
2011-10-22 18:12:15 +02:00
{
2011-10-23 20:50:49 +02:00
return 999999;
2011-10-22 18:12:15 +02:00
}
double ret = 0;
for (FPlayer fplayer : this.getFPlayers())
{
2011-03-23 12:00:38 +01:00
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()
{
2011-02-06 13:36:11 +01:00
return (int) Math.round(this.getPower());
}
public int getPowerMaxRounded()
{
2011-02-06 13:36:11 +01:00
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);
}
public boolean hasLandInflation()
{
return this.getLandRounded() > this.getPowerRounded();
2011-02-06 13:36:11 +01:00
}
// -------------------------------
2011-10-22 17:42:13 +02: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>();
2011-10-23 22:08:57 +02:00
//if (this.isPlayerFreeType()) 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>();
2011-10-23 22:08:57 +02:00
//if (this.isPlayerFreeType()) 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;
}
2011-10-23 17:55:53 +02:00
public FPlayer getFPlayerLeader()
{
//if ( ! this.isNormal()) return null;
for (FPlayer fplayer : FPlayers.i.get())
{
if (fplayer.getFaction() == this && fplayer.getRole() == Rel.LEADER)
{
return fplayer;
}
}
return null;
}
public ArrayList<FPlayer> getFPlayersWhereRole(Rel role)
2011-10-22 17:42:13 +02:00
{
2011-03-18 17:33:23 +01:00
ArrayList<FPlayer> ret = new ArrayList<FPlayer>();
//if ( ! this.isNormal()) return ret;
2011-02-06 13:36:11 +01:00
2011-10-22 17:42:13 +02:00
for (FPlayer fplayer : FPlayers.i.get())
{
if (fplayer.getFaction() == this && fplayer.getRole() == role)
{
2011-03-22 17:20:21 +01:00
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>();
2011-10-23 22:08:57 +02:00
//if (this.isPlayerFreeType()) 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;
}
//----------------------------------------------//
2011-03-22 17:20:21 +01:00
// Messages
2011-02-06 13:36:11 +01:00
//----------------------------------------------//
2011-10-10 13:40:24 +02:00
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))
{
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
}
}
//----------------------------------------------//
// Persistance and entity management
//----------------------------------------------//
2011-03-18 17:33:23 +01:00
@Override
public void postDetach()
{
2011-10-12 18:48:47 +02:00
if (Econ.shouldBeUsed())
{
Econ.getMethod().getAccount(getAccountId()).remove();
}
this.getAccountId();
// Clean the board
Board.clean();
// Clean the fplayers
FPlayers.i.clean();
2011-03-18 17:33:23 +01:00
}
2011-02-06 13:36:11 +01:00
}