2013-04-22 09:37:53 +02:00
package com.massivecraft.factions.entity ;
2011-10-08 22:03:44 +02:00
2017-03-24 13:05:58 +01:00
import java.util.ArrayList ;
import java.util.Collections ;
import java.util.LinkedHashMap ;
import java.util.List ;
import java.util.Map ;
import java.util.Set ;
2017-03-11 20:27:40 +01:00
import com.massivecraft.factions.PermissibleId ;
import com.massivecraft.massivecore.store.Coll ;
import com.massivecraft.massivecore.util.Txt ;
import com.massivecraft.factions.Factions ;
import com.massivecraft.factions.Rel ;
import com.massivecraft.factions.integration.Econ ;
import com.massivecraft.factions.util.MiscUtil ;
2013-04-12 15:10:11 +02:00
public class FactionColl extends Coll < Faction >
2011-10-08 22:03:44 +02:00
{
2013-04-10 10:10:28 +02:00
// -------------------------------------------- //
2014-09-17 13:17:33 +02:00
// INSTANCE & CONSTRUCT
2013-04-10 10:10:28 +02:00
// -------------------------------------------- //
2014-09-17 13:17:33 +02:00
private static FactionColl i = new FactionColl ( ) ;
public static FactionColl get ( ) { return i ; }
2015-02-02 00:25:29 +01:00
// -------------------------------------------- //
// STACK TRACEABILITY
// -------------------------------------------- //
@Override
public void onTick ( )
{
super . onTick ( ) ;
}
2011-10-08 22:03:44 +02:00
2013-04-12 09:47:43 +02:00
// -------------------------------------------- //
// OVERRIDE: COLL
// -------------------------------------------- //
2011-10-08 22:03:44 +02:00
@Override
2016-02-25 22:28:09 +01:00
public void setActive ( boolean active )
2011-10-08 22:03:44 +02:00
{
2016-02-25 22:28:09 +01:00
super . setActive ( active ) ;
2017-03-12 17:55:01 +01:00
if ( ! active ) return ;
2011-10-24 02:33:30 +02:00
2013-04-24 13:50:02 +02:00
this . createSpecialFactions ( ) ;
2011-10-08 22:03:44 +02:00
}
2013-04-10 09:40:39 +02:00
// -------------------------------------------- //
2013-04-24 13:50:02 +02:00
// SPECIAL FACTIONS
2013-04-10 09:40:39 +02:00
// -------------------------------------------- //
2011-10-08 22:03:44 +02:00
2013-04-24 13:50:02 +02:00
public void createSpecialFactions ( )
2011-10-08 22:03:44 +02:00
{
2013-04-24 13:50:02 +02:00
this . getNone ( ) ;
this . getSafezone ( ) ;
this . getWarzone ( ) ;
2011-10-08 22:03:44 +02:00
}
public Faction getNone ( )
{
2014-10-01 22:00:08 +02:00
String id = Factions . ID_NONE ;
2013-04-24 13:50:02 +02:00
Faction faction = this . get ( id ) ;
if ( faction ! = null ) return faction ;
2013-04-24 16:40:35 +02:00
faction = this . create ( id ) ;
2013-04-24 13:50:02 +02:00
2014-11-13 11:41:21 +01:00
faction . setName ( Factions . NAME_NONE_DEFAULT ) ;
2015-02-03 12:47:09 +01:00
faction . setDescription ( " It's dangerous to go alone. " ) ;
2014-10-02 11:45:06 +02:00
2014-10-07 12:30:44 +02:00
faction . setFlag ( MFlag . getFlagOpen ( ) , false ) ;
faction . setFlag ( MFlag . getFlagPermanent ( ) , true ) ;
faction . setFlag ( MFlag . getFlagPeaceful ( ) , false ) ;
faction . setFlag ( MFlag . getFlagInfpower ( ) , true ) ;
faction . setFlag ( MFlag . getFlagPowerloss ( ) , true ) ;
faction . setFlag ( MFlag . getFlagPvp ( ) , true ) ;
faction . setFlag ( MFlag . getFlagFriendlyire ( ) , false ) ;
faction . setFlag ( MFlag . getFlagMonsters ( ) , true ) ;
2015-09-08 05:06:57 +02:00
faction . setFlag ( MFlag . getFlagAnimals ( ) , true ) ;
2014-10-07 12:30:44 +02:00
faction . setFlag ( MFlag . getFlagExplosions ( ) , true ) ;
faction . setFlag ( MFlag . getFlagOfflineexplosions ( ) , true ) ;
faction . setFlag ( MFlag . getFlagFirespread ( ) , true ) ;
faction . setFlag ( MFlag . getFlagEndergrief ( ) , true ) ;
2015-12-11 13:34:36 +01:00
faction . setFlag ( MFlag . getFlagZombiegrief ( ) , true ) ;
2013-04-24 13:50:02 +02:00
2017-03-11 20:27:40 +01:00
faction . setPermittedRelations ( MPerm . getPermBuild ( ) , PermissibleId . ALL ) ;
faction . setPermittedRelations ( MPerm . getPermDoor ( ) , PermissibleId . ALL ) ;
faction . setPermittedRelations ( MPerm . getPermContainer ( ) , PermissibleId . ALL ) ;
faction . setPermittedRelations ( MPerm . getPermButton ( ) , PermissibleId . ALL ) ;
faction . setPermittedRelations ( MPerm . getPermLever ( ) , PermissibleId . ALL ) ;
faction . setPermittedRelations ( MPerm . getPermDeposit ( ) , PermissibleId . LEADER , PermissibleId . OFFICER ) ; // Wilderness deposit should be limited as an anti spam meassure.
2013-04-24 13:50:02 +02:00
return faction ;
}
public Faction getSafezone ( )
{
2014-10-01 22:00:08 +02:00
String id = Factions . ID_SAFEZONE ;
2013-04-24 13:50:02 +02:00
Faction faction = this . get ( id ) ;
if ( faction ! = null ) return faction ;
2013-04-24 16:40:35 +02:00
faction = this . create ( id ) ;
2013-04-24 13:50:02 +02:00
2014-11-13 11:41:21 +01:00
faction . setName ( Factions . NAME_SAFEZONE_DEFAULT ) ;
2013-04-24 13:50:02 +02:00
faction . setDescription ( " Free from PVP and monsters " ) ;
2014-10-02 11:45:06 +02:00
2014-10-07 12:30:44 +02:00
faction . setFlag ( MFlag . getFlagOpen ( ) , false ) ;
faction . setFlag ( MFlag . getFlagPermanent ( ) , true ) ;
faction . setFlag ( MFlag . getFlagPeaceful ( ) , true ) ;
faction . setFlag ( MFlag . getFlagInfpower ( ) , true ) ;
faction . setFlag ( MFlag . getFlagPowerloss ( ) , false ) ;
faction . setFlag ( MFlag . getFlagPvp ( ) , false ) ;
faction . setFlag ( MFlag . getFlagFriendlyire ( ) , false ) ;
faction . setFlag ( MFlag . getFlagMonsters ( ) , false ) ;
2015-09-08 05:06:57 +02:00
faction . setFlag ( MFlag . getFlagAnimals ( ) , true ) ;
2014-10-07 12:30:44 +02:00
faction . setFlag ( MFlag . getFlagExplosions ( ) , false ) ;
faction . setFlag ( MFlag . getFlagOfflineexplosions ( ) , false ) ;
faction . setFlag ( MFlag . getFlagFirespread ( ) , false ) ;
faction . setFlag ( MFlag . getFlagEndergrief ( ) , false ) ;
2015-12-11 13:34:36 +01:00
faction . setFlag ( MFlag . getFlagZombiegrief ( ) , false ) ;
2013-04-24 13:50:02 +02:00
2017-03-11 20:27:40 +01:00
faction . setPermittedRelations ( MPerm . getPermDoor ( ) , PermissibleId . ALL ) ;
faction . setPermittedRelations ( MPerm . getPermContainer ( ) , PermissibleId . ALL ) ;
faction . setPermittedRelations ( MPerm . getPermButton ( ) , PermissibleId . ALL ) ;
faction . setPermittedRelations ( MPerm . getPermLever ( ) , PermissibleId . ALL ) ;
faction . setPermittedRelations ( MPerm . getPermTerritory ( ) , PermissibleId . LEADER , PermissibleId . OFFICER , PermissibleId . MEMBER ) ;
2013-04-24 13:50:02 +02:00
return faction ;
}
public Faction getWarzone ( )
{
2014-10-01 22:00:08 +02:00
String id = Factions . ID_WARZONE ;
2013-04-24 13:50:02 +02:00
Faction faction = this . get ( id ) ;
if ( faction ! = null ) return faction ;
2013-04-24 16:40:35 +02:00
faction = this . create ( id ) ;
2013-04-24 13:50:02 +02:00
2014-11-13 11:41:21 +01:00
faction . setName ( Factions . NAME_WARZONE_DEFAULT ) ;
2013-04-24 13:50:02 +02:00
faction . setDescription ( " Not the safest place to be " ) ;
2014-10-02 11:45:06 +02:00
2014-10-07 12:30:44 +02:00
faction . setFlag ( MFlag . getFlagOpen ( ) , false ) ;
faction . setFlag ( MFlag . getFlagPermanent ( ) , true ) ;
faction . setFlag ( MFlag . getFlagPeaceful ( ) , true ) ;
faction . setFlag ( MFlag . getFlagInfpower ( ) , true ) ;
faction . setFlag ( MFlag . getFlagPowerloss ( ) , true ) ;
faction . setFlag ( MFlag . getFlagPvp ( ) , true ) ;
faction . setFlag ( MFlag . getFlagFriendlyire ( ) , true ) ;
faction . setFlag ( MFlag . getFlagMonsters ( ) , true ) ;
2015-09-08 05:06:57 +02:00
faction . setFlag ( MFlag . getFlagAnimals ( ) , true ) ;
2014-10-07 12:30:44 +02:00
faction . setFlag ( MFlag . getFlagExplosions ( ) , true ) ;
faction . setFlag ( MFlag . getFlagOfflineexplosions ( ) , true ) ;
faction . setFlag ( MFlag . getFlagFirespread ( ) , true ) ;
faction . setFlag ( MFlag . getFlagEndergrief ( ) , true ) ;
2015-12-11 13:34:36 +01:00
faction . setFlag ( MFlag . getFlagZombiegrief ( ) , true ) ;
2013-04-24 13:50:02 +02:00
2017-03-11 20:27:40 +01:00
faction . setPermittedRelations ( MPerm . getPermDoor ( ) , PermissibleId . ALL ) ;
faction . setPermittedRelations ( MPerm . getPermContainer ( ) , PermissibleId . ALL ) ;
faction . setPermittedRelations ( MPerm . getPermButton ( ) , PermissibleId . ALL ) ;
faction . setPermittedRelations ( MPerm . getPermLever ( ) , PermissibleId . ALL ) ;
faction . setPermittedRelations ( MPerm . getPermTerritory ( ) , PermissibleId . LEADER , PermissibleId . OFFICER , PermissibleId . MEMBER ) ;
2013-04-24 13:50:02 +02:00
return faction ;
2013-04-12 09:47:43 +02:00
}
2013-04-24 08:39:26 +02:00
// -------------------------------------------- //
// LAND REWARD
// -------------------------------------------- //
public void econLandRewardRoutine ( )
{
2017-03-12 17:55:01 +01:00
// If econ is enabled ...
2014-09-17 13:17:33 +02:00
if ( ! Econ . isEnabled ( ) ) return ;
2013-04-24 08:39:26 +02:00
2017-03-12 17:55:01 +01:00
// ... and the land reward is non zero ...
2014-09-17 13:17:33 +02:00
double econLandReward = MConf . get ( ) . econLandReward ;
2013-04-24 08:39:26 +02:00
if ( econLandReward = = 0 . 0 ) return ;
2017-03-12 17:55:01 +01:00
// ... log initiation ...
2013-04-24 08:39:26 +02:00
Factions . get ( ) . log ( " Running econLandRewardRoutine... " ) ;
2017-03-12 17:55:01 +01:00
MFlag flagPeaceful = MFlag . getFlagPeaceful ( ) ;
// ... and for each faction ...
2013-04-24 08:39:26 +02:00
for ( Faction faction : this . getAll ( ) )
{
2017-03-12 17:55:01 +01:00
// ... get the land count ...
2013-04-24 08:39:26 +02:00
int landCount = faction . getLandCount ( ) ;
2017-03-12 17:55:01 +01:00
// ... and if the faction isn't peaceful and has land ...
if ( faction . getFlag ( flagPeaceful ) | | landCount > 0 ) continue ;
// ... get the faction's members ...
List < MPlayer > players = faction . getMPlayers ( ) ;
// ... calculate the reward ...
int playerCount = players . size ( ) ;
double reward = econLandReward * landCount / playerCount ;
// ... and grant the reward.
String description = String . format ( " own %s faction land divided among %s members " , landCount , playerCount ) ;
for ( MPlayer player : players )
2013-04-24 08:39:26 +02:00
{
2017-03-12 17:55:01 +01:00
Econ . modifyMoney ( player , reward , description ) ;
2013-04-24 08:39:26 +02:00
}
2017-03-12 17:55:01 +01:00
2013-04-24 08:39:26 +02:00
}
}
2013-04-10 09:40:39 +02:00
// -------------------------------------------- //
2013-04-24 19:01:17 +02:00
// FACTION NAME
2013-04-10 09:40:39 +02:00
// -------------------------------------------- //
2011-10-08 22:03:44 +02:00
2013-04-24 19:01:17 +02:00
public ArrayList < String > validateName ( String str )
2011-10-08 22:03:44 +02:00
{
2017-03-12 17:55:01 +01:00
// Create
2017-03-24 14:03:29 +01:00
ArrayList < String > errors = new ArrayList < > ( ) ;
2011-10-08 22:03:44 +02:00
2017-03-12 17:55:01 +01:00
// Fill
// Check minimum length
2017-03-11 20:27:40 +01:00
if ( MiscUtil . getComparisonString ( str ) . length ( ) < MConf . get ( ) . nameLengthFactionMin )
2011-10-08 22:03:44 +02:00
{
2017-03-11 20:27:40 +01:00
errors . add ( Txt . parse ( " <i>The faction name can't be shorter than <h>%s<i> chars. " , MConf . get ( ) . nameLengthFactionMin ) ) ;
2011-10-08 22:03:44 +02:00
}
2017-03-12 17:55:01 +01:00
// Check maximum length
2017-03-11 20:27:40 +01:00
if ( str . length ( ) > MConf . get ( ) . nameLengthFactionMax )
2011-10-08 22:03:44 +02:00
{
2017-03-11 20:27:40 +01:00
errors . add ( Txt . parse ( " <i>The faction name can't be longer than <h>%s<i> chars. " , MConf . get ( ) . nameLengthFactionMax ) ) ;
2011-10-08 22:03:44 +02:00
}
2017-03-12 17:55:01 +01:00
// Check characters used
2011-10-08 22:03:44 +02:00
for ( char c : str . toCharArray ( ) )
{
2017-03-12 17:55:01 +01:00
if ( ! MiscUtil . substanceChars . contains ( String . valueOf ( c ) ) )
2011-10-08 22:03:44 +02:00
{
2013-04-24 19:01:17 +02:00
errors . add ( Txt . parse ( " <i>Faction name must be alphanumeric. \" <h>%s<i> \" is not allowed. " , c ) ) ;
2011-10-08 22:03:44 +02:00
}
}
2017-03-12 17:55:01 +01:00
// Return
2011-10-08 22:03:44 +02:00
return errors ;
}
2016-03-04 14:10:54 +01:00
@Override
2014-10-13 08:11:00 +02:00
public Faction getByName ( String name )
2011-10-08 22:03:44 +02:00
{
2014-10-13 08:11:00 +02:00
String compStr = MiscUtil . getComparisonString ( name ) ;
2013-04-12 09:47:43 +02:00
for ( Faction faction : this . getAll ( ) )
2011-10-08 22:03:44 +02:00
{
2013-04-24 19:01:17 +02:00
if ( faction . getComparisonName ( ) . equals ( compStr ) )
2011-10-08 22:03:44 +02:00
{
return faction ;
}
}
return null ;
}
2016-02-25 09:48:02 +01:00
2014-11-14 08:41:58 +01:00
// -------------------------------------------- //
2016-02-25 09:48:02 +01:00
// PREDICATE LOGIC
2014-11-14 08:41:58 +01:00
// -------------------------------------------- //
2016-02-25 09:48:02 +01:00
public Map < Rel , List < String > > getRelationNames ( Faction faction , Set < Rel > rels )
2014-09-17 13:17:33 +02:00
{
2016-02-25 09:48:02 +01:00
// Create
2017-03-24 14:03:29 +01:00
Map < Rel , List < String > > ret = new LinkedHashMap < > ( ) ;
2017-03-12 17:55:01 +01:00
MFlag flagPeaceful = MFlag . getFlagPeaceful ( ) ;
boolean peaceful = faction . getFlag ( flagPeaceful ) ;
2016-02-25 09:48:02 +01:00
for ( Rel rel : rels )
2014-09-17 13:17:33 +02:00
{
2016-02-25 09:48:02 +01:00
ret . put ( rel , new ArrayList < String > ( ) ) ;
2014-09-17 13:17:33 +02:00
}
2014-11-14 08:41:58 +01:00
2016-02-25 09:48:02 +01:00
// Fill
for ( Faction fac : FactionColl . get ( ) . getAll ( ) )
{
2017-03-12 17:55:01 +01:00
if ( fac . getFlag ( flagPeaceful ) ) continue ;
2016-02-25 09:48:02 +01:00
Rel rel = fac . getRelationTo ( faction ) ;
List < String > names = ret . get ( rel ) ;
if ( names = = null ) continue ;
String name = fac . describeTo ( faction , true ) ;
names . add ( name ) ;
}
2017-03-12 17:55:01 +01:00
// Replace TRUCE if peaceful
if ( ! peaceful ) return ret ;
2016-02-25 09:48:02 +01:00
List < String > names = ret . get ( Rel . TRUCE ) ;
if ( names = = null ) return ret ;
ret . put ( Rel . TRUCE , Collections . singletonList ( MConf . get ( ) . colorTruce . toString ( ) + Txt . parse ( " <italic>*EVERYONE* " ) ) ) ;
// Return
return ret ;
}
2012-11-28 06:51:37 +01:00
2011-10-08 22:03:44 +02:00
}