2011-07-18 22:06:02 +02:00
package com.massivecraft.factions ;
2011-02-06 13:36:11 +01:00
import java.util.* ;
2013-04-17 10:22:51 +02:00
import java.util.Map.Entry ;
2011-02-06 13:36:11 +01:00
2013-04-17 08:49:43 +02:00
import org.bukkit.Bukkit ;
2011-02-06 13:36:11 +01:00
import org.bukkit.ChatColor ;
2011-03-23 17:39:56 +01:00
import org.bukkit.Location ;
2013-04-17 08:49:43 +02:00
import org.bukkit.command.CommandSender ;
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 ;
2012-05-09 03:32:04 +02:00
import com.massivecraft.factions.integration.SpoutFeatures ;
2011-07-18 22:06:02 +02:00
import com.massivecraft.factions.util.* ;
2013-04-11 11:11:31 +02:00
import com.massivecraft.mcore.ps.PS ;
2013-04-12 09:47:43 +02:00
import com.massivecraft.mcore.store.Entity ;
2013-04-17 08:49:43 +02:00
import com.massivecraft.mcore.util.SenderUtil ;
2013-04-11 12:22:35 +02:00
import com.massivecraft.mcore.xlib.gson.annotations.SerializedName ;
2011-02-06 13:36:11 +01:00
2013-04-12 15:10:11 +02:00
public class Faction extends Entity < Faction > implements EconomyParticipator
2011-10-08 22:03:44 +02:00
{
2013-04-11 12:22:35 +02:00
// -------------------------------------------- //
// META
// -------------------------------------------- //
2013-04-12 09:47:43 +02:00
public static Faction get ( Object oid )
2013-04-11 12:22:35 +02:00
{
return FactionColl . get ( ) . get ( oid ) ;
2013-04-12 09:47:43 +02:00
}
2013-04-11 12:22:35 +02:00
// -------------------------------------------- //
// OVERRIDE: ENTITY
// -------------------------------------------- //
2013-04-12 09:47:43 +02:00
@Override
2013-04-11 12:22:35 +02:00
public Faction load ( Faction that )
{
2013-04-11 12:32:38 +02:00
this . tag = that . tag ;
2013-04-17 08:49:43 +02:00
this . setDescription ( that . description ) ;
2013-04-17 10:22:51 +02:00
this . open = that . open ;
this . setInvitedPlayerIds ( that . invitedPlayerIds ) ;
this . setRelationWishes ( that . relationWish ) ;
2013-04-11 12:32:38 +02:00
this . home = that . home ;
this . cape = that . cape ;
2013-04-17 10:22:51 +02:00
this . setPowerBoost ( that . powerBoost ) ;
this . setFlags ( that . flagOverrides ) ;
2013-04-11 12:32:38 +02:00
this . permOverrides = that . permOverrides ;
2013-04-11 12:22:35 +02:00
return this ;
2013-04-12 08:56:26 +02:00
}
2013-04-11 12:22:35 +02:00
// -------------------------------------------- //
// FIELDS: RAW
// -------------------------------------------- //
// TODO
2013-04-17 10:22:51 +02:00
// In this section of the source code we place the field declarations only.
// Each field has it's own section further down since even the getter and setter logic takes up quite some place.
2013-04-11 12:22:35 +02:00
2013-04-17 10:22:51 +02:00
// TODO: The faction "tag" could/should also have been called "name".
// The actual faction id looks something like "54947df8-0e9e-4471-a2f9-9af509fb5889" and that is not too easy to remember for humans.
// Thus we make use of a name. Since the id is used in all foreign key situations changing the name is fine.
private String tag = null ;
2013-04-11 12:22:35 +02:00
2013-04-17 10:22:51 +02:00
private String description = null ;
2011-10-08 22:03:44 +02:00
2013-04-17 10:22:51 +02:00
private Boolean open = null ;
2011-03-22 18:48:09 +01:00
2013-04-17 10:22:51 +02:00
@SerializedName ( " invites " )
private Set < String > invitedPlayerIds = null ;
private Map < String , Rel > relationWish = null ;
2011-03-23 17:39:56 +01:00
2011-10-08 22:03:44 +02:00
// FIELD: home
2013-04-17 08:49:43 +02:00
// TODO: Use a PS instead!
2012-03-14 19:06:38 +01:00
private LazyLocation home ;
public void setHome ( Location home ) { this . home = new LazyLocation ( home ) ; }
2011-10-08 22:03:44 +02:00
public boolean hasHome ( ) { return this . getHome ( ) ! = null ; }
2012-03-14 19:06:38 +01:00
public Location getHome ( )
{
confirmValidHome ( ) ;
return ( this . home ! = null ) ? this . home . getLocation ( ) : null ;
}
2011-10-08 22:03:44 +02:00
public void confirmValidHome ( )
{
2013-04-11 11:11:31 +02:00
if ( ! ConfServer . homesMustBeInClaimedTerritory | | this . home = = null | | ( this . home . getLocation ( ) ! = null & & BoardColl . get ( ) . getFactionAt ( PS . valueOf ( this . home . getLocation ( ) ) ) = = this ) )
2011-06-30 12:17:34 +02:00
return ;
2011-10-13 14:41:07 +02:00
msg ( " <b>Your faction home has been un-set since it is no longer in your territory. " ) ;
2011-06-30 12:17:34 +02:00
this . home = null ;
}
2011-10-08 22:03:44 +02:00
2012-05-09 03:24:07 +02:00
// FIELD: cape
private String cape ;
public String getCape ( ) { return cape ; }
2012-05-09 03:32:04 +02:00
public void setCape ( String val ) { this . cape = val ; SpoutFeatures . updateCape ( this , null ) ; }
2012-01-17 02:38:14 +01:00
2013-04-17 10:22:51 +02:00
// The powerBoost is a custom increase/decrease to default and max power for this faction
private Double powerBoost = null ;
2012-01-28 18:56:51 +01:00
2013-04-17 10:22:51 +02:00
// The flag overrides are the modifications to the default values
private Map < FFlag , Boolean > flagOverrides ;
2011-10-23 23:17:02 +02:00
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 )
2011-10-23 23:17:02 +02:00
{
Set < Rel > ret = this . permOverrides . get ( perm ) ;
if ( ret = = null ) ret = perm . getDefault ( ) ;
return ret ;
}
2011-10-25 21:18:08 +02:00
2012-05-09 06:29:52 +02:00
/ *
2011-10-25 21:18:08 +02:00
public void addPermittedRelation ( FPerm perm , Rel rel )
{
Set < Rel > newPermittedRelations = EnumSet . noneOf ( Rel . class ) ;
newPermittedRelations . addAll ( this . getPermittedRelations ( perm ) ) ;
newPermittedRelations . add ( rel ) ;
this . setPermittedRelations ( perm , newPermittedRelations ) ;
}
public void removePermittedRelation ( FPerm perm , Rel rel )
{
Set < Rel > newPermittedRelations = EnumSet . noneOf ( Rel . class ) ;
newPermittedRelations . addAll ( this . getPermittedRelations ( perm ) ) ;
newPermittedRelations . remove ( rel ) ;
this . setPermittedRelations ( perm , newPermittedRelations ) ;
2012-05-09 06:29:52 +02:00
} * /
public void setRelationPermitted ( FPerm perm , Rel rel , boolean permitted )
{
Set < Rel > newPermittedRelations = EnumSet . noneOf ( Rel . class ) ;
newPermittedRelations . addAll ( this . getPermittedRelations ( perm ) ) ;
if ( permitted )
{
newPermittedRelations . add ( rel ) ;
}
else
{
newPermittedRelations . remove ( rel ) ;
}
this . setPermittedRelations ( perm , newPermittedRelations ) ;
2011-10-25 21:18:08 +02:00
}
2011-10-24 02:33:30 +02:00
public void setPermittedRelations ( FPerm perm , Set < Rel > rels )
2011-10-23 23:17:02 +02:00
{
2011-10-25 21:18:08 +02:00
if ( perm . getDefault ( ) . equals ( rels ) )
2011-10-23 23:17:02 +02:00
{
this . permOverrides . remove ( perm ) ;
return ;
}
2011-10-24 02:33:30 +02:00
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 23:17:02 +02:00
}
2011-10-23 20:50:49 +02:00
2011-10-22 18:12:15 +02:00
2011-10-08 22:03:44 +02:00
// -------------------------------------------- //
2013-04-17 08:49:43 +02:00
// CONSTRUCT
2011-10-08 22:03:44 +02:00
// -------------------------------------------- //
public Faction ( )
{
2011-10-24 02:33:30 +02:00
this . flagOverrides = new LinkedHashMap < FFlag , Boolean > ( ) ;
2011-10-24 01:37:51 +02:00
this . permOverrides = new LinkedHashMap < FPerm , Set < Rel > > ( ) ;
2011-08-05 10:50:47 +02:00
}
2011-10-08 22:03:44 +02:00
2013-04-11 12:22:35 +02:00
// -------------------------------------------- //
2013-04-17 10:22:51 +02:00
// FIELD: id
2013-04-11 12:22:35 +02:00
// -------------------------------------------- //
2013-04-17 10:22:51 +02:00
// FINER
2013-04-11 12:22:35 +02:00
2013-04-17 10:22:51 +02:00
public boolean isNone ( )
2013-04-11 12:22:35 +02:00
{
2013-04-17 10:22:51 +02:00
return this . getId ( ) . equals ( Const . FACTIONID_NONE ) ;
}
public boolean isNormal ( )
{
return ! this . isNone ( ) ;
}
// This is the bank account id used by external money-plugins
@Override
public String getAccountId ( )
{
String accountId = " faction- " + this . getId ( ) ;
// We need to override the default money given to players.
if ( ! Econ . hasAccount ( accountId ) )
2013-04-11 12:22:35 +02:00
{
2013-04-17 10:22:51 +02:00
Econ . setBalance ( accountId , 0 ) ;
2013-04-11 12:22:35 +02:00
}
2013-04-17 10:22:51 +02:00
return accountId ;
2013-04-11 12:22:35 +02:00
}
2013-04-17 10:22:51 +02:00
// -------------------------------------------- //
// FIELD: tag
// -------------------------------------------- //
// TODO: Rename tag --> name ?
// RAW
public String getTag ( )
2013-04-11 12:22:35 +02:00
{
2013-04-17 10:22:51 +02:00
String ret = this . tag ;
if ( ConfServer . factionTagForceUpperCase )
2013-04-11 12:22:35 +02:00
{
2013-04-17 10:22:51 +02:00
ret = ret . toUpperCase ( ) ;
2013-04-11 12:22:35 +02:00
}
2013-04-17 10:22:51 +02:00
return ret ;
2013-04-11 12:22:35 +02:00
}
2013-04-17 10:22:51 +02:00
public void setTag ( String str )
2013-04-11 12:22:35 +02:00
{
2013-04-17 10:22:51 +02:00
if ( ConfServer . factionTagForceUpperCase )
{
str = str . toUpperCase ( ) ;
}
this . tag = str ;
this . changed ( ) ;
2013-04-11 12:22:35 +02:00
}
2013-04-17 10:22:51 +02:00
// FINER
2013-04-11 12:22:35 +02:00
2013-04-17 10:22:51 +02:00
public String getComparisonTag ( )
2013-04-11 12:22:35 +02:00
{
2013-04-17 10:22:51 +02:00
return MiscUtil . getComparisonString ( this . getTag ( ) ) ;
2013-04-11 12:22:35 +02:00
}
2013-04-17 10:22:51 +02:00
public String getTag ( String prefix )
2013-04-11 12:22:35 +02:00
{
2013-04-17 10:22:51 +02:00
return prefix + this . getTag ( ) ;
2013-04-11 12:22:35 +02:00
}
2013-04-17 10:22:51 +02:00
public String getTag ( RelationParticipator observer )
{
if ( observer = = null ) return getTag ( ) ;
return this . getTag ( this . getColorTo ( observer ) . toString ( ) ) ;
}
2013-04-17 08:49:43 +02:00
// -------------------------------------------- //
2013-04-17 10:22:51 +02:00
// FIELD: description
2013-04-17 08:49:43 +02:00
// -------------------------------------------- //
2011-10-23 20:50:49 +02:00
2013-04-17 10:22:51 +02:00
// RAW
public boolean hasDescription ( )
2011-10-08 22:03:44 +02:00
{
2013-04-17 10:22:51 +02:00
return this . description ! = null ;
2011-03-23 17:39:56 +01:00
}
2013-04-17 10:22:51 +02:00
public String getDescription ( )
2011-10-08 22:03:44 +02:00
{
2013-04-17 10:22:51 +02:00
if ( this . hasDescription ( ) ) return this . description ;
return Lang . FACTION_NODESCRIPTION ;
}
public void setDescription ( String description )
{
if ( description ! = null )
{
description = description . trim ( ) ;
// This code should be kept for a while to clean out the previous default text that was actually stored in the database.
if ( description . length ( ) = = 0 | | description . equalsIgnoreCase ( " Default faction description :( " ) )
{
description = null ;
}
}
this . description = description ;
this . changed ( ) ;
2011-03-23 17:39:56 +01:00
}
2013-04-17 08:49:43 +02:00
// -------------------------------------------- //
2013-04-17 10:22:51 +02:00
// FIELD: open
2013-04-17 08:49:43 +02:00
// -------------------------------------------- //
2011-03-22 17:20:21 +01:00
2013-04-17 10:22:51 +02:00
public boolean isOpen ( )
2011-10-12 17:25:01 +02:00
{
2013-04-17 10:22:51 +02:00
Boolean ret = this . open ;
if ( ret = = null ) ret = ConfServer . newFactionsDefaultOpen ;
return ret ;
2011-10-12 17:25:01 +02:00
}
2013-04-17 10:22:51 +02:00
public void setOpen ( Boolean open )
2011-10-12 17:25:01 +02:00
{
2013-04-17 10:22:51 +02:00
this . open = open ;
this . changed ( ) ;
2011-10-12 17:25:01 +02:00
}
2013-04-17 10:22:51 +02:00
// -------------------------------------------- //
// FIELD: relationWish
// -------------------------------------------- //
// RAW
public Map < String , Rel > getRelationWishes ( )
2011-10-12 17:25:01 +02:00
{
2013-04-17 10:22:51 +02:00
Map < String , Rel > ret = new LinkedHashMap < String , Rel > ( ) ;
if ( this . relationWish ! = null ) ret . putAll ( this . relationWish ) ;
return ret ;
2011-10-12 17:25:01 +02:00
}
2013-04-17 10:22:51 +02:00
public void setRelationWishes ( Map < String , Rel > relationWishes )
2011-10-12 17:25:01 +02:00
{
2013-04-17 10:22:51 +02:00
if ( relationWishes = = null | | relationWishes . isEmpty ( ) )
{
this . relationWish = null ;
}
else
{
this . relationWish = relationWishes ;
}
this . changed ( ) ;
2011-10-12 17:25:01 +02:00
}
2013-04-17 10:22:51 +02:00
// FINER
public Rel getRelationWish ( String factionId )
2011-10-12 17:25:01 +02:00
{
2013-04-17 10:22:51 +02:00
Rel ret = this . getRelationWishes ( ) . get ( factionId ) ;
if ( ret = = null ) ret = Rel . NEUTRAL ;
return ret ;
2011-10-12 17:25:01 +02:00
}
2013-04-17 10:22:51 +02:00
public Rel getRelationWish ( Faction faction )
2011-10-08 22:03:44 +02:00
{
2013-04-17 10:22:51 +02:00
return this . getRelationWish ( faction . getId ( ) ) ;
2011-03-22 17:20:21 +01:00
}
2013-04-17 10:22:51 +02:00
public void setRelationWish ( String factionId , Rel rel )
2011-10-08 22:03:44 +02:00
{
2013-04-17 10:22:51 +02:00
Map < String , Rel > relationWishes = this . getRelationWishes ( ) ;
if ( rel = = null | | rel = = Rel . NEUTRAL )
2011-10-08 22:03:44 +02:00
{
2013-04-17 10:22:51 +02:00
relationWishes . remove ( factionId ) ;
2011-10-08 22:03:44 +02:00
}
else
{
2013-04-17 10:22:51 +02:00
relationWishes . put ( factionId , rel ) ;
2011-03-22 17:20:21 +01:00
}
2013-04-17 10:22:51 +02:00
this . setRelationWishes ( relationWishes ) ;
2011-03-22 17:20:21 +01:00
}
2013-04-17 10:22:51 +02:00
public void setRelationWish ( Faction faction , Rel rel )
{
this . setRelationWish ( faction . getId ( ) , rel ) ;
}
// TODO: What is this and where is it used?
2011-11-24 16:53:59 +01:00
public Map < Rel , List < String > > getFactionTagsPerRelation ( RelationParticipator rp )
2012-11-06 16:43:27 +01:00
{
return getFactionTagsPerRelation ( rp , false ) ;
}
// onlyNonNeutral option provides substantial performance boost on large servers for listing only non-neutral factions
public Map < Rel , List < String > > getFactionTagsPerRelation ( RelationParticipator rp , boolean onlyNonNeutral )
2011-11-24 16:27:14 +01:00
{
Map < Rel , List < String > > ret = new HashMap < Rel , List < String > > ( ) ;
for ( Rel rel : Rel . values ( ) )
{
ret . put ( rel , new ArrayList < String > ( ) ) ;
}
2013-04-12 09:47:43 +02:00
for ( Faction faction : FactionColl . get ( ) . getAll ( ) )
2011-11-24 16:27:14 +01:00
{
Rel relation = faction . getRelationTo ( this ) ;
2012-11-06 16:43:27 +01:00
if ( onlyNonNeutral & & relation = = Rel . NEUTRAL ) continue ;
2011-11-24 16:53:59 +01:00
ret . get ( relation ) . add ( faction . getTag ( rp ) ) ;
2011-11-24 16:27:14 +01:00
}
return ret ;
}
2013-04-17 10:22:51 +02:00
// -------------------------------------------- //
// FIELD: invitedPlayerIds
// -------------------------------------------- //
// RAW
public TreeSet < String > getInvitedPlayerIds ( )
{
TreeSet < String > ret = new TreeSet < String > ( String . CASE_INSENSITIVE_ORDER ) ;
if ( this . invitedPlayerIds ! = null ) ret . addAll ( this . invitedPlayerIds ) ;
return ret ;
}
public void setInvitedPlayerIds ( Collection < String > invitedPlayerIds )
{
if ( invitedPlayerIds = = null | | invitedPlayerIds . isEmpty ( ) )
{
this . invitedPlayerIds = null ;
}
else
{
TreeSet < String > target = new TreeSet < String > ( String . CASE_INSENSITIVE_ORDER ) ;
for ( String invitedPlayerId : invitedPlayerIds )
{
target . add ( invitedPlayerId . toLowerCase ( ) ) ;
}
this . invitedPlayerIds = target ;
}
this . changed ( ) ;
}
// FINER
public boolean isInvited ( String playerId )
{
return this . getInvitedPlayerIds ( ) . contains ( playerId ) ;
}
public boolean isInvited ( FPlayer fplayer )
{
return this . isInvited ( fplayer . getId ( ) ) ;
}
public boolean invite ( String playerId )
{
TreeSet < String > invitedPlayerIds = this . getInvitedPlayerIds ( ) ;
if ( invitedPlayerIds . add ( playerId . toLowerCase ( ) ) )
{
this . setInvitedPlayerIds ( invitedPlayerIds ) ;
return true ;
}
return false ;
}
public void invite ( FPlayer fplayer )
{
this . invite ( fplayer . getId ( ) ) ;
}
public boolean deinvite ( String playerId )
{
TreeSet < String > invitedPlayerIds = this . getInvitedPlayerIds ( ) ;
if ( invitedPlayerIds . remove ( playerId . toLowerCase ( ) ) )
{
this . setInvitedPlayerIds ( invitedPlayerIds ) ;
return true ;
}
return false ;
}
public void deinvite ( FPlayer fplayer )
{
this . deinvite ( fplayer . getId ( ) ) ;
}
// -------------------------------------------- //
// FIELD: powerBoost
// -------------------------------------------- //
// RAW
public double getPowerBoost ( )
{
Double ret = this . powerBoost ;
if ( ret = = null ) ret = 0D ;
return ret ;
}
public void setPowerBoost ( Double powerBoost )
{
if ( powerBoost = = null | | powerBoost = = 0 )
{
powerBoost = null ;
}
this . powerBoost = powerBoost ;
this . changed ( ) ;
}
// -------------------------------------------- //
// FIELD: flagOverrides
// -------------------------------------------- //
// RAW
public Map < FFlag , Boolean > getFlags ( )
{
Map < FFlag , Boolean > ret = new LinkedHashMap < FFlag , Boolean > ( ) ;
for ( FFlag fflag : FFlag . values ( ) )
{
ret . put ( fflag , fflag . getDefault ( ) ) ;
}
if ( this . flagOverrides ! = null )
{
for ( Entry < FFlag , Boolean > entry : this . flagOverrides . entrySet ( ) )
{
ret . put ( entry . getKey ( ) , entry . getValue ( ) ) ;
}
}
return ret ;
}
public void setFlags ( Map < FFlag , Boolean > flags )
{
Map < FFlag , Boolean > target = new LinkedHashMap < FFlag , Boolean > ( ) ;
if ( flags ! = null )
{
target . putAll ( flags ) ;
}
Iterator < Entry < FFlag , Boolean > > iter = target . entrySet ( ) . iterator ( ) ;
while ( iter . hasNext ( ) )
{
Entry < FFlag , Boolean > entry = iter . next ( ) ;
if ( entry . getKey ( ) . getDefault ( ) = = entry . getValue ( ) )
{
iter . remove ( ) ;
}
}
if ( target = = null | | target . isEmpty ( ) )
{
this . flagOverrides = null ;
}
else
{
this . flagOverrides = target ;
}
this . changed ( ) ;
}
// FINER
public boolean getFlag ( FFlag flag )
{
return this . getFlags ( ) . get ( flag ) ;
}
public void setFlag ( FFlag flag , boolean value )
{
Map < FFlag , Boolean > flags = this . getFlags ( ) ;
flags . put ( flag , value ) ;
this . setFlags ( flags ) ;
}
// -------------------------------------------- //
// RELATION AND COLORS
// -------------------------------------------- //
@Override
public String describeTo ( RelationParticipator observer , boolean ucfirst )
{
return RelationUtil . describeThatToMe ( this , observer , ucfirst ) ;
}
@Override
public String describeTo ( RelationParticipator observer )
{
return RelationUtil . describeThatToMe ( this , observer ) ;
}
@Override
public Rel getRelationTo ( RelationParticipator observer )
{
return RelationUtil . getRelationOfThatToMe ( this , observer ) ;
}
@Override
public Rel getRelationTo ( RelationParticipator observer , boolean ignorePeaceful )
{
return RelationUtil . getRelationOfThatToMe ( this , observer , ignorePeaceful ) ;
}
@Override
public ChatColor getColorTo ( RelationParticipator observer )
{
return RelationUtil . getColorOfThatToMe ( this , observer ) ;
}
2011-10-24 03:02:25 +02:00
// TODO: Implement a has enough feature.
2013-04-10 09:40:39 +02:00
// -------------------------------------------- //
2013-04-17 08:49:43 +02:00
// POWER
2013-04-10 09:40:39 +02:00
// -------------------------------------------- //
2013-04-17 08:49:43 +02:00
2011-10-08 22:03:44 +02:00
public double getPower ( )
{
2011-10-24 02:33:30 +02:00
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
}
2011-02-07 21:42:14 +01:00
double ret = 0 ;
2013-04-17 08:49:43 +02:00
for ( FPlayer fplayer : this . getFPlayers ( ) )
2011-10-21 20:08:54 +02:00
{
2011-03-23 12:00:38 +01:00
ret + = fplayer . getPower ( ) ;
2011-02-06 13:36:11 +01:00
}
2013-04-09 13:15:25 +02:00
if ( ConfServer . powerFactionMax > 0 & & ret > ConfServer . powerFactionMax )
2011-10-21 20:08:54 +02:00
{
2013-04-09 13:15:25 +02:00
ret = ConfServer . powerFactionMax ;
2011-07-24 13:10:48 +02:00
}
2012-01-28 18:56:51 +01:00
return ret + this . powerBoost ;
2011-02-06 13:36:11 +01:00
}
2011-10-21 20:08:54 +02:00
public double getPowerMax ( )
{
2011-10-24 02:33:30 +02:00
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
}
2011-02-07 21:42:14 +01:00
double ret = 0 ;
2013-04-17 08:49:43 +02:00
for ( FPlayer fplayer : this . getFPlayers ( ) )
2011-10-21 20:08:54 +02:00
{
2011-03-23 12:00:38 +01:00
ret + = fplayer . getPowerMax ( ) ;
2011-02-06 13:36:11 +01:00
}
2013-04-09 13:15:25 +02:00
if ( ConfServer . powerFactionMax > 0 & & ret > ConfServer . powerFactionMax )
2011-10-21 20:08:54 +02:00
{
2013-04-09 13:15:25 +02:00
ret = ConfServer . powerFactionMax ;
2011-07-24 13:10:48 +02:00
}
2012-01-28 18:56:51 +01:00
return ret + this . powerBoost ;
2011-02-06 13:36:11 +01:00
}
2011-10-21 20:08:54 +02:00
public int getPowerRounded ( )
{
2011-02-06 13:36:11 +01:00
return ( int ) Math . round ( this . getPower ( ) ) ;
}
2011-10-21 20:08:54 +02:00
public int getPowerMaxRounded ( )
{
2011-02-06 13:36:11 +01:00
return ( int ) Math . round ( this . getPowerMax ( ) ) ;
}
2013-04-17 08:49:43 +02:00
public int getLandCount ( )
2013-04-11 11:11:31 +02:00
{
return BoardColl . get ( ) . getCount ( this ) ;
2011-02-06 13:36:11 +01:00
}
2013-04-17 08:49:43 +02:00
public int getLandCountInWorld ( String worldName )
2011-10-21 20:08:54 +02:00
{
2013-04-11 11:11:31 +02:00
return BoardColl . get ( ) . get ( worldName ) . getCount ( this ) ;
2011-06-30 13:13:47 +02:00
}
2011-10-21 20:08:54 +02:00
public boolean hasLandInflation ( )
{
2013-04-17 08:49:43 +02:00
return this . getLandCount ( ) > this . getPowerRounded ( ) ;
2011-02-06 13:36:11 +01:00
}
2013-04-10 09:40:39 +02:00
// -------------------------------------------- //
2013-04-17 08:49:43 +02:00
// FPLAYERS
2013-04-10 09:40:39 +02:00
// -------------------------------------------- //
2012-01-13 10:46:31 +01:00
2013-04-17 08:49:43 +02:00
public List < FPlayer > getFPlayers ( )
2011-10-08 22:03:44 +02:00
{
2013-04-17 08:49:43 +02:00
List < FPlayer > ret = new ArrayList < FPlayer > ( ) ;
2013-04-12 08:56:26 +02:00
for ( FPlayer fplayer : FPlayerColl . get ( ) . getAll ( ) )
2011-10-08 22:03:44 +02:00
{
2013-04-17 08:49:43 +02:00
if ( fplayer . getFaction ( ) ! = this ) continue ;
ret . add ( fplayer ) ;
2011-02-06 13:36:11 +01:00
}
2013-04-17 08:49:43 +02:00
return ret ;
2012-01-13 10:46:31 +01:00
}
2013-04-17 08:49:43 +02:00
public List < FPlayer > getFPlayersWhereOnline ( boolean online )
2012-01-13 10:46:31 +01:00
{
2013-04-17 08:49:43 +02:00
List < FPlayer > ret = new ArrayList < FPlayer > ( ) ;
for ( FPlayer fplayer : FPlayerColl . get ( ) . getAll ( ) )
{
if ( fplayer . getFaction ( ) ! = this ) continue ;
if ( fplayer . isOnline ( ) ! = online ) continue ;
ret . add ( fplayer ) ;
}
2011-02-06 13:36:11 +01:00
return ret ;
}
2013-04-17 08:49:43 +02:00
public List < FPlayer > getFPlayersWhereRole ( Rel role )
2011-10-08 22:03:44 +02:00
{
2013-04-17 08:49:43 +02:00
List < FPlayer > ret = new ArrayList < FPlayer > ( ) ;
for ( FPlayer fplayer : FPlayerColl . get ( ) . getAll ( ) )
2011-10-08 22:03:44 +02:00
{
2013-04-17 08:49:43 +02:00
if ( fplayer . getFaction ( ) ! = this ) continue ;
if ( fplayer . getRole ( ) ! = role ) continue ;
ret . add ( fplayer ) ;
2011-02-06 13:36:11 +01:00
}
return ret ;
}
2013-04-17 08:49:43 +02:00
public FPlayer getLeader ( )
2011-10-08 22:03:44 +02:00
{
2013-04-17 08:49:43 +02:00
for ( FPlayer fplayer : FPlayerColl . get ( ) . getAll ( ) )
2011-10-08 22:03:44 +02:00
{
2013-04-17 08:49:43 +02:00
if ( fplayer . getFaction ( ) ! = this ) continue ;
if ( fplayer . getRole ( ) ! = Rel . LEADER ) continue ;
return fplayer ;
2011-08-02 00:54:05 +02:00
}
return null ;
}
2013-04-17 08:49:43 +02:00
public List < CommandSender > getOnlineCommandSenders ( )
2011-10-22 17:42:13 +02:00
{
2013-04-17 08:49:43 +02:00
List < CommandSender > ret = new ArrayList < CommandSender > ( ) ;
for ( CommandSender player : SenderUtil . getOnlineSenders ( ) )
2011-10-22 17:42:13 +02:00
{
2013-04-17 08:49:43 +02:00
FPlayer fplayer = FPlayerColl . get ( ) . get ( player ) ;
if ( fplayer . getFaction ( ) ! = this ) continue ;
ret . add ( player ) ;
2011-02-06 13:36:11 +01:00
}
return ret ;
}
2013-04-17 08:49:43 +02:00
public List < Player > getOnlinePlayers ( )
2011-10-08 22:03:44 +02:00
{
2013-04-17 08:49:43 +02:00
List < Player > ret = new ArrayList < Player > ( ) ;
for ( Player player : Bukkit . getOnlinePlayers ( ) )
2011-10-08 22:03:44 +02:00
{
2013-04-12 08:56:26 +02:00
FPlayer fplayer = FPlayerColl . get ( ) . get ( player ) ;
2013-04-17 08:49:43 +02:00
if ( fplayer . getFaction ( ) ! = this ) continue ;
ret . add ( player ) ;
2011-02-06 13:36:11 +01:00
}
return ret ;
}
2011-12-18 14:50:41 +01:00
// used when current leader is about to be removed from the faction; promotes new leader, or disbands faction if no other members left
public void promoteNewLeader ( )
{
2013-04-17 08:49:43 +02:00
if ( ! this . isNormal ( ) ) return ;
2013-04-09 13:15:25 +02:00
if ( this . getFlag ( FFlag . PERMANENT ) & & ConfServer . permanentFactionsDisableLeaderPromotion ) return ;
2011-12-18 14:50:41 +01:00
2013-04-17 08:49:43 +02:00
FPlayer oldLeader = this . getLeader ( ) ;
2011-12-18 14:50:41 +01:00
// get list of officers, or list of normal members if there are no officers
2013-04-17 08:49:43 +02:00
List < FPlayer > replacements = this . getFPlayersWhereRole ( Rel . OFFICER ) ;
2011-12-18 14:50:41 +01:00
if ( replacements = = null | | replacements . isEmpty ( ) )
2013-04-17 08:49:43 +02:00
{
2011-12-18 14:50:41 +01:00
replacements = this . getFPlayersWhereRole ( Rel . MEMBER ) ;
2013-04-17 08:49:43 +02:00
}
2011-12-18 14:50:41 +01:00
if ( replacements = = null | | replacements . isEmpty ( ) )
{ // faction leader is the only member; one-man faction
if ( this . getFlag ( FFlag . PERMANENT ) )
{
2012-01-18 13:01:50 +01:00
if ( oldLeader ! = null )
2013-04-17 08:49:43 +02:00
{
2012-01-18 13:01:50 +01:00
oldLeader . setRole ( Rel . MEMBER ) ;
2013-04-17 08:49:43 +02:00
}
2011-12-18 14:50:41 +01:00
return ;
}
// no members left and faction isn't permanent, so disband it
2013-04-09 13:15:25 +02:00
if ( ConfServer . logFactionDisband )
2013-04-17 08:49:43 +02:00
{
2013-04-09 13:12:13 +02:00
Factions . get ( ) . log ( " The faction " + this . getTag ( ) + " ( " + this . getId ( ) + " ) has been disbanded since it has no members left. " ) ;
2013-04-17 08:49:43 +02:00
}
2011-12-18 14:50:41 +01:00
2013-04-12 08:56:26 +02:00
for ( FPlayer fplayer : FPlayerColl . get ( ) . getAllOnline ( ) )
2011-12-18 14:50:41 +01:00
{
fplayer . msg ( " The faction %s<i> was disbanded. " , this . getTag ( fplayer ) ) ;
}
this . detach ( ) ;
}
else
{ // promote new faction leader
2012-01-18 13:01:50 +01:00
if ( oldLeader ! = null )
2013-04-17 08:49:43 +02:00
{
2012-01-18 13:01:50 +01:00
oldLeader . setRole ( Rel . MEMBER ) ;
2013-04-17 08:49:43 +02:00
}
2011-12-18 14:50:41 +01:00
replacements . get ( 0 ) . setRole ( Rel . LEADER ) ;
2012-01-18 13:01:50 +01:00
this . msg ( " <i>Faction leader <h>%s<i> has been removed. %s<i> has been promoted as the new faction leader. " , oldLeader = = null ? " " : oldLeader . getName ( ) , replacements . get ( 0 ) . getName ( ) ) ;
2013-04-09 13:12:13 +02:00
Factions . get ( ) . log ( " Faction " + this . getTag ( ) + " ( " + this . getId ( ) + " ) leader was removed. Replacement leader: " + replacements . get ( 0 ) . getName ( ) ) ;
2011-12-18 14:50:41 +01:00
}
}
2013-04-10 09:40:39 +02:00
// -------------------------------------------- //
2013-04-17 08:49:43 +02:00
// MESSAGES
2013-04-10 09:40:39 +02:00
// -------------------------------------------- //
2013-04-17 08:49:43 +02:00
// These methods are simply proxied in from the SenderEntity class using a for loop.
2013-04-10 10:32:04 +02:00
2013-04-17 08:49:43 +02:00
// CONVENIENCE SEND MESSAGE
public boolean sendMessage ( String message )
2011-10-09 14:53:38 +02:00
{
2013-04-17 08:49:43 +02:00
for ( FPlayer fplayer : this . getFPlayers ( ) )
2011-10-09 14:53:38 +02:00
{
fplayer . sendMessage ( message ) ;
}
2013-04-12 08:56:26 +02:00
return true ;
2011-10-09 14:53:38 +02:00
}
2013-04-17 08:49:43 +02:00
public boolean sendMessage ( String . . . messages )
2011-10-08 22:03:44 +02:00
{
2013-04-17 08:49:43 +02:00
for ( FPlayer fplayer : this . getFPlayers ( ) )
2011-10-08 22:03:44 +02:00
{
2013-04-17 08:49:43 +02:00
fplayer . sendMessage ( messages ) ;
2011-02-06 13:36:11 +01:00
}
2013-04-17 08:49:43 +02:00
return true ;
2011-02-06 13:36:11 +01:00
}
2013-04-17 08:49:43 +02:00
public boolean sendMessage ( Collection < String > messages )
2011-10-08 22:03:44 +02:00
{
2013-04-17 08:49:43 +02:00
for ( FPlayer fplayer : this . getFPlayers ( ) )
2011-10-08 22:03:44 +02:00
{
2011-03-22 17:20:21 +01:00
fplayer . sendMessage ( messages ) ;
2011-02-06 13:36:11 +01:00
}
2013-04-17 08:49:43 +02:00
return true ;
}
// CONVENIENCE MSG
public boolean msg ( String msg )
{
for ( FPlayer fplayer : this . getFPlayers ( ) )
{
fplayer . msg ( msg ) ;
}
return true ;
2011-02-06 13:36:11 +01:00
}
2013-04-17 08:49:43 +02:00
public boolean msg ( String msg , Object . . . args )
{
for ( FPlayer fplayer : this . getFPlayers ( ) )
{
fplayer . msg ( msg , args ) ;
}
return true ;
}
public boolean msg ( Collection < String > msgs )
{
for ( FPlayer fplayer : this . getFPlayers ( ) )
{
fplayer . msg ( msgs ) ;
}
return true ;
}
2011-03-18 17:33:23 +01:00
2011-02-06 13:36:11 +01:00
}