2011-03-18 17:33:23 +01:00
|
|
|
package com.bukkit.mcteam.factions;
|
2011-02-06 13:36:11 +01:00
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
import java.io.File;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.lang.reflect.Type;
|
2011-02-06 13:36:11 +01:00
|
|
|
import java.util.*;
|
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;
|
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
|
|
|
|
import com.bukkit.mcteam.factions.struct.Relation;
|
|
|
|
import com.bukkit.mcteam.factions.struct.Role;
|
2011-02-13 17:02:51 +01:00
|
|
|
import com.bukkit.mcteam.factions.util.*;
|
2011-03-18 17:33:23 +01:00
|
|
|
import com.bukkit.mcteam.gson.reflect.TypeToken;
|
|
|
|
import com.bukkit.mcteam.util.DiscUtil;
|
2011-02-06 13:36:11 +01:00
|
|
|
|
|
|
|
public class Faction {
|
|
|
|
|
2011-03-22 17:20:21 +01:00
|
|
|
// -------------------------------------------- //
|
|
|
|
// Fields
|
|
|
|
// -------------------------------------------- //
|
|
|
|
|
|
|
|
private static transient Map<Integer, Faction> instances = new HashMap<Integer, Faction>();
|
|
|
|
private static transient File file = new File(Factions.instance.getDataFolder(), "factions.json");
|
|
|
|
private static transient int nextId;
|
|
|
|
|
|
|
|
private transient int id;
|
|
|
|
private Map<Integer, Relation> relationWish;
|
|
|
|
private Set<String> invites; // Where string is a follower id (lower case name)
|
|
|
|
private boolean open;
|
|
|
|
private String tag;
|
|
|
|
private String description;
|
|
|
|
|
|
|
|
// -------------------------------------------- //
|
|
|
|
// Construct
|
|
|
|
// -------------------------------------------- //
|
2011-02-06 13:36:11 +01:00
|
|
|
|
|
|
|
public Faction() {
|
|
|
|
this.relationWish = new HashMap<Integer, Relation>();
|
|
|
|
this.invites = new HashSet<String>();
|
|
|
|
this.open = true;
|
2011-02-12 18:05:05 +01:00
|
|
|
this.tag = "???";
|
2011-02-06 13:36:11 +01:00
|
|
|
this.description = "Default faction description :(";
|
|
|
|
}
|
|
|
|
|
2011-03-22 17:20:21 +01:00
|
|
|
// -------------------------------------------- //
|
|
|
|
// Getters And Setters
|
|
|
|
// -------------------------------------------- //
|
|
|
|
|
|
|
|
public int getId() {
|
|
|
|
return this.id;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -------------------------------
|
|
|
|
// Invites
|
|
|
|
// -------------------------------
|
|
|
|
|
|
|
|
public void invite(FPlayer fplayer) {
|
|
|
|
this.invites.add(fplayer.getName()); //TODO Lowercase paradigm shit....
|
|
|
|
}
|
|
|
|
|
|
|
|
public void deinvite(FPlayer fplayer) {
|
|
|
|
this.invites.remove(fplayer.getName()); //TODO Lowercase paradigm shit....
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isInvited(FPlayer fplayer) {
|
|
|
|
return this.invites.contains(fplayer.getName()); //TODO Lowercase paradigm shit....
|
|
|
|
}
|
|
|
|
|
|
|
|
// -------------------------------
|
|
|
|
// Relation and relation colors TODO
|
|
|
|
// -------------------------------
|
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
Faction.save();
|
|
|
|
}
|
|
|
|
|
|
|
|
public Relation getRelation(Faction otherFaction) {
|
|
|
|
if (otherFaction.getId() == 0 || this.getId() == 0) {
|
|
|
|
return Relation.NEUTRAL;
|
|
|
|
}
|
|
|
|
if (otherFaction.equals(this)) {
|
|
|
|
return Relation.MEMBER;
|
|
|
|
}
|
|
|
|
if(this.getRelationWish(otherFaction).value >= otherFaction.getRelationWish(this).value) {
|
|
|
|
return otherFaction.getRelationWish(this);
|
|
|
|
}
|
|
|
|
return this.getRelationWish(otherFaction);
|
|
|
|
}
|
|
|
|
|
|
|
|
public Relation getRelation(FPlayer follower) {
|
|
|
|
return getRelation(follower.getFaction());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2011-02-06 13:36:11 +01:00
|
|
|
// -------------------------------
|
|
|
|
// Information
|
|
|
|
// -------------------------------
|
2011-02-12 18:05:05 +01:00
|
|
|
public String getTag() {
|
|
|
|
return this.getTag("");
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
2011-02-12 18:05:05 +01:00
|
|
|
public String getTag(String prefix) {
|
|
|
|
return prefix+this.tag;
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
2011-02-12 18:05:05 +01:00
|
|
|
public String getTag(Faction otherFaction) {
|
|
|
|
return this.getTag(otherFaction.getRelationColor(this).toString());
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
2011-03-18 17:33:23 +01:00
|
|
|
public String getTag(FPlayer otherFollower) {
|
2011-02-12 18:05:05 +01:00
|
|
|
return this.getTag(otherFollower.getRelationColor(this).toString());
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
2011-02-12 18:05:05 +01:00
|
|
|
public void setTag(String str) {
|
2011-02-12 18:52:45 +01:00
|
|
|
if (Conf.factionTagForceUpperCase) {
|
|
|
|
str = str.toUpperCase();
|
|
|
|
}
|
|
|
|
this.tag = str;
|
2011-02-06 13:36:11 +01:00
|
|
|
this.save();
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getDescription() {
|
|
|
|
return this.description;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setDescription(String value) {
|
|
|
|
this.description = value;
|
|
|
|
this.save();
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean getOpen() {
|
|
|
|
return open;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setOpen(boolean isOpen) {
|
|
|
|
open = isOpen;
|
|
|
|
this.save();
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------//
|
|
|
|
// Power
|
|
|
|
//----------------------------------------------//
|
|
|
|
public double getPower() {
|
2011-02-07 21:42:14 +01:00
|
|
|
double ret = 0;
|
2011-03-19 13:00:03 +01:00
|
|
|
for (FPlayer follower : this.getFPlayers()) {
|
2011-02-06 13:36:11 +01:00
|
|
|
ret += follower.getPower();
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
public double getPowerMax() {
|
2011-02-07 21:42:14 +01:00
|
|
|
double ret = 0;
|
2011-03-19 13:00:03 +01:00
|
|
|
for (FPlayer follower : this.getFPlayers()) {
|
2011-02-06 13:36:11 +01:00
|
|
|
ret += follower.getPowerMax();
|
|
|
|
}
|
|
|
|
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 boolean hasLandInflation() {
|
2011-02-12 18:05:05 +01:00
|
|
|
return this.getLandRounded() > this.getPowerRounded();
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// -------------------------------
|
|
|
|
// Followers
|
|
|
|
// -------------------------------
|
|
|
|
|
2011-03-19 13:00:03 +01:00
|
|
|
public ArrayList<FPlayer> getFPlayers() {
|
2011-03-18 17:33:23 +01:00
|
|
|
ArrayList<FPlayer> ret = new ArrayList<FPlayer>();
|
|
|
|
for (FPlayer follower : FPlayer.getAll()) {
|
2011-03-22 17:20:21 +01:00
|
|
|
if (follower.getFaction() == this) {
|
2011-02-06 13:36:11 +01:00
|
|
|
ret.add(follower);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2011-03-19 13:00:03 +01:00
|
|
|
public ArrayList<FPlayer> getFPlayersWhereOnline(boolean online) {
|
2011-03-18 17:33:23 +01:00
|
|
|
ArrayList<FPlayer> ret = new ArrayList<FPlayer>();
|
2011-03-22 17:20:21 +01:00
|
|
|
for (FPlayer fplayer : FPlayer.getAll()) {
|
|
|
|
if (fplayer.getFaction() == this && fplayer.isOnline() == online) {
|
|
|
|
ret.add(fplayer);
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
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>();
|
2011-02-06 13:36:11 +01:00
|
|
|
|
2011-03-22 17:20:21 +01:00
|
|
|
for (FPlayer fplayer : FPlayer.getAll()) {
|
|
|
|
if (fplayer.getFaction() == this && fplayer.getRole() == role) {
|
|
|
|
ret.add(fplayer);
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2011-03-22 15:45:41 +01:00
|
|
|
/*
|
2011-03-18 17:33:23 +01:00
|
|
|
public void removeFollower(FPlayer follower) {
|
2011-02-06 13:36:11 +01:00
|
|
|
if (this.id != follower.factionId) {
|
|
|
|
return; // safety check
|
|
|
|
}
|
|
|
|
|
|
|
|
this.invites.remove(follower.id);
|
|
|
|
follower.resetFactionData();
|
|
|
|
follower.save();
|
|
|
|
this.save();
|
2011-03-22 15:45:41 +01:00
|
|
|
}*/
|
2011-02-06 13:36:11 +01:00
|
|
|
|
|
|
|
public ArrayList<Player> getOnlinePlayers() {
|
|
|
|
ArrayList<Player> ret = new ArrayList<Player>();
|
2011-03-18 17:33:23 +01:00
|
|
|
for (Player player: Factions.instance.getServer().getOnlinePlayers()) {
|
|
|
|
FPlayer follower = FPlayer.get(player);
|
2011-03-22 17:20:21 +01:00
|
|
|
if (follower.getFaction() == this) {
|
2011-02-06 13:36:11 +01:00
|
|
|
ret.add(player);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------//
|
2011-02-12 18:05:05 +01:00
|
|
|
// Faction tag
|
2011-02-06 13:36:11 +01:00
|
|
|
//----------------------------------------------//
|
|
|
|
|
2011-02-12 18:05:05 +01:00
|
|
|
public String getComparisonTag() {
|
|
|
|
return TextUtil.getComparisonString(this.tag);
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
|
2011-02-12 18:05:05 +01:00
|
|
|
public static ArrayList<String> validateTag(String str) {
|
2011-02-06 13:36:11 +01:00
|
|
|
ArrayList<String> errors = new ArrayList<String>();
|
|
|
|
|
2011-02-12 18:05:05 +01:00
|
|
|
if(TextUtil.getComparisonString(str).length() < Conf.factionTagLengthMin) {
|
|
|
|
errors.add(Conf.colorSystem+"The faction tag can't be shorter than "+Conf.factionTagLengthMin+ " chars.");
|
|
|
|
}
|
|
|
|
|
|
|
|
if(str.length() > Conf.factionTagLengthMax) {
|
|
|
|
errors.add(Conf.colorSystem+"The faction tag can't be longer than "+Conf.factionTagLengthMax+ " chars.");
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
|
2011-02-12 18:05:05 +01:00
|
|
|
for (char c : str.toCharArray()) {
|
|
|
|
if ( ! TextUtil.substanceChars.contains(String.valueOf(c))) {
|
|
|
|
errors.add(Conf.colorSystem+"Faction tag must be alphanumeric. \""+c+"\" is not allowed.");
|
|
|
|
}
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return errors;
|
|
|
|
}
|
|
|
|
|
2011-02-12 18:05:05 +01:00
|
|
|
public static Faction findByTag(String str) {
|
|
|
|
String compStr = TextUtil.getComparisonString(str);
|
2011-02-06 13:36:11 +01:00
|
|
|
for (Faction faction : Faction.getAll()) {
|
2011-02-12 18:05:05 +01:00
|
|
|
if (faction.getComparisonTag().equals(compStr)) {
|
2011-02-06 13:36:11 +01:00
|
|
|
return faction;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2011-02-12 18:05:05 +01:00
|
|
|
public static boolean isTagTaken(String str) {
|
|
|
|
return Faction.findByTag(str) != null;
|
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 sendMessage(String message) {
|
2011-03-22 17:20:21 +01:00
|
|
|
for (FPlayer fplayer : this.getFPlayersWhereOnline(true)) {
|
|
|
|
fplayer.sendMessage(message);
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-03-22 17:20:21 +01:00
|
|
|
public void sendMessage(List<String> messages) {
|
|
|
|
for (FPlayer fplayer : this.getFPlayersWhereOnline(true)) {
|
|
|
|
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) {
|
|
|
|
return this.getRelation(otherFaction).getColor();
|
|
|
|
}
|
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
public ChatColor getRelationColor(FPlayer follower) {
|
2011-02-06 13:36:11 +01:00
|
|
|
return this.getRelation(follower).getColor();
|
|
|
|
}
|
|
|
|
|
2011-03-22 17:20:21 +01:00
|
|
|
|
|
|
|
|
2011-02-06 13:36:11 +01:00
|
|
|
//----------------------------------------------//
|
|
|
|
// Persistance and entity management
|
|
|
|
//----------------------------------------------//
|
|
|
|
|
2011-03-18 17:33:23 +01:00
|
|
|
public static boolean save() {
|
|
|
|
Factions.log("Saving factions to disk");
|
|
|
|
|
|
|
|
try {
|
|
|
|
DiscUtil.write(file, Factions.gson.toJson(instances));
|
|
|
|
} catch (IOException e) {
|
|
|
|
Factions.log("Failed to save the factions to disk.");
|
|
|
|
e.printStackTrace();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean load() {
|
|
|
|
if ( ! file.exists()) {
|
|
|
|
Factions.log("No factions to load from disk. Creating new file.");
|
|
|
|
save();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
Type type = new TypeToken<Map<String, Faction>>(){}.getType();
|
|
|
|
instances = Factions.gson.fromJson(DiscUtil.read(file), type);
|
|
|
|
} catch (IOException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
fillIds();
|
|
|
|
|
|
|
|
// Make sure the default neutral faction exists
|
|
|
|
if ( ! instances.containsKey(0)) {
|
|
|
|
Faction faction = new Faction();
|
|
|
|
faction.tag = "*No faction*";
|
|
|
|
faction.description = "\"The faction for the factionless :P\"";
|
|
|
|
faction.id = 0;
|
|
|
|
instances.put(faction.id, faction);
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void fillIds() {
|
|
|
|
nextId = 1;
|
|
|
|
for(Entry<Integer, Faction> entry : instances.entrySet()) {
|
|
|
|
entry.getValue().id = entry.getKey();
|
|
|
|
if (nextId < entry.getKey()) {
|
|
|
|
nextId = entry.getKey();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
nextId += 1; // make it the next id and not the current highest.
|
|
|
|
}
|
|
|
|
|
|
|
|
public static Faction get(Integer factionId) {
|
|
|
|
if ( ! instances.containsKey(factionId)) {
|
|
|
|
Factions.log(Level.WARNING, "Non existing factionId "+factionId+" requested! Issuing board cleaning!");
|
2011-03-22 17:20:21 +01:00
|
|
|
Board.clean();
|
2011-03-18 17:33:23 +01:00
|
|
|
}
|
|
|
|
return instances.get(factionId);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean exists(Integer factionId) {
|
|
|
|
return instances.containsKey(factionId);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static Collection<Faction> getAll() {
|
|
|
|
return instances.values();
|
|
|
|
}
|
|
|
|
|
|
|
|
//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() {
|
|
|
|
Faction faction = new Faction();
|
|
|
|
faction.id = nextId;
|
|
|
|
nextId += 1;
|
|
|
|
instances.put(faction.id, faction);
|
|
|
|
Factions.log("created new faction "+faction.id);
|
|
|
|
//faction.save();
|
|
|
|
return faction;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean delete(Integer id) {
|
|
|
|
// NOTE that this does not do any security checks.
|
|
|
|
// Follower might get orphaned foreign id's
|
|
|
|
|
|
|
|
// purge from all boards
|
|
|
|
// Board.purgeFactionFromAllBoards(id);
|
2011-03-22 17:20:21 +01:00
|
|
|
Board.clean();
|
2011-03-18 17:33:23 +01:00
|
|
|
|
|
|
|
// Remove the file
|
|
|
|
//File file = new File(folderFaction, id+ext);
|
|
|
|
//file.delete();
|
|
|
|
|
|
|
|
// Remove the faction
|
|
|
|
instances.remove(id);
|
|
|
|
|
|
|
|
// TODO REMOVE ALL MEMBERS!
|
|
|
|
|
|
|
|
// TODO SAVE files
|
|
|
|
return true; // TODO
|
|
|
|
}
|
2011-02-06 13:36:11 +01:00
|
|
|
}
|