2010-12-21 17:52:15 +01:00
package org.bukkit.craftbukkit ;
2011-07-17 18:19:41 +02:00
import java.io.FileNotFoundException ;
2011-06-06 15:52:02 +02:00
import org.bukkit.generator.ChunkGenerator ;
2011-03-31 03:35:08 +02:00
import com.avaje.ebean.config.DataSourceConfig ;
import com.avaje.ebean.config.ServerConfig ;
import com.avaje.ebean.config.dbplatform.SQLitePlatform ;
import com.avaje.ebeaninternal.server.lib.sql.TransactionIsolation ;
2011-09-25 05:21:35 +02:00
import com.google.common.collect.MapMaker ;
2011-04-21 16:43:09 +02:00
import net.minecraft.server.IWorldAccess ;
2011-06-06 15:52:02 +02:00
import org.bukkit.World.Environment ;
2011-01-29 22:04:02 +01:00
import org.bukkit.command.* ;
2011-01-15 22:21:05 +01:00
import org.bukkit.entity.Player ;
2011-03-26 23:20:35 +01:00
import org.bukkit.event.world.WorldLoadEvent ;
2011-06-07 08:54:14 +02:00
import org.bukkit.event.world.WorldSaveEvent ;
import org.bukkit.event.world.WorldUnloadEvent ;
2011-04-16 04:11:13 +02:00
import org.bukkit.inventory.FurnaceRecipe ;
import org.bukkit.inventory.Recipe ;
import org.bukkit.inventory.ShapedRecipe ;
import org.bukkit.inventory.ShapelessRecipe ;
2011-03-26 23:20:35 +01:00
2010-12-24 18:24:21 +01:00
import java.io.File ;
2011-07-17 18:19:41 +02:00
import java.io.FileInputStream ;
2011-08-13 03:13:35 +02:00
import java.io.IOException ;
2011-01-07 03:42:53 +01:00
import java.util.ArrayList ;
2011-09-03 02:59:28 +02:00
import java.util.HashSet ;
2011-02-09 21:25:14 +01:00
import java.util.LinkedHashMap ;
2010-12-22 16:22:23 +01:00
import java.util.List ;
2011-02-08 13:03:36 +01:00
import java.util.Map ;
2011-07-13 06:06:07 +02:00
import java.util.UUID ;
2011-07-17 18:19:41 +02:00
import java.util.Set ;
2010-12-24 18:24:21 +01:00
import java.util.logging.Level ;
import java.util.logging.Logger ;
2011-02-25 17:12:38 +01:00
import jline.ConsoleReader ;
2011-02-23 03:37:56 +01:00
import net.minecraft.server.ChunkCoordinates ;
2011-02-24 13:07:33 +01:00
import net.minecraft.server.ConvertProgressUpdater ;
import net.minecraft.server.Convertable ;
2011-01-29 22:50:29 +01:00
import net.minecraft.server.EntityPlayer ;
2011-05-26 14:48:22 +02:00
import net.minecraft.server.EntityTracker ;
2011-06-07 08:54:14 +02:00
import net.minecraft.server.IProgressUpdate ;
2010-12-27 03:13:03 +01:00
import net.minecraft.server.MinecraftServer ;
2011-01-20 04:53:43 +01:00
import net.minecraft.server.PropertyManager ;
2010-12-27 03:13:03 +01:00
import net.minecraft.server.ServerConfigurationManager ;
2011-02-23 03:37:56 +01:00
import net.minecraft.server.ServerNBTManager ;
2011-02-24 13:07:33 +01:00
import net.minecraft.server.WorldLoaderServer ;
2011-02-07 02:59:06 +01:00
import net.minecraft.server.WorldManager ;
2011-02-05 19:15:04 +01:00
import net.minecraft.server.WorldServer ;
2011-03-12 19:23:57 +01:00
import net.minecraft.server.ServerCommand ;
2011-08-13 04:47:47 +02:00
import net.minecraft.server.Item ;
import net.minecraft.server.ItemStack ;
import net.minecraft.server.WorldMap ;
import net.minecraft.server.WorldMapCollection ;
2011-09-15 02:23:52 +02:00
import net.minecraft.server.WorldSettings ;
2010-12-22 16:22:23 +01:00
import org.bukkit.* ;
2011-10-10 22:10:48 +02:00
import org.bukkit.configuration.ConfigurationSection ;
import org.bukkit.configuration.file.YamlConfiguration ;
import org.bukkit.configuration.serialization.ConfigurationSerialization ;
2011-09-02 23:24:28 +02:00
import org.bukkit.permissions.Permissible ;
2011-01-03 03:25:09 +01:00
import org.bukkit.plugin.Plugin ;
2010-12-24 18:24:21 +01:00
import org.bukkit.plugin.PluginManager ;
2011-05-02 20:31:02 +02:00
import org.bukkit.plugin.ServicesManager ;
2010-12-25 16:42:17 +01:00
import org.bukkit.plugin.SimplePluginManager ;
2011-05-02 20:31:02 +02:00
import org.bukkit.plugin.SimpleServicesManager ;
2010-12-24 18:24:21 +01:00
import org.bukkit.plugin.java.JavaPluginLoader ;
2011-02-03 00:53:04 +01:00
import org.bukkit.scheduler.BukkitScheduler ;
2011-04-16 04:11:13 +02:00
import org.bukkit.craftbukkit.inventory.CraftFurnaceRecipe ;
import org.bukkit.craftbukkit.inventory.CraftRecipe ;
import org.bukkit.craftbukkit.inventory.CraftShapedRecipe ;
import org.bukkit.craftbukkit.inventory.CraftShapelessRecipe ;
2011-08-13 04:47:47 +02:00
import org.bukkit.craftbukkit.map.CraftMapView ;
2011-04-28 21:10:39 +02:00
import org.bukkit.scheduler.BukkitWorker ;
2011-02-03 00:53:04 +01:00
import org.bukkit.craftbukkit.scheduler.CraftScheduler ;
2011-09-02 20:19:50 +02:00
import org.bukkit.util.permissions.DefaultPermissions ;
2011-06-06 15:52:02 +02:00
import org.bukkit.event.world.WorldInitEvent ;
2011-07-17 18:19:41 +02:00
import org.bukkit.permissions.Permission ;
2011-06-22 18:46:12 +02:00
import org.bukkit.plugin.PluginLoadOrder ;
2011-07-17 18:19:41 +02:00
import org.yaml.snakeyaml.Yaml ;
import org.yaml.snakeyaml.constructor.SafeConstructor ;
import org.yaml.snakeyaml.error.MarkedYAMLException ;
2010-12-21 17:52:15 +01:00
2011-01-20 04:53:43 +01:00
public final class CraftServer implements Server {
2010-12-24 18:24:21 +01:00
private final String serverName = " Craftbukkit " ;
2011-02-01 22:55:30 +01:00
private final String serverVersion ;
2011-09-15 19:01:13 +02:00
private final String protocolVersion = " 1.8.1 " ;
2011-05-02 20:31:02 +02:00
private final ServicesManager servicesManager = new SimpleServicesManager ( ) ;
2011-06-12 01:12:43 +02:00
private final BukkitScheduler scheduler = new CraftScheduler ( this ) ;
2011-06-17 05:09:43 +02:00
private final SimpleCommandMap commandMap = new SimpleCommandMap ( this ) ;
2011-06-26 03:46:04 +02:00
private final PluginManager pluginManager = new SimplePluginManager ( this , commandMap ) ;
2010-12-22 16:22:23 +01:00
protected final MinecraftServer console ;
2010-12-26 03:20:29 +01:00
protected final ServerConfigurationManager server ;
2011-02-09 21:25:14 +01:00
private final Map < String , World > worlds = new LinkedHashMap < String , World > ( ) ;
2011-10-10 22:10:48 +02:00
private YamlConfiguration configuration ;
2011-07-17 18:19:41 +02:00
private final Yaml yaml = new Yaml ( new SafeConstructor ( ) ) ;
2011-09-25 05:21:35 +02:00
private final Map < String , OfflinePlayer > offlinePlayers = new MapMaker ( ) . softValues ( ) . makeMap ( ) ;
2010-12-22 16:22:23 +01:00
2011-10-10 22:10:48 +02:00
static {
ConfigurationSerialization . registerClass ( CraftOfflinePlayer . class ) ;
}
2011-01-03 20:41:23 +01:00
public CraftServer ( MinecraftServer console , ServerConfigurationManager server ) {
this . console = console ;
this . server = server ;
2011-02-01 22:55:30 +01:00
this . serverVersion = CraftServer . class . getPackage ( ) . getImplementationVersion ( ) ;
2010-12-24 18:24:21 +01:00
2011-03-30 15:55:42 +02:00
Bukkit . setServer ( this ) ;
2011-10-10 22:10:48 +02:00
configuration = YamlConfiguration . loadConfiguration ( getConfigFile ( ) ) ;
configuration . options ( ) . copyDefaults ( true ) ;
configuration . setDefaults ( YamlConfiguration . loadConfiguration ( getClass ( ) . getClassLoader ( ) . getResourceAsStream ( " configurations/bukkit.yml " ) ) ) ;
saveConfig ( ) ;
2011-06-22 18:46:12 +02:00
loadPlugins ( ) ;
enablePlugins ( PluginLoadOrder . STARTUP ) ;
2011-07-26 18:03:52 +02:00
ChunkCompressionThread . startThread ( ) ;
2011-03-31 03:35:08 +02:00
}
2011-10-10 22:10:48 +02:00
private File getConfigFile ( ) {
return ( File ) console . options . valueOf ( " bukkit-settings " ) ;
}
private void saveConfig ( ) {
try {
configuration . save ( getConfigFile ( ) ) ;
} catch ( IOException ex ) {
Logger . getLogger ( CraftServer . class . getName ( ) ) . log ( Level . SEVERE , " Could not save " + getConfigFile ( ) , ex ) ;
2011-06-17 05:09:43 +02:00
}
2011-01-06 19:33:59 +01:00
}
2011-01-17 21:50:37 +01:00
2011-01-06 19:33:59 +01:00
public void loadPlugins ( ) {
2011-03-07 19:58:19 +01:00
pluginManager . registerInterface ( JavaPluginLoader . class ) ;
2011-06-12 01:12:43 +02:00
File pluginFolder = ( File ) console . options . valueOf ( " plugins " ) ;
2011-01-03 03:25:09 +01:00
2010-12-24 20:04:35 +01:00
if ( pluginFolder . exists ( ) ) {
2011-06-22 18:46:12 +02:00
Plugin [ ] plugins = pluginManager . loadPlugins ( pluginFolder ) ;
for ( Plugin plugin : plugins ) {
try {
plugin . onLoad ( ) ;
} catch ( Throwable ex ) {
Logger . getLogger ( CraftServer . class . getName ( ) ) . log ( Level . SEVERE , ex . getMessage ( ) + " initializing " + plugin . getDescription ( ) . getFullName ( ) + " (Is it up to date?) " , ex ) ;
2011-03-12 18:38:10 +01:00
}
2010-12-24 20:04:35 +01:00
}
} else {
pluginFolder . mkdir ( ) ;
2010-12-24 18:24:21 +01:00
}
2010-12-21 17:52:15 +01:00
}
2011-06-22 18:46:12 +02:00
public void enablePlugins ( PluginLoadOrder type ) {
Plugin [ ] plugins = pluginManager . getPlugins ( ) ;
2011-06-24 01:57:46 +02:00
2011-06-22 18:46:12 +02:00
for ( Plugin plugin : plugins ) {
if ( ( ! plugin . isEnabled ( ) ) & & ( plugin . getDescription ( ) . getLoad ( ) = = type ) ) {
loadPlugin ( plugin ) ;
}
}
2011-06-24 01:57:46 +02:00
if ( type = = PluginLoadOrder . POSTWORLD ) {
commandMap . registerServerAliases ( ) ;
2011-07-17 18:19:41 +02:00
loadCustomPermissions ( ) ;
2011-08-18 15:04:59 +02:00
DefaultPermissions . registerCorePermissions ( ) ;
2011-06-24 01:57:46 +02:00
}
2011-06-22 18:46:12 +02:00
}
2011-01-27 22:15:41 +01:00
public void disablePlugins ( ) {
pluginManager . disablePlugins ( ) ;
}
2011-01-18 01:13:45 +01:00
private void loadPlugin ( Plugin plugin ) {
2011-02-27 15:55:29 +01:00
try {
pluginManager . enablePlugin ( plugin ) ;
2011-07-17 18:19:41 +02:00
List < Permission > perms = plugin . getDescription ( ) . getPermissions ( ) ;
for ( Permission perm : perms ) {
try {
pluginManager . addPermission ( perm ) ;
} catch ( IllegalArgumentException ex ) {
getLogger ( ) . log ( Level . WARNING , " Plugin " + plugin . getDescription ( ) . getFullName ( ) + " tried to register permission ' " + perm . getName ( ) + " ' but it's already registered " , ex ) ;
}
}
2011-02-27 15:55:29 +01:00
} catch ( Throwable ex ) {
Logger . getLogger ( CraftServer . class . getName ( ) ) . log ( Level . SEVERE , ex . getMessage ( ) + " loading " + plugin . getDescription ( ) . getFullName ( ) + " (Is it up to date?) " , ex ) ;
}
2011-01-18 01:13:45 +01:00
}
2010-12-21 17:52:15 +01:00
public String getName ( ) {
2010-12-22 16:22:23 +01:00
return serverName ;
2010-12-21 17:52:15 +01:00
}
public String getVersion ( ) {
2011-02-01 22:47:28 +01:00
return serverVersion + " (MC: " + protocolVersion + " ) " ;
2010-12-22 16:22:23 +01:00
}
2011-07-17 15:34:40 +02:00
@SuppressWarnings ( " unchecked " )
2010-12-22 16:22:23 +01:00
public Player [ ] getOnlinePlayers ( ) {
2011-04-20 19:05:14 +02:00
List < EntityPlayer > online = server . players ;
2010-12-22 16:22:23 +01:00
Player [ ] players = new Player [ online . size ( ) ] ;
for ( int i = 0 ; i < players . length ; i + + ) {
2011-04-20 19:05:14 +02:00
players [ i ] = online . get ( i ) . netServerHandler . getPlayer ( ) ;
2010-12-22 16:22:23 +01:00
}
return players ;
2010-12-21 17:52:15 +01:00
}
2011-01-03 01:16:00 +01:00
public Player getPlayer ( final String name ) {
Player [ ] players = getOnlinePlayers ( ) ;
2011-01-17 21:50:37 +01:00
Player found = null ;
String lowerName = name . toLowerCase ( ) ;
int delta = Integer . MAX_VALUE ;
2011-01-03 01:16:00 +01:00
for ( Player player : players ) {
2011-01-17 21:50:37 +01:00
if ( player . getName ( ) . toLowerCase ( ) . startsWith ( lowerName ) ) {
int curDelta = player . getName ( ) . length ( ) - lowerName . length ( ) ;
if ( curDelta < delta ) {
found = player ;
delta = curDelta ;
}
2011-03-11 22:25:35 +01:00
if ( curDelta = = 0 ) break ;
2011-01-03 01:16:00 +01:00
}
}
2011-01-17 21:50:37 +01:00
return found ;
2011-01-03 01:16:00 +01:00
}
2011-01-17 21:50:37 +01:00
2011-09-03 16:57:54 +02:00
public Player getPlayerExact ( String name ) {
String lname = name . toLowerCase ( ) ;
for ( Player player : getOnlinePlayers ( ) ) {
if ( player . getName ( ) . equalsIgnoreCase ( lname ) ) {
return player ;
}
}
return null ;
}
2011-01-15 22:40:15 +01:00
public int broadcastMessage ( String message ) {
2011-09-02 23:24:28 +02:00
return broadcast ( message , BROADCAST_CHANNEL_USERS ) ;
2011-01-15 22:40:15 +01:00
}
2011-01-03 01:16:00 +01:00
2011-01-29 22:50:29 +01:00
public Player getPlayer ( final EntityPlayer entity ) {
2011-04-20 19:05:14 +02:00
return entity . netServerHandler . getPlayer ( ) ;
2010-12-26 03:20:29 +01:00
}
2011-01-17 21:50:37 +01:00
2011-01-07 03:42:53 +01:00
public List < Player > matchPlayer ( String partialName ) {
List < Player > matchedPlayers = new ArrayList < Player > ( ) ;
2011-01-17 21:50:37 +01:00
2011-01-06 06:10:28 +01:00
for ( Player iterPlayer : this . getOnlinePlayers ( ) ) {
String iterPlayerName = iterPlayer . getName ( ) ;
2011-01-07 03:42:53 +01:00
if ( partialName . equalsIgnoreCase ( iterPlayerName ) ) {
2011-01-06 06:10:28 +01:00
// Exact match
2011-01-10 09:30:34 +01:00
matchedPlayers . clear ( ) ;
matchedPlayers . add ( iterPlayer ) ;
break ;
}
2011-01-07 03:42:53 +01:00
if ( iterPlayerName . toLowerCase ( ) . indexOf ( partialName . toLowerCase ( ) ) ! = - 1 ) {
2011-01-10 09:30:34 +01:00
// Partial match
2011-01-07 03:42:53 +01:00
matchedPlayers . add ( iterPlayer ) ;
2011-01-06 06:10:28 +01:00
}
}
2011-01-07 03:42:53 +01:00
return matchedPlayers ;
2011-01-06 06:10:28 +01:00
}
2010-12-26 03:20:29 +01:00
2011-02-04 07:12:33 +01:00
public int getMaxPlayers ( ) {
2011-04-20 19:05:14 +02:00
return server . maxPlayers ;
2011-02-04 07:12:33 +01:00
}
2011-02-06 13:30:50 +01:00
2011-03-12 19:23:57 +01:00
// NOTE: These are dependent on the corrisponding call in MinecraftServer
// so if that changes this will need to as well
public int getPort ( ) {
return this . getConfigInt ( " server-port " , 25565 ) ;
}
2011-08-15 20:27:02 +02:00
public int getViewDistance ( ) {
return this . getConfigInt ( " view-distance " , 10 ) ;
}
2011-03-12 19:23:57 +01:00
public String getIp ( ) {
return this . getConfigString ( " server-ip " , " " ) ;
}
2011-03-26 09:39:23 +01:00
public String getServerName ( ) {
2011-03-12 19:23:57 +01:00
return this . getConfigString ( " server-name " , " Unknown Server " ) ;
}
2011-03-26 09:39:23 +01:00
public String getServerId ( ) {
return this . getConfigString ( " server-id " , " unnamed " ) ;
}
2011-08-08 02:25:46 +02:00
public boolean getAllowNether ( ) {
return this . getConfigBoolean ( " allow-nether " , true ) ;
}
public boolean hasWhitelist ( ) {
return this . getConfigBoolean ( " white-list " , false ) ;
}
2011-03-12 19:23:57 +01:00
// NOTE: Temporary calls through to server.properies until its replaced
2011-03-26 09:39:23 +01:00
private String getConfigString ( String variable , String defaultValue ) {
2011-04-20 19:05:14 +02:00
return this . console . propertyManager . getString ( variable , defaultValue ) ;
2011-03-12 19:23:57 +01:00
}
2011-03-26 09:39:23 +01:00
private int getConfigInt ( String variable , int defaultValue ) {
2011-04-20 19:05:14 +02:00
return this . console . propertyManager . getInt ( variable , defaultValue ) ;
2011-03-12 19:23:57 +01:00
}
2011-03-26 09:39:23 +01:00
2011-08-08 02:25:46 +02:00
private boolean getConfigBoolean ( String variable , boolean defaultValue ) {
return this . console . propertyManager . getBoolean ( variable , defaultValue ) ;
}
2011-03-12 19:23:57 +01:00
// End Temporary calls
2011-05-05 22:57:22 +02:00
public String getUpdateFolder ( ) {
return this . configuration . getString ( " settings.update-folder " , " update " ) ;
}
2011-09-25 03:22:06 +02:00
public File getUpdateFolderFile ( ) {
return new File ( ( File ) console . options . valueOf ( " plugins " ) , this . configuration . getString ( " settings.update-folder " , " update " ) ) ;
}
2011-09-17 02:57:43 +02:00
public int getPingPacketLimit ( ) {
return this . configuration . getInt ( " settings.ping-packet-limit " , 100 ) ;
}
2010-12-24 18:24:21 +01:00
public PluginManager getPluginManager ( ) {
return pluginManager ;
}
2010-12-27 03:13:03 +01:00
2011-02-03 00:53:04 +01:00
public BukkitScheduler getScheduler ( ) {
return scheduler ;
}
2011-05-02 20:31:02 +02:00
public ServicesManager getServicesManager ( ) {
return servicesManager ;
}
2011-02-07 02:59:06 +01:00
public List < World > getWorlds ( ) {
2011-02-08 13:03:36 +01:00
return new ArrayList < World > ( worlds . values ( ) ) ;
2010-12-27 03:13:03 +01:00
}
2010-12-30 05:30:12 +01:00
public ServerConfigurationManager getHandle ( ) {
return server ;
}
2011-01-16 16:35:37 +01:00
2011-03-12 19:23:57 +01:00
// NOTE: Should only be called from MinecraftServer.b()
public boolean dispatchCommand ( CommandSender sender , ServerCommand serverCommand ) {
2011-09-03 16:57:54 +02:00
return dispatchCommand ( sender , serverCommand . command ) ;
2011-03-12 19:23:57 +01:00
}
2011-01-29 22:04:02 +01:00
public boolean dispatchCommand ( CommandSender sender , String commandLine ) {
2011-03-12 19:23:57 +01:00
if ( commandMap . dispatch ( sender , commandLine ) ) {
return true ;
}
2011-08-13 04:47:47 +02:00
2011-09-03 16:57:54 +02:00
sender . sendMessage ( " Unknown command. Type \" help \" for help. " ) ;
2011-03-12 19:23:57 +01:00
2011-09-03 16:57:54 +02:00
return false ;
2011-01-16 16:35:37 +01:00
}
2011-01-20 04:53:43 +01:00
public void reload ( ) {
2011-10-10 22:10:48 +02:00
configuration = YamlConfiguration . loadConfiguration ( getConfigFile ( ) ) ;
2011-01-20 04:53:43 +01:00
PropertyManager config = new PropertyManager ( console . options ) ;
2011-04-20 19:05:14 +02:00
console . propertyManager = config ;
2011-01-29 22:04:02 +01:00
2011-05-22 21:29:55 +02:00
boolean animals = config . getBoolean ( " spawn-animals " , console . spawnAnimals ) ;
2011-09-24 23:03:31 +02:00
boolean monsters = config . getBoolean ( " spawn-monsters " , console . worlds . get ( 0 ) . difficulty > 0 ) ;
2011-10-03 16:08:38 +02:00
int difficulty = config . getInt ( " difficulty " , console . worlds . get ( 0 ) . difficulty ) ;
2011-01-20 04:53:43 +01:00
2011-04-20 19:05:14 +02:00
console . onlineMode = config . getBoolean ( " online-mode " , console . onlineMode ) ;
console . spawnAnimals = config . getBoolean ( " spawn-animals " , console . spawnAnimals ) ;
console . pvpMode = config . getBoolean ( " pvp " , console . pvpMode ) ;
2011-06-27 00:25:01 +02:00
console . allowFlight = config . getBoolean ( " allow-flight " , console . allowFlight ) ;
2011-01-20 04:53:43 +01:00
2011-02-05 19:15:04 +01:00
for ( WorldServer world : console . worlds ) {
2011-10-03 16:08:38 +02:00
world . difficulty = difficulty ;
2011-04-20 19:05:14 +02:00
world . setSpawnFlags ( monsters , animals ) ;
2011-02-05 19:15:04 +01:00
}
2011-01-28 15:18:49 +01:00
pluginManager . clearPlugins ( ) ;
commandMap . clearCommands ( ) ;
2011-04-28 21:10:39 +02:00
int pollCount = 0 ;
// Wait for at most 2.5 seconds for plugins to close their threads
2011-06-12 01:12:43 +02:00
while ( pollCount < 50 & & getScheduler ( ) . getActiveWorkers ( ) . size ( ) > 0 ) {
2011-04-28 21:10:39 +02:00
try {
Thread . sleep ( 50 ) ;
2011-06-12 01:12:43 +02:00
} catch ( InterruptedException e ) { }
2011-04-28 21:10:39 +02:00
pollCount + + ;
}
List < BukkitWorker > overdueWorkers = getScheduler ( ) . getActiveWorkers ( ) ;
2011-06-12 01:12:43 +02:00
for ( BukkitWorker worker : overdueWorkers ) {
2011-04-28 21:10:39 +02:00
Plugin plugin = worker . getOwner ( ) ;
String author = " <NoAuthorGiven> " ;
if ( plugin . getDescription ( ) . getAuthors ( ) . size ( ) > 0 ) {
author = plugin . getDescription ( ) . getAuthors ( ) . get ( 0 ) ;
}
getLogger ( ) . log ( Level . SEVERE , String . format (
" Nag author: '%s' of '%s' about the following: %s " ,
author ,
plugin . getDescription ( ) . getName ( ) ,
" This plugin is not properly shutting down its async tasks when it is being reloaded. This may cause conflicts with the newly loaded version of the plugin "
) ) ;
}
2011-01-28 15:18:49 +01:00
loadPlugins ( ) ;
2011-06-22 18:46:12 +02:00
enablePlugins ( PluginLoadOrder . STARTUP ) ;
enablePlugins ( PluginLoadOrder . POSTWORLD ) ;
2011-01-20 04:53:43 +01:00
}
2011-02-02 19:23:19 +01:00
2011-07-17 18:19:41 +02:00
private void loadCustomPermissions ( ) {
File file = new File ( configuration . getString ( " settings.permissions-file " ) ) ;
FileInputStream stream ;
try {
stream = new FileInputStream ( file ) ;
} catch ( FileNotFoundException ex ) {
try {
file . createNewFile ( ) ;
} finally {
return ;
}
}
Map < String , Map < String , Object > > perms ;
try {
perms = ( Map < String , Map < String , Object > > ) yaml . load ( stream ) ;
} catch ( MarkedYAMLException ex ) {
getLogger ( ) . log ( Level . WARNING , " Server permissions file " + file + " is not valid YAML: " + ex . toString ( ) ) ;
return ;
} catch ( Throwable ex ) {
getLogger ( ) . log ( Level . WARNING , " Server permissions file " + file + " is not valid YAML. " , ex ) ;
return ;
2011-08-13 03:13:35 +02:00
} finally {
try {
stream . close ( ) ;
} catch ( IOException ex ) { }
2011-07-17 18:19:41 +02:00
}
if ( perms = = null ) {
getLogger ( ) . log ( Level . INFO , " Server permissions file " + file + " is empty, ignoring it " ) ;
return ;
}
Set < String > keys = perms . keySet ( ) ;
for ( String name : keys ) {
try {
pluginManager . addPermission ( Permission . loadPermission ( name , perms . get ( name ) ) ) ;
} catch ( Throwable ex ) {
Bukkit . getServer ( ) . getLogger ( ) . log ( Level . SEVERE , " Permission node ' " + name + " ' in server config is invalid " , ex ) ;
}
}
}
2011-02-02 19:23:19 +01:00
@Override
public String toString ( ) {
2011-03-12 19:23:57 +01:00
return " CraftServer{ " + " serverName= " + serverName + " ,serverVersion= " + serverVersion + " ,protocolVersion= " + protocolVersion + '}' ;
2011-02-02 19:23:19 +01:00
}
2011-02-05 21:51:22 +01:00
2011-02-06 21:50:57 +01:00
public World createWorld ( String name , World . Environment environment ) {
2011-09-25 02:05:10 +02:00
return WorldCreator . name ( name ) . environment ( environment ) . createWorld ( ) ;
2011-03-31 22:40:00 +02:00
}
public World createWorld ( String name , World . Environment environment , long seed ) {
2011-09-25 02:05:10 +02:00
return WorldCreator . name ( name ) . environment ( environment ) . seed ( seed ) . createWorld ( ) ;
2011-06-06 15:52:02 +02:00
}
public World createWorld ( String name , Environment environment , ChunkGenerator generator ) {
2011-09-25 02:05:10 +02:00
return WorldCreator . name ( name ) . environment ( environment ) . generator ( generator ) . createWorld ( ) ;
2011-06-06 15:52:02 +02:00
}
public World createWorld ( String name , Environment environment , long seed , ChunkGenerator generator ) {
2011-09-25 02:05:10 +02:00
return WorldCreator . name ( name ) . environment ( environment ) . seed ( seed ) . generator ( generator ) . createWorld ( ) ;
}
public World createWorld ( WorldCreator creator ) {
if ( creator = = null ) {
throw new IllegalArgumentException ( " Creator may not be null " ) ;
}
String name = creator . name ( ) ;
ChunkGenerator generator = creator . generator ( ) ;
2011-02-05 21:51:22 +01:00
File folder = new File ( name ) ;
2011-02-08 13:03:36 +01:00
World world = getWorld ( name ) ;
if ( world ! = null ) {
return world ;
}
2011-03-12 19:23:57 +01:00
2011-02-05 21:51:22 +01:00
if ( ( folder . exists ( ) ) & & ( ! folder . isDirectory ( ) ) ) {
throw new IllegalArgumentException ( " File exists with the name ' " + name + " ' and isn't a folder " ) ;
}
2011-07-08 20:01:03 +02:00
if ( generator = = null ) {
generator = getGenerator ( name ) ;
}
2011-02-24 13:07:33 +01:00
Convertable converter = new WorldLoaderServer ( folder ) ;
2011-04-20 19:05:14 +02:00
if ( converter . isConvertable ( name ) ) {
2011-02-24 13:07:33 +01:00
getLogger ( ) . info ( " Converting world ' " + name + " ' " ) ;
2011-04-20 19:05:14 +02:00
converter . convert ( name , new ConvertProgressUpdater ( console ) ) ;
2011-02-24 13:07:33 +01:00
}
2011-07-07 21:29:57 +02:00
int dimension = 10 + console . worlds . size ( ) ;
2011-09-25 02:05:10 +02:00
WorldServer internal = new WorldServer ( console , new ServerNBTManager ( new File ( " . " ) , name , true ) , name , dimension , new WorldSettings ( creator . seed ( ) , getDefaultGameMode ( ) . getValue ( ) , true ) , creator . environment ( ) , generator ) ;
2011-07-13 09:29:43 +02:00
2011-07-13 21:35:05 +02:00
if ( ! ( worlds . containsKey ( name . toLowerCase ( ) ) ) ) {
2011-07-13 09:29:43 +02:00
return null ;
}
2011-06-27 00:25:01 +02:00
internal . worldMaps = console . worlds . get ( 0 ) . worldMaps ;
2011-02-05 21:51:22 +01:00
2011-05-26 23:15:27 +02:00
internal . tracker = new EntityTracker ( console , dimension ) ;
2011-06-12 01:12:43 +02:00
internal . addIWorldAccess ( ( IWorldAccess ) new WorldManager ( console , internal ) ) ;
2011-09-24 23:03:31 +02:00
internal . difficulty = 1 ;
2011-04-20 19:05:14 +02:00
internal . setSpawnFlags ( true , true ) ;
2011-02-05 21:51:22 +01:00
console . worlds . add ( internal ) ;
2011-06-06 15:52:02 +02:00
if ( generator ! = null ) {
internal . getWorld ( ) . getPopulators ( ) . addAll ( generator . getDefaultPopulators ( internal . getWorld ( ) ) ) ;
}
pluginManager . callEvent ( new WorldInitEvent ( internal . getWorld ( ) ) ) ;
2011-06-18 05:23:34 +02:00
System . out . print ( " Preparing start region for level " + ( console . worlds . size ( ) - 1 ) + " (Seed: " + internal . getSeed ( ) + " ) " ) ;
2011-06-06 15:52:02 +02:00
2011-07-27 01:24:27 +02:00
if ( internal . getWorld ( ) . getKeepSpawnInMemory ( ) ) {
short short1 = 196 ;
long i = System . currentTimeMillis ( ) ;
for ( int j = - short1 ; j < = short1 ; j + = 16 ) {
for ( int k = - short1 ; k < = short1 ; k + = 16 ) {
long l = System . currentTimeMillis ( ) ;
if ( l < i ) {
i = l ;
}
if ( l > i + 1000L ) {
int i1 = ( short1 * 2 + 1 ) * ( short1 * 2 + 1 ) ;
int j1 = ( j + short1 ) * ( short1 * 2 + 1 ) + k + 1 ;
System . out . println ( " Preparing spawn area for " + name + " , " + ( j1 * 100 / i1 ) + " % " ) ;
i = l ;
}
ChunkCoordinates chunkcoordinates = internal . getSpawn ( ) ;
internal . chunkProviderServer . getChunkAt ( chunkcoordinates . x + j > > 4 , chunkcoordinates . z + k > > 4 ) ;
2011-09-15 02:23:52 +02:00
while ( internal . v ( ) ) {
2011-07-27 01:24:27 +02:00
;
}
2011-02-05 21:51:22 +01:00
}
}
}
2011-03-27 05:50:52 +02:00
pluginManager . callEvent ( new WorldLoadEvent ( internal . getWorld ( ) ) ) ;
2011-03-24 22:43:21 +01:00
return internal . getWorld ( ) ;
2011-02-05 21:51:22 +01:00
}
2011-06-07 08:54:14 +02:00
public boolean unloadWorld ( String name , boolean save ) {
return unloadWorld ( getWorld ( name ) , save ) ;
}
public boolean unloadWorld ( World world , boolean save ) {
if ( world = = null ) {
return false ;
}
WorldServer handle = ( ( CraftWorld ) world ) . getHandle ( ) ;
if ( ! ( console . worlds . contains ( handle ) ) ) {
return false ;
}
if ( ! ( handle . dimension > 1 ) ) {
return false ;
}
if ( handle . players . size ( ) > 0 ) {
return false ;
}
WorldUnloadEvent e = new WorldUnloadEvent ( handle . getWorld ( ) ) ;
2011-10-03 05:16:58 +02:00
pluginManager . callEvent ( new WorldUnloadEvent ( handle . getWorld ( ) ) ) ;
2011-06-07 08:54:14 +02:00
if ( e . isCancelled ( ) ) {
return false ;
}
if ( save ) {
handle . save ( true , ( IProgressUpdate ) null ) ;
handle . saveLevel ( ) ;
WorldSaveEvent event = new WorldSaveEvent ( handle . getWorld ( ) ) ;
getPluginManager ( ) . callEvent ( event ) ;
}
worlds . remove ( world . getName ( ) . toLowerCase ( ) ) ;
console . worlds . remove ( console . worlds . indexOf ( handle ) ) ;
return true ;
}
2011-02-05 21:51:22 +01:00
public MinecraftServer getServer ( ) {
return console ;
}
2011-02-08 13:03:36 +01:00
public World getWorld ( String name ) {
return worlds . get ( name . toLowerCase ( ) ) ;
}
2011-07-13 06:06:07 +02:00
public World getWorld ( UUID uid ) {
2011-07-07 20:47:42 +02:00
for ( World world : worlds . values ( ) ) {
2011-07-13 06:06:07 +02:00
if ( world . getUID ( ) . equals ( uid ) ) {
2011-07-05 05:48:27 +02:00
return world ;
}
}
return null ;
}
2011-06-17 04:06:45 +02:00
public void addWorld ( World world ) {
2011-07-13 21:35:05 +02:00
// Check if a World already exists with the UID.
if ( getWorld ( world . getUID ( ) ) ! = null ) {
System . out . println ( " World " + world . getName ( ) + " is a duplicate of another world and has been prevented from loading. Please delete the uid.dat file from " + world . getName ( ) + " 's world directory if you want to be able to load the duplicate world. " ) ;
return ;
}
2011-02-08 13:03:36 +01:00
worlds . put ( world . getName ( ) . toLowerCase ( ) , world ) ;
}
2011-02-20 02:53:06 +01:00
public Logger getLogger ( ) {
2011-04-20 19:05:14 +02:00
return MinecraftServer . log ;
2011-02-20 02:53:06 +01:00
}
2011-02-25 17:12:38 +01:00
public ConsoleReader getReader ( ) {
return console . reader ;
}
2011-02-28 01:31:25 +01:00
public PluginCommand getPluginCommand ( String name ) {
Command command = commandMap . getCommand ( name ) ;
if ( command instanceof PluginCommand ) {
2011-06-12 01:12:43 +02:00
return ( PluginCommand ) command ;
2011-02-28 01:31:25 +01:00
} else {
return null ;
}
}
2011-02-26 03:29:42 +01:00
public void savePlayers ( ) {
2011-04-20 19:05:14 +02:00
server . savePlayers ( ) ;
2011-02-26 03:29:42 +01:00
}
2011-03-12 19:23:57 +01:00
2011-03-31 03:35:08 +02:00
public void configureDbConfig ( ServerConfig config ) {
DataSourceConfig ds = new DataSourceConfig ( ) ;
ds . setDriver ( configuration . getString ( " database.driver " ) ) ;
ds . setUrl ( configuration . getString ( " database.url " ) ) ;
ds . setUsername ( configuration . getString ( " database.username " ) ) ;
ds . setPassword ( configuration . getString ( " database.password " ) ) ;
ds . setIsolationLevel ( TransactionIsolation . getLevel ( configuration . getString ( " database.isolation " ) ) ) ;
if ( ds . getDriver ( ) . contains ( " sqlite " ) ) {
config . setDatabasePlatform ( new SQLitePlatform ( ) ) ;
config . getDatabasePlatform ( ) . getDbDdlSyntax ( ) . setIdentity ( " " ) ;
}
config . setDataSourceConfig ( ds ) ;
}
2011-04-16 04:11:13 +02:00
public boolean addRecipe ( Recipe recipe ) {
CraftRecipe toAdd ;
2011-06-12 01:12:43 +02:00
if ( recipe instanceof CraftRecipe ) {
2011-04-16 04:11:13 +02:00
toAdd = ( CraftRecipe ) recipe ;
} else {
if ( recipe instanceof ShapedRecipe ) {
toAdd = CraftShapedRecipe . fromBukkitRecipe ( ( ShapedRecipe ) recipe ) ;
} else if ( recipe instanceof ShapelessRecipe ) {
toAdd = CraftShapelessRecipe . fromBukkitRecipe ( ( ShapelessRecipe ) recipe ) ;
} else if ( recipe instanceof FurnaceRecipe ) {
toAdd = CraftFurnaceRecipe . fromBukkitRecipe ( ( FurnaceRecipe ) recipe ) ;
} else {
return false ;
}
}
toAdd . addToCraftingManager ( ) ;
return true ;
}
2011-06-17 05:09:43 +02:00
2011-06-22 20:10:29 +02:00
public Map < String , String [ ] > getCommandAliases ( ) {
2011-10-10 22:10:48 +02:00
ConfigurationSection section = configuration . getConfigurationSection ( " aliases " ) ;
2011-07-13 05:14:28 +02:00
Map < String , String [ ] > result = new LinkedHashMap < String , String [ ] > ( ) ;
2011-06-17 05:09:43 +02:00
2011-10-10 22:10:48 +02:00
if ( section ! = null ) {
for ( String key : section . getKeys ( false ) ) {
List < String > commands = null ;
2011-06-22 20:10:29 +02:00
2011-10-10 22:10:48 +02:00
if ( section . isList ( key ) ) {
commands = section . getList ( key ) ;
2011-06-22 20:10:29 +02:00
} else {
2011-10-10 22:10:48 +02:00
commands = new ArrayList < String > ( ) ;
commands . add ( section . getString ( key ) ) ;
2011-06-22 20:10:29 +02:00
}
result . put ( key , commands . toArray ( new String [ 0 ] ) ) ;
2011-06-17 05:09:43 +02:00
}
}
return result ;
}
2011-06-17 05:49:58 +02:00
public int getSpawnRadius ( ) {
return configuration . getInt ( " settings.spawn-radius " , 16 ) ;
}
public void setSpawnRadius ( int value ) {
2011-10-10 22:10:48 +02:00
configuration . set ( " settings.spawn-radius " , value ) ;
saveConfig ( ) ;
2011-06-17 05:49:58 +02:00
}
2011-06-19 12:13:52 +02:00
public boolean getOnlineMode ( ) {
return this . console . onlineMode ;
}
2011-06-22 19:27:27 +02:00
2011-08-08 02:25:46 +02:00
public boolean getAllowFlight ( ) {
return this . console . allowFlight ;
}
2011-06-22 19:27:27 +02:00
public ChunkGenerator getGenerator ( String world ) {
2011-10-10 22:10:48 +02:00
ConfigurationSection section = configuration . getConfigurationSection ( " worlds " ) ;
2011-06-22 19:27:27 +02:00
ChunkGenerator result = null ;
2011-10-10 22:10:48 +02:00
if ( section ! = null ) {
section = section . getConfigurationSection ( world ) ;
2011-06-22 19:27:27 +02:00
2011-10-10 22:10:48 +02:00
if ( section ! = null ) {
String name = section . getString ( " generator " ) ;
2011-06-22 19:27:27 +02:00
2011-06-23 21:41:07 +02:00
if ( ( name ! = null ) & & ( ! name . equals ( " " ) ) ) {
2011-06-22 19:27:27 +02:00
String [ ] split = name . split ( " : " , 2 ) ;
String id = ( split . length > 1 ) ? split [ 1 ] : null ;
Plugin plugin = pluginManager . getPlugin ( split [ 0 ] ) ;
if ( plugin = = null ) {
getLogger ( ) . severe ( " Could not set generator for default world ' " + world + " ': Plugin ' " + split [ 0 ] + " ' does not exist " ) ;
} else if ( ! plugin . isEnabled ( ) ) {
getLogger ( ) . severe ( " Could not set generator for default world ' " + world + " ': Plugin ' " + split [ 0 ] + " ' is not enabled yet (is it load:STARTUP?) " ) ;
} else {
result = plugin . getDefaultWorldGenerator ( world , id ) ;
}
}
}
}
return result ;
}
2011-08-13 04:47:47 +02:00
public CraftMapView getMap ( short id ) {
WorldMapCollection collection = console . worlds . get ( 0 ) . worldMaps ;
WorldMap worldmap = ( WorldMap ) collection . a ( WorldMap . class , " map_ " + id ) ;
if ( worldmap = = null ) {
return null ;
}
return worldmap . mapView ;
}
public CraftMapView createMap ( World world ) {
ItemStack stack = new ItemStack ( Item . MAP , 1 , - 1 ) ;
WorldMap worldmap = Item . MAP . a ( stack , ( ( CraftWorld ) world ) . getHandle ( ) ) ;
return worldmap . mapView ;
}
2011-09-02 21:18:35 +02:00
public void shutdown ( ) {
2011-09-24 23:03:31 +02:00
console . safeShutdown ( ) ;
2011-09-02 21:18:35 +02:00
}
2011-09-02 23:24:28 +02:00
public int broadcast ( String message , String permission ) {
int count = 0 ;
Set < Permissible > permissibles = getPluginManager ( ) . getPermissionSubscriptions ( permission ) ;
for ( Permissible permissible : permissibles ) {
if ( permissible instanceof CommandSender ) {
CommandSender user = ( CommandSender ) permissible ;
user . sendMessage ( message ) ;
count + + ;
}
}
return count ;
}
2011-09-03 01:41:48 +02:00
public OfflinePlayer getOfflinePlayer ( String name ) {
2011-09-09 02:17:53 +02:00
OfflinePlayer result = getPlayerExact ( name ) ;
2011-09-25 05:21:35 +02:00
String lname = name . toLowerCase ( ) ;
2011-09-03 01:41:48 +02:00
if ( result = = null ) {
2011-09-25 05:21:35 +02:00
result = offlinePlayers . get ( lname ) ;
if ( result = = null ) {
result = new CraftOfflinePlayer ( this , name ) ;
offlinePlayers . put ( lname , result ) ;
}
} else {
offlinePlayers . remove ( lname ) ;
2011-09-03 01:41:48 +02:00
}
return result ;
}
2011-09-03 02:59:28 +02:00
public Set < String > getIPBans ( ) {
return new HashSet ( server . banByIP ) ;
}
public void banIP ( String address ) {
2011-09-24 23:03:31 +02:00
server . addIpBan ( address ) ;
2011-09-03 02:59:28 +02:00
}
public void unbanIP ( String address ) {
2011-09-24 23:03:31 +02:00
server . removeIpBan ( address ) ;
2011-09-03 02:59:28 +02:00
}
2011-09-03 03:13:07 +02:00
public Set < OfflinePlayer > getBannedPlayers ( ) {
Set < OfflinePlayer > result = new HashSet < OfflinePlayer > ( ) ;
for ( Object name : server . banByName ) {
result . add ( getOfflinePlayer ( ( String ) name ) ) ;
}
return result ;
}
2011-09-03 16:57:54 +02:00
public void setWhitelist ( boolean value ) {
2011-09-24 23:03:31 +02:00
server . hasWhitelist = value ;
console . propertyManager . setBoolean ( " white-list " , value ) ;
2011-09-03 16:57:54 +02:00
}
public Set < OfflinePlayer > getWhitelistedPlayers ( ) {
Set < OfflinePlayer > result = new HashSet < OfflinePlayer > ( ) ;
2011-09-24 23:03:31 +02:00
for ( Object name : server . getWhitelisted ( ) ) {
2011-09-03 16:57:54 +02:00
result . add ( getOfflinePlayer ( ( String ) name ) ) ;
}
return result ;
}
2011-09-25 04:28:00 +02:00
public Set < OfflinePlayer > getOperators ( ) {
Set < OfflinePlayer > result = new HashSet < OfflinePlayer > ( ) ;
for ( Object name : server . operators ) {
result . add ( getOfflinePlayer ( ( String ) name ) ) ;
}
return result ;
}
2011-09-03 16:57:54 +02:00
public void reloadWhitelist ( ) {
2011-09-24 23:03:31 +02:00
server . reloadWhitelist ( ) ;
2011-09-03 16:57:54 +02:00
}
2011-09-09 02:17:53 +02:00
public GameMode getDefaultGameMode ( ) {
2011-09-24 23:03:31 +02:00
return GameMode . getByValue ( console . worlds . get ( 0 ) . worldData . getGameType ( ) ) ;
2011-09-09 02:17:53 +02:00
}
public void setDefaultGameMode ( GameMode mode ) {
2011-09-15 03:22:20 +02:00
if ( mode = = null ) {
throw new IllegalArgumentException ( " Mode cannot be null " ) ;
}
for ( World world : getWorlds ( ) ) {
2011-09-24 23:03:31 +02:00
( ( CraftWorld ) world ) . getHandle ( ) . worldData . setGameType ( mode . getValue ( ) ) ;
2011-09-15 03:22:20 +02:00
}
2011-09-09 02:17:53 +02:00
}
2011-09-25 00:14:13 +02:00
public ConsoleCommandSender getConsoleSender ( ) {
return console . console ;
}
2011-10-03 01:34:51 +02:00
public void detectListNameConflict ( EntityPlayer entityPlayer ) {
// Collisions will make for invisible people
for ( int i = 0 ; i < getHandle ( ) . players . size ( ) ; + + i ) {
EntityPlayer testEntityPlayer = ( EntityPlayer ) getHandle ( ) . players . get ( i ) ;
// We have a problem!
if ( testEntityPlayer ! = entityPlayer & & testEntityPlayer . listName . equals ( entityPlayer . listName ) ) {
String oldName = entityPlayer . listName ;
int spaceLeft = 16 - oldName . length ( ) ;
if ( spaceLeft < = 1 ) { // We also hit the list name length limit!
entityPlayer . listName = oldName . subSequence ( 0 , oldName . length ( ) - 2 - spaceLeft )
+ String . valueOf ( System . currentTimeMillis ( ) % 99 ) ;
} else {
entityPlayer . listName = oldName + String . valueOf ( System . currentTimeMillis ( ) % 99 ) ;
}
return ;
}
}
}
2010-12-21 17:52:15 +01:00
}