2011-07-18 22:06:02 +02:00
package com.massivecraft.factions ;
2011-02-06 13:36:11 +01:00
2011-10-22 16:00:24 +02:00
import java.util.HashSet ;
import java.util.Set ;
2011-10-13 19:47:37 +02:00
2012-03-02 02:16:45 +01:00
import org.bukkit.Bukkit ;
2011-02-06 13:36:11 +01:00
import org.bukkit.ChatColor ;
2011-09-08 13:24:55 +02: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
2012-03-02 02:16:45 +01:00
import com.massivecraft.factions.event.FPlayerLeaveEvent ;
import com.massivecraft.factions.event.LandClaimEvent ;
2011-10-12 17:25:01 +02:00
import com.massivecraft.factions.iface.EconomyParticipator ;
import com.massivecraft.factions.iface.RelationParticipator ;
2011-10-05 12:13:54 +02:00
import com.massivecraft.factions.integration.Econ ;
2012-01-15 19:41:33 +01:00
import com.massivecraft.factions.integration.LWCFeatures ;
2011-10-05 12:13:54 +02:00
import com.massivecraft.factions.integration.SpoutFeatures ;
import com.massivecraft.factions.integration.Worldguard ;
2011-10-12 17:25:01 +02:00
import com.massivecraft.factions.util.RelationUtil ;
2013-04-11 11:11:31 +02:00
import com.massivecraft.mcore.ps.PS ;
2013-04-12 08:56:26 +02:00
import com.massivecraft.mcore.store.SenderEntity ;
2013-04-10 10:32:04 +02:00
import com.massivecraft.mcore.util.Txt ;
2011-02-06 13:36:11 +01:00
2013-04-12 08:56:26 +02:00
public class FPlayer extends SenderEntity < FPlayer > implements EconomyParticipator
2013-04-12 07:21:38 +02:00
{
// -------------------------------------------- //
2013-04-12 08:56:26 +02:00
// META
2013-04-12 07:21:38 +02:00
// -------------------------------------------- //
2013-04-12 08:56:26 +02:00
public static FPlayer get ( Object oid )
2013-04-12 07:21:38 +02:00
{
2013-04-12 08:56:26 +02:00
return FPlayerColl . get ( ) . get ( oid ) ;
2013-04-12 07:21:38 +02:00
}
// -------------------------------------------- //
// OVERRIDE: ENTITY
// -------------------------------------------- //
2013-04-12 08:56:26 +02:00
@Override
2013-04-12 07:21:38 +02:00
public FPlayer load ( FPlayer that )
{
this . factionId = that . factionId ;
this . role = that . role ;
this . title = that . title ;
this . power = that . power ;
this . powerBoost = that . powerBoost ;
this . lastPowerUpdateTime = that . lastPowerUpdateTime ;
this . lastLoginTime = that . lastLoginTime ;
return this ;
2013-04-12 08:56:26 +02:00
}
@Override
public boolean isDefault ( )
{
if ( this . hasFaction ( ) ) return false ;
if ( this . getPowerRounded ( ) ! = this . getPowerMaxRounded ( ) & & this . getPowerRounded ( ) ! = ( int ) Math . round ( ConfServer . powerPlayerStarting ) ) return false ;
return true ;
}
2013-04-12 07:21:38 +02:00
// -------------------------------------------- //
2013-04-12 08:11:11 +02:00
// FIELDS: RAW PERMANENT
2013-04-12 07:21:38 +02:00
// -------------------------------------------- //
2011-10-08 23:22:02 +02:00
// FIELD: factionId
2011-10-08 22:03:44 +02:00
private String factionId ;
2013-04-12 09:47:43 +02:00
public Faction getFaction ( ) { if ( this . factionId = = null ) { return null ; } return FactionColl . get ( ) . get ( this . factionId ) ; }
2011-10-08 23:22:02 +02:00
public String getFactionId ( ) { return this . factionId ; }
2013-04-12 09:51:14 +02:00
public boolean hasFaction ( ) { return this . factionId ! = null & & ! factionId . equals ( Const . FACTIONID_NONE ) ; }
2011-10-08 23:22:02 +02:00
public void setFaction ( Faction faction )
{
2012-01-13 10:46:31 +01:00
Faction oldFaction = this . getFaction ( ) ;
if ( oldFaction ! = null ) oldFaction . removeFPlayer ( this ) ;
faction . addFPlayer ( this ) ;
2011-10-08 23:22:02 +02:00
this . factionId = faction . getId ( ) ;
2012-05-09 03:24:07 +02:00
SpoutFeatures . updateTitle ( this , null ) ;
SpoutFeatures . updateTitle ( null , this ) ;
2011-10-08 23:22:02 +02:00
}
// FIELD: role
2011-10-23 17:30:41 +02:00
private Rel role ;
public Rel getRole ( ) { return this . role ; }
2012-05-09 03:24:07 +02:00
public void setRole ( Rel role ) { this . role = role ; SpoutFeatures . updateTitle ( this , null ) ; }
2011-10-08 23:22:02 +02:00
// FIELD: title
2011-02-06 13:36:11 +01:00
private String title ;
2011-10-24 03:02:25 +02:00
public String getTitle ( ) { return this . title ; }
public void setTitle ( String title ) { this . title = title ; }
2011-10-08 23:22:02 +02:00
// FIELD: power
2011-02-06 13:36:11 +01:00
private double power ;
2012-01-28 18:56:51 +01:00
// FIELD: powerBoost
// special increase/decrease to min and max power for this player
private double powerBoost ;
public double getPowerBoost ( ) { return this . powerBoost ; }
public void setPowerBoost ( double powerBoost ) { this . powerBoost = powerBoost ; }
2011-10-08 23:22:02 +02:00
// FIELD: lastPowerUpdateTime
2011-02-06 13:36:11 +01:00
private long lastPowerUpdateTime ;
2011-10-08 23:22:02 +02:00
// FIELD: lastLoginTime
2011-03-22 20:36:33 +01:00
private long lastLoginTime ;
2011-10-08 23:22:02 +02:00
2013-04-12 08:11:11 +02:00
// -------------------------------------------- //
// FIELDS: RAW TRANSIENT
// -------------------------------------------- //
// Where did this player stand the last time we checked?
private transient PS currentChunk = null ;
public PS getCurrentChunk ( ) { return this . currentChunk ; }
public void setCurrentChunk ( PS currentChunk ) { this . currentChunk = currentChunk . getChunk ( true ) ; }
2011-10-08 23:22:02 +02:00
// FIELD: mapAutoUpdating
2011-03-22 15:45:41 +01:00
private transient boolean mapAutoUpdating ;
2011-10-24 03:02:25 +02:00
public void setMapAutoUpdating ( boolean mapAutoUpdating ) { this . mapAutoUpdating = mapAutoUpdating ; }
public boolean isMapAutoUpdating ( ) { return mapAutoUpdating ; }
2011-10-08 23:22:02 +02:00
// FIELD: autoClaimEnabled
2011-10-22 17:03:49 +02:00
private transient Faction autoClaimFor ;
2011-10-24 03:02:25 +02:00
public Faction getAutoClaimFor ( ) { return autoClaimFor ; }
public void setAutoClaimFor ( Faction faction ) { this . autoClaimFor = faction ; }
2011-10-23 22:08:57 +02:00
2011-10-25 21:18:08 +02:00
private transient boolean hasAdminMode = false ;
public boolean hasAdminMode ( ) { return this . hasAdminMode ; }
public void setHasAdminMode ( boolean val ) { this . hasAdminMode = val ; }
2011-10-09 18:35:39 +02:00
2011-10-08 23:22:02 +02:00
// FIELD: loginPvpDisabled
2011-09-24 12:04:49 +02:00
private transient boolean loginPvpDisabled ;
2011-10-08 23:22:02 +02:00
2011-10-12 17:25:01 +02:00
// FIELD: account
2012-01-17 02:38:14 +01:00
public String getAccountId ( ) { return this . getId ( ) ; }
2011-10-12 17:25:01 +02:00
2011-03-22 17:20:21 +01:00
// -------------------------------------------- //
2013-04-11 11:11:31 +02:00
// CONSTRUCT
2011-03-22 17:20:21 +01:00
// -------------------------------------------- //
2011-03-18 17:33:23 +01:00
// GSON need this noarg constructor.
2011-10-08 22:03:44 +02:00
public FPlayer ( )
{
2011-10-10 01:21:05 +02:00
this . resetFactionData ( false ) ;
2013-04-09 13:15:25 +02:00
this . power = ConfServer . powerPlayerStarting ;
2011-03-19 13:00:03 +01:00
this . lastPowerUpdateTime = System . currentTimeMillis ( ) ;
2011-03-22 20:36:33 +01:00
this . lastLoginTime = System . currentTimeMillis ( ) ;
2011-03-19 13:00:03 +01:00
this . mapAutoUpdating = false ;
2011-10-22 17:03:49 +02:00
this . autoClaimFor = null ;
2013-04-09 13:15:25 +02:00
this . loginPvpDisabled = ( ConfServer . noPVPDamageToOthersForXSecondsAfterLogin > 0 ) ? true : false ;
2012-01-28 18:56:51 +01:00
this . powerBoost = 0 . 0 ;
2011-09-13 05:46:20 +02:00
2013-04-12 09:51:14 +02:00
if ( ! ConfServer . newPlayerStartingFactionID . equals ( Const . FACTIONID_NONE ) & & FactionColl . get ( ) . containsId ( ConfServer . newPlayerStartingFactionID ) )
2011-10-08 22:03:44 +02:00
{
2013-04-09 13:15:25 +02:00
this . factionId = ConfServer . newPlayerStartingFactionID ;
2011-09-13 05:46:20 +02:00
}
2011-03-19 13:00:03 +01:00
}
2012-02-19 15:32:50 +01:00
public final void resetFactionData ( boolean doSpoutUpdate )
2011-10-08 22:03:44 +02:00
{
2013-04-12 09:47:43 +02:00
if ( this . factionId ! = null & & FactionColl . get ( ) . containsId ( this . factionId ) ) // Avoid infinite loop! TODO: I think that this is needed is a sign we need to refactor.
2012-01-28 17:15:20 +01:00
{
Faction currentFaction = this . getFaction ( ) ;
if ( currentFaction ! = null )
{
currentFaction . removeFPlayer ( this ) ;
}
}
2012-01-13 10:46:31 +01:00
2013-04-12 09:51:14 +02:00
// TODO: Should we not rather use ConfServer.newPlayerStartingFactionID here?
this . factionId = Const . FACTIONID_NONE ; // The default neutral faction
2013-01-06 21:44:29 +01:00
2011-10-23 17:30:41 +02:00
this . role = Rel . MEMBER ;
2011-03-19 13:00:03 +01:00
this . title = " " ;
2011-10-22 17:03:49 +02:00
this . autoClaimFor = null ;
2011-08-20 03:36:23 +02:00
2012-02-19 15:32:50 +01:00
if ( doSpoutUpdate )
2011-10-10 01:21:05 +02:00
{
2013-01-27 03:38:04 +01:00
SpoutFeatures . updateTitle ( this , null ) ;
SpoutFeatures . updateTitle ( null , this ) ;
SpoutFeatures . updateCape ( this . getPlayer ( ) , null ) ;
2011-10-10 01:21:05 +02:00
}
}
public void resetFactionData ( )
{
this . resetFactionData ( true ) ;
2011-03-18 17:33:23 +01:00
}
2011-03-22 17:20:21 +01:00
// -------------------------------------------- //
2013-04-11 11:11:31 +02:00
// GETTERS AND SETTERS
2011-03-22 17:20:21 +01:00
// -------------------------------------------- //
2011-10-08 22:03:44 +02:00
public long getLastLoginTime ( )
{
2011-03-22 20:36:33 +01:00
return lastLoginTime ;
}
2011-10-08 22:03:44 +02:00
public void setLastLoginTime ( long lastLoginTime )
{
2011-09-22 13:33:34 +02:00
losePowerFromBeingOffline ( ) ;
2011-03-22 20:36:33 +01:00
this . lastLoginTime = lastLoginTime ;
2011-05-29 23:28:29 +02:00
this . lastPowerUpdateTime = lastLoginTime ;
2013-04-09 13:15:25 +02:00
if ( ConfServer . noPVPDamageToOthersForXSecondsAfterLogin > 0 )
2011-10-08 22:03:44 +02:00
{
2011-06-23 03:10:42 +02:00
this . loginPvpDisabled = true ;
}
2011-03-22 20:36:33 +01:00
}
2011-10-08 22:03:44 +02:00
public boolean hasLoginPvpDisabled ( )
{
if ( ! loginPvpDisabled )
{
2011-06-23 03:10:42 +02:00
return false ;
}
2013-04-09 13:15:25 +02:00
if ( this . lastLoginTime + ( ConfServer . noPVPDamageToOthersForXSecondsAfterLogin * 1000 ) < System . currentTimeMillis ( ) )
2011-10-08 22:03:44 +02:00
{
2011-06-23 03:10:42 +02:00
this . loginPvpDisabled = false ;
return false ;
}
return true ;
}
2011-02-12 18:05:05 +01:00
2013-04-12 07:21:38 +02:00
// -------------------------------------------- //
2013-04-11 11:11:31 +02:00
// TITLE, NAME, FACTION TAG AND CHAT
2013-04-12 07:21:38 +02:00
// -------------------------------------------- //
2011-10-08 22:03:44 +02:00
public String getName ( )
{
2011-10-24 03:15:08 +02:00
return getId ( ) ;
2011-02-12 18:05:05 +01:00
}
2011-10-08 22:03:44 +02:00
public String getTag ( )
{
if ( ! this . hasFaction ( ) )
{
2011-02-12 18:05:05 +01:00
return " " ;
}
return this . getFaction ( ) . getTag ( ) ;
}
// Base concatenations:
2011-10-08 22:03:44 +02:00
public String getNameAndSomething ( String something )
{
2011-02-12 18:05:05 +01:00
String ret = this . role . getPrefix ( ) ;
if ( something . length ( ) > 0 ) {
ret + = something + " " ;
}
ret + = this . getName ( ) ;
return ret ;
}
2011-10-08 22:03:44 +02:00
public String getNameAndTitle ( )
{
2011-02-12 18:05:05 +01:00
return this . getNameAndSomething ( this . getTitle ( ) ) ;
}
2011-10-08 22:03:44 +02:00
public String getNameAndTag ( )
{
2011-02-12 18:05:05 +01:00
return this . getNameAndSomething ( this . getTag ( ) ) ;
}
// Colored concatenations:
// These are used in information messages
2011-10-08 22:03:44 +02:00
public String getNameAndTitle ( Faction faction )
{
2011-10-21 20:08:54 +02:00
return this . getColorTo ( faction ) + this . getNameAndTitle ( ) ;
2011-02-12 18:05:05 +01:00
}
2011-10-08 22:03:44 +02:00
public String getNameAndTitle ( FPlayer fplayer )
{
2011-10-21 20:08:54 +02:00
return this . getColorTo ( fplayer ) + this . getNameAndTitle ( ) ;
2011-02-12 18:05:05 +01:00
}
// Chat Tag:
// These are injected into the format of global chat messages.
2011-10-08 22:03:44 +02:00
public String getChatTag ( )
{
2011-03-19 13:00:03 +01:00
if ( ! this . hasFaction ( ) ) {
2011-02-12 18:05:05 +01:00
return " " ;
}
2013-04-09 13:15:25 +02:00
return String . format ( ConfServer . chatTagFormat , this . role . getPrefix ( ) + this . getTag ( ) ) ;
2011-02-12 18:05:05 +01:00
}
// Colored Chat Tag
2011-10-08 22:03:44 +02:00
public String getChatTag ( Faction faction )
{
2011-03-19 13:00:03 +01:00
if ( ! this . hasFaction ( ) ) {
2011-02-12 18:05:05 +01:00
return " " ;
}
2011-10-12 17:25:01 +02:00
return this . getRelationTo ( faction ) . getColor ( ) + getChatTag ( ) ;
2011-02-12 18:05:05 +01:00
}
2011-10-08 22:03:44 +02:00
public String getChatTag ( FPlayer fplayer )
{
2011-10-21 20:08:54 +02:00
if ( ! this . hasFaction ( ) )
{
2011-02-12 18:05:05 +01:00
return " " ;
}
2011-10-21 20:08:54 +02:00
return this . getColorTo ( fplayer ) + getChatTag ( ) ;
2011-02-12 18:05:05 +01:00
}
2013-04-12 07:21:38 +02:00
// -------------------------------------------- //
2013-04-11 11:11:31 +02:00
// RELATION AND RELATION COLORS
2013-04-12 07:21:38 +02:00
// -------------------------------------------- //
2011-02-12 18:05:05 +01:00
2011-10-12 17:25:01 +02:00
@Override
2011-10-24 11:07:06 +02:00
public String describeTo ( RelationParticipator observer , boolean ucfirst )
2011-10-08 22:03:44 +02:00
{
2011-10-24 11:07:06 +02:00
return RelationUtil . describeThatToMe ( this , observer , ucfirst ) ;
2011-02-12 18:05:05 +01:00
}
2011-10-12 17:25:01 +02:00
@Override
2011-10-24 11:07:06 +02:00
public String describeTo ( RelationParticipator observer )
2011-10-08 22:03:44 +02:00
{
2011-10-24 11:07:06 +02:00
return RelationUtil . describeThatToMe ( this , observer ) ;
2011-02-12 18:05:05 +01:00
}
2011-10-12 17:25:01 +02:00
@Override
2011-10-24 11:07:06 +02:00
public Rel getRelationTo ( RelationParticipator observer )
2011-10-08 22:03:44 +02:00
{
2011-10-24 11:07:06 +02:00
return RelationUtil . getRelationOfThatToMe ( this , observer ) ;
2011-08-04 07:07:38 +02:00
}
2011-10-12 17:25:01 +02:00
@Override
2011-10-24 11:07:06 +02:00
public Rel getRelationTo ( RelationParticipator observer , boolean ignorePeaceful )
2011-10-08 22:03:44 +02:00
{
2011-10-24 11:07:06 +02:00
return RelationUtil . getRelationOfThatToMe ( this , observer , ignorePeaceful ) ;
2011-02-12 18:05:05 +01:00
}
2011-10-23 17:30:41 +02:00
public Rel getRelationToLocation ( )
2011-10-08 22:03:44 +02:00
{
2013-04-11 11:11:31 +02:00
// TODO: Use some built in system to get sender
return BoardColl . get ( ) . getFactionAt ( PS . valueOf ( this . getPlayer ( ) ) ) . getRelationTo ( this ) ;
2011-02-12 18:05:05 +01:00
}
2011-10-12 17:25:01 +02:00
@Override
2011-10-24 11:07:06 +02:00
public ChatColor getColorTo ( RelationParticipator observer )
2011-10-12 17:25:01 +02:00
{
2011-10-24 11:07:06 +02:00
return RelationUtil . getColorOfThatToMe ( this , observer ) ;
2011-10-12 17:25:01 +02:00
}
2011-02-12 18:05:05 +01:00
2013-04-12 07:21:38 +02:00
// -------------------------------------------- //
2013-04-11 11:11:31 +02:00
// HEALTH
2013-04-12 07:21:38 +02:00
// -------------------------------------------- //
2011-10-08 22:03:44 +02:00
public void heal ( int amnt )
{
2011-02-06 13:36:11 +01:00
Player player = this . getPlayer ( ) ;
2011-10-08 22:03:44 +02:00
if ( player = = null )
{
2011-02-06 13:36:11 +01:00
return ;
}
player . setHealth ( player . getHealth ( ) + amnt ) ;
}
2013-04-12 07:21:38 +02:00
// -------------------------------------------- //
2013-04-11 11:11:31 +02:00
// POWER
2013-04-12 07:21:38 +02:00
// -------------------------------------------- //
2011-10-08 22:03:44 +02:00
public double getPower ( )
{
2011-02-06 13:36:11 +01:00
this . updatePower ( ) ;
return this . power ;
}
2011-10-08 22:03:44 +02:00
protected void alterPower ( double delta )
{
2011-02-06 13:36:11 +01:00
this . power + = delta ;
2011-10-08 22:03:44 +02:00
if ( this . power > this . getPowerMax ( ) )
2011-02-06 13:36:11 +01:00
this . power = this . getPowerMax ( ) ;
2012-01-28 18:56:51 +01:00
else if ( this . power < this . getPowerMin ( ) )
2011-02-06 13:36:11 +01:00
this . power = this . getPowerMin ( ) ;
}
2011-10-08 22:03:44 +02:00
public double getPowerMax ( )
{
2013-04-09 13:15:25 +02:00
return ConfServer . powerPlayerMax + this . powerBoost ;
2011-02-06 13:36:11 +01:00
}
2011-10-08 22:03:44 +02:00
public double getPowerMin ( )
{
2013-04-09 13:15:25 +02:00
return ConfServer . powerPlayerMin + this . powerBoost ;
2011-02-06 13:36:11 +01:00
}
2011-10-08 22:03:44 +02:00
public int getPowerRounded ( )
{
2011-02-06 13:36:11 +01:00
return ( int ) Math . round ( this . getPower ( ) ) ;
}
2011-10-08 22:03:44 +02:00
public int getPowerMaxRounded ( )
{
2011-02-06 13:36:11 +01:00
return ( int ) Math . round ( this . getPowerMax ( ) ) ;
}
2011-10-08 22:03:44 +02:00
public int getPowerMinRounded ( )
{
2011-02-06 13:36:11 +01:00
return ( int ) Math . round ( this . getPowerMin ( ) ) ;
}
2011-10-08 22:03:44 +02:00
protected void updatePower ( )
{
if ( this . isOffline ( ) )
{
2011-09-22 13:33:34 +02:00
losePowerFromBeingOffline ( ) ;
2013-04-09 13:15:25 +02:00
if ( ! ConfServer . powerRegenOffline )
2011-10-08 22:03:44 +02:00
{
2011-09-22 13:33:34 +02:00
return ;
}
2011-05-29 23:28:29 +02:00
}
2011-02-06 13:36:11 +01:00
long now = System . currentTimeMillis ( ) ;
long millisPassed = now - this . lastPowerUpdateTime ;
this . lastPowerUpdateTime = now ;
2011-11-29 00:07:29 +01:00
2012-01-28 12:59:07 +01:00
Player thisPlayer = this . getPlayer ( ) ;
if ( thisPlayer ! = null & & thisPlayer . isDead ( ) ) return ; // don't let dead players regain power until they respawn
2011-11-29 00:07:29 +01:00
int millisPerMinute = 60 * 1000 ;
2013-04-09 13:15:25 +02:00
double powerPerMinute = ConfServer . powerPerMinute ;
if ( ConfServer . scaleNegativePower & & this . power < 0 )
2011-11-29 00:07:29 +01:00
{
2013-04-09 13:15:25 +02:00
powerPerMinute + = ( Math . sqrt ( Math . abs ( this . power ) ) * Math . abs ( this . power ) ) / ConfServer . scaleNegativeDivisor ;
2011-11-29 00:07:29 +01:00
}
this . alterPower ( millisPassed * powerPerMinute / millisPerMinute ) ;
2011-02-06 13:36:11 +01:00
}
2011-09-22 13:33:34 +02:00
2011-10-08 22:03:44 +02:00
protected void losePowerFromBeingOffline ( )
{
2013-04-09 13:15:25 +02:00
if ( ConfServer . powerOfflineLossPerDay > 0 . 0 & & this . power > ConfServer . powerOfflineLossLimit )
2011-10-08 22:03:44 +02:00
{
2011-09-22 13:33:34 +02:00
long now = System . currentTimeMillis ( ) ;
long millisPassed = now - this . lastPowerUpdateTime ;
this . lastPowerUpdateTime = now ;
2013-04-09 13:15:25 +02:00
double loss = millisPassed * ConfServer . powerOfflineLossPerDay / ( 24 * 60 * 60 * 1000 ) ;
if ( this . power - loss < ConfServer . powerOfflineLossLimit )
2011-10-08 22:03:44 +02:00
{
2011-09-22 13:33:34 +02:00
loss = this . power ;
}
this . alterPower ( - loss ) ;
}
}
2011-02-06 13:36:11 +01:00
2011-10-08 22:03:44 +02:00
public void onDeath ( )
{
2011-02-06 13:36:11 +01:00
this . updatePower ( ) ;
2013-04-09 13:15:25 +02:00
this . alterPower ( - ConfServer . powerPerDeath ) ;
2011-02-06 13:36:11 +01:00
}
2013-04-12 07:21:38 +02:00
// -------------------------------------------- //
2013-04-11 11:11:31 +02:00
// TERRITORY
2013-04-12 07:21:38 +02:00
// -------------------------------------------- //
2011-10-08 22:03:44 +02:00
public boolean isInOwnTerritory ( )
{
2013-04-11 11:11:31 +02:00
// TODO: Use Mixin to get this PS instead
return BoardColl . get ( ) . getFactionAt ( PS . valueOf ( this . getPlayer ( ) ) ) = = this . getFaction ( ) ;
2011-02-06 13:36:11 +01:00
}
2011-08-04 07:07:38 +02:00
2011-10-08 22:03:44 +02:00
public boolean isInEnemyTerritory ( )
{
2013-04-11 11:11:31 +02:00
// TODO: Use Mixin to get this PS instead
return BoardColl . get ( ) . getFactionAt ( PS . valueOf ( this . getPlayer ( ) ) ) . getRelationTo ( this ) = = Rel . ENEMY ;
2011-02-06 13:36:11 +01:00
}
2011-08-04 07:07:38 +02:00
2011-10-08 22:03:44 +02:00
public void sendFactionHereMessage ( )
{
if ( SpoutFeatures . updateTerritoryDisplay ( this ) )
{
2011-10-05 12:13:54 +02:00
return ;
}
2013-04-11 11:27:04 +02:00
Faction factionHere = BoardColl . get ( ) . getFactionAt ( this . getCurrentChunk ( ) ) ;
2013-04-10 10:32:04 +02:00
String msg = Txt . parse ( " <i> " ) + " ~ " + factionHere . getTag ( this ) ;
2011-10-08 22:03:44 +02:00
if ( factionHere . getDescription ( ) . length ( ) > 0 )
{
2011-02-12 18:05:05 +01:00
msg + = " - " + factionHere . getDescription ( ) ;
}
2011-02-06 13:36:11 +01:00
this . sendMessage ( msg ) ;
}
2013-04-12 07:21:38 +02:00
// -------------------------------------------- //
2013-04-11 11:11:31 +02:00
// ACTIONS
2013-04-12 07:21:38 +02:00
// -------------------------------------------- //
2011-03-22 20:36:33 +01:00
2011-10-08 22:03:44 +02:00
public void leave ( boolean makePay )
{
2011-03-22 20:36:33 +01:00
Faction myFaction = this . getFaction ( ) ;
2012-03-13 15:48:34 +01:00
makePay = makePay & & Econ . shouldBeUsed ( ) & & ! this . hasAdminMode ( ) ;
2011-12-18 14:50:41 +01:00
if ( myFaction = = null )
{
resetFactionData ( ) ;
return ;
}
2011-10-24 02:33:30 +02:00
boolean perm = myFaction . getFlag ( FFlag . PERMANENT ) ;
2011-03-22 20:36:33 +01:00
2011-10-23 17:30:41 +02:00
if ( ! perm & & this . getRole ( ) = = Rel . LEADER & & myFaction . getFPlayers ( ) . size ( ) > 1 )
2011-10-08 22:03:44 +02:00
{
2011-10-10 13:40:24 +02:00
msg ( " <b>You must give the admin role to someone else first. " ) ;
2011-03-22 20:36:33 +01:00
return ;
}
2011-04-28 22:45:43 +02:00
2013-04-09 13:15:25 +02:00
if ( ! ConfServer . canLeaveWithNegativePower & & this . getPower ( ) < 0 )
2011-10-08 22:03:44 +02:00
{
2011-10-10 13:40:24 +02:00
msg ( " <b>You cannot leave until your power is positive. " ) ;
2011-05-29 23:41:50 +02:00
return ;
}
Added basic support for iConomy, where most Factions commands can be made to cost (or give) money. For claiming land, there are some extra features. Each additional land claimed by default costs more than the last, with the multiplier being configurable. For example, the first claim might cost $30, the 2nd $45, the third $60, and so forth. When land is claimed from a weakened faction, there is a configurable bonus amount of money deducted from the cost of claiming the land, as an incentive; this number can be changed to a negative value to instead make it cost more to claim such land. When land is unclaimed, a configurable percentage of the cost of claiming the land can be refunded (defaults to 70% of the cost). The total value of a faction's claimed land is now shown in the info given by /f who [faction tag], along with the depreciated (refund) value.
2011-08-02 01:05:01 +02:00
2012-03-13 15:48:34 +01:00
// if economy is enabled and they're not on the bypass list, make sure they can pay
2013-04-09 13:15:25 +02:00
if ( makePay & & ! Econ . hasAtLeast ( this , ConfServer . econCostLeave , " to leave your faction. " ) ) return ;
2012-03-13 15:48:34 +01:00
2012-03-02 02:16:45 +01:00
FPlayerLeaveEvent leaveEvent = new FPlayerLeaveEvent ( this , myFaction , FPlayerLeaveEvent . PlayerLeaveReason . LEAVE ) ;
Bukkit . getServer ( ) . getPluginManager ( ) . callEvent ( leaveEvent ) ;
if ( leaveEvent . isCancelled ( ) ) return ;
2012-03-13 15:48:34 +01:00
// then make 'em pay (if applicable)
2013-04-09 13:15:25 +02:00
if ( makePay & & ! Econ . modifyMoney ( this , - ConfServer . econCostLeave , " to leave your faction. " , " for leaving your faction. " ) ) return ;
2012-03-13 15:48:34 +01:00
2011-10-13 19:47:37 +02:00
// Am I the last one in the faction?
2012-01-13 10:46:31 +01:00
if ( myFaction . getFPlayers ( ) . size ( ) = = 1 )
2011-10-13 19:47:37 +02:00
{
// Transfer all money
if ( Econ . shouldBeUsed ( ) )
2012-01-17 02:38:14 +01:00
Econ . transferMoney ( this , myFaction , this , Econ . getBalance ( myFaction . getAccountId ( ) ) ) ;
2011-10-13 19:47:37 +02:00
}
2011-10-08 22:03:44 +02:00
if ( myFaction . isNormal ( ) )
{
2011-10-12 21:54:38 +02:00
for ( FPlayer fplayer : myFaction . getFPlayersWhereOnline ( true ) )
{
2011-10-13 19:47:37 +02:00
fplayer . msg ( " %s<i> left %s<i>. " , this . describeTo ( fplayer , true ) , myFaction . describeTo ( fplayer ) ) ;
2011-10-12 21:54:38 +02:00
}
Additional logging, with new conf.json settings to enable/disable logging of specific events:
"logFactionCreate": true, - log faction creation
"logFactionDisband": true, - log factions being disbanded, by command or by circumstance
"logFactionJoin": true, - log player joining a faction
"logFactionKick": true, - log player being kicked from a faction
"logFactionLeave": true, - log player leaving a faction
"logLandClaims": true, - log land being claimed (including safe zone and war zone)
"logLandUnclaims": true, - log land being unclaimed (including safe zone and war zone)
"logMoneyTransactions": true, - log money being deposited, withdrawn, and otherwise transferred in relation to faction banks
Also a fix for a potential NPE from players logging out and Spout appearance handler referencing them afterwards
2011-10-23 19:50:02 +02:00
2013-04-09 13:15:25 +02:00
if ( ConfServer . logFactionLeave )
2013-04-09 13:12:13 +02:00
Factions . get ( ) . log ( this . getName ( ) + " left the faction: " + myFaction . getTag ( ) ) ;
2011-04-28 22:45:43 +02:00
}
2011-10-13 19:47:37 +02:00
2011-10-13 06:44:59 +02:00
this . resetFactionData ( ) ;
2011-10-08 22:03:44 +02:00
if ( myFaction . isNormal ( ) & & ! perm & & myFaction . getFPlayers ( ) . isEmpty ( ) )
{
2011-03-22 20:36:33 +01:00
// Remove this faction
2013-04-12 08:56:26 +02:00
for ( FPlayer fplayer : FPlayerColl . get ( ) . getAllOnline ( ) )
2011-10-08 22:03:44 +02:00
{
2011-10-12 21:54:38 +02:00
fplayer . msg ( " <i>%s<i> was disbanded. " , myFaction . describeTo ( fplayer , true ) ) ;
2011-03-22 20:36:33 +01:00
}
2011-10-13 06:44:59 +02:00
2011-10-10 01:21:05 +02:00
myFaction . detach ( ) ;
2013-04-09 13:15:25 +02:00
if ( ConfServer . logFactionDisband )
2013-04-09 13:12:13 +02:00
Factions . get ( ) . log ( " The faction " + myFaction . getTag ( ) + " ( " + myFaction . getId ( ) + " ) was disbanded due to the last player ( " + this . getName ( ) + " ) leaving. " ) ;
2011-03-22 20:36:33 +01:00
}
}
2011-10-25 08:27:58 +02:00
2011-10-22 16:00:24 +02:00
public boolean canClaimForFactionAtLocation ( Faction forFaction , Location location , boolean notifyFailure )
2011-10-08 22:03:44 +02:00
{
2011-10-22 16:00:24 +02:00
String error = null ;
2013-04-11 11:11:31 +02:00
PS ps = PS . valueOf ( location ) ;
Faction myFaction = this . getFaction ( ) ;
Faction currentFaction = BoardColl . get ( ) . getFactionAt ( ps ) ;
2011-10-22 16:00:24 +02:00
int ownedLand = forFaction . getLandRounded ( ) ;
2013-04-09 13:15:25 +02:00
if ( ConfServer . worldGuardChecking & & Worldguard . checkForRegionsInChunk ( location ) )
2011-10-08 22:03:44 +02:00
{
2011-08-29 14:54:04 +02:00
// Checks for WorldGuard regions in the chunk attempting to be claimed
2013-04-10 10:32:04 +02:00
error = Txt . parse ( " <b>This land is protected " ) ;
2011-08-29 14:54:04 +02:00
}
2013-04-11 11:11:31 +02:00
else if ( ConfServer . worldsNoClaiming . contains ( ps . getWorld ( ) ) )
2011-10-08 22:03:44 +02:00
{
2013-04-10 10:32:04 +02:00
error = Txt . parse ( " <b>Sorry, this world has land claiming disabled. " ) ;
2011-06-10 21:26:12 +02:00
}
2011-10-25 21:18:08 +02:00
else if ( this . hasAdminMode ( ) )
2011-10-08 22:03:44 +02:00
{
2011-10-22 16:00:24 +02:00
return true ;
2011-06-10 21:26:12 +02:00
}
2011-10-22 16:00:24 +02:00
else if ( forFaction = = currentFaction )
2011-10-08 22:03:44 +02:00
{
2013-04-10 10:32:04 +02:00
error = Txt . parse ( " %s<i> already own this land. " , forFaction . describeTo ( this , true ) ) ;
2011-06-10 21:26:12 +02:00
}
2011-10-25 21:18:08 +02:00
else if ( ! FPerm . TERRITORY . has ( this , forFaction , true ) )
2011-10-08 22:03:44 +02:00
{
2011-10-25 21:18:08 +02:00
return false ;
2011-06-10 21:26:12 +02:00
}
2013-04-09 13:15:25 +02:00
else if ( forFaction . getFPlayers ( ) . size ( ) < ConfServer . claimsRequireMinFactionMembers )
2011-10-08 22:03:44 +02:00
{
2013-04-10 10:32:04 +02:00
error = Txt . parse ( " Factions must have at least <h>%s<b> members to claim land. " , ConfServer . claimsRequireMinFactionMembers ) ;
2011-06-10 21:26:12 +02:00
}
2011-10-22 16:00:24 +02:00
else if ( ownedLand > = forFaction . getPowerRounded ( ) )
{
2013-04-10 10:32:04 +02:00
error = Txt . parse ( " <b>You can't claim more land! You need more power! " ) ;
2011-10-22 16:00:24 +02:00
}
2013-04-09 13:15:25 +02:00
else if ( ConfServer . claimedLandsMax ! = 0 & & ownedLand > = ConfServer . claimedLandsMax & & ! forFaction . getFlag ( FFlag . INFPOWER ) )
2012-02-02 20:09:43 +01:00
{
2013-04-10 10:32:04 +02:00
error = Txt . parse ( " <b>Limit reached. You can't claim more land! " ) ;
2012-01-31 23:30:24 +01:00
}
2013-04-09 13:15:25 +02:00
else if ( ! ConfServer . claimingFromOthersAllowed & & currentFaction . isNormal ( ) )
2012-07-30 23:28:23 +02:00
{
2013-04-10 10:32:04 +02:00
error = Txt . parse ( " <b>You may not claim land from others. " ) ;
2012-07-30 23:28:23 +02:00
}
2011-10-25 22:18:54 +02:00
else if ( currentFaction . getRelationTo ( forFaction ) . isAtLeast ( Rel . TRUCE ) & & ! currentFaction . isNone ( ) )
2011-10-22 16:00:24 +02:00
{
2013-04-10 10:32:04 +02:00
error = Txt . parse ( " <b>You can't claim this land due to your relation with the current owner. " ) ;
2011-10-22 16:00:24 +02:00
}
else if
2011-10-08 22:03:44 +02:00
(
2013-04-09 13:15:25 +02:00
ConfServer . claimsMustBeConnected
2011-10-25 21:18:08 +02:00
& & ! this . hasAdminMode ( )
2013-04-11 11:11:31 +02:00
& & myFaction . getLandRoundedInWorld ( ps . getWorld ( ) ) > 0
& & ! BoardColl . get ( ) . isConnectedPs ( ps , myFaction )
2013-04-09 13:15:25 +02:00
& & ( ! ConfServer . claimsCanBeUnconnectedIfOwnedByOtherFaction | | ! currentFaction . isNormal ( ) )
2011-10-08 22:03:44 +02:00
)
{
2013-04-09 13:15:25 +02:00
if ( ConfServer . claimsCanBeUnconnectedIfOwnedByOtherFaction )
2013-04-10 10:32:04 +02:00
error = Txt . parse ( " <b>You can only claim additional land which is connected to your first claim or controlled by another faction! " ) ;
2011-07-20 21:45:18 +02:00
else
2013-04-10 10:32:04 +02:00
error = Txt . parse ( " <b>You can only claim additional land which is connected to your first claim! " ) ;
2011-06-21 04:15:41 +02:00
}
2011-10-22 16:00:24 +02:00
else if ( currentFaction . isNormal ( ) )
2011-10-08 22:03:44 +02:00
{
2011-10-23 22:08:57 +02:00
if ( ! currentFaction . hasLandInflation ( ) )
2011-10-08 22:03:44 +02:00
{
2011-06-10 21:26:12 +02:00
// TODO more messages WARN current faction most importantly
2013-04-10 10:32:04 +02:00
error = Txt . parse ( " %s<i> owns this land and is strong enough to keep it. " , currentFaction . getTag ( this ) ) ;
2011-06-10 21:26:12 +02:00
}
2013-04-11 11:11:31 +02:00
else if ( ! BoardColl . get ( ) . isBorderPs ( ps ) )
2011-10-08 22:03:44 +02:00
{
2013-04-10 10:32:04 +02:00
error = Txt . parse ( " <b>You must start claiming land at the border of the territory. " ) ;
2011-06-10 21:26:12 +02:00
}
Added basic support for iConomy, where most Factions commands can be made to cost (or give) money. For claiming land, there are some extra features. Each additional land claimed by default costs more than the last, with the multiplier being configurable. For example, the first claim might cost $30, the 2nd $45, the third $60, and so forth. When land is claimed from a weakened faction, there is a configurable bonus amount of money deducted from the cost of claiming the land, as an incentive; this number can be changed to a negative value to instead make it cost more to claim such land. When land is unclaimed, a configurable percentage of the cost of claiming the land can be refunded (defaults to 70% of the cost). The total value of a faction's claimed land is now shown in the info given by /f who [faction tag], along with the depreciated (refund) value.
2011-08-02 01:05:01 +02:00
}
2011-10-22 16:00:24 +02:00
if ( notifyFailure & & error ! = null )
{
msg ( error ) ;
}
return error = = null ;
}
public boolean attemptClaim ( Faction forFaction , Location location , boolean notifyFailure )
{
// notifyFailure is false if called by auto-claim; no need to notify on every failure for it
// return value is false on failure, true on success
2013-04-11 11:11:31 +02:00
PS flocation = PS . valueOf ( location ) . getChunk ( true ) ;
Faction currentFaction = BoardColl . get ( ) . getFactionAt ( flocation ) ;
2011-10-22 16:00:24 +02:00
int ownedLand = forFaction . getLandRounded ( ) ;
if ( ! this . canClaimForFactionAtLocation ( forFaction , location , notifyFailure ) ) return false ;
2011-10-23 22:08:57 +02:00
// TODO: Add flag no costs??
2012-03-13 15:48:34 +01:00
// if economy is enabled and they're not on the bypass list, make sure they can pay
boolean mustPay = Econ . shouldBeUsed ( ) & & ! this . hasAdminMode ( ) ;
double cost = 0 . 0 ;
EconomyParticipator payee = null ;
if ( mustPay )
2011-10-08 22:03:44 +02:00
{
2012-03-13 15:48:34 +01:00
cost = Econ . calculateClaimCost ( ownedLand , currentFaction . isNormal ( ) ) ;
2012-01-19 04:10:40 +01:00
2013-04-11 11:11:31 +02:00
if ( ConfServer . econClaimUnconnectedFee ! = 0 . 0 & & forFaction . getLandRoundedInWorld ( flocation . getWorld ( ) ) > 0 & & ! BoardColl . get ( ) . isConnectedPs ( flocation , forFaction ) )
2013-04-09 13:15:25 +02:00
cost + = ConfServer . econClaimUnconnectedFee ;
2012-01-19 04:10:40 +01:00
2013-04-09 13:15:25 +02:00
if ( ConfServer . bankEnabled & & ConfServer . bankFactionPaysLandCosts & & this . hasFaction ( ) )
2012-03-13 15:48:34 +01:00
payee = this . getFaction ( ) ;
2011-10-08 22:03:44 +02:00
else
2012-03-13 15:48:34 +01:00
payee = this ;
if ( ! Econ . hasAtLeast ( payee , cost , " to claim this land " ) ) return false ;
Added basic support for iConomy, where most Factions commands can be made to cost (or give) money. For claiming land, there are some extra features. Each additional land claimed by default costs more than the last, with the multiplier being configurable. For example, the first claim might cost $30, the 2nd $45, the third $60, and so forth. When land is claimed from a weakened faction, there is a configurable bonus amount of money deducted from the cost of claiming the land, as an incentive; this number can be changed to a negative value to instead make it cost more to claim such land. When land is unclaimed, a configurable percentage of the cost of claiming the land can be refunded (defaults to 70% of the cost). The total value of a faction's claimed land is now shown in the info given by /f who [faction tag], along with the depreciated (refund) value.
2011-08-02 01:05:01 +02:00
}
2012-03-13 15:48:34 +01:00
2012-03-11 18:28:31 +01:00
LandClaimEvent claimEvent = new LandClaimEvent ( flocation , forFaction , this ) ;
2012-03-02 02:16:45 +01:00
Bukkit . getServer ( ) . getPluginManager ( ) . callEvent ( claimEvent ) ;
if ( claimEvent . isCancelled ( ) ) return false ;
2012-03-13 15:48:34 +01:00
// then make 'em pay (if applicable)
if ( mustPay & & ! Econ . modifyMoney ( payee , - cost , " to claim this land " , " for claiming this land " ) ) return false ;
2013-04-09 13:15:25 +02:00
if ( LWCFeatures . getEnabled ( ) & & forFaction . isNormal ( ) & & ConfServer . onCaptureResetLwcLocks )
2012-01-15 19:41:33 +01:00
LWCFeatures . clearOtherChests ( flocation , this . getFaction ( ) ) ;
Added basic support for iConomy, where most Factions commands can be made to cost (or give) money. For claiming land, there are some extra features. Each additional land claimed by default costs more than the last, with the multiplier being configurable. For example, the first claim might cost $30, the 2nd $45, the third $60, and so forth. When land is claimed from a weakened faction, there is a configurable bonus amount of money deducted from the cost of claiming the land, as an incentive; this number can be changed to a negative value to instead make it cost more to claim such land. When land is unclaimed, a configurable percentage of the cost of claiming the land can be refunded (defaults to 70% of the cost). The total value of a faction's claimed land is now shown in the info given by /f who [faction tag], along with the depreciated (refund) value.
2011-08-02 01:05:01 +02:00
// announce success
2011-10-22 16:00:24 +02:00
Set < FPlayer > informTheseFPlayers = new HashSet < FPlayer > ( ) ;
informTheseFPlayers . add ( this ) ;
informTheseFPlayers . addAll ( forFaction . getFPlayersWhereOnline ( true ) ) ;
for ( FPlayer fp : informTheseFPlayers )
2011-10-08 22:03:44 +02:00
{
2011-10-22 16:00:24 +02:00
fp . msg ( " <h>%s<i> claimed land for <h>%s<i> from <h>%s<i>. " , this . describeTo ( fp , true ) , forFaction . describeTo ( fp ) , currentFaction . describeTo ( fp ) ) ;
Added basic support for iConomy, where most Factions commands can be made to cost (or give) money. For claiming land, there are some extra features. Each additional land claimed by default costs more than the last, with the multiplier being configurable. For example, the first claim might cost $30, the 2nd $45, the third $60, and so forth. When land is claimed from a weakened faction, there is a configurable bonus amount of money deducted from the cost of claiming the land, as an incentive; this number can be changed to a negative value to instead make it cost more to claim such land. When land is unclaimed, a configurable percentage of the cost of claiming the land can be refunded (defaults to 70% of the cost). The total value of a faction's claimed land is now shown in the info given by /f who [faction tag], along with the depreciated (refund) value.
2011-08-02 01:05:01 +02:00
}
2011-10-22 16:00:24 +02:00
2013-04-11 11:11:31 +02:00
BoardColl . get ( ) . setFactionAt ( flocation , forFaction ) ;
2011-10-23 16:03:28 +02:00
SpoutFeatures . updateTerritoryDisplayLoc ( flocation ) ;
Additional logging, with new conf.json settings to enable/disable logging of specific events:
"logFactionCreate": true, - log faction creation
"logFactionDisband": true, - log factions being disbanded, by command or by circumstance
"logFactionJoin": true, - log player joining a faction
"logFactionKick": true, - log player being kicked from a faction
"logFactionLeave": true, - log player leaving a faction
"logLandClaims": true, - log land being claimed (including safe zone and war zone)
"logLandUnclaims": true, - log land being unclaimed (including safe zone and war zone)
"logMoneyTransactions": true, - log money being deposited, withdrawn, and otherwise transferred in relation to faction banks
Also a fix for a potential NPE from players logging out and Spout appearance handler referencing them afterwards
2011-10-23 19:50:02 +02:00
2013-04-09 13:15:25 +02:00
if ( ConfServer . logLandClaims )
2013-04-11 11:11:31 +02:00
Factions . get ( ) . log ( this . getName ( ) + " claimed land at ( " + flocation . getChunkX ( ) + " , " + flocation . getChunkZ ( ) + " ) for the faction: " + forFaction . getTag ( ) ) ;
Additional logging, with new conf.json settings to enable/disable logging of specific events:
"logFactionCreate": true, - log faction creation
"logFactionDisband": true, - log factions being disbanded, by command or by circumstance
"logFactionJoin": true, - log player joining a faction
"logFactionKick": true, - log player being kicked from a faction
"logFactionLeave": true, - log player leaving a faction
"logLandClaims": true, - log land being claimed (including safe zone and war zone)
"logLandUnclaims": true, - log land being unclaimed (including safe zone and war zone)
"logMoneyTransactions": true, - log money being deposited, withdrawn, and otherwise transferred in relation to faction banks
Also a fix for a potential NPE from players logging out and Spout appearance handler referencing them afterwards
2011-10-23 19:50:02 +02:00
2011-06-10 21:26:12 +02:00
return true ;
}
2011-03-19 13:00:03 +01:00
2013-01-06 21:44:29 +01:00
}