/mcp/temp/src/minecraft_server/net/minecraft/server/MinecraftServer.java
Java | 743 lines | 680 code | 60 blank | 3 comment | 63 complexity | 51f8f3ce36ac6abe79f1bb61a7fe2d2c MD5 | raw file
1// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
2// Jad home page: http://www.kpdus.com/jad.html
3// Decompiler options: packimports(3) braces deadcode fieldsfirst
4
5package net.minecraft.server;
6
7import java.io.File;
8import java.io.IOException;
9import java.net.InetAddress;
10import java.net.UnknownHostException;
11import java.util.ArrayList;
12import java.util.Collections;
13import java.util.HashMap;
14import java.util.Iterator;
15import java.util.List;
16import java.util.Random;
17import java.util.Set;
18import java.util.logging.Level;
19import java.util.logging.Logger;
20import net.minecraft.src.AnvilSaveConverter;
21import net.minecraft.src.AnvilSaveHandler;
22import net.minecraft.src.AxisAlignedBB;
23import net.minecraft.src.ChunkCoordinates;
24import net.minecraft.src.ChunkProviderServer;
25import net.minecraft.src.ConsoleCommandHandler;
26import net.minecraft.src.ConsoleLogManager;
27import net.minecraft.src.ConvertProgressUpdater;
28import net.minecraft.src.EntityTracker;
29import net.minecraft.src.ICommandListener;
30import net.minecraft.src.ISaveFormat;
31import net.minecraft.src.IServer;
32import net.minecraft.src.IUpdatePlayerListBox;
33import net.minecraft.src.MathHelper;
34import net.minecraft.src.NetworkListenThread;
35import net.minecraft.src.Packet;
36import net.minecraft.src.Packet4UpdateTime;
37import net.minecraft.src.PropertyManager;
38import net.minecraft.src.RConConsoleSource;
39import net.minecraft.src.RConThreadMain;
40import net.minecraft.src.RConThreadQuery;
41import net.minecraft.src.ServerCommand;
42import net.minecraft.src.ServerConfigurationManager;
43import net.minecraft.src.ServerGUI;
44import net.minecraft.src.StatList;
45import net.minecraft.src.ThreadCommandReader;
46import net.minecraft.src.ThreadServerApplication;
47import net.minecraft.src.ThreadServerSleep;
48import net.minecraft.src.Vec3D;
49import net.minecraft.src.WorldInfo;
50import net.minecraft.src.WorldManager;
51import net.minecraft.src.WorldProvider;
52import net.minecraft.src.WorldServer;
53import net.minecraft.src.WorldServerMulti;
54import net.minecraft.src.WorldSettings;
55import net.minecraft.src.WorldType;
56
57public class MinecraftServer
58 implements Runnable, ICommandListener, IServer
59{
60
61 public static Logger field_6038_a = Logger.getLogger("Minecraft");
62 public static HashMap field_6037_b = new HashMap();
63 private String field_40030_s;
64 private int field_40029_t;
65 public NetworkListenThread field_6036_c;
66 public PropertyManager field_6035_d;
67 public WorldServer field_6034_e[];
68 public long field_40027_f[];
69 public long field_40028_g[][];
70 public ServerConfigurationManager field_6033_f;
71 private ConsoleCommandHandler field_22005_o;
72 private boolean field_6025_n;
73 public boolean field_6032_g;
74 int field_9014_h;
75 public String field_9013_i;
76 public int field_9012_j;
77 private List field_9010_p;
78 private List field_6023_p;
79 public EntityTracker field_6028_k[];
80 public boolean field_6027_l;
81 public boolean field_6026_m;
82 public boolean field_44002_p;
83 public boolean field_9011_n;
84 public boolean field_27005_o;
85 public String field_35014_p;
86 public int field_48081_t;
87 private long field_48074_E;
88 private long field_48075_F;
89 private long field_48076_G;
90 private long field_48077_H;
91 public long field_48080_u[];
92 public long field_48079_v[];
93 public long field_48078_w[];
94 public long field_48082_x[];
95 private RConThreadQuery field_40032_y;
96 private RConThreadMain field_40031_z;
97
98 public MinecraftServer()
99 {
100 field_40027_f = new long[100];
101 field_6025_n = true;
102 field_6032_g = false;
103 field_9014_h = 0;
104 field_9010_p = new ArrayList();
105 field_6023_p = Collections.synchronizedList(new ArrayList());
106 field_6028_k = new EntityTracker[3];
107 field_48080_u = new long[100];
108 field_48079_v = new long[100];
109 field_48078_w = new long[100];
110 field_48082_x = new long[100];
111 new ThreadServerSleep(this);
112 }
113
114 private boolean func_6008_d()
115 throws UnknownHostException
116 {
117 field_22005_o = new ConsoleCommandHandler(this);
118 ThreadCommandReader threadcommandreader = new ThreadCommandReader(this);
119 threadcommandreader.setDaemon(true);
120 threadcommandreader.start();
121 ConsoleLogManager.func_641_a();
122 field_6038_a.info("Starting minecraft server version 1.2.5");
123 if(Runtime.getRuntime().maxMemory() / 1024L / 1024L < 512L)
124 {
125 field_6038_a.warning("To start the server with more ram, launch it as \"java -Xmx1024M -Xms1024M -jar minecraft_server.jar\"");
126 }
127 field_6038_a.info("Loading properties");
128 field_6035_d = new PropertyManager(new File("server.properties"));
129 field_40030_s = field_6035_d.func_720_a("server-ip", "");
130 field_6027_l = field_6035_d.func_724_a("online-mode", true);
131 field_6026_m = field_6035_d.func_724_a("spawn-animals", true);
132 field_44002_p = field_6035_d.func_724_a("spawn-npcs", true);
133 field_9011_n = field_6035_d.func_724_a("pvp", true);
134 field_27005_o = field_6035_d.func_724_a("allow-flight", false);
135 field_35014_p = field_6035_d.func_720_a("motd", "A Minecraft Server");
136 field_35014_p.replace('\247', '$');
137 InetAddress inetaddress = null;
138 if(field_40030_s.length() > 0)
139 {
140 inetaddress = InetAddress.getByName(field_40030_s);
141 }
142 field_40029_t = field_6035_d.func_722_a("server-port", 25565);
143 field_6038_a.info((new StringBuilder()).append("Starting Minecraft server on ").append(field_40030_s.length() != 0 ? field_40030_s : "*").append(":").append(field_40029_t).toString());
144 try
145 {
146 field_6036_c = new NetworkListenThread(this, inetaddress, field_40029_t);
147 }
148 catch(IOException ioexception)
149 {
150 field_6038_a.warning("**** FAILED TO BIND TO PORT!");
151 field_6038_a.log(Level.WARNING, (new StringBuilder()).append("The exception was: ").append(ioexception.toString()).toString());
152 field_6038_a.warning("Perhaps a server is already running on that port?");
153 return false;
154 }
155 if(!field_6027_l)
156 {
157 field_6038_a.warning("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!");
158 field_6038_a.warning("The server will make no attempt to authenticate usernames. Beware.");
159 field_6038_a.warning("While this makes the game possible to play without internet access, it also opens up the ability for hackers to connect with any username they choose.");
160 field_6038_a.warning("To change this, set \"online-mode\" to \"true\" in the server.settings file.");
161 }
162 field_6033_f = new ServerConfigurationManager(this);
163 field_6028_k[0] = new EntityTracker(this, 0);
164 field_6028_k[1] = new EntityTracker(this, -1);
165 field_6028_k[2] = new EntityTracker(this, 1);
166 long l = System.nanoTime();
167 String s = field_6035_d.func_720_a("level-name", "world");
168 String s1 = field_6035_d.func_720_a("level-seed", "");
169 String s2 = field_6035_d.func_720_a("level-type", "DEFAULT");
170 long l1 = (new Random()).nextLong();
171 if(s1.length() > 0)
172 {
173 try
174 {
175 long l2 = Long.parseLong(s1);
176 if(l2 != 0L)
177 {
178 l1 = l2;
179 }
180 }
181 catch(NumberFormatException numberformatexception)
182 {
183 l1 = s1.hashCode();
184 }
185 }
186 WorldType worldtype = WorldType.func_46049_a(s2);
187 if(worldtype == null)
188 {
189 worldtype = WorldType.field_48457_b;
190 }
191 field_48081_t = field_6035_d.func_722_a("max-build-height", 256);
192 field_48081_t = ((field_48081_t + 8) / 16) * 16;
193 field_48081_t = MathHelper.func_41051_a(field_48081_t, 64, 256);
194 field_6035_d.func_40657_a("max-build-height", Integer.valueOf(field_48081_t));
195 field_6038_a.info((new StringBuilder()).append("Preparing level \"").append(s).append("\"").toString());
196 func_6017_c(new AnvilSaveConverter(new File(".")), s, l1, worldtype);
197 long l3 = System.nanoTime() - l;
198 String s3 = String.format("%.3fs", new Object[] {
199 Double.valueOf((double)l3 / 1000000000D)
200 });
201 field_6038_a.info((new StringBuilder()).append("Done (").append(s3).append(")! For help, type \"help\" or \"?\"").toString());
202 if(field_6035_d.func_724_a("enable-query", false))
203 {
204 field_6038_a.info("Starting GS4 status listener");
205 field_40032_y = new RConThreadQuery(this);
206 field_40032_y.func_40402_a();
207 }
208 if(field_6035_d.func_724_a("enable-rcon", false))
209 {
210 field_6038_a.info("Starting remote control listener");
211 field_40031_z = new RConThreadMain(this);
212 field_40031_z.func_40402_a();
213 }
214 return true;
215 }
216
217 private void func_6017_c(ISaveFormat p_6017_1_, String p_6017_2_, long p_6017_3_, WorldType p_6017_5_)
218 {
219 if(p_6017_1_.func_22102_a(p_6017_2_))
220 {
221 field_6038_a.info("Converting map!");
222 p_6017_1_.func_22101_a(p_6017_2_, new ConvertProgressUpdater(this));
223 }
224 field_6034_e = new WorldServer[3];
225 field_40028_g = new long[field_6034_e.length][100];
226 int i = field_6035_d.func_722_a("gamemode", 0);
227 i = WorldSettings.func_35037_a(i);
228 field_6038_a.info((new StringBuilder()).append("Default game type: ").append(i).toString());
229 boolean flag = field_6035_d.func_724_a("generate-structures", true);
230 WorldSettings worldsettings = new WorldSettings(p_6017_3_, i, flag, false, p_6017_5_);
231 AnvilSaveHandler anvilsavehandler = new AnvilSaveHandler(new File("."), p_6017_2_, true);
232 for(int j = 0; j < field_6034_e.length; j++)
233 {
234 byte byte0 = 0;
235 if(j == 1)
236 {
237 byte0 = -1;
238 }
239 if(j == 2)
240 {
241 byte0 = 1;
242 }
243 if(j == 0)
244 {
245 field_6034_e[j] = new WorldServer(this, anvilsavehandler, p_6017_2_, byte0, worldsettings);
246 } else
247 {
248 field_6034_e[j] = new WorldServerMulti(this, anvilsavehandler, p_6017_2_, byte0, worldsettings, field_6034_e[0]);
249 }
250 field_6034_e[j].func_4072_a(new WorldManager(this, field_6034_e[j]));
251 field_6034_e[j].field_804_l = field_6035_d.func_722_a("difficulty", 1);
252 field_6034_e[j].func_21116_a(field_6035_d.func_724_a("spawn-monsters", true), field_6026_m);
253 field_6034_e[j].func_22081_n().func_35500_d(i);
254 field_6033_f.func_618_a(field_6034_e);
255 }
256
257 char c = '\304';
258 long l = System.currentTimeMillis();
259 for(int k = 0; k < 1; k++)
260 {
261 field_6038_a.info((new StringBuilder()).append("Preparing start region for level ").append(k).toString());
262 WorldServer worldserver = field_6034_e[k];
263 ChunkCoordinates chunkcoordinates = worldserver.func_22078_l();
264 for(int i1 = -c; i1 <= c && field_6025_n; i1 += 16)
265 {
266 for(int j1 = -c; j1 <= c && field_6025_n; j1 += 16)
267 {
268 long l1 = System.currentTimeMillis();
269 if(l1 < l)
270 {
271 l = l1;
272 }
273 if(l1 > l + 1000L)
274 {
275 int k1 = (c * 2 + 1) * (c * 2 + 1);
276 int i2 = (i1 + c) * (c * 2 + 1) + (j1 + 1);
277 func_6019_a("Preparing spawn area", (i2 * 100) / k1);
278 l = l1;
279 }
280 worldserver.field_20911_y.func_376_d(chunkcoordinates.field_22216_a + i1 >> 4, chunkcoordinates.field_528_b + j1 >> 4);
281 while(worldserver.func_6156_d() && field_6025_n) ;
282 }
283
284 }
285
286 }
287
288 func_6011_e();
289 }
290
291 private void func_6019_a(String p_6019_1_, int p_6019_2_)
292 {
293 field_9013_i = p_6019_1_;
294 field_9012_j = p_6019_2_;
295 field_6038_a.info((new StringBuilder()).append(p_6019_1_).append(": ").append(p_6019_2_).append("%").toString());
296 }
297
298 private void func_6011_e()
299 {
300 field_9013_i = null;
301 field_9012_j = 0;
302 }
303
304 private void func_6012_f()
305 {
306 field_6038_a.info("Saving chunks");
307 for(int i = 0; i < field_6034_e.length; i++)
308 {
309 WorldServer worldserver = field_6034_e[i];
310 worldserver.func_485_a(true, null);
311 worldserver.func_30006_w();
312 }
313
314 }
315
316 private void func_6013_g()
317 {
318 field_6038_a.info("Stopping server");
319 if(field_6033_f != null)
320 {
321 field_6033_f.func_617_d();
322 }
323 for(int i = 0; i < field_6034_e.length; i++)
324 {
325 WorldServer worldserver = field_6034_e[i];
326 if(worldserver != null)
327 {
328 func_6012_f();
329 }
330 }
331
332 }
333
334 public void func_6016_a()
335 {
336 field_6025_n = false;
337 }
338
339 public void run()
340 {
341 try
342 {
343 if(func_6008_d())
344 {
345 long l = System.currentTimeMillis();
346 long l1 = 0L;
347 while(field_6025_n)
348 {
349 long l2 = System.currentTimeMillis();
350 long l3 = l2 - l;
351 if(l3 > 2000L)
352 {
353 field_6038_a.warning("Can't keep up! Did the system time change, or is the server overloaded?");
354 l3 = 2000L;
355 }
356 if(l3 < 0L)
357 {
358 field_6038_a.warning("Time ran backwards! Did the system time change?");
359 l3 = 0L;
360 }
361 l1 += l3;
362 l = l2;
363 if(field_6034_e[0].func_22084_q())
364 {
365 func_6018_h();
366 l1 = 0L;
367 } else
368 {
369 while(l1 > 50L)
370 {
371 l1 -= 50L;
372 func_6018_h();
373 }
374 }
375 Thread.sleep(1L);
376 }
377 } else
378 {
379 while(field_6025_n)
380 {
381 func_6021_b();
382 try
383 {
384 Thread.sleep(10L);
385 }
386 catch(InterruptedException interruptedexception)
387 {
388 interruptedexception.printStackTrace();
389 }
390 }
391 }
392 }
393 catch(Throwable throwable1)
394 {
395 throwable1.printStackTrace();
396 field_6038_a.log(Level.SEVERE, "Unexpected exception", throwable1);
397 while(field_6025_n)
398 {
399 func_6021_b();
400 try
401 {
402 Thread.sleep(10L);
403 }
404 catch(InterruptedException interruptedexception1)
405 {
406 interruptedexception1.printStackTrace();
407 }
408 }
409 try
410 {
411 func_6013_g();
412 field_6032_g = true;
413 }
414 catch(Throwable throwable2)
415 {
416 throwable2.printStackTrace();
417 }
418 finally
419 {
420 System.exit(0);
421 }
422 break MISSING_BLOCK_LABEL_346;
423 }
424 try
425 {
426 func_6013_g();
427 field_6032_g = true;
428 }
429 catch(Throwable throwable)
430 {
431 throwable.printStackTrace();
432 }
433 finally
434 {
435 System.exit(0);
436 }
437 break MISSING_BLOCK_LABEL_346;
438 Exception exception2;
439 exception2;
440 try
441 {
442 func_6013_g();
443 field_6032_g = true;
444 }
445 catch(Throwable throwable3)
446 {
447 throwable3.printStackTrace();
448 }
449 finally
450 {
451 System.exit(0);
452 }
453 throw exception2;
454 }
455
456 private void func_6018_h()
457 {
458 long l = System.nanoTime();
459 ArrayList arraylist = new ArrayList();
460 for(Iterator iterator = field_6037_b.keySet().iterator(); iterator.hasNext();)
461 {
462 String s = (String)iterator.next();
463 int j1 = ((Integer)field_6037_b.get(s)).intValue();
464 if(j1 > 0)
465 {
466 field_6037_b.put(s, Integer.valueOf(j1 - 1));
467 } else
468 {
469 arraylist.add(s);
470 }
471 }
472
473 for(int i = 0; i < arraylist.size(); i++)
474 {
475 field_6037_b.remove(arraylist.get(i));
476 }
477
478 AxisAlignedBB.func_703_a();
479 Vec3D.func_761_a();
480 field_9014_h++;
481 for(int j = 0; j < field_6034_e.length; j++)
482 {
483 long l1 = System.nanoTime();
484 if(j == 0 || field_6035_d.func_724_a("allow-nether", true))
485 {
486 WorldServer worldserver = field_6034_e[j];
487 if(field_9014_h % 20 == 0)
488 {
489 field_6033_f.func_28169_a(new Packet4UpdateTime(worldserver.func_22080_k()), worldserver.field_4272_q.field_6165_g);
490 }
491 worldserver.func_22077_g();
492 while(worldserver.func_6156_d()) ;
493 worldserver.func_459_b();
494 }
495 field_40028_g[j][field_9014_h % 100] = System.nanoTime() - l1;
496 }
497
498 field_6036_c.func_715_a();
499 field_6033_f.func_637_b();
500 for(int k = 0; k < field_6028_k.length; k++)
501 {
502 field_6028_k[k].func_607_a();
503 }
504
505 for(int i1 = 0; i1 < field_9010_p.size(); i1++)
506 {
507 ((IUpdatePlayerListBox)field_9010_p.get(i1)).func_690_a();
508 }
509
510 try
511 {
512 func_6021_b();
513 }
514 catch(Exception exception)
515 {
516 field_6038_a.log(Level.WARNING, "Unexpected exception while parsing console command", exception);
517 }
518 field_40027_f[field_9014_h % 100] = System.nanoTime() - l;
519 field_48080_u[field_9014_h % 100] = Packet.field_48099_n - field_48074_E;
520 field_48074_E = Packet.field_48099_n;
521 field_48079_v[field_9014_h % 100] = Packet.field_48100_o - field_48075_F;
522 field_48075_F = Packet.field_48100_o;
523 field_48078_w[field_9014_h % 100] = Packet.field_48101_l - field_48076_G;
524 field_48076_G = Packet.field_48101_l;
525 field_48082_x[field_9014_h % 100] = Packet.field_48102_m - field_48077_H;
526 field_48077_H = Packet.field_48102_m;
527 }
528
529 public void func_6010_a(String p_6010_1_, ICommandListener p_6010_2_)
530 {
531 field_6023_p.add(new ServerCommand(p_6010_1_, p_6010_2_));
532 }
533
534 public void func_6021_b()
535 {
536 ServerCommand servercommand;
537 for(; field_6023_p.size() > 0; field_22005_o.func_22114_a(servercommand))
538 {
539 servercommand = (ServerCommand)field_6023_p.remove(0);
540 }
541
542 }
543
544 public void func_6022_a(IUpdatePlayerListBox p_6022_1_)
545 {
546 field_9010_p.add(p_6022_1_);
547 }
548
549 public static void main(String p_main_0_[])
550 {
551 StatList.func_27092_a();
552 try
553 {
554 MinecraftServer minecraftserver = new MinecraftServer();
555 if(!java.awt.GraphicsEnvironment.isHeadless() && (p_main_0_.length <= 0 || !p_main_0_[0].equals("nogui")))
556 {
557 ServerGUI.func_46_a(minecraftserver);
558 }
559 (new ThreadServerApplication("Server thread", minecraftserver)).start();
560 }
561 catch(Exception exception)
562 {
563 field_6038_a.log(Level.SEVERE, "Failed to start the minecraft server", exception);
564 }
565 }
566
567 public File func_6009_a(String p_6009_1_)
568 {
569 return new File(p_6009_1_);
570 }
571
572 public void func_2_b(String p_2_1_)
573 {
574 field_6038_a.info(p_2_1_);
575 }
576
577 public void func_25002_c(String p_25002_1_)
578 {
579 field_6038_a.warning(p_25002_1_);
580 }
581
582 public String func_1_c()
583 {
584 return "CONSOLE";
585 }
586
587 public WorldServer func_28004_a(int p_28004_1_)
588 {
589 if(p_28004_1_ == -1)
590 {
591 return field_6034_e[1];
592 }
593 if(p_28004_1_ == 1)
594 {
595 return field_6034_e[2];
596 } else
597 {
598 return field_6034_e[0];
599 }
600 }
601
602 public EntityTracker func_28003_b(int p_28003_1_)
603 {
604 if(p_28003_1_ == -1)
605 {
606 return field_6028_k[1];
607 }
608 if(p_28003_1_ == 1)
609 {
610 return field_6028_k[2];
611 } else
612 {
613 return field_6028_k[0];
614 }
615 }
616
617 public int func_40011_a(String p_40011_1_, int p_40011_2_)
618 {
619 return field_6035_d.func_722_a(p_40011_1_, p_40011_2_);
620 }
621
622 public String func_40023_a(String p_40023_1_, String p_40023_2_)
623 {
624 return field_6035_d.func_720_a(p_40023_1_, p_40023_2_);
625 }
626
627 public void func_40017_a(String p_40017_1_, Object p_40017_2_)
628 {
629 field_6035_d.func_40657_a(p_40017_1_, p_40017_2_);
630 }
631
632 public void func_40019_c()
633 {
634 field_6035_d.func_721_b();
635 }
636
637 public String func_40013_e()
638 {
639 File file = field_6035_d.func_40656_c();
640 if(file != null)
641 {
642 return file.getAbsolutePath();
643 } else
644 {
645 return "No settings file";
646 }
647 }
648
649 public String func_40009_f()
650 {
651 return field_40030_s;
652 }
653
654 public int func_40022_g()
655 {
656 return field_40029_t;
657 }
658
659 public String func_40014_h()
660 {
661 return field_35014_p;
662 }
663
664 public String func_40012_i()
665 {
666 return "1.2.5";
667 }
668
669 public int func_40018_j()
670 {
671 return field_6033_f.func_35481_g();
672 }
673
674 public int func_40015_k()
675 {
676 return field_6033_f.func_35480_h();
677 }
678
679 public String[] func_40016_l()
680 {
681 return field_6033_f.func_40575_d();
682 }
683
684 public String func_40024_m()
685 {
686 return field_6035_d.func_720_a("level-name", "world");
687 }
688
689 public String func_40020_n()
690 {
691 return "";
692 }
693
694 public void func_40010_o()
695 {
696 }
697
698 public String func_40008_d(String p_40008_1_)
699 {
700 RConConsoleSource.field_40005_a.func_40002_a();
701 field_22005_o.func_22114_a(new ServerCommand(p_40008_1_, RConConsoleSource.field_40005_a));
702 return RConConsoleSource.field_40005_a.func_40003_b();
703 }
704
705 public boolean func_40021_p()
706 {
707 return false;
708 }
709
710 public void func_40007_e(String p_40007_1_)
711 {
712 field_6038_a.log(Level.SEVERE, p_40007_1_);
713 }
714
715 public void func_40006_f(String p_40006_1_)
716 {
717 if(func_40021_p())
718 {
719 field_6038_a.log(Level.INFO, p_40006_1_);
720 }
721 }
722
723 public String[] func_40026_q()
724 {
725 return (String[])field_6033_f.func_40574_f().toArray(new String[0]);
726 }
727
728 public String[] func_40025_r()
729 {
730 return (String[])field_6033_f.func_40576_e().toArray(new String[0]);
731 }
732
733 public String func_52003_getServerModName()
734 {
735 return "vanilla";
736 }
737
738 public static boolean func_6015_a(MinecraftServer p_6015_0_)
739 {
740 return p_6015_0_.field_6025_n;
741 }
742
743}