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 ;
2013-07-01 13:03:00 +02:00
import java.net.Proxy ;
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-11-03 01:51:14 +01:00
import java.io.IOException ;
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-07-01 13:03:00 +02:00
private static MinecraftServer l ;
2012-07-29 09:33:13 +02:00
public Convertable convertable ; // CraftBukkit - private final -> public
2013-07-01 13:03:00 +02:00
private final MojangStatisticsGenerator n = new MojangStatisticsGenerator ( " server " , this , aq ( ) ) ;
2012-07-29 09:33:13 +02:00
public File universe ; // CraftBukkit - private final -> public
2013-07-01 13:03:00 +02:00
private final List p = new ArrayList ( ) ;
private final ICommandHandler q ;
2012-07-29 09:33:13 +02:00
public final MethodProfiler methodProfiler = new MethodProfiler ( ) ;
private String serverIp ;
2013-07-01 13:03:00 +02:00
private int s = - 1 ;
2013-03-13 23:33:27 +01:00
public WorldServer [ ] worldServer ;
2013-07-01 13:03:00 +02:00
private PlayerList t ;
2011-04-20 19:05:14 +02:00
private boolean isRunning = true ;
2013-07-01 13:03:00 +02:00
private boolean isStopped ;
private int ticks ;
protected Proxy c ;
public String d ;
public int e ;
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-07-01 13:03:00 +02:00
private int D ;
2012-03-01 11:49:23 +01:00
private long E ;
private long F ;
private long G ;
2013-07-01 13:03:00 +02:00
private long H ;
public final long [ ] f ;
public final long [ ] g ;
public final long [ ] h ;
public final long [ ] i ;
public final long [ ] j ;
public long [ ] [ ] k ;
private KeyPair I ;
2012-07-29 09:33:13 +02:00
private String J ;
2013-07-01 13:03:00 +02:00
private String K ;
2012-07-29 09:33:13 +02:00
private boolean demoMode ;
private boolean N ;
2013-07-01 13:03:00 +02:00
private boolean O ;
private String P ;
private boolean Q ;
private long R ;
private String S ;
private boolean T ;
private boolean U ;
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 ;
2013-04-12 01:28:15 +02:00
public static int currentTick = ( int ) ( System . currentTimeMillis ( ) / 50 ) ;
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-07-01 13:03:00 +02:00
this . c = Proxy . NO_PROXY ;
this . f = new long [ 100 ] ;
this . g = new long [ 100 ] ;
this . h = new long [ 100 ] ;
this . i = new long [ 100 ] ;
this . j = new long [ 100 ] ;
this . P = " " ;
l = this ;
2012-07-29 09:33:13 +02:00
// this.universe = file1; // CraftBukkit
2013-07-01 13:03:00 +02:00
this . q = new CommandDispatcher ( ) ;
2012-07-29 09:33:13 +02:00
// this.convertable = new WorldLoaderServer(server.getWorldContainer()); // CraftBukkit - moved to DedicatedServer.init
2013-07-01 13:03:00 +02:00
this . ar ( ) ;
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 ) ;
2013-03-25 05:22:32 +01:00
} catch ( 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-07-01 13:03:00 +02:00
private void ar ( ) {
2013-03-13 23:33:27 +01:00
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
2013-07-01 13:03:00 +02:00
protected void a ( 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! " ) ;
2013-07-01 13:03:00 +02:00
this . b ( " 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
}
2013-07-01 13:03:00 +02:00
protected synchronized void b ( String s ) {
this . S = 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 ) {
2013-07-01 13:03:00 +02:00
this . a ( s ) ;
this . b ( " menu.loadingLevel " ) ;
2013-03-13 23:33:27 +01:00
this . worldServer = new WorldServer [ 3 ] ;
2013-03-25 05:22:32 +01:00
// CraftBukkit - Removed ticktime arrays
2012-07-29 09:33:13 +02:00
IDataManager idatamanager = this . convertable . a ( s , true ) ;
WorldData worlddata = idatamanager . getWorldData ( ) ;
2013-03-25 05:22:32 +01:00
// 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 ) {
2013-07-01 13:03:00 +02:00
if ( this . O ( ) ) { // 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 {
2013-03-25 05:22:32 +01:00
com . google . common . io . Files . copy ( new File ( new File ( s ) , " level.dat " ) , new File ( new File ( name ) , " level.dat " ) ) ;
2012-11-03 01:51:14 +01:00
} 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
// 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
}
2013-03-22 22:21:33 +01:00
this . server . scoreboardManager = new org . bukkit . craftbukkit . scoreboard . CraftScoreboardManager ( this , world . getScoreboard ( ) ) ;
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 ) ) ;
2013-07-01 13:03:00 +02:00
if ( ! this . K ( ) ) {
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-07-01 13:03:00 +02:00
this . t . 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 ( ) ) ;
2013-07-01 13:03:00 +02:00
this . f ( ) ;
2012-07-29 09:33:13 +02:00
}
2013-07-01 13:03:00 +02:00
protected void f ( ) {
boolean flag = true ;
boolean flag1 = true ;
boolean flag2 = true ;
boolean flag3 = true ;
int i = 0 ;
2012-07-29 09:33:13 +02:00
2013-07-01 13:03:00 +02:00
this . b ( " menu.generatingTerrain " ) ;
2012-10-25 05:53:23 +02:00
byte b0 = 0 ;
2011-01-29 22:50:29 +01:00
2011-06-18 05:23:34 +02:00
// CraftBukkit start
2013-07-01 13:03:00 +02:00
for ( int m = 0 ; m < this . worlds . size ( ) ; + + m ) {
WorldServer worldserver = this . worlds . get ( m ) ;
2013-07-02 20:35:44 +02:00
this . getLogger ( ) . info ( " Preparing start region for level " + m + " (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 ( ) ;
2013-07-01 13:03:00 +02:00
long j = aq ( ) ;
2013-07-02 20:35:44 +02:00
i = 0 ;
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 ) {
2013-07-01 13:03:00 +02:00
long i1 = aq ( ) ;
2011-01-14 14:31:10 +01:00
2013-07-01 13:03:00 +02:00
if ( i1 - j > 1000L ) {
this . a_ ( " Preparing spawn area " , i * 100 / 625 ) ;
j = i1 ;
2012-01-12 23:10:13 +01:00
}
2011-01-29 22:50:29 +01:00
2013-07-01 13:03:00 +02:00
+ + i ;
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
2013-07-01 13:03:00 +02:00
this . l ( ) ;
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 ( ) ;
2013-07-01 13:03:00 +02:00
public abstract int k ( ) ;
2012-07-29 09:33:13 +02:00
protected void a_ ( String s , int i ) {
2013-07-01 13:03:00 +02:00
this . d = s ;
this . e = i ;
2013-03-13 23:33:27 +01:00
this . getLogger ( ) . info ( s + " : " + i + " % " ) ;
2010-12-22 16:22:23 +01:00
}
2013-07-01 13:03:00 +02:00
protected void l ( ) {
this . d = null ;
this . e = 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-07-01 13:03:00 +02:00
if ( ! this . O ) {
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-07-01 13:03:00 +02:00
if ( ! this . O ) {
2013-03-13 23:33:27 +01:00
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
2013-07-01 13:03:00 +02:00
if ( this . ag ( ) ! = null ) {
this . ag ( ) . a ( ) ;
2012-07-29 09:33:13 +02:00
}
2011-01-27 22:15:41 +01:00
2013-07-01 13:03:00 +02:00
if ( this . t ! = null ) {
2013-03-13 23:33:27 +01:00
this . getLogger ( ) . info ( " Saving players " ) ;
2013-07-01 13:03:00 +02:00
this . t . savePlayers ( ) ;
this . t . 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 ) ;
2013-03-25 05:22:32 +01:00
/ * CraftBukkit start - Handled in saveChunks
2012-11-06 13:05:28 +01:00
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-07-01 13:03:00 +02:00
if ( this . n ! = null & & this . n . d ( ) ) {
this . n . e ( ) ;
2012-01-12 23:10:13 +01:00
}
2012-07-29 09:33:13 +02:00
}
}
public String getServerIp ( ) {
return this . serverIp ;
}
2013-07-01 13:03:00 +02:00
public void c ( 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 ( ) ) {
2013-07-01 13:03:00 +02:00
long i = aq ( ) ;
2010-12-28 20:52:24 +01:00
2013-07-01 13:03:00 +02:00
for ( long j = 0L ; this . isRunning ; this . Q = true ) {
long k = aq ( ) ;
2011-01-29 22:50:29 +01:00
long l = k - i ;
2010-12-28 20:52:24 +01:00
2013-07-01 13:03:00 +02:00
if ( l > 2000L & & i - this . R > = 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-07-01 13:03:00 +02:00
this . R = 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
2013-07-01 13:03:00 +02:00
this . s ( ) ;
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 ;
2013-07-01 13:03:00 +02:00
this . s ( ) ;
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
2013-07-01 13:03:00 +02:00
File file1 = new File ( new File ( this . q ( ) , " 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 {
2013-03-25 05:22:32 +01:00
// CraftBukkit start - Restore terminal to original settings
2012-03-14 21:59:14 +01:00
try {
this . reader . getTerminal ( ) . restore ( ) ;
} catch ( Exception e ) {
}
// CraftBukkit end
2013-07-01 13:03:00 +02:00
this . r ( ) ;
2011-01-14 14:31:10 +01:00
}
2010-12-22 16:22:23 +01:00
}
}
2013-07-01 13:03:00 +02:00
protected File q ( ) {
2012-07-29 09:33:13 +02:00
return new File ( " . " ) ;
}
protected void a ( CrashReport crashreport ) { }
2013-07-01 13:03:00 +02:00
protected void r ( ) { }
2012-07-29 09:33:13 +02:00
2013-07-01 13:03:00 +02:00
protected void s ( ) 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-07-01 13:03:00 +02:00
if ( this . T ) {
this . T = 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 " ) ;
2013-07-01 13:03:00 +02:00
this . t ( ) ;
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-07-01 13:03:00 +02:00
this . t . 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-07-01 13:03:00 +02:00
this . j [ this . ticks % 100 ] = System . nanoTime ( ) - i ;
this . f [ this . ticks % 100 ] = Packet . q - this . E ;
this . E = Packet . q ;
this . g [ this . ticks % 100 ] = Packet . r - this . F ;
this . F = Packet . r ;
this . h [ this . ticks % 100 ] = Packet . o - this . G ;
this . G = Packet . o ;
this . i [ this . ticks % 100 ] = Packet . p - this . H ;
this . H = Packet . p ;
2012-09-10 06:19:28 +02:00
this . methodProfiler . b ( ) ;
this . methodProfiler . a ( " snooper " ) ;
2013-07-01 13:03:00 +02:00
if ( ! this . n . d ( ) & & this . ticks > 100 ) {
this . n . 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-07-01 13:03:00 +02:00
this . n . 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
2013-07-01 13:03:00 +02:00
public void t ( ) {
2012-09-10 06:19:28 +02:00
this . methodProfiler . a ( " levels " ) ;
2011-08-07 05:45:56 +02:00
2013-03-25 05:22:32 +01:00
// CraftBukkit start
2012-07-29 09:33:13 +02:00
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 ( ) ;
2013-03-25 05:22:32 +01:00
// Send time updates to everyone, it will get the right time from the world the player is in.
2011-09-23 20:20:18 +02:00
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 ) ;
2013-07-01 13:03:00 +02:00
entityplayer . playerConnection . sendPacket ( new Packet4UpdateTime ( entityplayer . world . getTime ( ) , entityplayer . getPlayerTime ( ) , entityplayer . world . getGameRules ( ) . getBoolean ( " doDaylightCycle " ) ) ) ; // 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-07-01 13:03:00 +02:00
this . t . a ( new Packet4UpdateTime ( worldserver . getTime ( ) , worldserver . getDayTime ( ) , worldserver . getGameRules ( ) . getBoolean ( " doDaylightCycle " ) ) , 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-07-01 13:03:00 +02:00
// this.k[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 " ) ;
2013-07-01 13:03:00 +02:00
this . ag ( ) . b ( ) ;
2012-09-10 06:19:28 +02:00
this . methodProfiler . c ( " players " ) ;
2013-07-01 13:03:00 +02:00
this . t . tick ( ) ;
2012-09-10 06:19:28 +02:00
this . methodProfiler . c ( " tickables " ) ;
2011-11-20 09:01:14 +01:00
2013-07-01 13:03:00 +02:00
for ( i = 0 ; i < this . p . size ( ) ; + + i ) {
( ( IUpdatePlayerListBox ) this . p . 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-07-01 13:03:00 +02:00
this . p . 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 {
2013-03-25 05:22:32 +01:00
/ * CraftBukkit start - Replace everything
2013-07-01 13:03:00 +02:00
boolean flag = ! GraphicsEnvironment . isHeadless ( ) ;
2012-07-29 09:33:13 +02:00
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 " ) ) {
2013-07-10 03:29:27 +02:00
dedicatedserver . k ( ( String ) options . valueOf ( " world " ) ) ;
2012-07-29 09:33:13 +02:00
}
/ *
if ( s ! = null ) {
2013-07-01 13:03:00 +02:00
dedicatedserver . j ( s ) ;
2012-07-29 09:33:13 +02:00
}
if ( s2 ! = null ) {
2013-07-01 13:03:00 +02:00
dedicatedserver . k ( 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-07-01 13:03:00 +02:00
dedicatedserver . at ( ) ;
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
}
}
2013-07-01 13:03:00 +02:00
public void v ( ) {
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
}
2013-07-01 13:03:00 +02:00
public File d ( String s ) {
return new File ( this . q ( ) , 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
}
2013-07-01 13:03:00 +02:00
public String w ( ) {
2012-07-29 09:33:13 +02:00
return this . serverIp ;
2011-11-20 09:01:14 +01:00
}
2013-07-01 13:03:00 +02:00
public int x ( ) {
return this . s ;
2011-11-20 09:01:14 +01:00
}
2013-07-01 13:03:00 +02:00
public String y ( ) {
2012-01-14 21:03:48 +01:00
return this . motd ;
2011-11-20 09:01:14 +01:00
}
public String getVersion ( ) {
2013-07-09 01:43:37 +02:00
return " 1.6.2 " ;
2011-11-20 09:01:14 +01:00
}
2013-07-01 13:03:00 +02:00
public int A ( ) {
return this . t . getPlayerCount ( ) ;
2011-11-20 09:01:14 +01:00
}
2013-07-01 13:03:00 +02:00
public int B ( ) {
return this . t . getMaxPlayers ( ) ;
2011-11-20 09:01:14 +01:00
}
public String [ ] getPlayers ( ) {
2013-07-01 13:03:00 +02:00
return this . t . d ( ) ;
2011-11-20 09:01:14 +01:00
}
public String getPlugins ( ) {
2013-03-25 05:22:32 +01:00
// CraftBukkit start - Whole method
2011-11-06 00:58:13 +01:00
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
2013-07-01 13:03:00 +02:00
public String g ( final String s ) { // CraftBukkit - final parameter
2012-10-07 22:08:21 +02:00
Waitable < String > waitable = new Waitable < String > ( ) {
@Override
protected String evaluate ( ) {
2013-07-01 13:03:00 +02:00
RemoteControlCommandListener . instance . d ( ) ;
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
2013-07-01 13:03:00 +02:00
return RemoteControlCommandListener . instance . e ( ) ;
2012-10-07 22:08:21 +02:00
} } ;
processQueue . add ( waitable ) ;
try {
return waitable . get ( ) ;
2013-03-25 05:22:32 +01:00
} catch ( java . util . concurrent . ExecutionException e ) {
2012-10-07 22:08:21 +02:00
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
}
2013-07-01 13:03:00 +02:00
public void h ( String s ) {
2013-03-13 23:33:27 +01:00
this . getLogger ( ) . severe ( s ) ;
2011-11-20 09:01:14 +01:00
}
2013-07-01 13:03:00 +02:00
public void i ( 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 ) ) ) ;
2013-07-01 13:03:00 +02:00
if ( this . worlds ! = null & & this . worlds . size ( ) > 0 & & this . worlds . get ( 0 ) ! = null ) { // CraftBukkit
2012-11-06 13:05:28 +01:00
crashreport . g ( ) . a ( " Vec3 Pool Size " , ( Callable ) ( new CrashReportVec3DPoolSize ( this ) ) ) ;
2012-07-29 09:33:13 +02:00
}
2013-07-01 13:03:00 +02:00
if ( this . t ! = 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-07-01 13:03:00 +02:00
return l ;
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 " ;
}
2013-07-01 13:03:00 +02:00
public void sendMessage ( ChatMessage chatmessage ) {
this . getLogger ( ) . info ( chatmessage . toString ( ) ) ;
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 ICommandHandler getCommandHandler ( ) {
2013-07-01 13:03:00 +02:00
return this . q ;
2012-07-29 09:33:13 +02:00
}
2013-07-01 13:03:00 +02:00
public KeyPair H ( ) {
return this . I ;
2012-07-29 09:33:13 +02:00
}
2013-07-01 13:03:00 +02:00
public int I ( ) {
return this . s ;
2012-07-29 09:33:13 +02:00
}
public void setPort ( int i ) {
2013-07-01 13:03:00 +02:00
this . s = i ;
2012-07-29 09:33:13 +02:00
}
2013-07-01 13:03:00 +02:00
public String J ( ) {
return this . J ;
2012-07-29 09:33:13 +02:00
}
2013-07-01 13:03:00 +02:00
public void j ( String s ) {
this . J = s ;
2012-07-29 09:33:13 +02:00
}
2013-07-01 13:03:00 +02:00
public boolean K ( ) {
return this . J ! = null ;
2012-07-29 09:33:13 +02:00
}
2013-07-01 13:03:00 +02:00
public String L ( ) {
return this . K ;
2012-07-29 09:33:13 +02:00
}
2013-07-01 13:03:00 +02:00
public void k ( String s ) {
this . K = s ;
2012-07-29 09:33:13 +02:00
}
public void a ( KeyPair keypair ) {
2013-07-01 13:03:00 +02:00
this . I = 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 ) ;
2013-07-01 13:03:00 +02:00
} else if ( this . K ( ) ) {
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 ;
}
2013-07-01 13:03:00 +02:00
public boolean O ( ) {
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-07-01 13:03:00 +02:00
this . N = flag ;
2012-07-29 09:33:13 +02:00
}
public Convertable getConvertable ( ) {
return this . convertable ;
}
2013-07-01 13:03:00 +02:00
public void R ( ) {
this . O = 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-07-01 13:03:00 +02:00
return this . P ;
2012-07-29 09:33:13 +02:00
}
public void setTexturePack ( String s ) {
2013-07-01 13:03:00 +02:00
this . P = 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 ) ) ;
2013-07-01 13:03:00 +02:00
mojangstatisticsgenerator . a ( " players_current " , Integer . valueOf ( this . A ( ) ) ) ;
mojangstatisticsgenerator . a ( " players_max " , Integer . valueOf ( this . B ( ) ) ) ;
mojangstatisticsgenerator . a ( " players_seen " , Integer . valueOf ( this . t . getSeenPlayers ( ) . length ) ) ;
2012-07-29 09:33:13 +02:00
mojangstatisticsgenerator . a ( " uses_auth " , Boolean . valueOf ( this . onlineMode ) ) ;
2013-07-01 13:03:00 +02:00
mojangstatisticsgenerator . a ( " gui_state " , this . ai ( ) ? " enabled " : " disabled " ) ;
mojangstatisticsgenerator . a ( " run_time " , Long . valueOf ( ( aq ( ) - mojangstatisticsgenerator . g ( ) ) / 60L * 1000L ) ) ;
mojangstatisticsgenerator . a ( " avg_tick_ms " , Integer . valueOf ( ( int ) ( MathHelper . a ( this . j ) * 1 . 0E - 6D ) ) ) ;
mojangstatisticsgenerator . a ( " avg_sent_packet_count " , Integer . valueOf ( ( int ) MathHelper . a ( this . f ) ) ) ;
mojangstatisticsgenerator . a ( " avg_sent_packet_size " , Integer . valueOf ( ( int ) MathHelper . a ( this . g ) ) ) ;
mojangstatisticsgenerator . a ( " avg_rec_packet_count " , Integer . valueOf ( ( int ) MathHelper . a ( this . h ) ) ) ;
mojangstatisticsgenerator . a ( " avg_rec_packet_size " , Integer . valueOf ( ( int ) MathHelper . a ( this . i ) ) ) ;
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-07-01 13:03:00 +02:00
mojangstatisticsgenerator . a ( " world[ " + i + " ][height] " , Integer . valueOf ( this . D ) ) ;
mojangstatisticsgenerator . a ( " world[ " + i + " ][chunks_loaded] " , Integer . valueOf ( worldserver . L ( ) . getLoadedChunks ( ) ) ) ;
2012-07-29 09:33:13 +02:00
+ + i ;
// } // CraftBukkit
}
mojangstatisticsgenerator . a ( " worlds " , Integer . valueOf ( i ) ) ;
}
public void b ( MojangStatisticsGenerator mojangstatisticsgenerator ) {
2013-07-01 13:03:00 +02:00
mojangstatisticsgenerator . a ( " singleplayer " , Boolean . valueOf ( this . K ( ) ) ) ;
2012-07-29 09:33:13 +02:00
mojangstatisticsgenerator . a ( " server_brand " , this . getServerModName ( ) ) ;
mojangstatisticsgenerator . a ( " gui_supported " , GraphicsEnvironment . isHeadless ( ) ? " headless " : " supported " ) ;
2013-07-01 13:03:00 +02:00
mojangstatisticsgenerator . a ( " dedicated " , Boolean . valueOf ( this . V ( ) ) ) ;
2012-07-29 09:33:13 +02:00
}
public boolean getSnooperEnabled ( ) {
return true ;
}
2013-07-01 13:03:00 +02:00
public int U ( ) {
2012-07-29 09:33:13 +02:00
return 16 ;
}
2013-07-01 13:03:00 +02:00
public abstract boolean V ( ) ;
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-07-01 13:03:00 +02:00
return this . D ;
2012-07-29 09:33:13 +02:00
}
public void d ( int i ) {
2013-07-01 13:03:00 +02:00
this . D = 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-07-01 13:03:00 +02:00
return this . t ;
2012-07-29 09:33:13 +02:00
}
2012-12-20 05:03:52 +01:00
public void a ( PlayerList playerlist ) {
2013-07-01 13:03:00 +02:00
this . t = 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
}
}
2013-07-01 13:03:00 +02:00
public abstract ServerConnection ag ( ) ;
2012-07-29 09:33:13 +02:00
2013-07-01 13:03:00 +02:00
public boolean ai ( ) {
2012-07-29 09:33:13 +02:00
return false ;
}
public abstract String a ( EnumGamemode enumgamemode , boolean flag ) ;
2013-07-01 13:03:00 +02:00
public int aj ( ) {
2012-07-29 09:33:13 +02:00
return this . ticks ;
}
2013-07-01 13:03:00 +02:00
public void ak ( ) {
this . T = 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 ) ;
}
2013-07-01 13:03:00 +02:00
public World f_ ( ) {
return this . worlds . get ( 0 ) ; // CraftBukkit
}
2012-10-25 05:53:23 +02:00
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 ( ) ;
2013-04-27 11:40:05 +02:00
public void setForceGamemode ( boolean flag ) {
2013-07-01 13:03:00 +02:00
this . U = flag ;
2013-04-27 11:40:05 +02:00
}
public boolean getForceGamemode ( ) {
2013-07-01 13:03:00 +02:00
return this . U ;
}
public Proxy ap ( ) {
return this . c ;
}
public static long aq ( ) {
return System . currentTimeMillis ( ) ;
2013-04-27 11:40:05 +02:00
}
2012-12-20 05:03:52 +01:00
public static PlayerList a ( MinecraftServer minecraftserver ) {
2013-07-01 13:03:00 +02:00
return minecraftserver . t ;
2010-12-28 20:52:24 +01:00
}
2011-01-11 09:25:13 +01:00
}