2010-12-21 17:52:15 +01:00
package org.bukkit.craftbukkit ;
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-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-01-07 03:42:53 +01:00
import java.util.ArrayList ;
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-03-31 22:40:00 +02:00
import java.util.Random ;
2011-07-13 06:06:07 +02:00
import java.util.UUID ;
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 ;
import net.minecraft.server.ICommandListener ;
2010-12-22 16:22:23 +01:00
import org.bukkit.* ;
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-05-22 21:24:44 +02:00
import org.bukkit.craftbukkit.command.ServerCommandListener ;
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-06-06 15:52:02 +02:00
import org.bukkit.event.world.WorldInitEvent ;
2011-06-22 18:46:12 +02:00
import org.bukkit.plugin.PluginLoadOrder ;
2011-03-31 03:35:08 +02:00
import org.bukkit.util.config.Configuration ;
2011-06-17 05:09:43 +02:00
import org.bukkit.util.config.ConfigurationNode ;
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-07-08 14:25:53 +02:00
private final String protocolVersion = " 1.7.3 " ;
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-03-31 03:35:08 +02:00
private final Configuration configuration ;
2010-12-22 16:22:23 +01:00
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-02-05 09:10:03 +01:00
Logger . getLogger ( " Minecraft " ) . log ( Level . INFO , " This server is running " + getName ( ) + " version " + getVersion ( ) ) ;
2011-03-31 03:35:08 +02:00
2011-06-12 01:12:43 +02:00
configuration = new Configuration ( ( File ) console . options . valueOf ( " bukkit-settings " ) ) ;
2011-06-23 20:06:09 +02:00
loadConfig ( ) ;
2011-06-22 18:46:12 +02:00
loadPlugins ( ) ;
enablePlugins ( PluginLoadOrder . STARTUP ) ;
2011-03-31 03:35:08 +02:00
}
2011-06-23 20:06:09 +02:00
private void loadConfig ( ) {
configuration . load ( ) ;
2011-04-01 17:52:00 +02:00
configuration . getString ( " database.url " , " jdbc:sqlite:{DIR}{NAME}.db " ) ;
2011-03-31 03:35:08 +02:00
configuration . getString ( " database.username " , " bukkit " ) ;
configuration . getString ( " database.password " , " walrus " ) ;
configuration . getString ( " database.driver " , " org.sqlite.JDBC " ) ;
configuration . getString ( " database.isolation " , " SERIALIZABLE " ) ;
2011-06-18 05:23:34 +02:00
2011-05-05 22:57:22 +02:00
configuration . getString ( " settings.update-folder " , " update " ) ;
2011-06-17 05:49:58 +02:00
configuration . getInt ( " settings.spawn-radius " , 16 ) ;
2011-06-18 05:23:34 +02:00
2011-06-17 05:09:43 +02:00
if ( configuration . getNode ( " aliases " ) = = null ) {
2011-06-22 20:20:14 +02:00
List < String > icanhasbukkit = new ArrayList < String > ( ) ;
icanhasbukkit . add ( " version " ) ;
configuration . setProperty ( " aliases.icanhasbukkit " , icanhasbukkit ) ;
2011-06-17 05:09:43 +02:00
}
2011-06-23 20:06:09 +02:00
configuration . save ( ) ;
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-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 ) ;
} 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-01-15 22:40:15 +01:00
public int broadcastMessage ( String message ) {
Player [ ] players = getOnlinePlayers ( ) ;
for ( Player player : players ) {
player . sendMessage ( message ) ;
}
return players . length ;
}
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 ) ;
}
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-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-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 " ) ;
}
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-05-14 16:29:42 +02:00
if ( commandMap . dispatch ( sender , serverCommand . command ) ) {
2011-03-12 19:23:57 +01:00
return true ;
}
2011-04-20 19:05:14 +02:00
return console . consoleCommandHandler . handle ( serverCommand ) ;
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
// CraftBukkit native commands
if ( commandMap . dispatch ( sender , commandLine ) ) {
return true ;
}
2011-05-14 16:29:42 +02:00
if ( ! sender . isOp ( ) ) {
2011-03-12 19:23:57 +01:00
return false ;
}
// See if the server can process this command
2011-06-12 01:12:43 +02:00
return console . consoleCommandHandler . handle ( new ServerCommand ( commandLine , ( ICommandListener ) new ServerCommandListener ( sender ) ) ) ;
2011-01-16 16:35:37 +01:00
}
2011-01-20 04:53:43 +01:00
public void reload ( ) {
2011-06-23 20:06:09 +02:00
loadConfig ( ) ;
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-04-20 19:05:14 +02:00
boolean monsters = config . getBoolean ( " spawn-monsters " , console . worlds . get ( 0 ) . spawnMonsters > 0 ) ;
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-04-20 19:05:14 +02:00
world . spawnMonsters = monsters ? 1 : 0 ;
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
@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-03-31 22:40:00 +02:00
return createWorld ( name , environment , ( new Random ( ) ) . nextLong ( ) ) ;
}
public World createWorld ( String name , World . Environment environment , long seed ) {
2011-06-06 15:52:02 +02:00
return createWorld ( name , environment , seed , null ) ;
}
public World createWorld ( String name , Environment environment , ChunkGenerator generator ) {
return createWorld ( name , environment , ( new Random ( ) ) . nextLong ( ) , generator ) ;
}
public World createWorld ( String name , Environment environment , long seed , ChunkGenerator 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-06-06 15:52:02 +02:00
WorldServer internal = new WorldServer ( console , new ServerNBTManager ( new File ( " . " ) , name , true ) , name , dimension , seed , 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-04-20 19:05:14 +02:00
internal . spawnMonsters = 1 ;
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-02-05 21:51:22 +01:00
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 ;
}
2011-04-20 19:05:14 +02:00
ChunkCoordinates chunkcoordinates = internal . getSpawn ( ) ;
internal . chunkProviderServer . getChunkAt ( chunkcoordinates . x + j > > 4 , chunkcoordinates . z + k > > 4 ) ;
2011-02-05 21:51:22 +01:00
2011-04-20 19:05:14 +02:00
while ( internal . doLighting ( ) ) {
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 ( ) ) ;
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-06-17 05:09:43 +02:00
ConfigurationNode node = configuration . getNode ( " 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
if ( node ! = null ) {
for ( String key : node . getKeys ( ) ) {
2011-06-22 20:10:29 +02:00
List < String > commands = new ArrayList < String > ( ) ;
if ( node . getProperty ( key ) instanceof List ) {
commands = node . getStringList ( key , null ) ;
} else {
commands . add ( node . getString ( key ) ) ;
}
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 ) {
configuration . setProperty ( " settings.spawn-radius " , value ) ;
configuration . save ( ) ;
}
2011-06-19 12:13:52 +02:00
public boolean getOnlineMode ( ) {
return this . console . onlineMode ;
}
2011-06-22 19:27:27 +02:00
public ChunkGenerator getGenerator ( String world ) {
ConfigurationNode node = configuration . getNode ( " worlds " ) ;
ChunkGenerator result = null ;
if ( node ! = null ) {
node = node . getNode ( world ) ;
if ( node ! = null ) {
String name = node . getString ( " generator " ) ;
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 ;
}
2010-12-21 17:52:15 +01:00
}