2011-10-08 22:03:44 +02:00
package com.massivecraft.factions ;
import java.lang.reflect.Modifier ;
2011-10-10 14:21:22 +02:00
import java.lang.reflect.Type ;
2012-02-02 22:20:43 +01:00
import java.util.logging.Level ;
2011-10-08 22:03:44 +02:00
import java.util.HashSet ;
2011-10-10 14:21:22 +02:00
import java.util.Map ;
2011-10-08 22:03:44 +02:00
import java.util.Set ;
import org.bukkit.block.Block ;
import org.bukkit.Location ;
import org.bukkit.Material ;
2012-01-19 05:42:58 +01:00
import org.bukkit.command.CommandSender ;
2011-10-08 22:03:44 +02:00
import org.bukkit.entity.Player ;
import org.bukkit.event.player.PlayerChatEvent ;
import org.bukkit.plugin.Plugin ;
2011-10-25 21:18:08 +02:00
import com.massivecraft.factions.adapters.FFlagTypeAdapter ;
import com.massivecraft.factions.adapters.FLocToStringSetTypeAdapter ;
import com.massivecraft.factions.adapters.FPermTypeAdapter ;
import com.massivecraft.factions.adapters.LocationTypeAdapter ;
import com.massivecraft.factions.adapters.RelTypeAdapter ;
2011-10-09 21:57:43 +02:00
import com.massivecraft.factions.cmd.* ;
2012-02-03 02:31:33 +01:00
import com.massivecraft.factions.integration.capi.CapiFeatures ;
2011-10-08 22:03:44 +02:00
import com.massivecraft.factions.integration.Econ ;
2012-02-03 02:31:33 +01:00
import com.massivecraft.factions.integration.EssentialsFeatures ;
import com.massivecraft.factions.integration.EssentialsOldVersionFeatures ;
2012-01-15 19:41:33 +01:00
import com.massivecraft.factions.integration.LWCFeatures ;
2011-10-08 22:03:44 +02:00
import com.massivecraft.factions.integration.SpoutFeatures ;
2012-02-02 22:20:43 +01:00
//import com.massivecraft.factions.integration.Worldguard;
2011-10-08 22:03:44 +02:00
import com.massivecraft.factions.listeners.FactionsBlockListener ;
import com.massivecraft.factions.listeners.FactionsChatEarlyListener ;
import com.massivecraft.factions.listeners.FactionsEntityListener ;
import com.massivecraft.factions.listeners.FactionsPlayerListener ;
2011-10-12 17:25:01 +02:00
import com.massivecraft.factions.listeners.FactionsServerListener ;
2011-10-08 22:03:44 +02:00
import com.massivecraft.factions.struct.ChatMode ;
2011-10-25 21:18:08 +02:00
import com.massivecraft.factions.struct.FFlag ;
import com.massivecraft.factions.struct.FPerm ;
2011-10-23 17:55:53 +02:00
import com.massivecraft.factions.struct.Rel ;
2011-10-08 22:03:44 +02:00
import com.massivecraft.factions.zcore.MPlugin ;
2012-01-15 19:41:33 +01:00
import com.griefcraft.lwc.LWCPlugin ;
2011-10-08 22:03:44 +02:00
import com.earth2me.essentials.chat.EssentialsChat ;
import com.google.gson.GsonBuilder ;
2011-10-10 14:21:22 +02:00
import com.google.gson.reflect.TypeToken ;
2011-10-08 22:03:44 +02:00
2012-02-02 22:20:43 +01:00
2011-10-08 22:03:44 +02:00
public class P extends MPlugin
{
// Our single plugin instance
public static P p ;
// Listeners
public final FactionsPlayerListener playerListener ;
public final FactionsChatEarlyListener chatEarlyListener ;
public final FactionsEntityListener entityListener ;
public final FactionsBlockListener blockListener ;
2011-10-12 17:25:01 +02:00
public final FactionsServerListener serverListener ;
2011-10-08 22:03:44 +02:00
2011-10-09 21:57:43 +02:00
// Persistance related
2011-10-10 01:21:05 +02:00
private boolean locked = false ;
2011-10-09 21:57:43 +02:00
public boolean getLocked ( ) { return this . locked ; }
public void setLocked ( boolean val ) { this . locked = val ; this . setAutoSave ( val ) ; }
// Commands
2011-10-09 20:10:19 +02:00
public FCmdRoot cmdBase ;
2011-10-13 14:41:07 +02:00
public CmdAutoHelp cmdAutoHelp ;
2011-10-09 14:53:38 +02:00
2011-10-08 22:03:44 +02:00
public P ( )
{
p = this ;
this . playerListener = new FactionsPlayerListener ( this ) ;
this . chatEarlyListener = new FactionsChatEarlyListener ( this ) ;
this . entityListener = new FactionsEntityListener ( this ) ;
this . blockListener = new FactionsBlockListener ( this ) ;
2011-10-12 17:25:01 +02:00
this . serverListener = new FactionsServerListener ( this ) ;
2011-10-08 22:03:44 +02:00
}
2011-10-12 17:25:01 +02:00
2012-01-31 17:52:34 +01:00
2011-10-08 22:03:44 +02:00
private static EssentialsChat essChat ;
@Override
public void onEnable ( )
{
if ( ! preEnable ( ) ) return ;
// Load Conf from disk
Conf . load ( ) ;
FPlayers . i . loadFromDisc ( ) ;
Factions . i . loadFromDisc ( ) ;
Board . load ( ) ;
2011-10-09 14:53:38 +02:00
// Add Base Commands
2011-10-09 20:10:19 +02:00
this . cmdBase = new FCmdRoot ( ) ;
2011-10-13 14:41:07 +02:00
this . cmdAutoHelp = new CmdAutoHelp ( ) ;
2011-10-09 14:53:38 +02:00
this . getBaseCommands ( ) . add ( cmdBase ) ;
2011-10-08 22:03:44 +02:00
//setupPermissions();
integrateEssentialsChat ( ) ;
setupSpout ( this ) ;
2012-01-30 06:11:39 +01:00
Econ . doSetup ( ) ;
Econ . oldMoneyDoTransfer ( ) ;
2011-10-14 15:03:23 +02:00
CapiFeatures . setup ( ) ;
2012-01-15 19:41:33 +01:00
setupLWC ( ) ;
2011-10-08 22:03:44 +02:00
if ( Conf . worldGuardChecking )
{
2012-02-02 22:20:43 +01:00
this . log ( Level . WARNING , " Our WorldGuard integration is broken with current versions of WorldGuard, so it is disabled. If you are a plugin dev and want to try your hand at fixing it, be our guest. " ) ;
Conf . worldGuardChecking = false ;
// Worldguard.init(this);
2011-10-08 22:03:44 +02:00
}
2012-01-28 11:37:56 +01:00
// Register Event Handlers
getServer ( ) . getPluginManager ( ) . registerEvents ( playerListener , this ) ;
getServer ( ) . getPluginManager ( ) . registerEvents ( chatEarlyListener , this ) ;
getServer ( ) . getPluginManager ( ) . registerEvents ( entityListener , this ) ;
getServer ( ) . getPluginManager ( ) . registerEvents ( blockListener , this ) ;
getServer ( ) . getPluginManager ( ) . registerEvents ( serverListener , this ) ;
2011-10-08 22:03:44 +02:00
postEnable ( ) ;
}
@Override
public GsonBuilder getGsonBuilder ( )
{
2011-10-10 14:21:22 +02:00
Type mapFLocToStringSetType = new TypeToken < Map < FLocation , Set < String > > > ( ) { } . getType ( ) ;
2011-10-08 22:03:44 +02:00
return new GsonBuilder ( )
. setPrettyPrinting ( )
. disableHtmlEscaping ( )
2011-10-10 14:21:22 +02:00
. excludeFieldsWithModifiers ( Modifier . TRANSIENT , Modifier . VOLATILE )
2011-10-25 21:18:08 +02:00
. registerTypeAdapter ( Location . class , new LocationTypeAdapter ( ) )
. registerTypeAdapter ( mapFLocToStringSetType , new FLocToStringSetTypeAdapter ( ) )
. registerTypeAdapter ( Rel . class , new RelTypeAdapter ( ) )
. registerTypeAdapter ( FPerm . class , new FPermTypeAdapter ( ) )
. registerTypeAdapter ( FFlag . class , new FFlagTypeAdapter ( ) ) ;
2011-10-08 22:03:44 +02:00
}
@Override
public void onDisable ( )
{
2011-10-09 18:35:39 +02:00
Board . save ( ) ;
Conf . save ( ) ;
2011-10-08 22:03:44 +02:00
unhookEssentialsChat ( ) ;
super . onDisable ( ) ;
}
2011-10-09 18:35:39 +02:00
@Override
2011-10-09 21:57:43 +02:00
public void postAutoSave ( )
2011-10-09 18:35:39 +02:00
{
Board . save ( ) ;
Conf . save ( ) ;
}
2011-10-08 22:03:44 +02:00
2012-01-19 05:42:58 +01:00
@Override
public boolean handleCommand ( CommandSender sender , String commandString , boolean testOnly )
{
if ( sender instanceof Player & & FactionsPlayerListener . preventCommand ( commandString , ( Player ) sender ) ) return true ;
return super . handleCommand ( sender , commandString , testOnly ) ;
}
2011-10-08 22:03:44 +02:00
// -------------------------------------------- //
// Integration with other plugins
// -------------------------------------------- //
private void setupSpout ( P factions )
{
Plugin test = factions . getServer ( ) . getPluginManager ( ) . getPlugin ( " Spout " ) ;
if ( test ! = null & & test . isEnabled ( ) )
{
SpoutFeatures . setAvailable ( true , test . getDescription ( ) . getFullName ( ) ) ;
}
}
private void integrateEssentialsChat ( )
{
if ( essChat ! = null ) return ;
Plugin test = this . getServer ( ) . getPluginManager ( ) . getPlugin ( " EssentialsChat " ) ;
if ( test ! = null & & test . isEnabled ( ) )
{
essChat = ( EssentialsChat ) test ;
2012-02-03 02:31:33 +01:00
// try newer Essentials 3.x integration method
try
{
Class . forName ( " com.earth2me.essentials.chat.EssentialsLocalChatEvent " ) ;
EssentialsFeatures . integrateChat ( essChat ) ;
}
catch ( ClassNotFoundException ex )
{
// no? try older Essentials 2.x integration method
try
{
EssentialsOldVersionFeatures . integrateChat ( essChat ) ;
}
catch ( NoClassDefFoundError ex2 )
{
// no known method for hooking into Essentials chat stuff
}
}
2011-10-08 22:03:44 +02:00
}
}
private void unhookEssentialsChat ( )
{
2011-10-09 20:10:19 +02:00
if ( essChat ! = null )
{
2012-02-03 02:31:33 +01:00
try
{
EssentialsOldVersionFeatures . unhookChat ( ) ;
}
catch ( NoClassDefFoundError ex )
{
}
2011-10-08 22:03:44 +02:00
}
}
2012-01-15 19:41:33 +01:00
private void setupLWC ( )
{
Plugin test = this . getServer ( ) . getPluginManager ( ) . getPlugin ( " LWC " ) ;
if ( test ! = null & & test . isEnabled ( ) )
LWCFeatures . integrateLWC ( ( LWCPlugin ) test ) ;
}
2011-10-08 22:03:44 +02:00
// -------------------------------------------- //
// Functions for other plugins to hook into
// -------------------------------------------- //
// This value will be updated whenever new hooks are added
public int hookSupportVersion ( )
{
return 3 ;
}
// If another plugin is handling insertion of chat tags, this should be used to notify Factions
public void handleFactionTagExternally ( boolean notByFactions )
{
Conf . chatTagHandledByAnotherPlugin = notByFactions ;
}
// Simply put, should this chat event be left for Factions to handle? For now, that means players with Faction Chat
// enabled or use of the Factions f command without a slash; combination of isPlayerFactionChatting() and isFactionsCommand()
2011-10-09 20:10:19 +02:00
2011-10-08 22:03:44 +02:00
public boolean shouldLetFactionsHandleThisChat ( PlayerChatEvent event )
{
if ( event = = null ) return false ;
return ( isPlayerFactionChatting ( event . getPlayer ( ) ) | | isFactionsCommand ( event . getMessage ( ) ) ) ;
}
// Does player have Faction Chat enabled? If so, chat plugins should preferably not do channels,
// local chat, or anything else which targets individual recipients, so Faction Chat can be done
public boolean isPlayerFactionChatting ( Player player )
{
if ( player = = null ) return false ;
FPlayer me = FPlayers . i . get ( player ) ;
if ( me = = null ) return false ;
return me . getChatMode ( ) . isAtLeast ( ChatMode . ALLIANCE ) ;
}
// Is this chat message actually a Factions command, and thus should be left alone by other plugins?
public boolean isFactionsCommand ( String check )
{
if ( check = = null | | check . isEmpty ( ) ) return false ;
2011-10-09 20:10:19 +02:00
return this . handleCommand ( null , check , true ) ;
2011-10-08 22:03:44 +02:00
}
// Get a player's faction tag (faction name), mainly for usage by chat plugins for local/channel chat
public String getPlayerFactionTag ( Player player )
{
return getPlayerFactionTagRelation ( player , null ) ;
}
// Same as above, but with relation (enemy/neutral/ally) coloring potentially added to the tag
public String getPlayerFactionTagRelation ( Player speaker , Player listener )
{
String tag = " ~ " ;
if ( speaker = = null )
return tag ;
FPlayer me = FPlayers . i . get ( speaker ) ;
if ( me = = null )
return tag ;
// if listener isn't set, or config option is disabled, give back uncolored tag
if ( listener = = null | | ! Conf . chatTagRelationColored ) {
tag = me . getChatTag ( ) . trim ( ) ;
} else {
FPlayer you = FPlayers . i . get ( listener ) ;
if ( you = = null )
tag = me . getChatTag ( ) . trim ( ) ;
else // everything checks out, give the colored tag
tag = me . getChatTag ( you ) . trim ( ) ;
}
if ( tag . isEmpty ( ) )
tag = " ~ " ;
return tag ;
}
// Get a player's title within their faction, mainly for usage by chat plugins for local/channel chat
public String getPlayerTitle ( Player player )
{
if ( player = = null )
return " " ;
FPlayer me = FPlayers . i . get ( player ) ;
if ( me = = null )
return " " ;
return me . getTitle ( ) . trim ( ) ;
}
// Get a list of all faction tags (names)
public Set < String > getFactionTags ( )
{
Set < String > tags = new HashSet < String > ( ) ;
for ( Faction faction : Factions . i . get ( ) )
{
tags . add ( faction . getTag ( ) ) ;
}
return tags ;
}
// Get a list of all players in the specified faction
public Set < String > getPlayersInFaction ( String factionTag )
{
Set < String > players = new HashSet < String > ( ) ;
2011-10-22 14:39:01 +02:00
Faction faction = Factions . i . getByTag ( factionTag ) ;
2011-10-08 22:03:44 +02:00
if ( faction ! = null )
{
for ( FPlayer fplayer : faction . getFPlayers ( ) )
{
players . add ( fplayer . getName ( ) ) ;
}
}
return players ;
}
// Get a list of all online players in the specified faction
public Set < String > getOnlinePlayersInFaction ( String factionTag )
{
Set < String > players = new HashSet < String > ( ) ;
2011-10-22 14:39:01 +02:00
Faction faction = Factions . i . getByTag ( factionTag ) ;
2011-10-08 22:03:44 +02:00
if ( faction ! = null )
{
for ( FPlayer fplayer : faction . getFPlayersWhereOnline ( true ) )
{
players . add ( fplayer . getName ( ) ) ;
}
}
return players ;
}
// check if player is allowed to build/destroy in a particular location
public boolean isPlayerAllowedToBuildHere ( Player player , Location location )
{
2011-10-24 01:37:51 +02:00
return FactionsBlockListener . playerCanBuildDestroyBlock ( player , location . getBlock ( ) , " " , true ) ;
2011-10-08 22:03:44 +02:00
}
// check if player is allowed to interact with the specified block (doors/chests/whatever)
public boolean isPlayerAllowedToInteractWith ( Player player , Block block )
{
return FactionsPlayerListener . canPlayerUseBlock ( player , block , true ) ;
}
// check if player is allowed to use a specified item (flint&steel, buckets, etc) in a particular location
public boolean isPlayerAllowedToUseThisHere ( Player player , Location location , Material material )
{
return FactionsPlayerListener . playerCanUseItemHere ( player , location , material , true ) ;
}
}