2010-12-22 16:22:23 +01:00
package net.minecraft.server ;
2012-07-29 09:33:13 +02:00
import java.awt.GraphicsEnvironment ;
2010-12-22 16:22:23 +01:00
import java.io.File ;
2012-07-29 09:33:13 +02:00
import java.security.KeyPair ;
import java.text.SimpleDateFormat ;
2010-12-22 16:22:23 +01:00
import java.util.ArrayList ;
2012-07-29 09:33:13 +02:00
import java.util.Date ;
2010-12-28 20:52:24 +01:00
import java.util.Iterator ;
2010-12-22 16:22:23 +01:00
import java.util.List ;
2012-07-29 09:33:13 +02:00
import java.util.concurrent.Callable ;
2010-12-22 16:22:23 +01:00
import java.util.logging.Level ;
import java.util.logging.Logger ;
2010-12-28 20:52:24 +01:00
2011-01-11 09:25:13 +01:00
// CraftBukkit start
2012-10-07 22:08:21 +02:00
import java.util.concurrent.ExecutionException ;
2012-11-03 01:51:14 +01:00
import java.io.IOException ;
import com.google.common.io.Files ;
2012-03-14 21:59:14 +01:00
import jline.console.ConsoleReader ;
2011-01-11 09:25:13 +01:00
import joptsimple.OptionSet ;
2012-07-22 08:18:00 +02:00
2011-05-26 14:48:22 +02:00
import org.bukkit.World.Environment ;
2012-10-07 22:08:21 +02:00
import org.bukkit.craftbukkit.util.Waitable ;
2012-01-30 21:51:53 +01:00
import org.bukkit.event.server.RemoteServerCommandEvent ;
2011-03-26 23:20:35 +01:00
import org.bukkit.event.world.WorldSaveEvent ;
2011-07-28 16:35:50 +02:00
// CraftBukkit end
2010-12-22 16:22:23 +01:00
2012-11-06 13:05:28 +01:00
public abstract class MinecraftServer implements ICommandListener , Runnable , IMojangStatistics {
2010-12-22 16:22:23 +01:00
2013-03-13 23:33:27 +01:00
private static MinecraftServer k = null ;
2012-07-29 09:33:13 +02:00
public Convertable convertable ; // CraftBukkit - private final -> public
2013-03-13 23:33:27 +01:00
private final MojangStatisticsGenerator m = new MojangStatisticsGenerator ( " server " , this ) ;
2012-07-29 09:33:13 +02:00
public File universe ; // CraftBukkit - private final -> public
2013-03-13 23:33:27 +01:00
private final List o = new ArrayList ( ) ;
private final ICommandHandler p ;
2012-07-29 09:33:13 +02:00
public final MethodProfiler methodProfiler = new MethodProfiler ( ) ;
private String serverIp ;
2013-03-13 23:33:27 +01:00
private int r = - 1 ;
public WorldServer [ ] worldServer ;
private PlayerList s ;
2011-04-20 19:05:14 +02:00
private boolean isRunning = true ;
2012-07-29 09:33:13 +02:00
private boolean isStopped = false ;
private int ticks = 0 ;
2013-03-13 23:33:27 +01:00
public String c ;
public int d ;
2012-07-29 09:33:13 +02:00
private boolean onlineMode ;
private boolean spawnAnimals ;
private boolean spawnNPCs ;
private boolean pvpMode ;
private boolean allowFlight ;
private String motd ;
2013-03-13 23:33:27 +01:00
private int C ;
private long D ;
2012-03-01 11:49:23 +01:00
private long E ;
private long F ;
private long G ;
2013-03-13 23:33:27 +01:00
public final long [ ] e = new long [ 100 ] ;
2012-07-29 09:33:13 +02:00
public final long [ ] f = new long [ 100 ] ;
public final long [ ] g = new long [ 100 ] ;
public final long [ ] h = new long [ 100 ] ;
public final long [ ] i = new long [ 100 ] ;
2013-03-13 23:33:27 +01:00
public long [ ] [ ] j ;
private KeyPair H ;
private String I ;
2012-07-29 09:33:13 +02:00
private String J ;
private boolean demoMode ;
2013-03-13 23:33:27 +01:00
private boolean M ;
2012-07-29 09:33:13 +02:00
private boolean N ;
2013-03-13 23:33:27 +01:00
private String O = " " ;
private boolean P = false ;
private long Q ;
private String R ;
private boolean S ;
2010-12-28 20:52:24 +01:00
2011-02-23 13:56:36 +01:00
// CraftBukkit start
2011-05-26 23:15:27 +02:00
public List < WorldServer > worlds = new ArrayList < WorldServer > ( ) ;
2012-07-22 08:18:00 +02:00
public org . bukkit . craftbukkit . CraftServer server ;
2011-01-29 22:50:29 +01:00
public OptionSet options ;
2012-07-22 08:18:00 +02:00
public org . bukkit . command . ConsoleCommandSender console ;
public org . bukkit . command . RemoteConsoleCommandSender remoteConsole ;
2011-02-25 17:12:38 +01:00
public ConsoleReader reader ;
2011-05-09 20:51:01 +02:00
public static int currentTick ;
2012-06-14 04:52:49 +02:00
public final Thread primaryThread ;
2012-10-07 22:08:21 +02:00
public java . util . Queue < Runnable > processQueue = new java . util . concurrent . ConcurrentLinkedQueue < Runnable > ( ) ;
2012-08-19 00:36:39 +02:00
public int autosavePeriod ;
2011-05-14 16:29:42 +02:00
// CraftBukkit end
2010-12-22 16:22:23 +01:00
2012-07-29 09:33:13 +02:00
public MinecraftServer ( OptionSet options ) { // CraftBukkit - signature file -> OptionSet
2013-03-13 23:33:27 +01:00
k = this ;
2012-07-29 09:33:13 +02:00
// this.universe = file1; // CraftBukkit
2013-03-13 23:33:27 +01:00
this . p = new CommandDispatcher ( ) ;
2012-07-29 09:33:13 +02:00
// this.convertable = new WorldLoaderServer(server.getWorldContainer()); // CraftBukkit - moved to DedicatedServer.init
2013-03-13 23:33:27 +01:00
this . am ( ) ;
2011-02-25 17:12:38 +01:00
2011-06-12 00:02:58 +02:00
// CraftBukkit start
2011-02-25 17:12:38 +01:00
this . options = options ;
try {
2012-03-14 21:59:14 +01:00
this . reader = new ConsoleReader ( System . in , System . out ) ;
this . reader . setExpandEvents ( false ) ; // Avoid parsing exceptions for uncommonly used event designators
2012-05-23 06:44:03 +02:00
} catch ( Exception e ) {
try {
// Try again with jline disabled for Windows users without C++ 2008 Redistributable
System . setProperty ( " jline.terminal " , " jline.UnsupportedTerminal " ) ;
System . setProperty ( " user.language " , " en " ) ;
org . bukkit . craftbukkit . Main . useJline = false ;
this . reader = new ConsoleReader ( System . in , System . out ) ;
this . reader . setExpandEvents ( false ) ;
2012-07-29 09:33:13 +02:00
} catch ( java . io . IOException ex ) {
2012-05-23 06:44:03 +02:00
Logger . getLogger ( MinecraftServer . class . getName ( ) ) . log ( Level . SEVERE , null , ex ) ;
}
2011-02-25 17:12:38 +01:00
}
2012-07-22 08:18:00 +02:00
Runtime . getRuntime ( ) . addShutdownHook ( new org . bukkit . craftbukkit . util . ServerShutdownThread ( this ) ) ;
2012-06-14 04:52:49 +02:00
2012-07-29 09:33:13 +02:00
primaryThread = new ThreadServerApplication ( this , " Server thread " ) ; // Moved from main
2011-02-21 23:30:01 +01:00
}
2012-10-25 05:53:23 +02:00
public abstract PropertyManager getPropertyManager ( ) ;
2012-07-29 09:33:13 +02:00
// CraftBukkit end
2011-11-20 09:01:14 +01:00
2013-03-13 23:33:27 +01:00
private void am ( ) {
DispenserRegistry . a ( ) ;
2012-10-25 05:53:23 +02:00
}
2012-07-29 09:33:13 +02:00
protected abstract boolean init ( ) throws java . net . UnknownHostException ; // CraftBukkit - throws UnknownHostException
2011-11-20 09:01:14 +01:00
2012-10-25 05:53:23 +02:00
protected void b ( String s ) {
2012-07-29 09:33:13 +02:00
if ( this . getConvertable ( ) . isConvertable ( s ) ) {
2013-03-13 23:33:27 +01:00
this . getLogger ( ) . info ( " Converting map! " ) ;
2012-10-25 05:53:23 +02:00
this . c ( " menu.convertingLevel " ) ;
2012-07-29 09:33:13 +02:00
this . getConvertable ( ) . convert ( s , new ConvertProgressUpdater ( this ) ) ;
2011-06-17 05:49:58 +02:00
}
2010-12-22 16:22:23 +01:00
}
2012-10-25 05:53:23 +02:00
protected synchronized void c ( String s ) {
2013-03-13 23:33:27 +01:00
this . R = s ;
2012-07-29 09:33:13 +02:00
}
2011-02-23 03:37:56 +01:00
2012-10-25 05:53:23 +02:00
protected void a ( String s , String s1 , long i , WorldType worldtype , String s2 ) {
this . b ( s ) ;
this . c ( " menu.loadingLevel " ) ;
2013-03-13 23:33:27 +01:00
this . worldServer = new WorldServer [ 3 ] ;
// CraftBukkit - removed ticktime arrays
2012-07-29 09:33:13 +02:00
IDataManager idatamanager = this . convertable . a ( s , true ) ;
WorldData worlddata = idatamanager . getWorldData ( ) ;
// CraftBukkit start - removed worldsettings
2011-11-24 19:48:01 +01:00
int worldCount = 3 ;
2011-11-20 09:01:14 +01:00
2012-07-29 09:33:13 +02:00
for ( int j = 0 ; j < worldCount ; + + j ) {
2011-05-26 14:48:22 +02:00
WorldServer world ;
2011-11-20 09:01:14 +01:00
int dimension = 0 ;
2012-07-29 09:33:13 +02:00
if ( j = = 1 ) {
if ( this . getAllowNether ( ) ) {
2011-11-24 19:48:01 +01:00
dimension = - 1 ;
} else {
continue ;
}
2011-11-20 09:01:14 +01:00
}
2012-07-29 09:33:13 +02:00
if ( j = = 2 ) {
2011-12-09 18:55:36 +01:00
if ( this . server . getAllowEnd ( ) ) {
dimension = 1 ;
} else {
continue ;
}
2011-11-20 09:01:14 +01:00
}
2011-06-22 19:27:27 +02:00
String worldType = Environment . getEnvironment ( dimension ) . toString ( ) . toLowerCase ( ) ;
String name = ( dimension = = 0 ) ? s : s + " _ " + worldType ;
2012-07-22 08:18:00 +02:00
org . bukkit . generator . ChunkGenerator gen = this . server . getGenerator ( name ) ;
2012-08-12 23:50:00 +02:00
WorldSettings worldsettings = new WorldSettings ( i , this . getGamemode ( ) , this . getGenerateStructures ( ) , this . isHardcore ( ) , worldtype ) ;
2012-10-28 05:35:10 +01:00
worldsettings . a ( s2 ) ;
2011-02-05 19:15:04 +01:00
2012-07-29 09:33:13 +02:00
if ( j = = 0 ) {
2012-10-25 05:53:23 +02:00
if ( this . M ( ) ) { // Strip out DEMO?
2012-07-29 09:33:13 +02:00
// CraftBukkit
2013-03-13 23:33:27 +01:00
world = new DemoWorldServer ( this , new ServerNBTManager ( server . getWorldContainer ( ) , s1 , true ) , s1 , dimension , this . methodProfiler , this . getLogger ( ) ) ;
2012-07-29 09:33:13 +02:00
} else {
// CraftBukkit
2013-03-13 23:33:27 +01:00
world = new WorldServer ( this , new ServerNBTManager ( server . getWorldContainer ( ) , s1 , true ) , s1 , dimension , worldsettings , this . methodProfiler , this . getLogger ( ) , Environment . getEnvironment ( dimension ) , gen ) ;
2012-07-29 09:33:13 +02:00
}
2011-05-26 14:48:22 +02:00
} else {
2011-12-19 17:26:11 +01:00
String dim = " DIM " + dimension ;
2011-06-16 22:41:01 +02:00
File newWorld = new File ( new File ( name ) , dim ) ;
File oldWorld = new File ( new File ( s ) , dim ) ;
2011-06-17 08:29:16 +02:00
2011-06-16 22:41:01 +02:00
if ( ( ! newWorld . isDirectory ( ) ) & & ( oldWorld . isDirectory ( ) ) ) {
2013-03-13 23:33:27 +01:00
final IConsoleLogManager log = this . getLogger ( ) ;
2011-06-16 22:41:01 +02:00
log . info ( " ---- Migration of old " + worldType + " folder required ---- " ) ;
log . info ( " Unfortunately due to the way that Minecraft implemented multiworld support in 1.6, Bukkit requires that you move your " + worldType + " folder to a new location in order to operate correctly. " ) ;
log . info ( " We will move this folder for you, but it will mean that you need to move it back should you wish to stop using Bukkit in the future. " ) ;
log . info ( " Attempting to move " + oldWorld + " to " + newWorld + " ... " ) ;
if ( newWorld . exists ( ) ) {
log . severe ( " A file or folder already exists at " + newWorld + " ! " ) ;
log . info ( " ---- Migration of old " + worldType + " folder failed ---- " ) ;
} else if ( newWorld . getParentFile ( ) . mkdirs ( ) ) {
if ( oldWorld . renameTo ( newWorld ) ) {
2011-12-19 17:26:11 +01:00
log . info ( " Success! To restore " + worldType + " in the future, simply move " + newWorld + " to " + oldWorld ) ;
2012-11-03 01:51:14 +01:00
// Migrate world data too.
try {
Files . copy ( new File ( new File ( s ) , " level.dat " ) , new File ( new File ( name ) , " level.dat " ) ) ;
} catch ( IOException exception ) {
log . severe ( " Unable to migrate world data. " ) ;
}
2011-06-16 22:41:01 +02:00
log . info ( " ---- Migration of old " + worldType + " folder complete ---- " ) ;
} else {
log . severe ( " Could not move folder " + oldWorld + " to " + newWorld + " ! " ) ;
log . info ( " ---- Migration of old " + worldType + " folder failed ---- " ) ;
}
} else {
log . severe ( " Could not create path for " + newWorld + " ! " ) ;
log . info ( " ---- Migration of old " + worldType + " folder failed ---- " ) ;
}
}
2012-07-29 09:33:13 +02:00
this . c ( name ) ;
2012-03-02 14:17:20 +01:00
2012-07-29 09:33:13 +02:00
// CraftBukkit
2013-03-13 23:33:27 +01:00
world = new SecondaryWorldServer ( this , new ServerNBTManager ( server . getWorldContainer ( ) , name , true ) , name , dimension , worldsettings , this . worlds . get ( 0 ) , this . methodProfiler , this . getLogger ( ) , Environment . getEnvironment ( dimension ) , gen ) ;
2011-06-22 19:27:27 +02:00
}
if ( gen ! = null ) {
world . getWorld ( ) . getPopulators ( ) . addAll ( gen . getDefaultPopulators ( world . getWorld ( ) ) ) ;
2011-05-26 14:48:22 +02:00
}
2012-08-02 17:14:01 +02:00
this . server . getPluginManager ( ) . callEvent ( new org . bukkit . event . world . WorldInitEvent ( world . getWorld ( ) ) ) ;
2011-05-26 14:48:22 +02:00
world . addIWorldAccess ( new WorldManager ( this , world ) ) ;
2012-10-25 05:53:23 +02:00
if ( ! this . I ( ) ) {
2012-07-29 09:33:13 +02:00
world . getWorldData ( ) . setGameType ( this . getGamemode ( ) ) ;
}
2011-06-27 00:25:01 +02:00
this . worlds . add ( world ) ;
2013-03-13 23:33:27 +01:00
this . s . setPlayerFileData ( this . worlds . toArray ( new WorldServer [ this . worlds . size ( ) ] ) ) ;
2012-07-29 09:33:13 +02:00
// CraftBukkit end
2011-05-26 14:48:22 +02:00
}
2011-02-05 19:15:04 +01:00
2012-07-29 09:33:13 +02:00
this . c ( this . getDifficulty ( ) ) ;
2012-10-25 05:53:23 +02:00
this . e ( ) ;
2012-07-29 09:33:13 +02:00
}
2012-10-25 05:53:23 +02:00
protected void e ( ) {
2013-03-13 23:33:27 +01:00
long i = System . currentTimeMillis ( ) ; // CraftBukkit - current time
2012-07-29 09:33:13 +02:00
2012-10-25 05:53:23 +02:00
this . c ( " menu.generatingTerrain " ) ;
byte b0 = 0 ;
2011-01-29 22:50:29 +01:00
2011-06-18 05:23:34 +02:00
// CraftBukkit start
2012-07-29 09:33:13 +02:00
for ( int j = 0 ; j < this . worlds . size ( ) ; + + j ) {
WorldServer worldserver = this . worlds . get ( j ) ;
2013-03-13 23:33:27 +01:00
this . getLogger ( ) . info ( " Preparing start region for level " + j + " (Seed: " + worldserver . getSeed ( ) + " ) " ) ;
2012-01-12 23:10:13 +01:00
if ( ! worldserver . getWorld ( ) . getKeepSpawnInMemory ( ) ) {
continue ;
}
2013-03-13 23:33:27 +01:00
2012-01-12 23:10:13 +01:00
ChunkCoordinates chunkcoordinates = worldserver . getSpawn ( ) ;
2011-01-29 22:50:29 +01:00
2013-03-13 23:33:27 +01:00
for ( int k = - 192 ; k < = 192 & & this . isRunning ( ) ; k + = 16 ) {
for ( int l = - 192 ; l < = 192 & & this . isRunning ( ) ; l + = 16 ) {
2012-07-29 09:33:13 +02:00
long i1 = System . currentTimeMillis ( ) ;
2011-05-26 14:48:22 +02:00
2012-07-29 09:33:13 +02:00
if ( i1 < i ) {
i = i1 ;
2012-01-12 23:10:13 +01:00
}
2011-01-14 14:31:10 +01:00
2012-07-29 09:33:13 +02:00
if ( i1 > i + 1000L ) {
2013-03-13 23:33:27 +01:00
int j1 = ( 192 * 2 + 1 ) * ( 192 * 2 + 1 ) ;
int k1 = ( k + 192 ) * ( 192 * 2 + 1 ) + l + 1 ;
2011-01-29 22:50:29 +01:00
2012-07-29 09:33:13 +02:00
this . a_ ( " Preparing spawn area " , k1 * 100 / j1 ) ;
i = i1 ;
2012-01-12 23:10:13 +01:00
}
2011-01-29 22:50:29 +01:00
2012-07-29 09:33:13 +02:00
worldserver . chunkProviderServer . getChunkAt ( chunkcoordinates . x + k > > 4 , chunkcoordinates . z + l > > 4 ) ;
2010-12-22 16:22:23 +01:00
}
2012-01-12 23:10:13 +01:00
}
2010-12-22 16:22:23 +01:00
}
2013-03-13 23:33:27 +01:00
// CraftBukkit end
2012-10-25 05:53:23 +02:00
this . j ( ) ;
2010-12-22 16:22:23 +01:00
}
2012-07-29 09:33:13 +02:00
public abstract boolean getGenerateStructures ( ) ;
public abstract EnumGamemode getGamemode ( ) ;
public abstract int getDifficulty ( ) ;
public abstract boolean isHardcore ( ) ;
protected void a_ ( String s , int i ) {
2013-03-13 23:33:27 +01:00
this . c = s ;
this . d = i ;
this . getLogger ( ) . info ( s + " : " + i + " % " ) ;
2010-12-22 16:22:23 +01:00
}
2012-10-25 05:53:23 +02:00
protected void j ( ) {
2013-03-13 23:33:27 +01:00
this . c = null ;
this . d = 0 ;
2011-01-11 09:25:13 +01:00
2012-07-22 08:18:00 +02:00
this . server . enablePlugins ( org . bukkit . plugin . PluginLoadOrder . POSTWORLD ) ; // CraftBukkit
2010-12-22 16:22:23 +01:00
}
2012-07-29 09:33:13 +02:00
protected void saveChunks ( boolean flag ) throws ExceptionWorldConflict { // CraftBukkit - added throws
2013-03-13 23:33:27 +01:00
if ( ! this . N ) {
2012-07-29 09:33:13 +02:00
// CraftBukkit start
for ( int j = 0 ; j < this . worlds . size ( ) ; + + j ) {
WorldServer worldserver = this . worlds . get ( j ) ;
2011-02-05 19:15:04 +01:00
2012-07-29 09:33:13 +02:00
if ( worldserver ! = null ) {
if ( ! flag ) {
2013-03-13 23:33:27 +01:00
this . getLogger ( ) . info ( " Saving chunks for level \ ' " + worldserver . getWorldData ( ) . getName ( ) + " \ '/ " + worldserver . worldProvider . getName ( ) ) ;
2012-07-29 09:33:13 +02:00
}
2011-02-19 21:29:51 +01:00
2012-09-13 02:50:44 +02:00
worldserver . save ( true , ( IProgressUpdate ) null ) ;
2012-07-29 09:33:13 +02:00
worldserver . saveLevel ( ) ;
2011-05-26 14:48:22 +02:00
2012-07-29 09:33:13 +02:00
WorldSaveEvent event = new WorldSaveEvent ( worldserver . getWorld ( ) ) ;
this . server . getPluginManager ( ) . callEvent ( event ) ;
}
}
// CraftBukkit end
2011-05-16 23:29:57 +02:00
}
2010-12-22 16:22:23 +01:00
}
2012-07-29 09:33:13 +02:00
public void stop ( ) throws ExceptionWorldConflict { // CraftBukkit - added throws
2013-03-13 23:33:27 +01:00
if ( ! this . N ) {
this . getLogger ( ) . info ( " Stopping server " ) ;
2012-07-29 09:33:13 +02:00
// CraftBukkit start
if ( this . server ! = null ) {
this . server . disablePlugins ( ) ;
}
// CraftBukkit end
2011-02-02 00:32:18 +01:00
2012-10-25 05:53:23 +02:00
if ( this . ae ( ) ! = null ) {
this . ae ( ) . a ( ) ;
2012-07-29 09:33:13 +02:00
}
2011-01-27 22:15:41 +01:00
2013-03-13 23:33:27 +01:00
if ( this . s ! = null ) {
this . getLogger ( ) . info ( " Saving players " ) ;
this . s . savePlayers ( ) ;
this . s . r ( ) ;
2012-07-29 09:33:13 +02:00
}
2011-05-26 14:48:22 +02:00
2013-03-13 23:33:27 +01:00
this . getLogger ( ) . info ( " Saving worlds " ) ;
2012-07-29 09:33:13 +02:00
this . saveChunks ( false ) ;
2012-11-06 13:05:28 +01:00
/ * CraftBukkit start - handled in saveChunks
for ( int i = 0 ; i < this . worldServer . length ; + + i ) {
WorldServer worldserver = this . worldServer [ i ] ;
2012-07-29 09:33:13 +02:00
worldserver . saveLevel ( ) ;
}
// CraftBukkit end */
2013-03-13 23:33:27 +01:00
if ( this . m ! = null & & this . m . d ( ) ) {
this . m . e ( ) ;
2012-01-12 23:10:13 +01:00
}
2012-07-29 09:33:13 +02:00
}
}
public String getServerIp ( ) {
return this . serverIp ;
}
2012-10-25 05:53:23 +02:00
public void d ( String s ) {
2012-07-29 09:33:13 +02:00
this . serverIp = s ;
}
public boolean isRunning ( ) {
return this . isRunning ;
2010-12-22 16:22:23 +01:00
}
2011-09-24 23:03:31 +02:00
public void safeShutdown ( ) {
2011-04-20 19:05:14 +02:00
this . isRunning = false ;
2010-12-22 16:22:23 +01:00
}
public void run ( ) {
try {
2011-04-20 19:05:14 +02:00
if ( this . init ( ) ) {
2011-01-29 22:50:29 +01:00
long i = System . currentTimeMillis ( ) ;
2010-12-28 20:52:24 +01:00
2013-03-13 23:33:27 +01:00
for ( long j = 0L ; this . isRunning ; this . P = true ) {
2011-01-29 22:50:29 +01:00
long k = System . currentTimeMillis ( ) ;
long l = k - i ;
2010-12-28 20:52:24 +01:00
2013-03-13 23:33:27 +01:00
if ( l > 2000L & & i - this . Q > = 15000L ) {
2012-07-29 09:33:13 +02:00
if ( this . server . getWarnOnOverload ( ) ) // CraftBukkit - Added option to suppress warning messages
2013-03-13 23:33:27 +01:00
this . getLogger ( ) . warning ( " Can \ 't keep up! Did the system time change, or is the server overloaded? " ) ;
2011-01-29 22:50:29 +01:00
l = 2000L ;
2013-03-13 23:33:27 +01:00
this . Q = i ;
2010-12-22 16:22:23 +01:00
}
2011-01-29 22:50:29 +01:00
if ( l < 0L ) {
2013-03-13 23:33:27 +01:00
this . getLogger ( ) . warning ( " Time ran backwards! Did the system time change? " ) ;
2011-01-29 22:50:29 +01:00
l = 0L ;
2010-12-22 16:22:23 +01:00
}
2011-01-29 22:50:29 +01:00
j + = l ;
i = k ;
2011-05-28 22:50:08 +02:00
if ( this . worlds . get ( 0 ) . everyoneDeeplySleeping ( ) ) { // CraftBukkit
2012-10-25 05:53:23 +02:00
this . q ( ) ;
2011-02-23 03:37:56 +01:00
j = 0L ;
} else {
while ( j > 50L ) {
2011-05-09 20:51:01 +02:00
MinecraftServer . currentTick = ( int ) ( System . currentTimeMillis ( ) / 50 ) ; // CraftBukkit
2011-02-23 03:37:56 +01:00
j - = 50L ;
2012-10-25 05:53:23 +02:00
this . q ( ) ;
2011-02-23 03:37:56 +01:00
}
2010-12-22 16:22:23 +01:00
}
2011-01-29 22:50:29 +01:00
2012-07-29 09:33:13 +02:00
Thread . sleep ( 1L ) ;
2010-12-22 16:22:23 +01:00
}
2012-07-29 09:33:13 +02:00
} else {
this . a ( ( CrashReport ) null ) ;
2010-12-22 16:22:23 +01:00
}
2011-02-23 03:37:56 +01:00
} catch ( Throwable throwable ) {
throwable . printStackTrace ( ) ;
2013-03-13 23:33:27 +01:00
this . getLogger ( ) . severe ( " Encountered an unexpected exception " + throwable . getClass ( ) . getSimpleName ( ) , throwable ) ;
2012-07-29 09:33:13 +02:00
CrashReport crashreport = null ;
if ( throwable instanceof ReportedException ) {
crashreport = this . b ( ( ( ReportedException ) throwable ) . a ( ) ) ;
} else {
crashreport = this . b ( new CrashReport ( " Exception in server tick loop " , throwable ) ) ;
}
2011-01-29 22:50:29 +01:00
2012-10-25 05:53:23 +02:00
File file1 = new File ( new File ( this . o ( ) , " crash-reports " ) , " crash- " + ( new SimpleDateFormat ( " yyyy-MM-dd_HH.mm.ss " ) ) . format ( new Date ( ) ) + " -server.txt " ) ;
2011-01-29 22:50:29 +01:00
2013-03-13 23:33:27 +01:00
if ( crashreport . a ( file1 , this . getLogger ( ) ) ) {
this . getLogger ( ) . severe ( " This crash report has been saved to: " + file1 . getAbsolutePath ( ) ) ;
2012-07-29 09:33:13 +02:00
} else {
2013-03-13 23:33:27 +01:00
this . getLogger ( ) . severe ( " We were unable to save this crash report to disk. " ) ;
2010-12-22 16:22:23 +01:00
}
2012-07-29 09:33:13 +02:00
this . a ( crashreport ) ;
2010-12-22 16:22:23 +01:00
} finally {
2011-01-14 14:31:10 +01:00
try {
2011-04-20 19:05:14 +02:00
this . stop ( ) ;
this . isStopped = true ;
2012-07-29 09:33:13 +02:00
} catch ( Throwable throwable1 ) {
throwable1 . printStackTrace ( ) ;
} finally {
2012-03-14 21:59:14 +01:00
// CraftBukkit start - restore terminal to original settings
try {
this . reader . getTerminal ( ) . restore ( ) ;
} catch ( Exception e ) {
}
// CraftBukkit end
2012-10-25 05:53:23 +02:00
this . p ( ) ;
2011-01-14 14:31:10 +01:00
}
2010-12-22 16:22:23 +01:00
}
}
2012-10-25 05:53:23 +02:00
protected File o ( ) {
2012-07-29 09:33:13 +02:00
return new File ( " . " ) ;
}
protected void a ( CrashReport crashreport ) { }
2012-10-25 05:53:23 +02:00
protected void p ( ) { }
2012-07-29 09:33:13 +02:00
2012-10-25 05:53:23 +02:00
protected void q ( ) throws ExceptionWorldConflict { // CraftBukkit - added throws
2011-11-20 09:01:14 +01:00
long i = System . nanoTime ( ) ;
2010-12-28 20:52:24 +01:00
2012-07-29 09:33:13 +02:00
AxisAlignedBB . a ( ) . a ( ) ;
+ + this . ticks ;
2013-03-13 23:33:27 +01:00
if ( this . S ) {
this . S = false ;
2012-09-10 06:19:28 +02:00
this . methodProfiler . a = true ;
this . methodProfiler . a ( ) ;
2012-07-29 09:33:13 +02:00
}
2010-12-28 20:52:24 +01:00
2012-09-10 06:19:28 +02:00
this . methodProfiler . a ( " root " ) ;
2012-10-25 05:53:23 +02:00
this . r ( ) ;
2012-08-19 00:36:39 +02:00
if ( ( this . autosavePeriod > 0 ) & & ( ( this . ticks % this . autosavePeriod ) = = 0 ) ) { // CraftBukkit
2012-09-10 06:19:28 +02:00
this . methodProfiler . a ( " save " ) ;
2013-03-13 23:33:27 +01:00
this . s . savePlayers ( ) ;
2012-07-29 09:33:13 +02:00
this . saveChunks ( true ) ;
2012-09-10 06:19:28 +02:00
this . methodProfiler . b ( ) ;
2010-12-22 16:22:23 +01:00
}
2010-12-28 20:52:24 +01:00
2012-09-10 06:19:28 +02:00
this . methodProfiler . a ( " tallying " ) ;
2013-03-13 23:33:27 +01:00
this . i [ this . ticks % 100 ] = System . nanoTime ( ) - i ;
this . e [ this . ticks % 100 ] = Packet . q - this . D ;
this . D = Packet . q ;
this . f [ this . ticks % 100 ] = Packet . r - this . E ;
this . E = Packet . r ;
this . g [ this . ticks % 100 ] = Packet . o - this . F ;
this . F = Packet . o ;
this . h [ this . ticks % 100 ] = Packet . p - this . G ;
this . G = Packet . p ;
2012-09-10 06:19:28 +02:00
this . methodProfiler . b ( ) ;
this . methodProfiler . a ( " snooper " ) ;
2013-03-13 23:33:27 +01:00
if ( ! this . m . d ( ) & & this . ticks > 100 ) {
this . m . a ( ) ;
2012-07-29 09:33:13 +02:00
}
2011-01-29 22:50:29 +01:00
2012-07-29 09:33:13 +02:00
if ( this . ticks % 6000 = = 0 ) {
2013-03-13 23:33:27 +01:00
this . m . b ( ) ;
2010-12-22 16:22:23 +01:00
}
2012-09-10 06:19:28 +02:00
this . methodProfiler . b ( ) ;
this . methodProfiler . b ( ) ;
2012-07-29 09:33:13 +02:00
}
2011-02-05 19:15:04 +01:00
2012-10-25 05:53:23 +02:00
public void r ( ) {
2012-09-10 06:19:28 +02:00
this . methodProfiler . a ( " levels " ) ;
2011-08-07 05:45:56 +02:00
2012-07-29 09:33:13 +02:00
// CraftBukkit start - only send timeupdates to the people in that world
this . server . getScheduler ( ) . mainThreadHeartbeat ( this . ticks ) ;
2011-02-07 02:59:06 +01:00
2012-10-07 22:08:21 +02:00
// Run tasks that are waiting on processing
while ( ! processQueue . isEmpty ( ) ) {
processQueue . remove ( ) . run ( ) ;
2012-08-03 13:24:55 +02:00
}
2012-11-30 09:49:19 +01:00
org . bukkit . craftbukkit . chunkio . ChunkIOExecutor . tick ( ) ;
2011-09-23 20:20:18 +02:00
// Send timeupdates to everyone, it will get the right time from the world the player is in.
if ( this . ticks % 20 = = 0 ) {
2012-12-20 05:03:52 +01:00
for ( int i = 0 ; i < this . getPlayerList ( ) . players . size ( ) ; + + i ) {
EntityPlayer entityplayer = ( EntityPlayer ) this . getPlayerList ( ) . players . get ( i ) ;
entityplayer . playerConnection . sendPacket ( new Packet4UpdateTime ( entityplayer . world . getTime ( ) , entityplayer . getPlayerTime ( ) ) ) ; // Add support for per player time
2011-09-23 20:20:18 +02:00
}
}
2012-11-06 13:05:28 +01:00
int i ;
for ( i = 0 ; i < this . worlds . size ( ) ; + + i ) {
2012-07-29 09:33:13 +02:00
long j = System . nanoTime ( ) ;
// if (i == 0 || this.getAllowNether()) {
WorldServer worldserver = this . worlds . get ( i ) ;
2011-09-23 20:20:18 +02:00
2012-10-25 05:53:23 +02:00
this . methodProfiler . a ( worldserver . getWorldData ( ) . getName ( ) ) ;
this . methodProfiler . a ( " pools " ) ;
worldserver . getVec3DPool ( ) . a ( ) ;
this . methodProfiler . b ( ) ;
/ * Drop global time updates
2011-05-28 22:50:08 +02:00
if ( this . ticks % 20 = = 0 ) {
2012-10-25 05:53:23 +02:00
this . methodProfiler . a ( " timeSync " ) ;
2013-03-13 23:33:27 +01:00
this . s . a ( new Packet4UpdateTime ( worldserver . getTime ( ) , worldserver . getDayTime ( ) ) , worldserver . worldProvider . dimension ) ;
2012-10-25 05:53:23 +02:00
this . methodProfiler . b ( ) ;
2011-05-26 14:48:22 +02:00
}
2011-09-23 20:20:18 +02:00
// CraftBukkit end */
2011-02-19 21:29:51 +01:00
2012-09-10 06:19:28 +02:00
this . methodProfiler . a ( " tick " ) ;
2012-11-06 13:05:28 +01:00
CrashReport crashreport ;
try {
worldserver . doTick ( ) ;
} catch ( Throwable throwable ) {
crashreport = CrashReport . a ( throwable , " Exception ticking world " ) ;
worldserver . a ( crashreport ) ;
throw new ReportedException ( crashreport ) ;
}
try {
worldserver . tickEntities ( ) ;
} catch ( Throwable throwable1 ) {
crashreport = CrashReport . a ( throwable1 , " Exception ticking world entities " ) ;
worldserver . a ( crashreport ) ;
throw new ReportedException ( crashreport ) ;
}
2012-10-25 05:53:23 +02:00
this . methodProfiler . b ( ) ;
this . methodProfiler . a ( " tracker " ) ;
worldserver . getTracker ( ) . updatePlayers ( ) ;
this . methodProfiler . b ( ) ;
this . methodProfiler . b ( ) ;
2012-07-29 09:33:13 +02:00
// } // CraftBukkit
2011-05-26 14:48:22 +02:00
2013-03-13 23:33:27 +01:00
// this.j[i][this.ticks % 100] = System.nanoTime() - j; // CraftBukkit
2011-05-26 14:48:22 +02:00
}
2011-01-29 22:50:29 +01:00
2012-09-10 06:19:28 +02:00
this . methodProfiler . c ( " connection " ) ;
2012-10-25 05:53:23 +02:00
this . ae ( ) . b ( ) ;
2012-09-10 06:19:28 +02:00
this . methodProfiler . c ( " players " ) ;
2013-03-13 23:33:27 +01:00
this . s . tick ( ) ;
2012-09-10 06:19:28 +02:00
this . methodProfiler . c ( " tickables " ) ;
2011-11-20 09:01:14 +01:00
2013-03-13 23:33:27 +01:00
for ( i = 0 ; i < this . o . size ( ) ; + + i ) {
( ( IUpdatePlayerListBox ) this . o . get ( i ) ) . a ( ) ;
2012-07-29 09:33:13 +02:00
}
2010-12-22 16:22:23 +01:00
2012-09-10 06:19:28 +02:00
this . methodProfiler . b ( ) ;
2010-12-22 16:22:23 +01:00
}
2012-07-29 09:33:13 +02:00
public boolean getAllowNether ( ) {
return true ;
2010-12-22 16:22:23 +01:00
}
2010-12-28 20:52:24 +01:00
public void a ( IUpdatePlayerListBox iupdateplayerlistbox ) {
2013-03-13 23:33:27 +01:00
this . o . add ( iupdateplayerlistbox ) ;
2010-12-22 16:22:23 +01:00
}
2012-07-29 09:33:13 +02:00
public static void main ( final OptionSet options ) { // CraftBukkit - replaces main(String[] astring)
2011-04-20 22:47:26 +02:00
StatisticList . a ( ) ;
2013-03-13 23:33:27 +01:00
IConsoleLogManager iconsolelogmanager = null ;
2011-04-20 22:47:26 +02:00
2010-12-22 16:22:23 +01:00
try {
2012-07-29 09:33:13 +02:00
/ * CraftBukkit start - replace everything
boolean flag = false ;
String s = null ;
String s1 = " . " ;
String s2 = null ;
boolean flag1 = false ;
boolean flag2 = false ;
int i = - 1 ;
for ( int j = 0 ; j < astring . length ; + + j ) {
String s3 = astring [ j ] ;
String s4 = j = = astring . length - 1 ? null : astring [ j + 1 ] ;
boolean flag3 = false ;
if ( ! s3 . equals ( " nogui " ) & & ! s3 . equals ( " --nogui " ) ) {
if ( s3 . equals ( " --port " ) & & s4 ! = null ) {
flag3 = true ;
try {
i = Integer . parseInt ( s4 ) ;
} catch ( NumberFormatException numberformatexception ) {
;
}
} else if ( s3 . equals ( " --singleplayer " ) & & s4 ! = null ) {
flag3 = true ;
s = s4 ;
} else if ( s3 . equals ( " --universe " ) & & s4 ! = null ) {
flag3 = true ;
s1 = s4 ;
} else if ( s3 . equals ( " --world " ) & & s4 ! = null ) {
flag3 = true ;
s2 = s4 ;
} else if ( s3 . equals ( " --demo " ) ) {
flag1 = true ;
} else if ( s3 . equals ( " --bonusChest " ) ) {
flag2 = true ;
}
} else {
flag = false ;
}
if ( flag3 ) {
+ + j ;
}
}
// */
2011-01-29 22:50:29 +01:00
2012-07-29 09:33:13 +02:00
DedicatedServer dedicatedserver = new DedicatedServer ( options ) ;
2013-03-13 23:33:27 +01:00
iconsolelogmanager = dedicatedserver . getLogger ( ) ;
2012-07-29 09:33:13 +02:00
if ( options . has ( " port " ) ) {
int port = ( Integer ) options . valueOf ( " port " ) ;
if ( port > 0 ) {
dedicatedserver . setPort ( port ) ;
}
}
if ( options . has ( " universe " ) ) {
dedicatedserver . universe = ( File ) options . valueOf ( " universe " ) ;
}
if ( options . has ( " world " ) ) {
2012-10-25 05:53:23 +02:00
dedicatedserver . l ( ( String ) options . valueOf ( " world " ) ) ;
2012-07-29 09:33:13 +02:00
}
/ *
if ( s ! = null ) {
2012-10-25 05:53:23 +02:00
dedicatedserver . k ( s ) ;
2012-07-29 09:33:13 +02:00
}
if ( s2 ! = null ) {
2012-10-25 05:53:23 +02:00
dedicatedserver . l ( s2 ) ;
2012-07-29 09:33:13 +02:00
}
2010-12-22 16:22:23 +01:00
2012-07-29 09:33:13 +02:00
if ( i > = 0 ) {
dedicatedserver . setPort ( i ) ;
}
if ( flag1 ) {
dedicatedserver . b ( true ) ;
}
if ( flag2 ) {
dedicatedserver . c ( true ) ;
}
if ( flag ) {
2013-03-13 23:33:27 +01:00
dedicatedserver . ao ( ) ;
2012-07-29 09:33:13 +02:00
}
* /
dedicatedserver . primaryThread . start ( ) ;
// Runtime.getRuntime().addShutdownHook(new ThreadShutdown(dedicatedserver));
// CraftBukkit end
2010-12-28 20:52:24 +01:00
} catch ( Exception exception ) {
2013-03-13 23:33:27 +01:00
if ( iconsolelogmanager ! = null ) {
iconsolelogmanager . severe ( " Failed to start the minecraft server " , exception ) ;
} else {
Logger . getAnonymousLogger ( ) . log ( Level . SEVERE , " Failed to start the minecraft server " , exception ) ;
}
2010-12-22 16:22:23 +01:00
}
}
2012-10-25 05:53:23 +02:00
public void t ( ) {
2012-07-29 09:33:13 +02:00
// (new ThreadServerApplication(this, "Server thread")).start(); // CraftBukkit - prevent abuse
2010-12-22 16:22:23 +01:00
}
2012-10-25 05:53:23 +02:00
public File e ( String s ) {
return new File ( this . o ( ) , s ) ;
2012-07-29 09:33:13 +02:00
}
public void info ( String s ) {
2013-03-13 23:33:27 +01:00
this . getLogger ( ) . info ( s ) ;
2010-12-22 16:22:23 +01:00
}
2011-11-20 09:01:14 +01:00
public void warning ( String s ) {
2013-03-13 23:33:27 +01:00
this . getLogger ( ) . warning ( s ) ;
2011-03-31 22:40:00 +02:00
}
2011-06-27 00:25:01 +02:00
public WorldServer getWorldServer ( int i ) {
2011-05-28 22:50:08 +02:00
// CraftBukkit start
2011-06-27 00:25:01 +02:00
for ( WorldServer world : this . worlds ) {
2011-05-26 23:15:27 +02:00
if ( world . dimension = = i ) {
return world ;
}
}
2011-05-28 22:50:08 +02:00
2011-06-27 00:25:01 +02:00
return this . worlds . get ( 0 ) ;
2011-05-28 22:50:08 +02:00
// CraftBukkit end
2011-05-26 14:48:22 +02:00
}
2012-10-25 05:53:23 +02:00
public String u ( ) {
2012-07-29 09:33:13 +02:00
return this . serverIp ;
2011-11-20 09:01:14 +01:00
}
2012-10-25 05:53:23 +02:00
public int v ( ) {
2013-03-13 23:33:27 +01:00
return this . r ;
2011-11-20 09:01:14 +01:00
}
2012-10-25 05:53:23 +02:00
public String w ( ) {
2012-01-14 21:03:48 +01:00
return this . motd ;
2011-11-20 09:01:14 +01:00
}
public String getVersion ( ) {
2013-03-20 21:09:23 +01:00
return " 1.5.1 " ;
2011-11-20 09:01:14 +01:00
}
2012-10-25 05:53:23 +02:00
public int y ( ) {
2013-03-13 23:33:27 +01:00
return this . s . getPlayerCount ( ) ;
2011-11-20 09:01:14 +01:00
}
2012-10-25 05:53:23 +02:00
public int z ( ) {
2013-03-13 23:33:27 +01:00
return this . s . getMaxPlayers ( ) ;
2011-11-20 09:01:14 +01:00
}
public String [ ] getPlayers ( ) {
2013-03-13 23:33:27 +01:00
return this . s . d ( ) ;
2011-11-20 09:01:14 +01:00
}
public String getPlugins ( ) {
2011-11-06 00:58:13 +01:00
// CraftBukkit start - whole method
StringBuilder result = new StringBuilder ( ) ;
2012-07-22 08:18:00 +02:00
org . bukkit . plugin . Plugin [ ] plugins = server . getPluginManager ( ) . getPlugins ( ) ;
2011-11-06 00:58:13 +01:00
result . append ( server . getName ( ) ) ;
result . append ( " on Bukkit " ) ;
result . append ( server . getBukkitVersion ( ) ) ;
2012-06-09 19:59:52 +02:00
if ( plugins . length > 0 & & this . server . getQueryPlugins ( ) ) {
2011-11-06 00:58:13 +01:00
result . append ( " : " ) ;
for ( int i = 0 ; i < plugins . length ; i + + ) {
if ( i > 0 ) {
result . append ( " ; " ) ;
}
result . append ( plugins [ i ] . getDescription ( ) . getName ( ) ) ;
result . append ( " " ) ;
result . append ( plugins [ i ] . getDescription ( ) . getVersion ( ) . replaceAll ( " ; " , " , " ) ) ;
}
}
return result . toString ( ) ;
// CraftBukkit end
2011-11-20 09:01:14 +01:00
}
2012-10-07 22:08:21 +02:00
// CraftBukkit start
2012-10-25 05:53:23 +02:00
public String h ( final String s ) { // CraftBukkit - final parameter
2012-10-07 22:08:21 +02:00
Waitable < String > waitable = new Waitable < String > ( ) {
@Override
protected String evaluate ( ) {
2012-10-25 05:53:23 +02:00
RemoteControlCommandListener . instance . c ( ) ;
2012-10-07 22:08:21 +02:00
// Event changes start
RemoteServerCommandEvent event = new RemoteServerCommandEvent ( MinecraftServer . this . remoteConsole , s ) ;
MinecraftServer . this . server . getPluginManager ( ) . callEvent ( event ) ;
// Event changes end
ServerCommand servercommand = new ServerCommand ( event . getCommand ( ) , RemoteControlCommandListener . instance ) ;
2013-03-13 23:33:27 +01:00
// this.p.a(RemoteControlCommandListener.instance, s);
2012-10-07 22:08:21 +02:00
MinecraftServer . this . server . dispatchServerCommand ( MinecraftServer . this . remoteConsole , servercommand ) ; // CraftBukkit
2012-10-25 05:53:23 +02:00
return RemoteControlCommandListener . instance . d ( ) ;
2012-10-07 22:08:21 +02:00
} } ;
processQueue . add ( waitable ) ;
try {
return waitable . get ( ) ;
} catch ( ExecutionException e ) {
throw new RuntimeException ( " Exception processing rcon command " + s , e . getCause ( ) ) ;
} catch ( InterruptedException e ) {
Thread . currentThread ( ) . interrupt ( ) ; // Maintain interrupted state
throw new RuntimeException ( " Interrupted processing rcon command " + s , e ) ;
}
2011-12-07 07:01:05 +01:00
// CraftBukkit end
2011-11-20 09:01:14 +01:00
}
public boolean isDebugging ( ) {
2012-07-29 09:33:13 +02:00
return this . getPropertyManager ( ) . getBoolean ( " debug " , false ) ; // CraftBukkit - don't hardcode
2011-11-20 09:01:14 +01:00
}
2012-10-25 05:53:23 +02:00
public void i ( String s ) {
2013-03-13 23:33:27 +01:00
this . getLogger ( ) . severe ( s ) ;
2011-11-20 09:01:14 +01:00
}
2012-10-25 05:53:23 +02:00
public void j ( String s ) {
2011-11-20 09:01:14 +01:00
if ( this . isDebugging ( ) ) {
2013-03-13 23:33:27 +01:00
this . getLogger ( ) . info ( s ) ;
2011-11-20 09:01:14 +01:00
}
}
2012-07-29 09:33:13 +02:00
public String getServerModName ( ) {
return " craftbukkit " ; // CraftBukkit - cb > vanilla!
}
public CrashReport b ( CrashReport crashreport ) {
2012-11-06 13:05:28 +01:00
crashreport . g ( ) . a ( " Profiler Position " , ( Callable ) ( new CrashReportProfilerPosition ( this ) ) ) ;
if ( this . worlds ! = null & & this . worlds . size ( ) > 0 & & this . worlds . get ( 0 ) ! = null ) {
crashreport . g ( ) . a ( " Vec3 Pool Size " , ( Callable ) ( new CrashReportVec3DPoolSize ( this ) ) ) ;
2012-07-29 09:33:13 +02:00
}
2013-03-13 23:33:27 +01:00
if ( this . s ! = null ) {
2012-11-06 13:05:28 +01:00
crashreport . g ( ) . a ( " Player Count " , ( Callable ) ( new CrashReportPlayerCount ( this ) ) ) ;
2012-07-29 09:33:13 +02:00
}
return crashreport ;
}
public List a ( ICommandListener icommandlistener , String s ) {
2012-10-09 20:44:04 +02:00
// CraftBukkit start - Allow tab-completion of Bukkit commands
/ *
2012-07-29 09:33:13 +02:00
ArrayList arraylist = new ArrayList ( ) ;
if ( s . startsWith ( " / " ) ) {
s = s . substring ( 1 ) ;
boolean flag = ! s . contains ( " " ) ;
2013-03-13 23:33:27 +01:00
List list = this . p . b ( icommandlistener , s ) ;
2012-07-29 09:33:13 +02:00
if ( list ! = null ) {
Iterator iterator = list . iterator ( ) ;
while ( iterator . hasNext ( ) ) {
String s1 = ( String ) iterator . next ( ) ;
if ( flag ) {
arraylist . add ( " / " + s1 ) ;
} else {
arraylist . add ( s1 ) ;
}
}
}
return arraylist ;
} else {
String [ ] astring = s . split ( " " , - 1 ) ;
String s2 = astring [ astring . length - 1 ] ;
2013-03-13 23:33:27 +01:00
String [ ] astring1 = this . s . d ( ) ;
2012-07-29 09:33:13 +02:00
int i = astring1 . length ;
for ( int j = 0 ; j < i ; + + j ) {
String s3 = astring1 [ j ] ;
if ( CommandAbstract . a ( s2 , s3 ) ) {
arraylist . add ( s3 ) ;
}
}
return arraylist ;
}
2012-10-09 20:44:04 +02:00
* /
return this . server . tabComplete ( icommandlistener , s ) ;
// CraftBukkit end
2011-11-20 09:01:14 +01:00
}
2012-07-29 09:33:13 +02:00
public static MinecraftServer getServer ( ) {
2013-03-13 23:33:27 +01:00
return k ;
2011-11-20 09:01:14 +01:00
}
2012-06-14 04:52:49 +02:00
2012-07-29 09:33:13 +02:00
public String getName ( ) {
return " Server " ;
}
public void sendMessage ( String s ) {
2013-03-13 23:33:27 +01:00
this . getLogger ( ) . info ( StripColor . a ( s ) ) ;
2012-07-29 09:33:13 +02:00
}
2012-10-25 05:53:23 +02:00
public boolean a ( int i , String s ) {
2012-07-29 09:33:13 +02:00
return true ;
}
public String a ( String s , Object . . . aobject ) {
return LocaleLanguage . a ( ) . a ( s , aobject ) ;
}
public ICommandHandler getCommandHandler ( ) {
2013-03-13 23:33:27 +01:00
return this . p ;
2012-07-29 09:33:13 +02:00
}
2012-10-25 05:53:23 +02:00
public KeyPair F ( ) {
2013-03-13 23:33:27 +01:00
return this . H ;
2012-07-29 09:33:13 +02:00
}
2012-10-25 05:53:23 +02:00
public int G ( ) {
2013-03-13 23:33:27 +01:00
return this . r ;
2012-07-29 09:33:13 +02:00
}
public void setPort ( int i ) {
2013-03-13 23:33:27 +01:00
this . r = i ;
2012-07-29 09:33:13 +02:00
}
2012-10-25 05:53:23 +02:00
public String H ( ) {
2013-03-13 23:33:27 +01:00
return this . I ;
2012-07-29 09:33:13 +02:00
}
2012-10-25 05:53:23 +02:00
public void k ( String s ) {
2013-03-13 23:33:27 +01:00
this . I = s ;
2012-07-29 09:33:13 +02:00
}
2012-10-25 05:53:23 +02:00
public boolean I ( ) {
2013-03-13 23:33:27 +01:00
return this . I ! = null ;
2012-07-29 09:33:13 +02:00
}
2012-10-25 05:53:23 +02:00
public String J ( ) {
2013-03-13 23:33:27 +01:00
return this . J ;
2012-07-29 09:33:13 +02:00
}
2012-10-25 05:53:23 +02:00
public void l ( String s ) {
2013-03-13 23:33:27 +01:00
this . J = s ;
2012-07-29 09:33:13 +02:00
}
public void a ( KeyPair keypair ) {
2013-03-13 23:33:27 +01:00
this . H = keypair ;
2012-07-29 09:33:13 +02:00
}
public void c ( int i ) {
// CraftBukkit start
for ( int j = 0 ; j < this . worlds . size ( ) ; + + j ) {
WorldServer worldserver = this . worlds . get ( j ) ;
// CraftBukkit end
if ( worldserver ! = null ) {
if ( worldserver . getWorldData ( ) . isHardcore ( ) ) {
worldserver . difficulty = 3 ;
worldserver . setSpawnFlags ( true , true ) ;
2012-10-25 05:53:23 +02:00
} else if ( this . I ( ) ) {
2012-07-29 09:33:13 +02:00
worldserver . difficulty = i ;
worldserver . setSpawnFlags ( worldserver . difficulty > 0 , true ) ;
} else {
worldserver . difficulty = i ;
worldserver . setSpawnFlags ( this . getSpawnMonsters ( ) , this . spawnAnimals ) ;
}
}
}
}
protected boolean getSpawnMonsters ( ) {
return true ;
}
2012-10-25 05:53:23 +02:00
public boolean M ( ) {
2012-07-29 09:33:13 +02:00
return this . demoMode ;
}
public void b ( boolean flag ) {
this . demoMode = flag ;
}
public void c ( boolean flag ) {
2013-03-13 23:33:27 +01:00
this . M = flag ;
2012-07-29 09:33:13 +02:00
}
public Convertable getConvertable ( ) {
return this . convertable ;
}
2012-10-25 05:53:23 +02:00
public void P ( ) {
2013-03-13 23:33:27 +01:00
this . N = true ;
2012-07-29 09:33:13 +02:00
this . getConvertable ( ) . d ( ) ;
// CraftBukkit start - This needs review, what does it do? (it's new)
for ( int i = 0 ; i < this . worlds . size ( ) ; + + i ) {
WorldServer worldserver = this . worlds . get ( i ) ;
// CraftBukkit end
if ( worldserver ! = null ) {
worldserver . saveLevel ( ) ;
}
}
2012-10-25 05:53:23 +02:00
this . getConvertable ( ) . e ( this . worlds . get ( 0 ) . getDataManager ( ) . g ( ) ) ; // CraftBukkit
2012-07-29 09:33:13 +02:00
this . safeShutdown ( ) ;
}
public String getTexturePack ( ) {
2013-03-13 23:33:27 +01:00
return this . O ;
2012-07-29 09:33:13 +02:00
}
public void setTexturePack ( String s ) {
2013-03-13 23:33:27 +01:00
this . O = s ;
2012-07-29 09:33:13 +02:00
}
public void a ( MojangStatisticsGenerator mojangstatisticsgenerator ) {
mojangstatisticsgenerator . a ( " whitelist_enabled " , Boolean . valueOf ( false ) ) ;
mojangstatisticsgenerator . a ( " whitelist_count " , Integer . valueOf ( 0 ) ) ;
2012-10-25 05:53:23 +02:00
mojangstatisticsgenerator . a ( " players_current " , Integer . valueOf ( this . y ( ) ) ) ;
mojangstatisticsgenerator . a ( " players_max " , Integer . valueOf ( this . z ( ) ) ) ;
2013-03-13 23:33:27 +01:00
mojangstatisticsgenerator . a ( " players_seen " , Integer . valueOf ( this . s . getSeenPlayers ( ) . length ) ) ;
2012-07-29 09:33:13 +02:00
mojangstatisticsgenerator . a ( " uses_auth " , Boolean . valueOf ( this . onlineMode ) ) ;
2012-10-25 05:53:23 +02:00
mojangstatisticsgenerator . a ( " gui_state " , this . ag ( ) ? " enabled " : " disabled " ) ;
2013-03-13 23:33:27 +01:00
mojangstatisticsgenerator . a ( " avg_tick_ms " , Integer . valueOf ( ( int ) ( MathHelper . a ( this . i ) * 1 . 0E - 6D ) ) ) ;
mojangstatisticsgenerator . a ( " avg_sent_packet_count " , Integer . valueOf ( ( int ) MathHelper . a ( this . e ) ) ) ;
mojangstatisticsgenerator . a ( " avg_sent_packet_size " , Integer . valueOf ( ( int ) MathHelper . a ( this . f ) ) ) ;
mojangstatisticsgenerator . a ( " avg_rec_packet_count " , Integer . valueOf ( ( int ) MathHelper . a ( this . g ) ) ) ;
mojangstatisticsgenerator . a ( " avg_rec_packet_size " , Integer . valueOf ( ( int ) MathHelper . a ( this . h ) ) ) ;
2012-07-29 09:33:13 +02:00
int i = 0 ;
// CraftBukkit start
for ( int j = 0 ; j < this . worlds . size ( ) ; + + j ) {
// if (this.worldServer[j] != null) {
WorldServer worldserver = this . worlds . get ( j ) ;
// CraftBukkit end
WorldData worlddata = worldserver . getWorldData ( ) ;
mojangstatisticsgenerator . a ( " world[ " + i + " ][dimension] " , Integer . valueOf ( worldserver . worldProvider . dimension ) ) ;
mojangstatisticsgenerator . a ( " world[ " + i + " ][mode] " , worlddata . getGameType ( ) ) ;
mojangstatisticsgenerator . a ( " world[ " + i + " ][difficulty] " , Integer . valueOf ( worldserver . difficulty ) ) ;
mojangstatisticsgenerator . a ( " world[ " + i + " ][hardcore] " , Boolean . valueOf ( worlddata . isHardcore ( ) ) ) ;
mojangstatisticsgenerator . a ( " world[ " + i + " ][generator_name] " , worlddata . getType ( ) . name ( ) ) ;
mojangstatisticsgenerator . a ( " world[ " + i + " ][generator_version] " , Integer . valueOf ( worlddata . getType ( ) . getVersion ( ) ) ) ;
2013-03-13 23:33:27 +01:00
mojangstatisticsgenerator . a ( " world[ " + i + " ][height] " , Integer . valueOf ( this . C ) ) ;
mojangstatisticsgenerator . a ( " world[ " + i + " ][chunks_loaded] " , Integer . valueOf ( worldserver . J ( ) . getLoadedChunks ( ) ) ) ;
2012-07-29 09:33:13 +02:00
+ + i ;
// } // CraftBukkit
}
mojangstatisticsgenerator . a ( " worlds " , Integer . valueOf ( i ) ) ;
}
public void b ( MojangStatisticsGenerator mojangstatisticsgenerator ) {
2012-10-25 05:53:23 +02:00
mojangstatisticsgenerator . a ( " singleplayer " , Boolean . valueOf ( this . I ( ) ) ) ;
2012-07-29 09:33:13 +02:00
mojangstatisticsgenerator . a ( " server_brand " , this . getServerModName ( ) ) ;
mojangstatisticsgenerator . a ( " gui_supported " , GraphicsEnvironment . isHeadless ( ) ? " headless " : " supported " ) ;
2012-10-25 05:53:23 +02:00
mojangstatisticsgenerator . a ( " dedicated " , Boolean . valueOf ( this . T ( ) ) ) ;
2012-07-29 09:33:13 +02:00
}
public boolean getSnooperEnabled ( ) {
return true ;
}
2012-10-25 05:53:23 +02:00
public int S ( ) {
2012-07-29 09:33:13 +02:00
return 16 ;
}
2012-10-25 05:53:23 +02:00
public abstract boolean T ( ) ;
2012-07-29 09:33:13 +02:00
public boolean getOnlineMode ( ) {
2012-12-20 05:03:52 +01:00
return this . server . getOnlineMode ( ) ; // CraftBukkit
2012-07-29 09:33:13 +02:00
}
public void setOnlineMode ( boolean flag ) {
this . onlineMode = flag ;
}
public boolean getSpawnAnimals ( ) {
return this . spawnAnimals ;
}
public void setSpawnAnimals ( boolean flag ) {
this . spawnAnimals = flag ;
}
public boolean getSpawnNPCs ( ) {
return this . spawnNPCs ;
}
public void setSpawnNPCs ( boolean flag ) {
this . spawnNPCs = flag ;
}
public boolean getPvP ( ) {
return this . pvpMode ;
}
public void setPvP ( boolean flag ) {
this . pvpMode = flag ;
}
public boolean getAllowFlight ( ) {
return this . allowFlight ;
}
public void setAllowFlight ( boolean flag ) {
this . allowFlight = flag ;
}
2012-10-25 05:53:23 +02:00
public abstract boolean getEnableCommandBlock ( ) ;
2012-07-29 09:33:13 +02:00
public String getMotd ( ) {
return this . motd ;
}
public void setMotd ( String s ) {
this . motd = s ;
}
public int getMaxBuildHeight ( ) {
2013-03-13 23:33:27 +01:00
return this . C ;
2012-07-29 09:33:13 +02:00
}
public void d ( int i ) {
2013-03-13 23:33:27 +01:00
this . C = i ;
2012-07-29 09:33:13 +02:00
}
public boolean isStopped ( ) {
return this . isStopped ;
}
2012-12-20 05:03:52 +01:00
public PlayerList getPlayerList ( ) {
2013-03-13 23:33:27 +01:00
return this . s ;
2012-07-29 09:33:13 +02:00
}
2012-12-20 05:03:52 +01:00
public void a ( PlayerList playerlist ) {
2013-03-13 23:33:27 +01:00
this . s = playerlist ;
2012-07-29 09:33:13 +02:00
}
public void a ( EnumGamemode enumgamemode ) {
// CraftBukkit start
for ( int i = 0 ; i < this . worlds . size ( ) ; + + i ) {
getServer ( ) . worlds . get ( i ) . getWorldData ( ) . setGameType ( enumgamemode ) ;
// CraftBukkit end
}
}
2012-10-25 05:53:23 +02:00
public abstract ServerConnection ae ( ) ;
2012-07-29 09:33:13 +02:00
2012-10-25 05:53:23 +02:00
public boolean ag ( ) {
2012-07-29 09:33:13 +02:00
return false ;
}
public abstract String a ( EnumGamemode enumgamemode , boolean flag ) ;
2012-10-25 05:53:23 +02:00
public int ah ( ) {
2012-07-29 09:33:13 +02:00
return this . ticks ;
}
2012-10-25 05:53:23 +02:00
public void ai ( ) {
2013-03-13 23:33:27 +01:00
this . S = true ;
2012-03-30 23:33:51 +02:00
}
2011-11-20 09:01:14 +01:00
2012-10-25 05:53:23 +02:00
public ChunkCoordinates b ( ) {
return new ChunkCoordinates ( 0 , 0 , 0 ) ;
}
public int getSpawnProtection ( ) {
return 16 ;
}
2013-03-13 23:33:27 +01:00
public boolean a ( World world , int i , int j , int k , EntityHuman entityhuman ) {
return false ;
}
public abstract IConsoleLogManager getLogger ( ) ;
2012-12-20 05:03:52 +01:00
public static PlayerList a ( MinecraftServer minecraftserver ) {
2013-03-13 23:33:27 +01:00
return minecraftserver . s ;
2010-12-28 20:52:24 +01:00
}
2011-01-11 09:25:13 +01:00
}