2011-05-13 21:58:30 +02:00
/ *
* Essentials - a bukkit plugin
* Copyright ( C ) 2011 Essentials Team
2011-11-21 02:55:26 +01:00
*
2011-05-13 21:58:30 +02:00
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
2011-11-21 02:55:26 +01:00
*
2011-05-13 21:58:30 +02:00
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
2011-11-21 02:55:26 +01:00
*
2011-05-13 21:58:30 +02:00
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
* /
2011-03-30 06:03:21 +02:00
package com.earth2me.essentials ;
2020-10-03 19:46:05 +02:00
import com.earth2me.essentials.commands.EssentialsCommand ;
import com.earth2me.essentials.commands.IEssentialsCommand ;
import com.earth2me.essentials.commands.NoChargeException ;
import com.earth2me.essentials.commands.NotEnoughArgumentsException ;
import com.earth2me.essentials.commands.QuietAbortException ;
2018-11-19 15:13:05 +01:00
import com.earth2me.essentials.items.AbstractItemDb ;
2019-12-23 00:38:26 +01:00
import com.earth2me.essentials.items.CustomItemResolver ;
2018-11-19 15:13:05 +01:00
import com.earth2me.essentials.items.FlatItemDb ;
import com.earth2me.essentials.items.LegacyItemDb ;
2020-07-05 20:30:01 +02:00
import com.earth2me.essentials.metrics.MetricsWrapper ;
2020-10-19 21:38:55 +02:00
import com.earth2me.essentials.perm.PermissionsDefaults ;
2011-08-30 23:26:23 +02:00
import com.earth2me.essentials.perm.PermissionsHandler ;
2011-05-14 01:39:18 +02:00
import com.earth2me.essentials.register.payment.Methods ;
2011-07-09 13:52:46 +02:00
import com.earth2me.essentials.signs.SignBlockListener ;
import com.earth2me.essentials.signs.SignEntityListener ;
import com.earth2me.essentials.signs.SignPlayerListener ;
2013-06-16 02:07:16 +02:00
import com.earth2me.essentials.textreader.IText ;
import com.earth2me.essentials.textreader.KeywordReplacer ;
import com.earth2me.essentials.textreader.SimpleTextInput ;
2021-03-06 17:29:42 +01:00
import com.earth2me.essentials.updatecheck.UpdateChecker ;
2018-11-19 15:13:05 +01:00
import com.earth2me.essentials.utils.VersionUtil ;
2020-06-24 23:00:59 +02:00
import io.papermc.lib.PaperLib ;
2020-10-03 19:46:05 +02:00
import net.ess3.api.Economy ;
2013-10-11 04:44:41 +02:00
import net.ess3.api.IEssentials ;
2020-10-03 19:46:05 +02:00
import net.ess3.api.IItemDb ;
import net.ess3.api.IJails ;
2013-10-11 04:44:41 +02:00
import net.ess3.api.ISettings ;
2021-02-20 17:30:07 +01:00
import net.ess3.nms.refl.providers.ReflFormattedCommandAliasProvider ;
2021-01-23 23:41:24 +01:00
import net.ess3.nms.refl.providers.ReflKnownCommandsProvider ;
2020-06-24 23:00:59 +02:00
import net.ess3.nms.refl.providers.ReflServerStateProvider ;
import net.ess3.nms.refl.providers.ReflSpawnEggProvider ;
2020-08-05 21:47:42 +02:00
import net.ess3.nms.refl.providers.ReflSpawnerBlockProvider ;
2021-04-08 03:37:21 +02:00
import net.ess3.nms.refl.providers.ReflSyncCommandsProvider ;
2020-10-05 15:45:33 +02:00
import net.ess3.provider.ContainerProvider ;
2021-02-20 17:30:07 +01:00
import net.ess3.provider.FormattedCommandAliasProvider ;
2020-10-19 16:27:40 +02:00
import net.ess3.provider.KnownCommandsProvider ;
2021-02-05 19:57:32 +01:00
import net.ess3.provider.MaterialTagProvider ;
2020-06-24 23:00:59 +02:00
import net.ess3.provider.PotionMetaProvider ;
2020-07-02 00:19:42 +02:00
import net.ess3.provider.ProviderListener ;
2020-06-24 23:00:59 +02:00
import net.ess3.provider.ServerStateProvider ;
import net.ess3.provider.SpawnEggProvider ;
2020-08-05 21:47:42 +02:00
import net.ess3.provider.SpawnerBlockProvider ;
import net.ess3.provider.SpawnerItemProvider ;
2021-04-08 03:37:21 +02:00
import net.ess3.provider.SyncCommandsProvider ;
2020-10-03 19:46:05 +02:00
import net.ess3.provider.providers.BasePotionDataProvider ;
import net.ess3.provider.providers.BlockMetaSpawnerItemProvider ;
2021-02-05 19:57:32 +01:00
import net.ess3.provider.providers.BukkitMaterialTagProvider ;
2020-10-03 19:46:05 +02:00
import net.ess3.provider.providers.BukkitSpawnerBlockProvider ;
import net.ess3.provider.providers.FlatSpawnEggProvider ;
import net.ess3.provider.providers.LegacyPotionMetaProvider ;
import net.ess3.provider.providers.LegacySpawnEggProvider ;
2020-10-05 15:45:33 +02:00
import net.ess3.provider.providers.PaperContainerProvider ;
2020-10-19 16:27:40 +02:00
import net.ess3.provider.providers.PaperKnownCommandsProvider ;
2021-02-05 19:57:32 +01:00
import net.ess3.provider.providers.PaperMaterialTagProvider ;
2020-10-03 19:46:05 +02:00
import net.ess3.provider.providers.PaperRecipeBookListener ;
import net.ess3.provider.providers.PaperServerStateProvider ;
2021-02-15 16:43:10 +01:00
import net.essentialsx.api.v2.services.BalanceTop ;
2012-04-20 23:31:25 +02:00
import org.bukkit.Bukkit ;
2011-11-18 18:42:26 +01:00
import org.bukkit.Server ;
import org.bukkit.World ;
2013-07-02 08:16:42 +02:00
import org.bukkit.block.Block ;
2020-10-03 19:46:05 +02:00
import org.bukkit.command.BlockCommandSender ;
import org.bukkit.command.Command ;
import org.bukkit.command.CommandSender ;
import org.bukkit.command.PluginCommand ;
2021-05-02 21:08:18 +02:00
import org.bukkit.command.PluginIdentifiableCommand ;
2020-10-03 19:46:05 +02:00
import org.bukkit.command.TabCompleter ;
2011-03-30 06:03:21 +02:00
import org.bukkit.entity.Player ;
2020-07-02 00:19:42 +02:00
import org.bukkit.event.Cancellable ;
2012-01-20 05:20:37 +01:00
import org.bukkit.event.EventHandler ;
import org.bukkit.event.EventPriority ;
2012-12-31 06:44:20 +01:00
import org.bukkit.event.HandlerList ;
2012-01-20 05:20:37 +01:00
import org.bukkit.event.Listener ;
2020-07-02 00:19:42 +02:00
import org.bukkit.event.player.PlayerEvent ;
2011-11-30 20:48:42 +01:00
import org.bukkit.event.player.PlayerJoinEvent ;
2012-01-14 23:13:58 +01:00
import org.bukkit.event.world.WorldLoadEvent ;
import org.bukkit.event.world.WorldUnloadEvent ;
2011-11-18 18:42:26 +01:00
import org.bukkit.plugin.InvalidDescriptionException ;
import org.bukkit.plugin.Plugin ;
import org.bukkit.plugin.PluginDescriptionFile ;
import org.bukkit.plugin.PluginManager ;
import org.bukkit.plugin.java.JavaPlugin ;
2014-01-20 11:20:13 +01:00
import org.bukkit.plugin.java.JavaPluginLoader ;
2011-08-08 14:40:30 +02:00
import org.bukkit.scheduler.BukkitScheduler ;
2013-01-31 20:03:27 +01:00
import org.bukkit.scheduler.BukkitTask ;
2011-11-30 20:48:42 +01:00
import org.yaml.snakeyaml.error.YAMLException ;
2011-03-30 06:03:21 +02:00
2020-04-13 15:33:37 +02:00
import java.io.File ;
import java.io.IOException ;
2020-10-03 19:46:05 +02:00
import java.util.ArrayList ;
import java.util.Collection ;
import java.util.Collections ;
import java.util.LinkedHashSet ;
import java.util.List ;
import java.util.Set ;
import java.util.UUID ;
2020-04-13 15:33:37 +02:00
import java.util.function.Predicate ;
import java.util.logging.Level ;
import java.util.logging.Logger ;
2015-04-15 06:06:16 +02:00
import static com.earth2me.essentials.I18n.tl ;
public class Essentials extends JavaPlugin implements net . ess3 . api . IEssentials {
private static final Logger LOGGER = Logger . getLogger ( " Essentials " ) ;
private final transient TNTExplodeListener tntListener = new TNTExplodeListener ( this ) ;
2020-10-03 19:46:05 +02:00
private final transient Set < String > vanishedPlayers = new LinkedHashSet < > ( ) ;
private transient ISettings settings ;
2015-04-15 06:06:16 +02:00
private transient Jails jails ;
private transient Warps warps ;
private transient Worth worth ;
private transient List < IConf > confList ;
private transient Backup backup ;
2018-11-19 15:13:05 +01:00
private transient AbstractItemDb itemDb ;
2019-12-23 00:38:26 +01:00
private transient CustomItemResolver customItemResolver ;
2015-04-15 06:06:16 +02:00
private transient PermissionsHandler permissionsHandler ;
private transient AlternativeCommandsHandler alternativeCommandsHandler ;
private transient UserMap userMap ;
2021-02-15 16:43:10 +01:00
private transient BalanceTopImpl balanceTop ;
2015-04-15 06:06:16 +02:00
private transient ExecuteTimer execTimer ;
private transient I18n i18n ;
2020-07-05 20:30:01 +02:00
private transient MetricsWrapper metrics ;
2015-04-15 06:06:16 +02:00
private transient EssentialsTimer timer ;
2020-08-05 21:47:42 +02:00
private transient SpawnerItemProvider spawnerItemProvider ;
private transient SpawnerBlockProvider spawnerBlockProvider ;
2016-03-10 17:28:08 +01:00
private transient SpawnEggProvider spawnEggProvider ;
2016-03-29 01:42:33 +02:00
private transient PotionMetaProvider potionMetaProvider ;
2020-06-24 23:00:59 +02:00
private transient ServerStateProvider serverStateProvider ;
2020-10-05 15:45:33 +02:00
private transient ContainerProvider containerProvider ;
2020-10-19 16:27:40 +02:00
private transient KnownCommandsProvider knownCommandsProvider ;
2021-02-20 17:30:07 +01:00
private transient FormattedCommandAliasProvider formattedCommandAliasProvider ;
2020-07-02 00:19:42 +02:00
private transient ProviderListener recipeBookEventProvider ;
2021-02-05 19:57:32 +01:00
private transient MaterialTagProvider materialTagProvider ;
2021-04-08 03:37:21 +02:00
private transient SyncCommandsProvider syncCommandsProvider ;
2018-01-18 09:25:00 +01:00
private transient Kits kits ;
2020-07-06 20:53:43 +02:00
private transient RandomTeleport randomTeleport ;
2021-03-06 17:29:42 +01:00
private transient UpdateChecker updateChecker ;
2015-04-15 06:06:16 +02:00
2020-10-03 19:46:05 +02:00
static {
// TODO: improve legacy code
Methods . init ( ) ;
}
2020-03-29 19:33:23 +02:00
2020-10-03 19:46:05 +02:00
public Essentials ( ) {
2020-03-29 19:33:23 +02:00
}
2020-10-03 19:46:05 +02:00
protected Essentials ( final JavaPluginLoader loader , final PluginDescriptionFile description , final File dataFolder , final File file ) {
2020-03-29 19:33:23 +02:00
super ( loader , description , dataFolder , file ) ;
2015-04-15 06:06:16 +02:00
}
public Essentials ( final Server server ) {
super ( new JavaPluginLoader ( server ) , new PluginDescriptionFile ( " Essentials " , " " , " com.earth2me.essentials.Essentials " ) , null , null ) ;
}
@Override
public ISettings getSettings ( ) {
return settings ;
}
public void setupForTesting ( final Server server ) throws IOException , InvalidDescriptionException {
final File dataFolder = File . createTempFile ( " essentialstest " , " " ) ;
if ( ! dataFolder . delete ( ) ) {
throw new IOException ( ) ;
}
if ( ! dataFolder . mkdir ( ) ) {
throw new IOException ( ) ;
}
i18n = new I18n ( this ) ;
i18n . onEnable ( ) ;
i18n . updateLocale ( " en " ) ;
2015-10-27 18:34:59 +01:00
Console . setInstance ( this ) ;
2020-07-02 00:19:42 +02:00
2015-04-15 06:06:16 +02:00
LOGGER . log ( Level . INFO , tl ( " usingTempFolderForTesting " ) ) ;
LOGGER . log ( Level . INFO , dataFolder . toString ( ) ) ;
settings = new Settings ( this ) ;
userMap = new UserMap ( this ) ;
2021-02-15 16:43:10 +01:00
balanceTop = new BalanceTopImpl ( this ) ;
2015-04-15 06:06:16 +02:00
permissionsHandler = new PermissionsHandler ( this , false ) ;
Economy . setEss ( this ) ;
2015-06-03 22:11:56 +02:00
confList = new ArrayList < > ( ) ;
2015-04-15 06:06:16 +02:00
jails = new Jails ( this ) ;
registerListeners ( server . getPluginManager ( ) ) ;
2018-01-18 09:25:00 +01:00
kits = new Kits ( this ) ;
2015-04-15 06:06:16 +02:00
}
@Override
public void onEnable ( ) {
try {
2017-09-30 17:51:32 +02:00
if ( LOGGER ! = this . getLogger ( ) ) {
LOGGER . setParent ( this . getLogger ( ) ) ;
}
2015-06-06 00:49:05 +02:00
execTimer = new ExecuteTimer ( ) ;
execTimer . start ( ) ;
i18n = new I18n ( this ) ;
i18n . onEnable ( ) ;
execTimer . mark ( " I18n1 " ) ;
2020-07-02 00:19:42 +02:00
2015-10-27 18:34:59 +01:00
Console . setInstance ( this ) ;
2016-01-18 23:49:43 +01:00
2020-10-19 22:26:38 +02:00
switch ( VersionUtil . getServerSupportStatus ( ) ) {
2021-01-19 13:40:05 +01:00
case NMS_CLEANROOM :
getLogger ( ) . severe ( tl ( " serverUnsupportedCleanroom " ) ) ;
break ;
case DANGEROUS_FORK :
getLogger ( ) . severe ( tl ( " serverUnsupportedDangerous " ) ) ;
break ;
2020-10-19 22:26:38 +02:00
case UNSTABLE :
getLogger ( ) . severe ( tl ( " serverUnsupportedMods " ) ) ;
break ;
case OUTDATED :
getLogger ( ) . severe ( tl ( " serverUnsupported " ) ) ;
break ;
case LIMITED :
getLogger ( ) . info ( tl ( " serverUnsupportedLimitedApi " ) ) ;
break ;
2018-12-06 18:41:32 +01:00
}
2021-01-19 13:40:05 +01:00
if ( VersionUtil . getSupportStatusClass ( ) ! = null ) {
getLogger ( ) . info ( tl ( " serverUnsupportedClass " , VersionUtil . getSupportStatusClass ( ) ) ) ;
}
2015-04-15 06:06:16 +02:00
final PluginManager pm = getServer ( ) . getPluginManager ( ) ;
2020-10-03 19:46:05 +02:00
for ( final Plugin plugin : pm . getPlugins ( ) ) {
2015-04-15 06:06:16 +02:00
if ( plugin . getDescription ( ) . getName ( ) . startsWith ( " Essentials " ) & & ! plugin . getDescription ( ) . getVersion ( ) . equals ( this . getDescription ( ) . getVersion ( ) ) & & ! plugin . getDescription ( ) . getName ( ) . equals ( " EssentialsAntiCheat " ) ) {
2015-06-03 15:44:18 +02:00
getLogger ( ) . warning ( tl ( " versionMismatch " , plugin . getDescription ( ) . getName ( ) ) ) ;
2015-04-15 06:06:16 +02:00
}
}
try {
final EssentialsUpgrade upgrade = new EssentialsUpgrade ( this ) ;
upgrade . beforeSettings ( ) ;
execTimer . mark ( " Upgrade " ) ;
2019-01-12 22:30:02 +01:00
2015-06-03 22:11:56 +02:00
confList = new ArrayList < > ( ) ;
2015-04-15 06:06:16 +02:00
settings = new Settings ( this ) ;
confList . add ( settings ) ;
execTimer . mark ( " Settings " ) ;
2019-01-12 22:30:02 +01:00
2015-04-15 06:06:16 +02:00
userMap = new UserMap ( this ) ;
confList . add ( userMap ) ;
execTimer . mark ( " Init(Usermap) " ) ;
2019-01-12 22:30:02 +01:00
2021-02-15 16:43:10 +01:00
balanceTop = new BalanceTopImpl ( this ) ;
execTimer . mark ( " Init(BalanceTop) " ) ;
2018-01-18 09:25:00 +01:00
kits = new Kits ( this ) ;
confList . add ( kits ) ;
upgrade . convertKits ( ) ;
execTimer . mark ( " Kits " ) ;
2019-01-12 22:30:02 +01:00
2015-04-15 06:06:16 +02:00
upgrade . afterSettings ( ) ;
execTimer . mark ( " Upgrade2 " ) ;
2019-01-12 22:30:02 +01:00
2015-04-15 06:06:16 +02:00
warps = new Warps ( getServer ( ) , this . getDataFolder ( ) ) ;
confList . add ( warps ) ;
2019-12-23 00:38:26 +01:00
execTimer . mark ( " Init(Warp) " ) ;
2019-01-12 22:30:02 +01:00
2015-04-15 06:06:16 +02:00
worth = new Worth ( this . getDataFolder ( ) ) ;
confList . add ( worth ) ;
2019-12-23 00:38:26 +01:00
execTimer . mark ( " Init(Worth) " ) ;
2018-11-19 15:13:05 +01:00
itemDb = getItemDbFromConfig ( ) ;
2015-04-15 06:06:16 +02:00
confList . add ( itemDb ) ;
2019-12-23 00:38:26 +01:00
execTimer . mark ( " Init(ItemDB) " ) ;
2020-07-06 20:53:43 +02:00
randomTeleport = new RandomTeleport ( this ) ;
if ( randomTeleport . getPreCache ( ) ) {
randomTeleport . cacheRandomLocations ( randomTeleport . getCenter ( ) , randomTeleport . getMinRange ( ) , randomTeleport . getMaxRange ( ) ) ;
}
confList . add ( randomTeleport ) ;
execTimer . mark ( " Init(RandomTeleport) " ) ;
2019-12-23 00:38:26 +01:00
customItemResolver = new CustomItemResolver ( this ) ;
try {
itemDb . registerResolver ( this , " custom_items " , customItemResolver ) ;
confList . add ( customItemResolver ) ;
2020-10-03 19:46:05 +02:00
} catch ( final Exception e ) {
2019-12-23 00:38:26 +01:00
e . printStackTrace ( ) ;
customItemResolver = null ;
}
execTimer . mark ( " Init(CustomItemResolver) " ) ;
2019-01-12 22:30:02 +01:00
2015-04-15 06:06:16 +02:00
jails = new Jails ( this ) ;
confList . add ( jails ) ;
2018-08-19 22:11:51 +02:00
execTimer . mark ( " Init(Jails) " ) ;
2018-08-10 23:07:02 +02:00
2020-08-05 21:47:42 +02:00
//Spawner item provider only uses one but it's here for legacy...
spawnerItemProvider = new BlockMetaSpawnerItemProvider ( ) ;
//Spawner block providers
if ( VersionUtil . getServerBukkitVersion ( ) . isLowerThan ( VersionUtil . v1_12_0_R01 ) ) {
spawnerBlockProvider = new ReflSpawnerBlockProvider ( ) ;
} else {
spawnerBlockProvider = new BukkitSpawnerBlockProvider ( ) ;
}
2020-06-24 23:00:59 +02:00
//Spawn Egg Providers
2020-12-11 17:31:40 +01:00
if ( VersionUtil . getServerBukkitVersion ( ) . isLowerThan ( VersionUtil . v1_9_R01 ) ) {
2020-06-24 23:00:59 +02:00
spawnEggProvider = new LegacySpawnEggProvider ( ) ;
} else if ( VersionUtil . getServerBukkitVersion ( ) . isLowerThanOrEqualTo ( VersionUtil . v1_12_2_R01 ) ) {
spawnEggProvider = new ReflSpawnEggProvider ( ) ;
} else {
spawnEggProvider = new FlatSpawnEggProvider ( ) ;
}
//Potion Meta Provider
2020-12-11 17:31:40 +01:00
if ( VersionUtil . getServerBukkitVersion ( ) . isLowerThan ( VersionUtil . v1_9_R01 ) ) {
2020-06-24 23:00:59 +02:00
potionMetaProvider = new LegacyPotionMetaProvider ( ) ;
} else {
potionMetaProvider = new BasePotionDataProvider ( ) ;
}
//Server State Provider
2020-10-05 15:45:33 +02:00
//Container Provider
2020-06-24 23:00:59 +02:00
if ( PaperLib . isPaper ( ) & & VersionUtil . getServerBukkitVersion ( ) . isHigherThanOrEqualTo ( VersionUtil . v1_15_2_R01 ) ) {
serverStateProvider = new PaperServerStateProvider ( ) ;
2020-10-05 15:45:33 +02:00
containerProvider = new PaperContainerProvider ( ) ;
2020-06-24 23:00:59 +02:00
} else {
serverStateProvider = new ReflServerStateProvider ( getLogger ( ) ) ;
}
2020-07-02 00:19:42 +02:00
//Event Providers
if ( PaperLib . isPaper ( ) ) {
try {
Class . forName ( " com.destroystokyo.paper.event.player.PlayerRecipeBookClickEvent " ) ;
recipeBookEventProvider = new PaperRecipeBookListener ( event - > {
if ( this . getUser ( ( ( PlayerEvent ) event ) . getPlayer ( ) ) . isRecipeSee ( ) ) {
( ( Cancellable ) event ) . setCancelled ( true ) ;
}
} ) ;
2020-10-03 19:46:05 +02:00
} catch ( final ClassNotFoundException ignored ) {
}
2020-07-02 00:19:42 +02:00
}
2020-10-19 16:27:40 +02:00
//Known Commands Provider
if ( PaperLib . isPaper ( ) & & VersionUtil . getServerBukkitVersion ( ) . isHigherThanOrEqualTo ( VersionUtil . v1_11_2_R01 ) ) {
knownCommandsProvider = new PaperKnownCommandsProvider ( ) ;
} else {
knownCommandsProvider = new ReflKnownCommandsProvider ( ) ;
}
2021-02-20 17:30:07 +01:00
// Command aliases provider
formattedCommandAliasProvider = new ReflFormattedCommandAliasProvider ( PaperLib . isPaper ( ) ) ;
2021-04-08 03:37:21 +02:00
// Material Tag Providers
2021-02-05 19:57:32 +01:00
if ( VersionUtil . getServerBukkitVersion ( ) . isHigherThanOrEqualTo ( VersionUtil . v1_13_0_R01 ) ) {
materialTagProvider = PaperLib . isPaper ( ) ? new PaperMaterialTagProvider ( ) : new BukkitMaterialTagProvider ( ) ;
}
2021-04-08 03:37:21 +02:00
// Sync Commands Provider
syncCommandsProvider = new ReflSyncCommandsProvider ( ) ;
2018-08-19 22:11:51 +02:00
execTimer . mark ( " Init(Providers) " ) ;
2015-04-15 06:06:16 +02:00
reload ( ) ;
2019-01-12 22:30:02 +01:00
// The item spawn blacklist is loaded with all other settings, before the item
// DB, but it depends on the item DB, so we need to reload it again here:
( ( Settings ) settings ) . _lateLoadItemSpawnBlacklist ( ) ;
2020-10-03 19:46:05 +02:00
} catch ( final YAMLException exception ) {
2015-04-15 06:06:16 +02:00
if ( pm . getPlugin ( " EssentialsUpdate " ) ! = null ) {
LOGGER . log ( Level . SEVERE , tl ( " essentialsHelp2 " ) ) ;
} else {
LOGGER . log ( Level . SEVERE , tl ( " essentialsHelp1 " ) ) ;
}
handleCrash ( exception ) ;
return ;
}
backup = new Backup ( this ) ;
permissionsHandler = new PermissionsHandler ( this , settings . useBukkitPermissions ( ) ) ;
alternativeCommandsHandler = new AlternativeCommandsHandler ( this ) ;
timer = new EssentialsTimer ( this ) ;
scheduleSyncRepeatingTask ( timer , 1000 , 50 ) ;
Economy . setEss ( this ) ;
execTimer . mark ( " RegHandler " ) ;
2020-10-19 21:38:55 +02:00
// Register /hat and /back default permissions
PermissionsDefaults . registerAllBackDefaults ( ) ;
PermissionsDefaults . registerAllHatDefaults ( ) ;
2018-04-29 16:49:49 +02:00
2021-03-06 17:29:42 +01:00
updateChecker = new UpdateChecker ( this ) ;
runTaskAsynchronously ( ( ) - > {
2021-03-07 00:52:10 +01:00
getLogger ( ) . log ( Level . INFO , tl ( " versionFetching " ) ) ;
2021-03-06 17:29:42 +01:00
for ( String str : updateChecker . getVersionMessages ( false , true ) ) {
2021-03-07 00:52:10 +01:00
getLogger ( ) . log ( getSettings ( ) . isUpdateCheckEnabled ( ) ? Level . WARNING : Level . INFO , str ) ;
2021-03-06 17:29:42 +01:00
}
} ) ;
2021-03-06 17:58:35 +01:00
metrics = new MetricsWrapper ( this , 858 , true ) ;
2021-03-06 17:29:42 +01:00
execTimer . mark ( " Init(External) " ) ;
2015-04-15 06:06:16 +02:00
final String timeroutput = execTimer . end ( ) ;
if ( getSettings ( ) . isDebug ( ) ) {
LOGGER . log ( Level . INFO , " Essentials load {0} " , timeroutput ) ;
}
2020-10-03 19:46:05 +02:00
} catch ( final NumberFormatException ex ) {
2015-04-15 06:06:16 +02:00
handleCrash ( ex ) ;
2020-10-03 19:46:05 +02:00
} catch ( final Error ex ) {
2015-04-15 06:06:16 +02:00
handleCrash ( ex ) ;
throw ex ;
}
2020-05-11 17:55:31 +02:00
getBackup ( ) . setPendingShutdown ( false ) ;
2015-04-15 06:06:16 +02:00
}
@Override
public void saveConfig ( ) {
// We don't use any of the bukkit config writing, as this breaks our config file formatting.
}
2020-10-03 19:46:05 +02:00
private void registerListeners ( final PluginManager pm ) {
2015-04-15 06:06:16 +02:00
HandlerList . unregisterAll ( this ) ;
if ( getSettings ( ) . isDebug ( ) ) {
LOGGER . log ( Level . INFO , " Registering Listeners " ) ;
}
2016-08-27 04:27:52 +02:00
final EssentialsPluginListener pluginListener = new EssentialsPluginListener ( this ) ;
pm . registerEvents ( pluginListener , this ) ;
confList . add ( pluginListener ) ;
2015-04-15 06:06:16 +02:00
final EssentialsPlayerListener playerListener = new EssentialsPlayerListener ( this ) ;
2017-07-28 21:13:59 +02:00
playerListener . registerEvents ( ) ;
2015-04-15 06:06:16 +02:00
final EssentialsBlockListener blockListener = new EssentialsBlockListener ( this ) ;
pm . registerEvents ( blockListener , this ) ;
final SignBlockListener signBlockListener = new SignBlockListener ( this ) ;
pm . registerEvents ( signBlockListener , this ) ;
final SignPlayerListener signPlayerListener = new SignPlayerListener ( this ) ;
pm . registerEvents ( signPlayerListener , this ) ;
final SignEntityListener signEntityListener = new SignEntityListener ( this ) ;
pm . registerEvents ( signEntityListener , this ) ;
final EssentialsEntityListener entityListener = new EssentialsEntityListener ( this ) ;
pm . registerEvents ( entityListener , this ) ;
final EssentialsWorldListener worldListener = new EssentialsWorldListener ( this ) ;
pm . registerEvents ( worldListener , this ) ;
2016-08-27 04:27:52 +02:00
final EssentialsServerListener serverListener = new EssentialsServerListener ( this ) ;
pm . registerEvents ( serverListener , this ) ;
2015-04-15 06:06:16 +02:00
pm . registerEvents ( tntListener , this ) ;
2020-07-02 00:19:42 +02:00
if ( recipeBookEventProvider ! = null ) {
pm . registerEvents ( recipeBookEventProvider , this ) ;
}
2015-04-15 06:06:16 +02:00
jails . resetListener ( ) ;
}
@Override
public void onDisable ( ) {
2020-10-03 19:46:05 +02:00
final boolean stopping = getServerStateProvider ( ) . isStopping ( ) ;
2020-05-11 17:55:31 +02:00
if ( ! stopping ) {
LOGGER . log ( Level . SEVERE , tl ( " serverReloading " ) ) ;
}
getBackup ( ) . setPendingShutdown ( true ) ;
2020-10-03 19:46:05 +02:00
for ( final User user : getOnlineUsers ( ) ) {
2015-04-15 06:06:16 +02:00
if ( user . isVanished ( ) ) {
user . setVanished ( false ) ;
user . sendMessage ( tl ( " unvanishedReload " ) ) ;
}
2020-05-11 17:55:31 +02:00
if ( stopping ) {
2020-05-11 15:53:05 +02:00
user . setLastLocation ( ) ;
if ( ! user . isHidden ( ) ) {
user . setLastLogout ( System . currentTimeMillis ( ) ) ;
}
user . cleanup ( ) ;
} else {
user . stopTransaction ( ) ;
}
2015-04-15 06:06:16 +02:00
}
cleanupOpenInventories ( ) ;
2020-05-11 17:55:31 +02:00
if ( getBackup ( ) . getTaskLock ( ) ! = null & & ! getBackup ( ) . getTaskLock ( ) . isDone ( ) ) {
LOGGER . log ( Level . SEVERE , tl ( " backupInProgress " ) ) ;
getBackup ( ) . getTaskLock ( ) . join ( ) ;
}
2015-04-15 06:06:16 +02:00
if ( i18n ! = null ) {
i18n . onDisable ( ) ;
}
if ( backup ! = null ) {
backup . stopTask ( ) ;
}
2020-06-03 22:36:27 +02:00
this . getPermissionsHandler ( ) . unregisterContexts ( ) ;
2015-04-15 06:06:16 +02:00
Economy . setEss ( null ) ;
Trade . closeLog ( ) ;
2016-03-02 01:45:48 +01:00
getUserMap ( ) . getUUIDMap ( ) . shutdown ( ) ;
2015-04-15 06:06:16 +02:00
HandlerList . unregisterAll ( this ) ;
}
@Override
public void reload ( ) {
Trade . closeLog ( ) ;
2020-10-03 19:46:05 +02:00
for ( final IConf iConf : confList ) {
2015-04-15 06:06:16 +02:00
iConf . reloadConfig ( ) ;
execTimer . mark ( " Reload( " + iConf . getClass ( ) . getSimpleName ( ) + " ) " ) ;
}
i18n . updateLocale ( settings . getLocale ( ) ) ;
2020-10-03 19:46:05 +02:00
for ( final String commandName : this . getDescription ( ) . getCommands ( ) . keySet ( ) ) {
final Command command = this . getCommand ( commandName ) ;
2020-06-16 22:39:48 +02:00
if ( command ! = null ) {
command . setDescription ( tl ( commandName + " CommandDescription " ) ) ;
command . setUsage ( tl ( commandName + " CommandUsage " ) ) ;
}
}
2015-04-15 06:06:16 +02:00
final PluginManager pm = getServer ( ) . getPluginManager ( ) ;
registerListeners ( pm ) ;
}
@Override
2020-10-03 19:46:05 +02:00
public List < String > onTabComplete ( final CommandSender sender , final Command command , final String commandLabel , final String [ ] args ) {
2017-04-14 03:46:43 +02:00
return onTabCompleteEssentials ( sender , command , commandLabel , args , Essentials . class . getClassLoader ( ) ,
2020-10-03 19:46:05 +02:00
" com.earth2me.essentials.commands.Command " , " essentials. " , null ) ;
2017-04-14 03:46:43 +02:00
}
@Override
public List < String > onTabCompleteEssentials ( final CommandSender cSender , final Command command , final String commandLabel , final String [ ] args ,
final ClassLoader classLoader , final String commandPath , final String permissionPrefix ,
final IEssentialsModule module ) {
2015-04-15 06:06:16 +02:00
if ( ! getSettings ( ) . isCommandOverridden ( command . getName ( ) ) & & ( ! commandLabel . startsWith ( " e " ) | | commandLabel . equalsIgnoreCase ( command . getName ( ) ) ) ) {
2020-12-12 14:50:34 +01:00
final Command pc = alternativeCommandsHandler . getAlternative ( commandLabel ) ;
if ( pc instanceof PluginCommand ) {
2015-04-15 06:06:16 +02:00
try {
2020-12-12 14:50:34 +01:00
final TabCompleter completer = ( ( PluginCommand ) pc ) . getTabCompleter ( ) ;
2015-04-15 06:06:16 +02:00
if ( completer ! = null ) {
2017-04-14 03:46:43 +02:00
return completer . onTabComplete ( cSender , command , commandLabel , args ) ;
2015-04-15 06:06:16 +02:00
}
} catch ( final Exception ex ) {
Bukkit . getLogger ( ) . log ( Level . SEVERE , ex . getMessage ( ) , ex ) ;
}
}
}
2017-04-14 03:46:43 +02:00
try {
// Note: The tab completer is always a player, even when tab-completing in a command block
User user = null ;
if ( cSender instanceof Player ) {
user = getUser ( ( Player ) cSender ) ;
}
2020-10-03 19:46:05 +02:00
final CommandSource sender = new CommandSource ( cSender ) ;
2017-04-14 03:46:43 +02:00
// Check for disabled commands
if ( getSettings ( ) . isCommandDisabled ( commandLabel ) ) {
2021-04-08 03:37:21 +02:00
if ( getKnownCommandsProvider ( ) . getKnownCommands ( ) . containsKey ( commandLabel ) ) {
2021-05-02 21:08:18 +02:00
final Command newCmd = getKnownCommandsProvider ( ) . getKnownCommands ( ) . get ( commandLabel ) ;
if ( ! ( newCmd instanceof PluginIdentifiableCommand ) | | ( ( PluginIdentifiableCommand ) newCmd ) . getPlugin ( ) ! = this ) {
return newCmd . tabComplete ( cSender , commandLabel , args ) ;
}
2021-04-08 03:37:21 +02:00
}
2017-04-14 03:46:43 +02:00
return Collections . emptyList ( ) ;
}
2020-10-03 19:46:05 +02:00
final IEssentialsCommand cmd ;
2017-04-14 03:46:43 +02:00
try {
cmd = ( IEssentialsCommand ) classLoader . loadClass ( commandPath + command . getName ( ) ) . newInstance ( ) ;
cmd . setEssentials ( this ) ;
cmd . setEssentialsModule ( module ) ;
2020-10-03 19:46:05 +02:00
} catch ( final Exception ex ) {
2017-04-14 03:46:43 +02:00
sender . sendMessage ( tl ( " commandNotLoaded " , commandLabel ) ) ;
LOGGER . log ( Level . SEVERE , tl ( " commandNotLoaded " , commandLabel ) , ex ) ;
return Collections . emptyList ( ) ;
}
// Check authorization
if ( user ! = null & & ! user . isAuthorized ( cmd , permissionPrefix ) ) {
return Collections . emptyList ( ) ;
}
if ( user ! = null & & user . isJailed ( ) & & ! user . isAuthorized ( cmd , " essentials.jail.allow. " ) ) {
return Collections . emptyList ( ) ;
}
// Run the command
try {
if ( user = = null ) {
return cmd . tabComplete ( getServer ( ) , sender , commandLabel , command , args ) ;
} else {
return cmd . tabComplete ( getServer ( ) , user , commandLabel , command , args ) ;
}
2020-10-03 19:46:05 +02:00
} catch ( final Exception ex ) {
2017-04-14 03:46:43 +02:00
showError ( sender , ex , commandLabel ) ;
// Tab completion shouldn't fail
LOGGER . log ( Level . SEVERE , tl ( " commandFailed " , commandLabel ) , ex ) ;
return Collections . emptyList ( ) ;
}
2020-10-03 19:46:05 +02:00
} catch ( final Throwable ex ) {
2017-04-14 03:46:43 +02:00
LOGGER . log ( Level . SEVERE , tl ( " commandFailed " , commandLabel ) , ex ) ;
return Collections . emptyList ( ) ;
}
2015-04-15 06:06:16 +02:00
}
@Override
public boolean onCommand ( final CommandSender sender , final Command command , final String commandLabel , final String [ ] args ) {
2020-07-05 20:30:01 +02:00
metrics . markCommand ( command . getName ( ) , true ) ;
2015-04-15 06:06:16 +02:00
return onCommandEssentials ( sender , command , commandLabel , args , Essentials . class . getClassLoader ( ) , " com.earth2me.essentials.commands.Command " , " essentials. " , null ) ;
}
@Override
public boolean onCommandEssentials ( final CommandSender cSender , final Command command , final String commandLabel , final String [ ] args , final ClassLoader classLoader , final String commandPath , final String permissionPrefix , final IEssentialsModule module ) {
// Allow plugins to override the command via onCommand
if ( ! getSettings ( ) . isCommandOverridden ( command . getName ( ) ) & & ( ! commandLabel . startsWith ( " e " ) | | commandLabel . equalsIgnoreCase ( command . getName ( ) ) ) ) {
2020-12-30 20:59:38 +01:00
if ( getSettings ( ) . isDebug ( ) ) {
LOGGER . log ( Level . INFO , " Searching for alternative to: " + commandLabel ) ;
}
2020-12-12 14:50:34 +01:00
final Command pc = alternativeCommandsHandler . getAlternative ( commandLabel ) ;
2015-04-15 06:06:16 +02:00
if ( pc ! = null ) {
alternativeCommandsHandler . executed ( commandLabel , pc ) ;
try {
2021-01-09 19:47:58 +01:00
pc . execute ( cSender , commandLabel , args ) ;
2015-04-15 06:06:16 +02:00
} catch ( final Exception ex ) {
Bukkit . getLogger ( ) . log ( Level . SEVERE , ex . getMessage ( ) , ex ) ;
2018-08-26 16:17:07 +02:00
cSender . sendMessage ( tl ( " internalError " ) ) ;
2015-04-15 06:06:16 +02:00
}
2021-01-09 19:47:58 +01:00
return true ;
2015-04-15 06:06:16 +02:00
}
}
try {
User user = null ;
Block bSenderBlock = null ;
if ( cSender instanceof Player ) {
user = getUser ( ( Player ) cSender ) ;
} else if ( cSender instanceof BlockCommandSender ) {
2020-10-03 19:46:05 +02:00
final BlockCommandSender bsender = ( BlockCommandSender ) cSender ;
2015-04-15 06:06:16 +02:00
bSenderBlock = bsender . getBlock ( ) ;
}
if ( bSenderBlock ! = null ) {
2019-08-05 17:17:22 +02:00
if ( getSettings ( ) . logCommandBlockCommands ( ) ) {
2020-10-03 19:46:05 +02:00
Bukkit . getLogger ( ) . log ( Level . INFO , " CommandBlock at {0},{1},{2} issued server command: /{3} {4} " , new Object [ ] { bSenderBlock . getX ( ) , bSenderBlock . getY ( ) , bSenderBlock . getZ ( ) , commandLabel , EssentialsCommand . getFinalArg ( args , 0 ) } ) ;
2019-08-05 17:17:22 +02:00
}
2015-04-15 06:06:16 +02:00
} else if ( user = = null ) {
2020-10-03 19:46:05 +02:00
Bukkit . getLogger ( ) . log ( Level . INFO , " {0} issued server command: /{1} {2} " , new Object [ ] { cSender . getName ( ) , commandLabel , EssentialsCommand . getFinalArg ( args , 0 ) } ) ;
2015-04-15 06:06:16 +02:00
}
2020-10-03 19:46:05 +02:00
final CommandSource sender = new CommandSource ( cSender ) ;
2015-04-15 06:06:16 +02:00
// New mail notification
if ( user ! = null & & ! getSettings ( ) . isCommandDisabled ( " mail " ) & & ! command . getName ( ) . equals ( " mail " ) & & user . isAuthorized ( " essentials.mail " ) ) {
2017-06-22 23:54:51 +02:00
user . notifyOfMail ( ) ;
2015-04-15 06:06:16 +02:00
}
//Print version even if admin command is not available #easteregg
if ( commandLabel . equalsIgnoreCase ( " essversion " ) ) {
sender . sendMessage ( " This server is running Essentials " + getDescription ( ) . getVersion ( ) ) ;
return true ;
}
// Check for disabled commands
if ( getSettings ( ) . isCommandDisabled ( commandLabel ) ) {
2021-04-08 03:37:21 +02:00
if ( getKnownCommandsProvider ( ) . getKnownCommands ( ) . containsKey ( commandLabel ) ) {
2021-05-02 21:08:18 +02:00
final Command newCmd = getKnownCommandsProvider ( ) . getKnownCommands ( ) . get ( commandLabel ) ;
if ( ! ( newCmd instanceof PluginIdentifiableCommand ) | | ( ( PluginIdentifiableCommand ) newCmd ) . getPlugin ( ) ! = this ) {
return newCmd . execute ( cSender , commandLabel , args ) ;
}
2021-04-08 03:37:21 +02:00
}
2020-03-31 06:01:15 +02:00
sender . sendMessage ( tl ( " commandDisabled " , commandLabel ) ) ;
2015-04-15 06:06:16 +02:00
return true ;
}
2020-10-03 19:46:05 +02:00
final IEssentialsCommand cmd ;
2015-04-15 06:06:16 +02:00
try {
cmd = ( IEssentialsCommand ) classLoader . loadClass ( commandPath + command . getName ( ) ) . newInstance ( ) ;
cmd . setEssentials ( this ) ;
cmd . setEssentialsModule ( module ) ;
2020-10-03 19:46:05 +02:00
} catch ( final Exception ex ) {
2015-04-15 06:06:16 +02:00
sender . sendMessage ( tl ( " commandNotLoaded " , commandLabel ) ) ;
LOGGER . log ( Level . SEVERE , tl ( " commandNotLoaded " , commandLabel ) , ex ) ;
return true ;
}
// Check authorization
if ( user ! = null & & ! user . isAuthorized ( cmd , permissionPrefix ) ) {
LOGGER . log ( Level . INFO , tl ( " deniedAccessCommand " , user . getName ( ) ) ) ;
user . sendMessage ( tl ( " noAccessCommand " ) ) ;
return true ;
}
if ( user ! = null & & user . isJailed ( ) & & ! user . isAuthorized ( cmd , " essentials.jail.allow. " ) ) {
if ( user . getJailTimeout ( ) > 0 ) {
2021-01-23 23:41:24 +01:00
user . sendMessage ( tl ( " playerJailedFor " , user . getName ( ) , user . getFormattedJailTime ( ) ) ) ;
2015-04-15 06:06:16 +02:00
} else {
user . sendMessage ( tl ( " jailMessage " ) ) ;
}
return true ;
}
// Run the command
try {
if ( user = = null ) {
cmd . run ( getServer ( ) , sender , commandLabel , command , args ) ;
} else {
cmd . run ( getServer ( ) , user , commandLabel , command , args ) ;
}
return true ;
2020-10-03 19:46:05 +02:00
} catch ( final NoChargeException | QuietAbortException ex ) {
2015-04-15 06:06:16 +02:00
return true ;
2020-10-03 19:46:05 +02:00
} catch ( final NotEnoughArgumentsException ex ) {
2015-04-15 06:06:16 +02:00
sender . sendMessage ( command . getDescription ( ) ) ;
sender . sendMessage ( command . getUsage ( ) . replaceAll ( " <command> " , commandLabel ) ) ;
if ( ! ex . getMessage ( ) . isEmpty ( ) ) {
sender . sendMessage ( ex . getMessage ( ) ) ;
}
2020-08-11 20:09:22 +02:00
if ( ex . getCause ( ) ! = null & & settings . isDebug ( ) ) {
ex . getCause ( ) . printStackTrace ( ) ;
}
2015-04-15 06:06:16 +02:00
return true ;
2020-10-03 19:46:05 +02:00
} catch ( final Exception ex ) {
2015-04-15 06:06:16 +02:00
showError ( sender , ex , commandLabel ) ;
2015-09-30 03:56:04 +02:00
if ( settings . isDebug ( ) ) {
2015-04-21 00:49:23 +02:00
ex . printStackTrace ( ) ;
}
2015-04-15 06:06:16 +02:00
return true ;
}
2020-10-03 19:46:05 +02:00
} catch ( final Throwable ex ) {
2015-04-15 06:06:16 +02:00
LOGGER . log ( Level . SEVERE , tl ( " commandFailed " , commandLabel ) , ex ) ;
return true ;
}
}
public void cleanupOpenInventories ( ) {
2020-10-03 19:46:05 +02:00
for ( final User user : getOnlineUsers ( ) ) {
2015-04-15 06:06:16 +02:00
if ( user . isRecipeSee ( ) ) {
user . getBase ( ) . getOpenInventory ( ) . getTopInventory ( ) . clear ( ) ;
user . getBase ( ) . getOpenInventory ( ) . close ( ) ;
user . setRecipeSee ( false ) ;
}
if ( user . isInvSee ( ) | | user . isEnderSee ( ) ) {
user . getBase ( ) . getOpenInventory ( ) . close ( ) ;
user . setInvSee ( false ) ;
user . setEnderSee ( false ) ;
}
}
}
@Override
public void showError ( final CommandSource sender , final Throwable exception , final String commandLabel ) {
sender . sendMessage ( tl ( " errorWithMessage " , exception . getMessage ( ) ) ) ;
if ( getSettings ( ) . isDebug ( ) ) {
LOGGER . log ( Level . INFO , tl ( " errorCallingCommand " , commandLabel ) , exception ) ;
}
}
@Override
public BukkitScheduler getScheduler ( ) {
return this . getServer ( ) . getScheduler ( ) ;
}
@Override
public IJails getJails ( ) {
return jails ;
}
@Override
public Warps getWarps ( ) {
return warps ;
}
@Override
public Worth getWorth ( ) {
return worth ;
}
@Override
public Backup getBackup ( ) {
return backup ;
}
2018-01-18 09:25:00 +01:00
@Override
public Kits getKits ( ) {
return kits ;
}
2020-07-06 20:53:43 +02:00
@Override
public RandomTeleport getRandomTeleport ( ) {
return randomTeleport ;
}
2021-03-06 17:29:42 +01:00
@Override
public UpdateChecker getUpdateChecker ( ) {
return updateChecker ;
}
2015-04-15 06:06:16 +02:00
@Deprecated
@Override
public User getUser ( final Object base ) {
if ( base instanceof Player ) {
return getUser ( ( Player ) base ) ;
}
if ( base instanceof org . bukkit . OfflinePlayer ) {
return getUser ( ( ( org . bukkit . OfflinePlayer ) base ) . getUniqueId ( ) ) ;
}
if ( base instanceof UUID ) {
return getUser ( ( UUID ) base ) ;
}
if ( base instanceof String ) {
return getOfflineUser ( ( String ) base ) ;
}
return null ;
}
//This will return null if there is not a match.
@Override
public User getUser ( final String base ) {
return getOfflineUser ( base ) ;
}
//This will return null if there is not a match.
@Override
public User getUser ( final UUID base ) {
return userMap . getUser ( base ) ;
}
//This will return null if there is not a match.
@Override
public User getOfflineUser ( final String name ) {
final User user = userMap . getUser ( name ) ;
if ( user ! = null & & user . getBase ( ) instanceof OfflinePlayer ) {
//This code should attempt to use the last known name of a user, if Bukkit returns name as null.
final String lastName = user . getLastAccountName ( ) ;
if ( lastName ! = null ) {
( ( OfflinePlayer ) user . getBase ( ) ) . setName ( lastName ) ;
} else {
( ( OfflinePlayer ) user . getBase ( ) ) . setName ( name ) ;
}
}
return user ;
}
//This will create a new user if there is not a match.
@Override
public User getUser ( final Player base ) {
if ( base = = null ) {
return null ;
}
if ( userMap = = null ) {
LOGGER . log ( Level . WARNING , " Essentials userMap not initialized " ) ;
return null ;
}
User user = userMap . getUser ( base . getUniqueId ( ) ) ;
if ( user = = null ) {
if ( getSettings ( ) . isDebug ( ) ) {
LOGGER . log ( Level . INFO , " Constructing new userfile from base player {0} " , base . getName ( ) ) ;
}
user = new User ( base , this ) ;
} else {
user . update ( base ) ;
}
return user ;
}
2020-10-03 19:46:05 +02:00
private void handleCrash ( final Throwable exception ) {
2015-04-15 06:06:16 +02:00
final PluginManager pm = getServer ( ) . getPluginManager ( ) ;
LOGGER . log ( Level . SEVERE , exception . toString ( ) ) ;
2017-07-03 15:24:43 +02:00
exception . printStackTrace ( ) ;
2015-04-15 06:06:16 +02:00
pm . registerEvents ( new Listener ( ) {
@EventHandler ( priority = EventPriority . LOW )
public void onPlayerJoin ( final PlayerJoinEvent event ) {
event . getPlayer ( ) . sendMessage ( " Essentials failed to load, read the log file. " ) ;
}
} , this ) ;
2020-10-03 19:46:05 +02:00
for ( final Player player : getOnlinePlayers ( ) ) {
2015-04-15 06:06:16 +02:00
player . sendMessage ( " Essentials failed to load, read the log file. " ) ;
}
this . setEnabled ( false ) ;
}
@Override
public World getWorld ( final String name ) {
if ( name . matches ( " [0-9]+ " ) ) {
final int worldId = Integer . parseInt ( name ) ;
if ( worldId < getServer ( ) . getWorlds ( ) . size ( ) ) {
return getServer ( ) . getWorlds ( ) . get ( worldId ) ;
}
}
return getServer ( ) . getWorld ( name ) ;
}
@Override
public void addReloadListener ( final IConf listener ) {
confList . add ( listener ) ;
}
@Override
public int broadcastMessage ( final String message ) {
2020-04-13 15:33:37 +02:00
return broadcastMessage ( null , null , message , true , u - > false ) ;
2015-04-15 06:06:16 +02:00
}
@Override
public int broadcastMessage ( final IUser sender , final String message ) {
2020-04-13 15:33:37 +02:00
return broadcastMessage ( sender , null , message , false , u - > false ) ;
}
@Override
public int broadcastMessage ( final IUser sender , final String message , final Predicate < IUser > shouldExclude ) {
return broadcastMessage ( sender , null , message , false , shouldExclude ) ;
2015-04-15 06:06:16 +02:00
}
@Override
public int broadcastMessage ( final String permission , final String message ) {
2020-04-13 15:33:37 +02:00
return broadcastMessage ( null , permission , message , false , u - > false ) ;
2015-04-15 06:06:16 +02:00
}
2020-04-13 15:33:37 +02:00
private int broadcastMessage ( final IUser sender , final String permission , final String message , final boolean keywords , final Predicate < IUser > shouldExclude ) {
2015-04-15 06:06:16 +02:00
if ( sender ! = null & & sender . isHidden ( ) ) {
return 0 ;
}
IText broadcast = new SimpleTextInput ( message ) ;
final Collection < Player > players = getOnlinePlayers ( ) ;
2020-10-03 19:46:05 +02:00
for ( final Player player : players ) {
2015-04-15 06:06:16 +02:00
final User user = getUser ( player ) ;
if ( ( permission = = null & & ( sender = = null | | ! user . isIgnoredPlayer ( sender ) ) ) | | ( permission ! = null & & user . isAuthorized ( permission ) ) ) {
2020-04-13 15:33:37 +02:00
if ( shouldExclude . test ( user ) ) {
continue ;
}
2015-04-15 06:06:16 +02:00
if ( keywords ) {
broadcast = new KeywordReplacer ( broadcast , new CommandSource ( player ) , this , false ) ;
}
2020-10-03 19:46:05 +02:00
for ( final String messageText : broadcast . getLines ( ) ) {
2015-04-15 06:06:16 +02:00
user . sendMessage ( messageText ) ;
}
}
}
return players . size ( ) ;
}
@Override
public BukkitTask runTaskAsynchronously ( final Runnable run ) {
return this . getScheduler ( ) . runTaskAsynchronously ( this , run ) ;
}
@Override
public BukkitTask runTaskLaterAsynchronously ( final Runnable run , final long delay ) {
return this . getScheduler ( ) . runTaskLaterAsynchronously ( this , run , delay ) ;
}
@Override
public BukkitTask runTaskTimerAsynchronously ( final Runnable run , final long delay , final long period ) {
return this . getScheduler ( ) . runTaskTimerAsynchronously ( this , run , delay , period ) ;
}
@Override
public int scheduleSyncDelayedTask ( final Runnable run ) {
return this . getScheduler ( ) . scheduleSyncDelayedTask ( this , run ) ;
}
@Override
public int scheduleSyncDelayedTask ( final Runnable run , final long delay ) {
return this . getScheduler ( ) . scheduleSyncDelayedTask ( this , run , delay ) ;
}
@Override
public int scheduleSyncRepeatingTask ( final Runnable run , final long delay , final long period ) {
return this . getScheduler ( ) . scheduleSyncRepeatingTask ( this , run , delay , period ) ;
}
@Override
public TNTExplodeListener getTNTListener ( ) {
return tntListener ;
}
@Override
public PermissionsHandler getPermissionsHandler ( ) {
return permissionsHandler ;
}
@Override
public AlternativeCommandsHandler getAlternativeCommandsHandler ( ) {
return alternativeCommandsHandler ;
}
@Override
public IItemDb getItemDb ( ) {
return itemDb ;
}
@Override
public UserMap getUserMap ( ) {
return userMap ;
}
2021-02-15 16:43:10 +01:00
@Override
public BalanceTop getBalanceTop ( ) {
return balanceTop ;
}
2015-04-15 06:06:16 +02:00
@Override
public I18n getI18n ( ) {
return i18n ;
}
@Override
public EssentialsTimer getTimer ( ) {
return timer ;
}
@Override
public List < String > getVanishedPlayers ( ) {
2018-03-25 23:12:36 +02:00
return Collections . unmodifiableList ( new ArrayList < > ( vanishedPlayers ) ) ;
}
@Override
public Collection < String > getVanishedPlayersNew ( ) {
2015-04-15 06:06:16 +02:00
return vanishedPlayers ;
}
@Override
public Collection < Player > getOnlinePlayers ( ) {
2020-08-11 20:09:22 +02:00
return ( Collection < Player > ) getServer ( ) . getOnlinePlayers ( ) ;
2015-04-15 06:06:16 +02:00
}
@Override
2020-08-31 20:11:07 +02:00
public Iterable < User > getOnlineUsers ( ) {
2020-10-03 19:46:05 +02:00
final List < User > onlineUsers = new ArrayList < > ( ) ;
for ( final Player player : getOnlinePlayers ( ) ) {
2020-08-11 20:09:22 +02:00
onlineUsers . add ( getUser ( player ) ) ;
}
return onlineUsers ;
2015-04-15 06:06:16 +02:00
}
2015-06-02 15:32:10 +02:00
@Override
2020-08-05 21:47:42 +02:00
public SpawnerItemProvider getSpawnerItemProvider ( ) {
return spawnerItemProvider ;
}
@Override
public SpawnerBlockProvider getSpawnerBlockProvider ( ) {
return spawnerBlockProvider ;
2015-06-02 15:32:10 +02:00
}
2016-03-10 17:28:08 +01:00
@Override
public SpawnEggProvider getSpawnEggProvider ( ) {
return spawnEggProvider ;
}
2016-03-29 01:42:33 +02:00
@Override
public PotionMetaProvider getPotionMetaProvider ( ) {
return potionMetaProvider ;
}
2019-12-23 00:38:26 +01:00
@Override
public CustomItemResolver getCustomItemResolver ( ) {
return customItemResolver ;
}
2020-06-24 23:00:59 +02:00
@Override
public ServerStateProvider getServerStateProvider ( ) {
return serverStateProvider ;
}
2021-02-05 19:57:32 +01:00
public MaterialTagProvider getMaterialTagProvider ( ) {
return materialTagProvider ;
}
2020-10-05 15:45:33 +02:00
@Override
public ContainerProvider getContainerProvider ( ) {
return containerProvider ;
}
2020-10-19 16:27:40 +02:00
@Override
public KnownCommandsProvider getKnownCommandsProvider ( ) {
return knownCommandsProvider ;
}
2021-02-20 17:30:07 +01:00
@Override
public FormattedCommandAliasProvider getFormattedCommandAliasProvider ( ) {
return formattedCommandAliasProvider ;
}
2021-04-08 03:37:21 +02:00
@Override
public SyncCommandsProvider getSyncCommandsProvider ( ) {
return syncCommandsProvider ;
}
@Override
public PluginCommand getPluginCommand ( final String cmd ) {
return this . getCommand ( cmd ) ;
}
2020-10-03 19:46:05 +02:00
private AbstractItemDb getItemDbFromConfig ( ) {
final String setting = settings . getItemDbType ( ) ;
2018-04-29 16:49:49 +02:00
2020-10-03 19:46:05 +02:00
if ( setting . equalsIgnoreCase ( " json " ) ) {
return new FlatItemDb ( this ) ;
} else if ( setting . equalsIgnoreCase ( " csv " ) ) {
return new LegacyItemDb ( this ) ;
} else {
final VersionUtil . BukkitVersion version = VersionUtil . getServerBukkitVersion ( ) ;
if ( version . isHigherThanOrEqualTo ( VersionUtil . v1_13_0_R01 ) ) {
return new FlatItemDb ( this ) ;
} else {
return new LegacyItemDb ( this ) ;
}
2018-04-29 16:49:49 +02:00
}
}
2015-04-15 06:06:16 +02:00
private static class EssentialsWorldListener implements Listener , Runnable {
private transient final IEssentials ess ;
2020-10-03 19:46:05 +02:00
EssentialsWorldListener ( final IEssentials ess ) {
2015-04-15 06:06:16 +02:00
this . ess = ess ;
}
@EventHandler ( priority = EventPriority . LOW )
public void onWorldLoad ( final WorldLoadEvent event ) {
2020-10-19 21:38:55 +02:00
PermissionsDefaults . registerBackDefaultFor ( event . getWorld ( ) ) ;
2018-04-29 16:49:49 +02:00
2015-04-15 06:06:16 +02:00
ess . getJails ( ) . onReload ( ) ;
ess . getWarps ( ) . reloadConfig ( ) ;
2020-10-03 19:46:05 +02:00
for ( final IConf iConf : ( ( Essentials ) ess ) . confList ) {
2015-04-15 06:06:16 +02:00
if ( iConf instanceof IEssentialsModule ) {
iConf . reloadConfig ( ) ;
}
}
}
@EventHandler ( priority = EventPriority . LOW )
public void onWorldUnload ( final WorldUnloadEvent event ) {
ess . getJails ( ) . onReload ( ) ;
ess . getWarps ( ) . reloadConfig ( ) ;
2020-10-03 19:46:05 +02:00
for ( final IConf iConf : ( ( Essentials ) ess ) . confList ) {
2015-04-15 06:06:16 +02:00
if ( iConf instanceof IEssentialsModule ) {
iConf . reloadConfig ( ) ;
}
}
}
@Override
public void run ( ) {
ess . reload ( ) ;
}
}
2011-03-30 06:03:21 +02:00
}