2011-10-08 22:03:44 +02:00
package com.massivecraft.factions ;
2018-12-27 02:22:06 +01:00
import ch.njol.skript.Skript ;
import ch.njol.skript.SkriptAddon ;
2014-10-25 20:22:41 +02:00
import com.google.gson.GsonBuilder ;
import com.google.gson.reflect.TypeToken ;
2012-01-08 00:27:03 +01:00
import com.massivecraft.factions.cmd.CmdAutoHelp ;
2019-09-14 21:13:01 +02:00
import com.massivecraft.factions.cmd.CommandContext ;
2012-01-08 00:27:03 +01:00
import com.massivecraft.factions.cmd.FCmdRoot ;
2019-09-14 21:13:01 +02:00
import com.massivecraft.factions.cmd.FCommand ;
2019-09-08 07:25:19 +02:00
import com.massivecraft.factions.cmd.check.CheckTask ;
import com.massivecraft.factions.cmd.check.WeeWooTask ;
2019-09-24 12:39:43 +02:00
import com.massivecraft.factions.cmd.chest.AntiChestListener ;
2019-09-29 10:39:30 +02:00
import com.massivecraft.factions.discord.DiscordListener ;
import com.massivecraft.factions.discord.FactionChatHandler ;
2014-04-05 22:42:01 +02:00
import com.massivecraft.factions.integration.Econ ;
import com.massivecraft.factions.integration.Worldguard ;
2014-12-05 06:04:00 +01:00
import com.massivecraft.factions.integration.dynmap.EngineDynmap ;
2014-04-04 20:55:21 +02:00
import com.massivecraft.factions.listeners.* ;
2019-08-07 20:35:19 +02:00
import com.massivecraft.factions.missions.MissionHandler ;
2019-08-04 22:23:40 +02:00
import com.massivecraft.factions.shop.ShopConfig ;
2011-10-08 22:03:44 +02:00
import com.massivecraft.factions.struct.ChatMode ;
2019-09-14 21:13:01 +02:00
import com.massivecraft.factions.struct.Relation ;
import com.massivecraft.factions.struct.Role ;
2014-10-25 20:22:41 +02:00
import com.massivecraft.factions.util.* ;
2018-04-03 16:38:11 +02:00
import com.massivecraft.factions.util.Particles.ReflectionUtils ;
2018-12-09 03:13:18 +01:00
import com.massivecraft.factions.zcore.CommandVisibility ;
2011-10-08 22:03:44 +02:00
import com.massivecraft.factions.zcore.MPlugin ;
2018-01-05 00:44:39 +01:00
import com.massivecraft.factions.zcore.fperms.Access ;
2018-02-06 04:46:43 +01:00
import com.massivecraft.factions.zcore.fperms.Permissable ;
2018-02-03 21:49:04 +01:00
import com.massivecraft.factions.zcore.fperms.PermissableAction ;
2019-05-14 15:27:57 +02:00
import com.massivecraft.factions.zcore.fupgrades.* ;
2012-03-11 17:41:56 +01:00
import com.massivecraft.factions.zcore.util.TextUtil ;
2019-09-14 21:13:01 +02:00
import me.lucko.commodore.CommodoreProvider ;
2018-03-26 23:43:15 +02:00
import net.milkbowl.vault.economy.Economy ;
2014-11-13 20:49:13 +01:00
import net.milkbowl.vault.permission.Permission ;
2018-03-26 23:43:15 +02:00
import org.bukkit.* ;
2014-04-04 20:55:21 +02:00
import org.bukkit.command.Command ;
import org.bukkit.command.CommandSender ;
2018-03-26 23:43:15 +02:00
import org.bukkit.entity.ArmorStand ;
import org.bukkit.entity.EntityType ;
2014-04-04 20:55:21 +02:00
import org.bukkit.entity.Player ;
2018-12-09 03:13:18 +01:00
import org.bukkit.event.Listener ;
2014-04-04 20:55:21 +02:00
import org.bukkit.event.player.AsyncPlayerChatEvent ;
2018-09-09 19:40:45 +02:00
import org.bukkit.inventory.Inventory ;
2018-03-26 23:43:15 +02:00
import org.bukkit.inventory.ItemStack ;
import org.bukkit.inventory.meta.ItemMeta ;
2016-05-31 01:22:45 +02:00
import org.bukkit.plugin.Plugin ;
2014-11-13 20:49:13 +01:00
import org.bukkit.plugin.RegisteredServiceProvider ;
2014-04-04 20:55:21 +02:00
2018-11-12 03:05:57 +01:00
import java.io.* ;
2014-04-04 20:55:21 +02:00
import java.lang.reflect.Modifier ;
import java.lang.reflect.Type ;
2018-03-26 23:43:15 +02:00
import java.util.* ;
2019-05-15 09:10:10 +02:00
import java.util.concurrent.atomic.AtomicReference ;
2014-04-04 20:55:21 +02:00
import java.util.logging.Level ;
2018-12-09 03:13:18 +01:00
import java.util.stream.Collectors ;
2011-10-08 22:03:44 +02:00
2018-03-26 23:43:15 +02:00
2019-09-14 21:13:01 +02:00
public class FactionsPlugin extends MPlugin {
2014-08-05 17:17:27 +02:00
2019-09-15 11:19:06 +02:00
// Our single plugin instance.
// Single 4 life.
public static FactionsPlugin instance ;
public static Permission perms = null ;
// This plugin sets the boolean true when fully enabled.
// Plugins can check this boolean while hooking in have
// a green light to use the api.
public static boolean startupFinished = false ;
public static Economy econ = null ;
public boolean PlaceholderApi ;
// Commands
public FCmdRoot cmdBase ;
public CmdAutoHelp cmdAutoHelp ;
public boolean mc17 = false ;
public boolean mc18 = false ;
public boolean mc112 = false ;
public boolean mc113 = false ;
public boolean mc114 = false ;
public boolean useNonPacketParticles = false ;
public boolean factionsFlight = false ;
SkriptAddon skriptAddon ;
private FactionsPlayerListener factionsPlayerListener ;
private boolean locked = false ;
private boolean spam = false ;
private Integer AutoLeaveTask = null ;
private boolean hookedPlayervaults ;
private ClipPlaceholderAPIManager clipPlaceholderAPIManager ;
private boolean mvdwPlaceholderAPIManager = false ;
private Listener [ ] eventsListener ;
2019-09-24 12:39:43 +02:00
public List < String > itemList = getConfig ( ) . getStringList ( " fchest.Items-Not-Allowed " ) ;
2019-11-21 15:10:04 +01:00
private Worldguard wg ;
2019-09-15 11:19:06 +02:00
public FactionsPlugin ( ) {
instance = this ;
}
public static FactionsPlugin getInstance ( ) {
return instance ;
}
public boolean getLocked ( ) {
return this . locked ;
}
public void setLocked ( boolean val ) {
this . locked = val ;
this . setAutoSave ( val ) ;
}
public boolean getSpam ( ) {
return this . spam ;
}
public void setSpam ( boolean val ) {
this . spam = val ;
this . setAutoSave ( val ) ;
}
public void playSoundForAll ( String sound ) {
for ( Player pl : Bukkit . getOnlinePlayers ( ) ) {
playSound ( pl , sound ) ;
}
}
public void playSoundForAll ( List < String > sounds ) {
for ( Player pl : Bukkit . getOnlinePlayers ( ) ) {
playSound ( pl , sounds ) ;
}
}
public void playSound ( Player p , List < String > sounds ) {
for ( String sound : sounds ) {
playSound ( p , sound ) ;
}
}
public void playSound ( Player p , String sound ) {
float pitch = Float . valueOf ( sound . split ( " : " ) [ 1 ] ) ;
sound = sound . split ( " : " ) [ 0 ] ;
p . playSound ( p . getLocation ( ) , Sound . valueOf ( sound ) , pitch , 5 . 0F ) ;
}
@Override
public void onEnable ( ) {
log ( " ==== Setup ==== " ) ;
int version = Integer . parseInt ( ReflectionUtils . PackageType . getServerVersion ( ) . split ( " _ " ) [ 1 ] ) ;
switch ( version ) {
case 7 :
2019-10-09 23:53:32 +02:00
FactionsPlugin . instance . log ( " Minecraft Version 1.7 found, disabling banners, itemflags inside GUIs, corners, and Titles. " ) ;
2019-09-15 11:19:06 +02:00
mc17 = true ;
break ;
case 8 :
FactionsPlugin . instance . log ( " Minecraft Version 1.8 found, Title Fadeouttime etc will not be configurable. " ) ;
mc18 = true ;
break ;
case 12 :
mc112 = true ;
break ;
case 13 :
FactionsPlugin . instance . log ( " Minecraft Version 1.13 found, New Items will be used. " ) ;
mc113 = true ;
break ;
case 14 :
FactionsPlugin . instance . log ( " Minecraft Version 1.14 found. " ) ;
mc114 = true ;
break ;
}
migrateFPlayerLeaders ( ) ;
log ( " ==== End Setup ==== " ) ;
if ( ! preEnable ( ) ) {
return ;
}
this . loadSuccessful = false ;
2019-10-12 20:34:36 +02:00
if ( ! new File ( this . getDataFolder ( ) + " /config.yml " ) . exists ( ) ) {
this . saveResource ( " config.yml " , false ) ;
this . reloadConfig ( ) ;
}
2019-10-09 00:48:46 +02:00
//Attempt to generate a permission list
PermissionList . generateFile ( ) ;
2019-10-17 20:01:44 +02:00
// Load Conf from disk
Conf . load ( ) ;
2019-10-17 20:00:00 +02:00
//Dependency checks
2019-11-06 00:15:42 +01:00
if ( Conf . dependencyCheck & & ( ! Bukkit . getPluginManager ( ) . isPluginEnabled ( " Vault " ) & & ! Bukkit . getPluginManager ( ) . isPluginEnabled ( " Essentials " ) ) ) {
2019-10-17 20:00:00 +02:00
divider ( ) ;
System . out . println ( " You are missing dependencies! " ) ;
System . out . println ( " Please verify EssentialsX and Vault are installed! " ) ;
2019-11-06 00:15:42 +01:00
Conf . save ( ) ;
2019-10-17 20:00:00 +02:00
Bukkit . getPluginManager ( ) . disablePlugin ( instance ) ;
divider ( ) ;
return ;
}
2019-11-06 00:15:42 +01:00
//Update their config if needed
2019-11-22 10:55:58 +01:00
// Updater.updateIfNeeded(getConfig());
2019-11-06 00:15:42 +01:00
RegisteredServiceProvider < Economy > rsp = FactionsPlugin . this . getServer ( ) . getServicesManager ( ) . getRegistration ( Economy . class ) ;
FactionsPlugin . econ = rsp . getProvider ( ) ;
2019-09-15 11:19:06 +02:00
com . massivecraft . factions . integration . Essentials . setup ( ) ;
hookedPlayervaults = setupPlayervaults ( ) ;
FPlayers . getInstance ( ) . load ( ) ;
Factions . getInstance ( ) . load ( ) ;
for ( FPlayer fPlayer : FPlayers . getInstance ( ) . getAllFPlayers ( ) ) {
Faction faction = Factions . getInstance ( ) . getFactionById ( fPlayer . getFactionId ( ) ) ;
if ( faction = = null ) {
log ( " Invalid faction id on " + fPlayer . getName ( ) + " : " + fPlayer . getFactionId ( ) ) ;
fPlayer . resetFactionData ( false ) ;
continue ;
}
if ( fPlayer . isAlt ( ) ) {
faction . addAltPlayer ( fPlayer ) ;
} else {
faction . addFPlayer ( fPlayer ) ;
}
}
if ( getConfig ( ) . getBoolean ( " enable-faction-flight " , true ) ) {
UtilFly . run ( ) ;
}
Board . getInstance ( ) . load ( ) ;
Board . getInstance ( ) . clean ( ) ;
// Add Base Commands
this . cmdBase = new FCmdRoot ( ) ;
this . cmdAutoHelp = new CmdAutoHelp ( ) ;
Econ . setup ( ) ;
setupPermissions ( ) ;
2019-11-21 15:10:04 +01:00
if ( Conf . worldGuardChecking | | Conf . worldGuardBuildPriority ) wg = new Worldguard ( ) ;
2019-09-15 11:19:06 +02:00
EngineDynmap . getInstance ( ) . init ( ) ;
// start up task which runs the autoLeaveAfterDaysOfInactivity routine
startAutoLeaveTask ( false ) ;
if ( version > 8 ) {
useNonPacketParticles = true ;
log ( " Minecraft Version 1.9 or higher found, using non packet based particle API " ) ;
}
if ( getConfig ( ) . getBoolean ( " enable-faction-flight " ) ) {
factionsFlight = true ;
}
if ( getServer ( ) . getPluginManager ( ) . getPlugin ( " Skript " ) ! = null ) {
log ( " Skript was found! Registering FactionsPlugin Addon... " ) ;
skriptAddon = Skript . registerAddon ( this ) ;
try {
skriptAddon . loadClasses ( " com.massivecraft.factions.skript " , " expressions " ) ;
} catch ( IOException ex ) {
ex . printStackTrace ( ) ;
}
log ( " Skript addon registered! " ) ;
}
if ( Conf . useCheckSystem ) {
int minute = 1200 ;
this . getServer ( ) . getScheduler ( ) . runTaskTimerAsynchronously ( this , new CheckTask ( this , 3 ) , 0L , ( long ) ( minute * 3 ) ) ;
this . getServer ( ) . getScheduler ( ) . runTaskTimerAsynchronously ( this , new CheckTask ( this , 5 ) , 0L , ( long ) ( minute * 5 ) ) ;
this . getServer ( ) . getScheduler ( ) . runTaskTimerAsynchronously ( this , new CheckTask ( this , 10 ) , 0L , ( long ) ( minute * 10 ) ) ;
this . getServer ( ) . getScheduler ( ) . runTaskTimerAsynchronously ( this , new CheckTask ( this , 15 ) , 0L , ( long ) ( minute * 15 ) ) ;
this . getServer ( ) . getScheduler ( ) . runTaskTimerAsynchronously ( this , new CheckTask ( this , 30 ) , 0L , ( long ) ( minute * 30 ) ) ;
this . getServer ( ) . getScheduler ( ) . runTaskTimer ( this , CheckTask : : cleanupTask , 0L , 1200L ) ;
this . getServer ( ) . getScheduler ( ) . runTaskTimerAsynchronously ( this , new WeeWooTask ( this ) , 600L , 600L ) ;
}
2019-10-12 20:34:36 +02:00
if ( Conf . useDiscordSystem & & ! Conf . discordBotToken . equals ( " <token here> " ) ) {
2019-09-29 10:39:30 +02:00
new FactionChatHandler ( this ) ;
2019-09-30 22:03:44 +02:00
} else {
System . out . println ( " \ n \ n \ n SABER-FACTIONS-DISCORD-INTEGRATION - You are not using Discord integration features, set conf.json option useDiscordSystem to true and put a valid token in before using! \ n \ n \ n " ) ;
2019-09-29 10:39:30 +02:00
}
2019-09-15 11:19:06 +02:00
ShopConfig . setup ( ) ;
getServer ( ) . getPluginManager ( ) . registerEvents ( factionsPlayerListener = new FactionsPlayerListener ( ) , this ) ;
// Register Event Handlers
eventsListener = new Listener [ ] {
new FactionsChatListener ( ) ,
new FactionsEntityListener ( ) ,
new FactionsExploitListener ( ) ,
new FactionsBlockListener ( ) ,
new FUpgradesGUI ( ) ,
2019-09-15 13:52:29 +02:00
new UpgradesListener ( ) ,
2019-09-15 11:19:06 +02:00
new MissionHandler ( this ) ,
2019-11-07 13:09:45 +01:00
new AntiChestListener ( )
2019-09-15 11:19:06 +02:00
} ;
for ( Listener eventListener : eventsListener )
getServer ( ) . getPluginManager ( ) . registerEvents ( eventListener , this ) ;
this . getCommand ( refCommand ) . setExecutor ( cmdBase ) ;
if ( ! CommodoreProvider . isSupported ( ) ) this . getCommand ( refCommand ) . setTabCompleter ( this ) ;
if ( getDescription ( ) . getFullName ( ) . contains ( " BETA " ) ) {
divider ( ) ;
System . out . println ( " You are using a BETA version of the plugin! " ) ;
System . out . println ( " This comes with risks of small bugs in newer features! " ) ;
System . out . println ( " For support head to: https://github.com/Driftay/Saber-Factions/issues " ) ;
divider ( ) ;
}
this . setupPlaceholderAPI ( ) ;
this . postEnable ( ) ;
this . loadSuccessful = true ;
// Set startup finished to true. to give plugins hooking in a greenlight
FactionsPlugin . startupFinished = true ;
}
public SkriptAddon getSkriptAddon ( ) {
return skriptAddon ;
}
private void setupPlaceholderAPI ( ) {
Plugin clip = getServer ( ) . getPluginManager ( ) . getPlugin ( " PlaceholderAPI " ) ;
if ( clip ! = null & & clip . isEnabled ( ) ) {
this . clipPlaceholderAPIManager = new ClipPlaceholderAPIManager ( ) ;
if ( this . clipPlaceholderAPIManager . register ( ) ) {
PlaceholderApi = true ;
log ( Level . INFO , " Successfully registered placeholders with PlaceholderAPI. " ) ;
} else {
PlaceholderApi = false ;
}
} else {
PlaceholderApi = false ;
}
Plugin mvdw = getServer ( ) . getPluginManager ( ) . getPlugin ( " MVdWPlaceholderAPI " ) ;
if ( mvdw ! = null & & mvdw . isEnabled ( ) ) {
this . mvdwPlaceholderAPIManager = true ;
log ( Level . INFO , " Found MVdWPlaceholderAPI. Adding hooks. " ) ;
}
}
public List < String > replacePlaceholders ( List < String > lore , Placeholder . . . placeholders ) {
for ( Placeholder placeholder : placeholders ) {
for ( int x = 0 ; x < = lore . size ( ) - 1 ; x + + )
lore . set ( x , lore . get ( x ) . replace ( placeholder . getTag ( ) , placeholder . getReplace ( ) ) ) ;
}
return lore ;
}
private void migrateFPlayerLeaders ( ) {
List < String > lines = new ArrayList < > ( ) ;
File fplayerFile = new File ( " plugins " + File . pathSeparator + " Factions " + File . pathSeparator + " players.json " ) ;
try {
BufferedReader br = new BufferedReader ( new FileReader ( fplayerFile ) ) ;
System . out . println ( " Migrating old players.json file. " ) ;
String line ;
while ( ( line = br . readLine ( ) ) ! = null ) {
if ( line . contains ( " \" role \" : \" ADMIN \" " ) ) {
line = line . replace ( " \" role \" : \" ADMIN \" " , " \" role \" : " + " \" LEADER \" " ) ;
}
lines . add ( line ) ;
}
br . close ( ) ;
BufferedWriter bw = new BufferedWriter ( new FileWriter ( fplayerFile ) ) ;
for ( String newLine : lines ) {
bw . write ( newLine + " \ n " ) ;
}
bw . flush ( ) ;
bw . close ( ) ;
} catch ( IOException ex ) {
System . out . println ( " File was not found for players.json, assuming "
+ " there is no need to migrate old players.json file. " ) ;
}
}
public boolean isClipPlaceholderAPIHooked ( ) {
return this . clipPlaceholderAPIManager ! = null ;
}
public boolean isMVdWPlaceholderAPIHooked ( ) {
return this . mvdwPlaceholderAPIManager ;
}
private boolean setupPermissions ( ) {
try {
RegisteredServiceProvider < Permission > rsp = getServer ( ) . getServicesManager ( ) . getRegistration ( Permission . class ) ;
if ( rsp ! = null ) {
perms = rsp . getProvider ( ) ;
}
} catch ( NoClassDefFoundError ex ) {
return false ;
}
return perms ! = null ;
}
private boolean setupPlayervaults ( ) {
Plugin plugin = getServer ( ) . getPluginManager ( ) . getPlugin ( " PlayerVaults " ) ;
return plugin ! = null & & plugin . isEnabled ( ) ;
}
@Override
public GsonBuilder getGsonBuilder ( ) {
Type mapFLocToStringSetType = new TypeToken < Map < FLocation , Set < String > > > ( ) {
} . getType ( ) ;
Type accessTypeAdatper = new TypeToken < Map < Permissable , Map < PermissableAction , Access > > > ( ) {
} . getType ( ) ;
return new GsonBuilder ( ) . setPrettyPrinting ( ) . disableHtmlEscaping ( ) . enableComplexMapKeySerialization ( ) . excludeFieldsWithModifiers ( Modifier . TRANSIENT , Modifier . VOLATILE )
. registerTypeAdapter ( accessTypeAdatper , new PermissionsMapTypeAdapter ( ) )
. registerTypeAdapter ( LazyLocation . class , new MyLocationTypeAdapter ( ) )
. registerTypeAdapter ( mapFLocToStringSetType , new MapFLocToStringSetTypeAdapter ( ) )
. registerTypeAdapter ( Inventory . class , new InventoryTypeAdapter ( ) )
. registerTypeAdapter ( Location . class , new LocationTypeAdapter ( ) )
. registerTypeAdapterFactory ( EnumTypeAdapter . ENUM_FACTORY ) ;
}
private void divider ( ) {
System . out . println ( " .-.-. .-.-. .-.-. .-.-. .-.-. .-.-. .-.-. .-.- " ) ;
System . out . println ( " / / \\ \\ / / \\ \\ / / \\ \\ / / \\ \\ / / \\ \\ / / \\ \\ / / \\ \\ / / \\ " ) ;
System . out . println ( " `-' `-`-' `-`-' `-`-' `-`-' `-`-' `-`-' `-`-' " ) ;
}
@Override
public void onDisable ( ) {
// only save data if plugin actually completely loaded successfully
if ( this . loadSuccessful ) {
2019-11-21 15:38:15 +01:00
Conf . saveSync ( ) ;
2019-09-15 11:19:06 +02:00
}
if ( AutoLeaveTask ! = null ) {
this . getServer ( ) . getScheduler ( ) . cancelTask ( AutoLeaveTask ) ;
AutoLeaveTask = null ;
}
2019-09-29 10:39:30 +02:00
DiscordListener . saveGuilds ( ) ;
2019-09-15 11:19:06 +02:00
super . onDisable ( ) ;
}
public void startAutoLeaveTask ( boolean restartIfRunning ) {
if ( AutoLeaveTask ! = null ) {
if ( ! restartIfRunning ) {
return ;
}
this . getServer ( ) . getScheduler ( ) . cancelTask ( AutoLeaveTask ) ;
}
if ( Conf . autoLeaveRoutineRunsEveryXMinutes > 0 . 0 ) {
long ticks = ( long ) ( 20 * 60 * Conf . autoLeaveRoutineRunsEveryXMinutes ) ;
AutoLeaveTask = getServer ( ) . getScheduler ( ) . scheduleSyncRepeatingTask ( this , new AutoLeaveTask ( ) , ticks , ticks ) ;
}
}
@Override
public void postAutoSave ( ) {
//Board.getInstance().forceSave(); Not sure why this was there as it's called after the board is already saved.
Conf . save ( ) ;
}
public ItemStack createItem ( Material material , int amount , short datavalue , String name , List < String > lore ) {
ItemStack item = new ItemStack ( XMaterial . matchXMaterial ( material . toString ( ) ) . parseMaterial ( ) , amount , datavalue ) ;
ItemMeta meta = item . getItemMeta ( ) ;
meta . setDisplayName ( color ( name ) ) ;
meta . setLore ( colorList ( lore ) ) ;
item . setItemMeta ( meta ) ;
return item ;
}
public ItemStack createLazyItem ( Material material , int amount , short datavalue , String name , String lore ) {
ItemStack item = new ItemStack ( material , amount , datavalue ) ;
ItemMeta meta = item . getItemMeta ( ) ;
meta . setDisplayName ( color ( FactionsPlugin . instance . getConfig ( ) . getString ( name ) ) ) ;
meta . setLore ( colorList ( FactionsPlugin . instance . getConfig ( ) . getStringList ( lore ) ) ) ;
item . setItemMeta ( meta ) ;
return item ;
}
public Economy getEcon ( ) {
RegisteredServiceProvider < Economy > rsp = FactionsPlugin . instance . getServer ( ) . getServicesManager ( ) . getRegistration ( Economy . class ) ;
return rsp . getProvider ( ) ;
}
@Override
public boolean logPlayerCommands ( ) {
return Conf . logPlayerCommands ;
}
@Override
public boolean handleCommand ( CommandSender sender , String commandString , boolean testOnly ) {
return sender instanceof Player & & FactionsPlayerListener . preventCommand ( commandString , ( Player ) sender ) | | super . handleCommand ( sender , commandString , testOnly ) ;
}
@Override
public boolean onCommand ( CommandSender sender , Command command , String label , String [ ] split ) {
if ( split . length = = 0 ) {
return handleCommand ( sender , " /f help " , false ) ;
}
// otherwise, needs to be handled; presumably another plugin directly ran the command
String cmd = Conf . baseCommandAliases . isEmpty ( ) ? " /f " : " / " + Conf . baseCommandAliases . get ( 0 ) ;
return handleCommand ( sender , cmd + " " + TextUtil . implode ( Arrays . asList ( split ) , " " ) , false ) ;
}
// This method must stay for < 1.12 versions
@Override
public List < String > onTabComplete ( CommandSender sender , Command command , String alias , String [ ] args ) {
// Must be a LinkedList to prevent UnsupportedOperationException.
List < String > argsList = new LinkedList < > ( Arrays . asList ( args ) ) ;
CommandContext context = new CommandContext ( sender , argsList , alias ) ;
String cmd = Conf . baseCommandAliases . isEmpty ( ) ? " /f " : " / " + Conf . baseCommandAliases . get ( 0 ) ;
2019-09-14 21:13:01 +02:00
// String cmdValid = (cmd + " " + TextUtil.implode(context.args, " ")).trim();
2019-09-15 11:19:06 +02:00
List < FCommand > commandsList = cmdBase . subCommands ;
FCommand commandsEx = cmdBase ;
List < String > completions = new ArrayList < > ( ) ;
// Check for "" first arg because spigot is mangled.
if ( context . args . get ( 0 ) . equals ( " " ) ) {
for ( FCommand subCommand : commandsEx . subCommands ) {
if ( subCommand . requirements . playerOnly & & sender . hasPermission ( subCommand . requirements . permission . node ) & & subCommand . visibility ! = CommandVisibility . INVISIBLE )
completions . addAll ( subCommand . aliases ) ;
}
return completions ;
} else if ( context . args . size ( ) = = 1 ) {
for ( ; ! commandsList . isEmpty ( ) & & ! context . args . isEmpty ( ) ; context . args . remove ( 0 ) ) {
String cmdName = context . args . get ( 0 ) . toLowerCase ( ) ;
boolean toggle = false ;
for ( FCommand fCommand : commandsList ) {
for ( String s : fCommand . aliases ) {
if ( s . startsWith ( cmdName ) ) {
commandsList = fCommand . subCommands ;
completions . addAll ( fCommand . aliases ) ;
toggle = true ;
break ;
}
2019-09-14 21:13:01 +02:00
}
2019-09-15 11:19:06 +02:00
if ( toggle ) break ;
}
}
String lastArg = args [ args . length - 1 ] . toLowerCase ( ) ;
completions = completions . stream ( )
. filter ( m - > m . toLowerCase ( ) . startsWith ( lastArg ) )
. collect ( Collectors . toList ( ) ) ;
return completions ;
} else {
String lastArg = args [ args . length - 1 ] . toLowerCase ( ) ;
for ( Role value : Role . values ( ) ) completions . add ( value . nicename ) ;
for ( Relation value : Relation . values ( ) ) completions . add ( value . nicename ) ;
// The stream and foreach from the old implementation looped 2 times, by looping all players -> filtered -> looped filter and added -> filtered AGAIN at the end.
// This loops them once and just adds, because we are filtering the arguments at the end anyways
for ( Player player : Bukkit . getServer ( ) . getOnlinePlayers ( ) ) completions . add ( player . getName ( ) ) ;
for ( Faction faction : Factions . getInstance ( ) . getAllFactions ( ) )
completions . add ( ChatColor . stripColor ( faction . getTag ( ) ) ) ;
completions = completions . stream ( ) . filter ( m - > m . toLowerCase ( ) . startsWith ( lastArg ) ) . collect ( Collectors . toList ( ) ) ;
return completions ;
}
}
public void createTimedHologram ( final Location location , String text , Long timeout ) {
ArmorStand as = ( ArmorStand ) location . add ( 0 . 5 , 1 , 0 . 5 ) . getWorld ( ) . spawnEntity ( location , EntityType . ARMOR_STAND ) ; //Spawn the ArmorStand
as . setVisible ( false ) ; //Makes the ArmorStand invisible
as . setGravity ( false ) ; //Make sure it doesn't fall
as . setCanPickupItems ( false ) ; //I'm not sure what happens if you leave this as it is, but you might as well disable it
as . setCustomName ( FactionsPlugin . instance . color ( text ) ) ; //Set this to the text you want
as . setCustomNameVisible ( true ) ; //This makes the text appear no matter if your looking at the entity or not
final ArmorStand armorStand = as ;
Bukkit . getScheduler ( ) . scheduleSyncDelayedTask ( FactionsPlugin . instance , ( ) - > {
armorStand . remove ( ) ;
getLogger ( ) . info ( " Removing Hologram. " ) ;
}
, timeout * 20 ) ;
}
// -------------------------------------------- //
// 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()
public boolean shouldLetFactionsHandleThisChat ( AsyncPlayerChatEvent event ) {
return event ! = null & & ( 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 . getInstance ( ) . getByPlayer ( player ) ;
return me ! = null & & me . getChatMode ( ) . isAtLeast ( ChatMode . ALLIANCE ) ;
}
// Is this chat message actually a Factions command, and thus should be left alone by other plugins?
// TODO: GET THIS BACK AND WORKING
public boolean isFactionsCommand ( String check ) {
return ! ( check = = null | | check . isEmpty ( ) ) & & this . handleCommand ( null , check , true ) ;
}
// 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 . getInstance ( ) . getByPlayer ( 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 . getInstance ( ) . getByPlayer ( 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 . getInstance ( ) . getByPlayer ( player ) ;
if ( me = = null ) {
return " " ;
}
return me . getTitle ( ) . trim ( ) ;
}
public String color ( String line ) {
line = ChatColor . translateAlternateColorCodes ( '&' , line ) ;
return line ;
}
//colors a string list
public List < String > colorList ( List < String > lore ) {
for ( int i = 0 ; i < = lore . size ( ) - 1 ; i + + ) {
lore . set ( i , color ( lore . get ( i ) ) ) ;
}
return lore ;
}
// Get a list of all faction tags (names)
public Set < String > getFactionTags ( ) {
return Factions . getInstance ( ) . getFactionTags ( ) ;
}
// Get a list of all players in the specified faction
public Set < String > getPlayersInFaction ( String factionTag ) {
Set < String > players = new HashSet < > ( ) ;
Faction faction = Factions . getInstance ( ) . getByTag ( factionTag ) ;
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 < > ( ) ;
Faction faction = Factions . getInstance ( ) . getByTag ( factionTag ) ;
if ( faction ! = null ) {
for ( FPlayer fplayer : faction . getFPlayersWhereOnline ( true ) ) {
players . add ( fplayer . getName ( ) ) ;
}
}
return players ;
}
public boolean isHookedPlayervaults ( ) {
return hookedPlayervaults ;
}
public String getPrimaryGroup ( OfflinePlayer player ) {
AtomicReference < String > primaryGroup = new AtomicReference < > ( ) ;
if ( perms = = null | | ! perms . hasGroupSupport ( ) ) return " " ;
else {
Bukkit . getScheduler ( ) . runTaskAsynchronously ( this , ( ) - > primaryGroup . set ( perms . getPrimaryGroup ( Bukkit . getWorlds ( ) . get ( 0 ) . toString ( ) , player ) ) ) ;
return primaryGroup . get ( ) ;
}
}
public void debug ( Level level , String s ) {
if ( getConfig ( ) . getBoolean ( " debug " , false ) ) {
getLogger ( ) . log ( level , s ) ;
}
}
public FactionsPlayerListener getFactionsPlayerListener ( ) {
return this . factionsPlayerListener ;
}
public void debug ( String s ) {
debug ( Level . INFO , s ) ;
}
2019-11-25 04:37:31 +01:00
public Worldguard getWg ( ) {
return wg ;
}
2011-10-08 22:03:44 +02:00
}