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 ;
2011-03-18 17:33:23 +01:00
import com.bukkit.mcteam.factions.entities.EM ;
2011-02-06 13:36:11 +01:00
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-18 17:33:23 +01:00
public static transient Map < Integer , Faction > instances = new HashMap < Integer , Faction > ( ) ;
public static transient File file = new File ( Factions . instance . getDataFolder ( ) , " factions.json " ) ;
public static transient int nextId ;
2011-02-06 13:36:11 +01:00
public transient int id ;
protected Map < Integer , Relation > relationWish ;
protected Set < String > invites ; // Where string is a follower id (lower case name)
protected boolean open ;
2011-02-12 18:05:05 +01:00
protected String tag ;
2011-02-06 13:36:11 +01:00
protected String description ;
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 :( " ;
}
// -------------------------------
// 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-18 17:33:23 +01:00
for ( FPlayer follower : this . getFollowersAll ( ) ) {
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-18 17:33:23 +01:00
for ( FPlayer follower : this . getFollowersAll ( ) ) {
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-02-13 11:18:08 +01:00
return Board . getFactionCoordCountAllBoards ( 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
}
// -------------------------------
// Membership management
// -------------------------------
2011-03-18 17:33:23 +01:00
public ArrayList < String > invite ( FPlayer follower ) { // TODO Move out
2011-02-06 13:36:11 +01:00
ArrayList < String > errors = new ArrayList < String > ( ) ;
if ( follower . getFaction ( ) . equals ( this ) ) { // error här?
2011-02-12 18:05:05 +01:00
errors . add ( Conf . colorSystem + follower . getName ( ) + " is already a member of " + this . getTag ( ) ) ;
2011-02-06 13:36:11 +01:00
}
if ( errors . size ( ) > 0 ) {
return errors ;
}
this . invites . add ( follower . id ) ;
this . save ( ) ;
return errors ;
}
2011-03-18 17:33:23 +01:00
public ArrayList < String > deinvite ( FPlayer follower ) { // TODO move out!
2011-02-06 13:36:11 +01:00
ArrayList < String > errors = new ArrayList < String > ( ) ;
2011-02-06 16:07:10 +01:00
if ( follower . getFaction ( ) = = this ) {
2011-02-12 18:05:05 +01:00
errors . add ( Conf . colorSystem + follower . getName ( ) + " is already a member of " + this . getTag ( ) ) ;
2011-02-06 13:36:11 +01:00
errors . add ( Conf . colorSystem + " You might want to " + Conf . colorCommand + Conf . aliasBase . get ( 0 ) + " " + Conf . aliasKick . get ( 0 ) + Conf . colorParameter + " " + follower . getName ( ) ) ;
}
if ( errors . size ( ) > 0 ) {
return errors ;
}
this . invites . remove ( follower . id ) ;
this . save ( ) ;
return errors ;
}
2011-03-18 17:33:23 +01:00
public ArrayList < String > kick ( FPlayer follower ) {
2011-02-06 13:36:11 +01:00
ArrayList < String > errors = new ArrayList < String > ( ) ;
removeFollower ( follower ) ;
return errors ;
}
2011-03-18 17:33:23 +01:00
public boolean isInvited ( FPlayer follower ) {
2011-02-06 13:36:11 +01:00
return invites . contains ( follower . id ) ;
}
// -------------------------------
// Followers
// -------------------------------
2011-03-18 17:33:23 +01:00
public ArrayList < FPlayer > getFollowersAll ( ) {
ArrayList < FPlayer > ret = new ArrayList < FPlayer > ( ) ;
for ( FPlayer follower : FPlayer . getAll ( ) ) {
2011-02-06 13:36:11 +01:00
if ( follower . factionId = = this . id ) {
ret . add ( follower ) ;
}
}
return ret ;
}
2011-03-18 17:33:23 +01:00
public ArrayList < FPlayer > getFollowersWhereOnline ( boolean online ) {
ArrayList < FPlayer > ret = new ArrayList < FPlayer > ( ) ;
for ( FPlayer follower : FPlayer . getAll ( ) ) {
2011-02-06 13:36:11 +01:00
if ( follower . factionId = = this . id & & follower . isOnline ( ) = = online ) {
ret . add ( follower ) ;
}
}
return ret ;
}
2011-03-18 17:33:23 +01:00
public ArrayList < FPlayer > getFollowersWhereRole ( Role role ) {
ArrayList < FPlayer > ret = new ArrayList < FPlayer > ( ) ;
2011-02-06 13:36:11 +01:00
2011-03-18 17:33:23 +01:00
for ( FPlayer follower : FPlayer . getAll ( ) ) {
2011-02-06 13:36:11 +01:00
if ( follower . factionId = = this . id & & follower . role . equals ( role ) ) {
ret . add ( follower ) ;
}
}
return ret ;
}
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 ( ) ;
}
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-02-06 13:36:11 +01:00
if ( follower . factionId = = this . id ) {
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
}
//----------------------------------------------//
// Messages - Directly connected to ChatFixUtil
//----------------------------------------------//
public void sendMessage ( String message , boolean fix ) {
ChatFixUtil . sendMessage ( this . getOnlinePlayers ( ) , message , fix ) ;
}
public void sendMessage ( List < String > messages , boolean fix ) {
ChatFixUtil . sendMessage ( this . getOnlinePlayers ( ) , messages , fix ) ;
}
public void sendMessage ( String message ) {
ChatFixUtil . sendMessage ( this . getOnlinePlayers ( ) , message , true ) ;
}
public void sendMessage ( List < String > messages ) {
ChatFixUtil . sendMessage ( this . getOnlinePlayers ( ) , messages , true ) ;
}
// -------------------------------
// Relation and relation colors
// -------------------------------
public Relation getRelationWish ( Faction otherFaction ) {
if ( this . relationWish . containsKey ( otherFaction . id ) ) {
return this . relationWish . get ( otherFaction . id ) ;
}
return Relation . NEUTRAL ;
}
public void setRelationWish ( Faction otherFaction , Relation relation ) {
if ( this . relationWish . containsKey ( otherFaction . id ) & & relation . equals ( Relation . NEUTRAL ) ) {
this . relationWish . remove ( otherFaction . id ) ;
2011-02-12 18:05:05 +01:00
} else {
this . relationWish . put ( otherFaction . id , relation ) ;
2011-02-06 13:36:11 +01:00
}
2011-02-12 18:05:05 +01:00
this . save ( ) ;
2011-02-06 13:36:11 +01:00
}
public Relation getRelation ( Faction otherFaction ) {
if ( otherFaction . id = = 0 | | this . id = = 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 ) ;
}
2011-03-18 17:33:23 +01:00
public Relation getRelation ( FPlayer follower ) {
2011-02-06 13:36:11 +01:00
return getRelation ( follower . getFaction ( ) ) ;
}
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 ( ) ;
}
//----------------------------------------------//
// 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! " ) ;
Board . cleanAll ( ) ;
}
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);
Board . cleanAll ( ) ;
// 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
public static Faction create ( ) {
return EM . factionCreate ( ) ;
}
public static Faction get ( Integer factionId ) {
return EM . factionGet ( factionId ) ;
}
public static Collection < Faction > getAll ( ) {
return EM . factionGetAll ( ) ;
}
public boolean save ( ) {
return EM . factionSave ( this . id ) ;
}
2011-03-18 17:33:23 +01:00
* /
2011-02-06 13:36:11 +01:00
}