2011-02-06 13:36:11 +01:00
package com.bukkit.mcteam.factions.entities ;
import java.util.* ;
import org.bukkit.ChatColor ;
import org.bukkit.entity.Player ;
import com.bukkit.mcteam.factions.Factions ;
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-02-06 13:36:11 +01:00
import com.bukkit.mcteam.util.ChatFixUtil ;
public class Faction {
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-02-12 18:05:05 +01:00
public String getTag ( Follower otherFollower ) {
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-02-06 13:36:11 +01:00
for ( Follower follower : this . getFollowersAll ( ) ) {
ret + = follower . getPower ( ) ;
}
return ret ;
}
public double getPowerMax ( ) {
2011-02-07 21:42:14 +01:00
double ret = 0 ;
2011-02-06 13:36:11 +01:00
for ( Follower follower : this . getFollowersAll ( ) ) {
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-02-12 18:05:05 +01:00
public ArrayList < String > invite ( Follower 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-02-12 18:05:05 +01:00
public ArrayList < String > deinvite ( Follower 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 ;
}
public ArrayList < String > kick ( Follower follower ) {
ArrayList < String > errors = new ArrayList < String > ( ) ;
removeFollower ( follower ) ;
return errors ;
}
public boolean isInvited ( Follower follower ) {
return invites . contains ( follower . id ) ;
}
// -------------------------------
// Followers
// -------------------------------
public ArrayList < Follower > getFollowersAll ( ) {
ArrayList < Follower > ret = new ArrayList < Follower > ( ) ;
for ( Follower follower : Follower . getAll ( ) ) {
if ( follower . factionId = = this . id ) {
ret . add ( follower ) ;
}
}
return ret ;
}
public ArrayList < Follower > getFollowersWhereOnline ( boolean online ) {
ArrayList < Follower > ret = new ArrayList < Follower > ( ) ;
for ( Follower follower : Follower . getAll ( ) ) {
if ( follower . factionId = = this . id & & follower . isOnline ( ) = = online ) {
ret . add ( follower ) ;
}
}
return ret ;
}
public ArrayList < Follower > getFollowersWhereRole ( Role role ) {
ArrayList < Follower > ret = new ArrayList < Follower > ( ) ;
for ( Follower follower : Follower . getAll ( ) ) {
if ( follower . factionId = = this . id & & follower . role . equals ( role ) ) {
ret . add ( follower ) ;
}
}
return ret ;
}
public void removeFollower ( Follower follower ) {
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-02-13 17:04:06 +01:00
for ( Player player : Factions . factions . getServer ( ) . getOnlinePlayers ( ) ) {
2011-02-06 13:36:11 +01:00
Follower follower = Follower . get ( player ) ;
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 ) ;
}
public Relation getRelation ( Follower follower ) {
return getRelation ( follower . getFaction ( ) ) ;
}
public ChatColor getRelationColor ( Faction otherFaction ) {
return this . getRelation ( otherFaction ) . getColor ( ) ;
}
public ChatColor getRelationColor ( Follower follower ) {
return this . getRelation ( follower ) . getColor ( ) ;
}
//----------------------------------------------//
// Persistance and entity management
//----------------------------------------------//
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 ) ;
}
}