Jelajahi Sumber

Minor updating

AY 5 tahun lalu
induk
melakukan
fe240fab73
52 mengubah file dengan 2882 tambahan dan 240 penghapusan
  1. TEMPAT SAMPAH
      __debug_bin
  2. 0 9
      command.go
  3. 20 0
      mc_misc.go
  4. 2 0
      mod/server/core.go
  5. 27 10
      mod/server/server.go
  6. 335 0
      server/crash-reports/crash-2020-12-16_00.02.22-server.txt
  7. 392 0
      server/crash-reports/crash-2020-12-16_18.03.51-server.txt
  8. 305 0
      server/crash-reports/crash-2020-12-16_19.07.18-server.txt
  9. TEMPAT SAMPAH
      server/logs/.2020-12-15-2 2.log.gz.icloud
  10. TEMPAT SAMPAH
      server/logs/2020-12-16-1.log.gz
  11. TEMPAT SAMPAH
      server/logs/2020-12-16-2 2.log.gz
  12. TEMPAT SAMPAH
      server/logs/2020-12-16-2.log.gz
  13. TEMPAT SAMPAH
      server/logs/2020-12-16-3.log.gz
  14. TEMPAT SAMPAH
      server/logs/2020-12-16-4.log.gz
  15. TEMPAT SAMPAH
      server/logs/2020-12-16-5.log.gz
  16. TEMPAT SAMPAH
      server/logs/2020-12-16-6.log.gz
  17. TEMPAT SAMPAH
      server/logs/2020-12-16-7.log.gz
  18. 47 25
      server/logs/latest.log
  19. 1 8
      server/ops.json
  20. 2 2
      server/server.properties
  21. 1 1
      server/usercache.json
  22. TEMPAT SAMPAH
      server/world/DIM-1/data/raids.dat
  23. TEMPAT SAMPAH
      server/world/DIM1/data/raids_end.dat
  24. 241 146
      server/world/advancements/3d1c0ed1-d4d0-42ae-ac5e-a7557d5a6c4f.json
  25. TEMPAT SAMPAH
      server/world/data/raids.dat
  26. TEMPAT SAMPAH
      server/world/level.dat
  27. TEMPAT SAMPAH
      server/world/level.dat_old
  28. TEMPAT SAMPAH
      server/world/playerdata/3d1c0ed1-d4d0-42ae-ac5e-a7557d5a6c4f.dat
  29. TEMPAT SAMPAH
      server/world/playerdata/3d1c0ed1-d4d0-42ae-ac5e-a7557d5a6c4f.dat_old
  30. 0 0
      server/world/poi/r.0.-2.mca
  31. TEMPAT SAMPAH
      server/world/poi/r.0.0.mca
  32. TEMPAT SAMPAH
      server/world/region/.r.-2.-1.mca.icloud
  33. TEMPAT SAMPAH
      server/world/region/r.-1.-1.mca
  34. TEMPAT SAMPAH
      server/world/region/r.-1.0.mca
  35. TEMPAT SAMPAH
      server/world/region/r.-1.1.mca
  36. TEMPAT SAMPAH
      server/world/region/r.-2.-1.mca
  37. TEMPAT SAMPAH
      server/world/region/r.0.-1.mca
  38. TEMPAT SAMPAH
      server/world/region/r.0.-2.mca
  39. TEMPAT SAMPAH
      server/world/region/r.0.0.mca
  40. 0 0
      server/world/region/r.0.1.mca
  41. TEMPAT SAMPAH
      server/world/region/r.1.-1.mca
  42. 0 0
      server/world/region/r.1.0.mca
  43. 0 0
      server/world/region/r.1.1.mca
  44. 1 1
      server/world/stats/3d1c0ed1-d4d0-42ae-ac5e-a7557d5a6c4f.json
  45. 1 0
      web.go
  46. 1359 0
      webroot/css/minecraft-skinviewer.css
  47. 27 0
      webroot/css/minecraft-skinviewer.less
  48. TEMPAT SAMPAH
      webroot/img/3d1c0ed1-d4d0-42ae-ac5e-a7557d5a6c4f.png
  49. TEMPAT SAMPAH
      webroot/img/hyperxraft.png
  50. 41 15
      webroot/info.html
  51. 24 9
      webroot/log.html
  52. 56 14
      webroot/players.html

TEMPAT SAMPAH
__debug_bin


+ 0 - 9
command.go

@@ -1,9 +0,0 @@
-package main
-
-import "net/http"
-
-func SendCommand(w http.ResponseWriter, r *http.Request) {
-	command, _ := mv(r, "command", false)
-	MCServer.SendCommand(command)
-	sendJSONResponse(w, "OK")
-}

+ 20 - 0
mc_misc.go

@@ -0,0 +1,20 @@
+package main
+
+import (
+	"encoding/json"
+	"net/http"
+
+	"aytechnology.us/gominecraft/mod/mcping"
+)
+
+func SendCommand(w http.ResponseWriter, r *http.Request) {
+	command, _ := mv(r, "command", false)
+	MCServer.SendCommand(command)
+	sendJSONResponse(w, "OK")
+}
+
+func ServerInfo(w http.ResponseWriter, r *http.Request) {
+	resp, _ := mcping.Ping("localhost:25565")
+	jsonData, _ := json.Marshal(resp)
+	sendJSONResponse(w, string(jsonData))
+}

+ 2 - 0
mod/server/core.go

@@ -15,6 +15,7 @@ type Handler struct {
 	stdout    io.ReadCloser
 	stdin     io.WriteCloser
 	cmd       *exec.Cmd
+	isRunning bool
 	log       []Log
 }
 
@@ -26,6 +27,7 @@ func NewHandler(JavaPath string, ServerJar string, minRAM string, maxRAM string,
 		minRAM:    minRAM,
 		maxRAM:    maxRAM,
 		args:      args,
+		isRunning: false,
 		log:       []Log{},
 	}
 

+ 27 - 10
mod/server/server.go

@@ -3,6 +3,7 @@ package server
 import (
 	"bufio"
 	"fmt"
+	"log"
 	"os/exec"
 	"strings"
 	"time"
@@ -10,18 +11,34 @@ import (
 
 //StartService is exported
 func (server *Handler) StartService() {
-	cmdName := server.JavaPath + " -Xmx" + server.maxRAM + " -Xms" + server.minRAM + " -jar " + server.ServerJar + " nogui " + server.args
-	fmt.Println(cmdName)
-	cmdArgs := strings.Fields(cmdName)
+	if server.isRunning == false {
+		server.log = []Log{} //Clean up the log
+		cmdName := server.JavaPath + " -Xmx" + server.maxRAM + " -Xms" + server.minRAM + " -jar " + server.ServerJar + " nogui " + server.args
+		fmt.Println(cmdName)
+		cmdArgs := strings.Fields(cmdName)
 
-	server.cmd = exec.Command(cmdArgs[0], cmdArgs[1:len(cmdArgs)]...)
-	server.cmd.Dir = "./server/"
-	server.stdout, _ = server.cmd.StdoutPipe()
-	server.stdin, _ = server.cmd.StdinPipe()
-	server.cmd.Start()
-
-	server.StartStdout()
+		server.cmd = exec.Command(cmdArgs[0], cmdArgs[1:len(cmdArgs)]...)
+		server.cmd.Dir = "./server/"
+		server.stdout, _ = server.cmd.StdoutPipe()
+		server.stdin, _ = server.cmd.StdinPipe()
+		server.cmd.Start()
+		server.StartStdout()
+		server.isRunning = true
+		server.startCheckStatus()
+	} else {
+		log.Println("Server is already running.")
+	}
 	//cmd.Wait()
+	//init the server status checker
+
+}
+
+func (server *Handler) startCheckStatus() {
+	go func() {
+		server.cmd.Wait()
+		log.Println("Stopped.")
+		server.isRunning = false
+	}()
 }
 
 //StartStdout is exported

+ 335 - 0
server/crash-reports/crash-2020-12-16_00.02.22-server.txt

@@ -0,0 +1,335 @@
+---- Minecraft Crash Report ----
+// Why did you do that?
+
+Time: 16/12/2020 上午12:02
+Description: Watching Server
+
+java.lang.Error: Watchdog
+	at app//ceg$a.m(SourceFile:951)
+	at app//cgi.b(SourceFile:43)
+	at app//cgh.a(SourceFile:226)
+	at app//cgh.b(SourceFile:218)
+	at app//brx.b(SourceFile:418)
+	at app//brc.a(SourceFile:60)
+	at app//brc$$Lambda$3644/0x00000008013e1040.apply(Unknown Source)
+	at app//brc.a(SourceFile:181)
+	at app//brc.a(SourceFile:58)
+	at app//brp.a(SourceFile:125)
+	at app//brp.a(SourceFile:219)
+	at app//aag.a(SourceFile:1031)
+	at app//brx.a(SourceFile:573)
+	at app//bcw.k(SourceFile:100)
+	at app//bcw.j(SourceFile:88)
+	at app//aag.a(SourceFile:621)
+	at app//aag$$Lambda$3578/0x00000008013bf840.accept(Unknown Source)
+	at app//brx.a(SourceFile:561)
+	at app//aag.a(SourceFile:411)
+	at app//net.minecraft.server.MinecraftServer.b(SourceFile:871)
+	at app//zg.b(SourceFile:312)
+	at app//net.minecraft.server.MinecraftServer.a(SourceFile:811)
+	at app//net.minecraft.server.MinecraftServer.w(SourceFile:670)
+	at app//net.minecraft.server.MinecraftServer.a(SourceFile:257)
+	at app//net.minecraft.server.MinecraftServer$$Lambda$3318/0x00000008012cc440.run(Unknown Source)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Thread: Server Watchdog
+Stacktrace:
+	at app//ceg$a.m(SourceFile:951)
+	at app//cgi.b(SourceFile:43)
+	at app//cgh.a(SourceFile:226)
+	at app//cgh.b(SourceFile:218)
+	at app//brx.b(SourceFile:418)
+	at app//brc.a(SourceFile:60)
+	at app//brc$$Lambda$3644/0x00000008013e1040.apply(Unknown Source)
+	at app//brc.a(SourceFile:181)
+	at app//brc.a(SourceFile:58)
+	at app//brp.a(SourceFile:125)
+	at app//brp.a(SourceFile:219)
+	at app//aag.a(SourceFile:1031)
+	at app//brx.a(SourceFile:573)
+	at app//bcw.k(SourceFile:100)
+	at app//bcw.j(SourceFile:88)
+	at app//aag.a(SourceFile:621)
+	at app//aag$$Lambda$3578/0x00000008013bf840.accept(Unknown Source)
+	at app//brx.a(SourceFile:561)
+	at app//aag.a(SourceFile:411)
+	at app//net.minecraft.server.MinecraftServer.b(SourceFile:871)
+	at app//zg.b(SourceFile:312)
+	at app//net.minecraft.server.MinecraftServer.a(SourceFile:811)
+	at app//net.minecraft.server.MinecraftServer.w(SourceFile:670)
+	at app//net.minecraft.server.MinecraftServer.a(SourceFile:257)
+
+-- Thread Dump --
+Details:
+	Threads: "Reference Handler" daemon prio=10 Id=2 RUNNABLE
+	at java.base@13.0.2/java.lang.ref.Reference.waitForReferencePendingList(Native Method)
+	at java.base@13.0.2/java.lang.ref.Reference.processPendingReferences(Reference.java:241)
+	at java.base@13.0.2/java.lang.ref.Reference$ReferenceHandler.run(Reference.java:213)
+
+
+"Finalizer" daemon prio=8 Id=3 WAITING on java.lang.ref.ReferenceQueue$Lock@78a28ce3
+	at java.base@13.0.2/java.lang.Object.wait(Native Method)
+	-  waiting on java.lang.ref.ReferenceQueue$Lock@78a28ce3
+	at java.base@13.0.2/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
+	at java.base@13.0.2/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:176)
+	at java.base@13.0.2/java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:170)
+
+
+"Signal Dispatcher" daemon prio=9 Id=4 RUNNABLE
+
+
+"Common-Cleaner" daemon prio=8 Id=11 TIMED_WAITING on java.lang.ref.ReferenceQueue$Lock@76656d87
+	at java.base@13.0.2/java.lang.Object.wait(Native Method)
+	-  waiting on java.lang.ref.ReferenceQueue$Lock@76656d87
+	at java.base@13.0.2/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
+	at java.base@13.0.2/jdk.internal.ref.CleanerImpl.run(CleanerImpl.java:148)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+	at java.base@13.0.2/jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:134)
+
+
+"Worker-Bootstrap-1" daemon prio=5 Id=15 TIMED_WAITING on java.util.concurrent.ForkJoinPool@725ae793
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@725ae793
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.parkUntil(LockSupport.java:276)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1624)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Bootstrap-3" daemon prio=5 Id=17 WAITING on java.util.concurrent.ForkJoinPool@725ae793
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@725ae793
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Bootstrap-4" daemon prio=5 Id=18 WAITING on java.util.concurrent.ForkJoinPool@725ae793
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@725ae793
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Bootstrap-5" daemon prio=5 Id=19 WAITING on java.util.concurrent.ForkJoinPool@725ae793
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@725ae793
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Bootstrap-6" daemon prio=5 Id=20 WAITING on java.util.concurrent.ForkJoinPool@725ae793
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@725ae793
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Bootstrap-7" daemon prio=5 Id=21 WAITING on java.util.concurrent.ForkJoinPool@725ae793
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@725ae793
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Timer hack thread" daemon prio=5 Id=22 TIMED_WAITING
+	at java.base@13.0.2/java.lang.Thread.sleep(Native Method)
+	at app//x$6.run(SourceFile:636)
+
+
+"Worker-Main-8" daemon prio=5 Id=23 WAITING on java.util.concurrent.ForkJoinPool@375867bc
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@375867bc
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Main-9" daemon prio=5 Id=24 WAITING on java.util.concurrent.ForkJoinPool@375867bc
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@375867bc
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Main-10" daemon prio=5 Id=25 WAITING on java.util.concurrent.ForkJoinPool@375867bc
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@375867bc
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Main-11" daemon prio=5 Id=27 WAITING on java.util.concurrent.ForkJoinPool@375867bc
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@375867bc
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Main-12" daemon prio=5 Id=28 WAITING on java.util.concurrent.ForkJoinPool@375867bc
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@375867bc
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Main-13" daemon prio=5 Id=29 WAITING on java.util.concurrent.ForkJoinPool@375867bc
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@375867bc
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Main-14" daemon prio=5 Id=26 TIMED_WAITING on java.util.concurrent.ForkJoinPool@375867bc
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@375867bc
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.parkUntil(LockSupport.java:276)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1624)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Snooper Timer" daemon prio=5 Id=31 WAITING on java.util.TaskQueue@5b713020
+	at java.base@13.0.2/java.lang.Object.wait(Native Method)
+	-  waiting on java.util.TaskQueue@5b713020
+	at java.base@13.0.2/java.lang.Object.wait(Object.java:326)
+	at java.base@13.0.2/java.util.TimerThread.mainLoop(Timer.java:527)
+	at java.base@13.0.2/java.util.TimerThread.run(Timer.java:506)
+
+
+"Server thread" prio=5 Id=30 RUNNABLE
+	at app//ceg$a.m(SourceFile:951)
+	at app//cgi.b(SourceFile:43)
+	at app//cgh.a(SourceFile:226)
+	at app//cgh.b(SourceFile:218)
+	at app//brx.b(SourceFile:418)
+	at app//brc.a(SourceFile:60)
+	at app//brc$$Lambda$3644/0x00000008013e1040.apply(Unknown Source)
+	at app//brc.a(SourceFile:181)
+	...
+
+
+"Server console handler" daemon prio=5 Id=33 RUNNABLE (in native)
+	at java.base@13.0.2/java.io.FileInputStream.readBytes(Native Method)
+	at java.base@13.0.2/java.io.FileInputStream.read(FileInputStream.java:273)
+	at java.base@13.0.2/java.io.BufferedInputStream.read1(BufferedInputStream.java:283)
+	at java.base@13.0.2/java.io.BufferedInputStream.read(BufferedInputStream.java:344)
+	-  locked java.io.BufferedInputStream@625779c
+	at java.base@13.0.2/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
+	at java.base@13.0.2/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
+	at java.base@13.0.2/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
+	-  locked java.io.InputStreamReader@23e67eb4
+	at java.base@13.0.2/java.io.InputStreamReader.read(InputStreamReader.java:185)
+	...
+
+
+"DestroyJavaVM" prio=5 Id=34 RUNNABLE
+
+
+"ObjectCleanerThread" daemon prio=1 Id=36 TIMED_WAITING on java.lang.ref.ReferenceQueue$Lock@577798f3
+	at java.base@13.0.2/java.lang.Object.wait(Native Method)
+	-  waiting on java.lang.ref.ReferenceQueue$Lock@577798f3
+	at java.base@13.0.2/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
+	at app//io.netty.util.internal.ObjectCleaner$1.run(ObjectCleaner.java:54)
+	at app//io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+"Netty Server IO #0" daemon prio=5 Id=37 RUNNABLE
+	at java.base@13.0.2/sun.nio.ch.KQueue.poll(Native Method)
+	at java.base@13.0.2/sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:122)
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:124)
+	-  locked sun.nio.ch.Util$2@5d5420d
+	-  locked sun.nio.ch.KQueueSelectorImpl@28e15cbc
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.select(SelectorImpl.java:136)
+	at app//io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:756)
+	at app//io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:411)
+	at app//io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+"IO-Worker-16" prio=5 Id=39 TIMED_WAITING on java.util.concurrent.SynchronousQueue$TransferStack@38e294ca
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.SynchronousQueue$TransferStack@38e294ca
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:235)
+	at java.base@13.0.2/java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:462)
+	at java.base@13.0.2/java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:361)
+	at java.base@13.0.2/java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:937)
+	at java.base@13.0.2/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1053)
+	at java.base@13.0.2/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1114)
+	at java.base@13.0.2/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
+	...
+
+
+"IO-Worker-17" prio=5 Id=40 TIMED_WAITING on java.util.concurrent.SynchronousQueue$TransferStack@38e294ca
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.SynchronousQueue$TransferStack@38e294ca
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:235)
+	at java.base@13.0.2/java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:462)
+	at java.base@13.0.2/java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:361)
+	at java.base@13.0.2/java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:937)
+	at java.base@13.0.2/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1053)
+	at java.base@13.0.2/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1114)
+	at java.base@13.0.2/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
+	...
+
+
+"Server Watchdog" daemon prio=5 Id=41 RUNNABLE
+	at java.management@13.0.2/sun.management.ThreadImpl.dumpThreads0(Native Method)
+	at java.management@13.0.2/sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:502)
+	at java.management@13.0.2/sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:490)
+	at app//zj.run(SourceFile:49)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+"Netty Server IO #1" daemon prio=5 Id=42 RUNNABLE
+	at java.base@13.0.2/sun.nio.ch.KQueue.poll(Native Method)
+	at java.base@13.0.2/sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:122)
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:124)
+	-  locked sun.nio.ch.Util$2@53392325
+	-  locked sun.nio.ch.KQueueSelectorImpl@7cd3c665
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.select(SelectorImpl.java:136)
+	at app//io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:756)
+	at app//io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:411)
+	at app//io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+
+Stacktrace:
+	at zj.run(SourceFile:65)
+	at java.base/java.lang.Thread.run(Thread.java:830)
+
+-- Performance stats --
+Details:
+	Random tick rate: 3
+	Level stats: ResourceKey[minecraft:dimension / minecraft:overworld]: players: 1, entities: 24272 [minecraft:tnt:23433,minecraft:item:616,minecraft:zombie:31,minecraft:skeleton:29,minecraft:creeper:24], block_entities: 32 [minecraft:mob_spawner:19,minecraft:chest:11,minecraft:beehive:2], block_ticks: 345, fluid_ticks: 229, chunk_source: ServerChunkCache: 2153,
+ResourceKey[minecraft:dimension / minecraft:the_nether]: players: 0, entities: 0 [], block_entities: 0 [], block_ticks: 0, fluid_ticks: 0, chunk_source: ServerChunkCache: 0,
+ResourceKey[minecraft:dimension / minecraft:the_end]: players: 0, entities: 0 [], block_entities: 0 [], block_ticks: 0, fluid_ticks: 0, chunk_source: ServerChunkCache: 0
+
+-- System Details --
+Details:
+	Minecraft Version: 1.16.4
+	Minecraft Version ID: 1.16.4
+	Operating System: Mac OS X (x86_64) version 10.16
+	Java Version: 13.0.2, Oracle Corporation
+	Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode, sharing), Oracle Corporation
+	Memory: 365662208 bytes (348 MB) / 1073741824 bytes (1024 MB) up to 1073741824 bytes (1024 MB)
+	CPUs: 8
+	JVM Flags: 2 total; -Xmx1024M -Xms1024M
+	Player Count: 1 / 99; [aah['Alanyeung'/6995, l='ServerLevel[world]', x=10.48, y=71.00, z=0.70]]
+	Data Packs: vanilla
+	Is Modded: Unknown (can't tell)
+	Type: Dedicated Server (map_server.txt)

+ 392 - 0
server/crash-reports/crash-2020-12-16_18.03.51-server.txt

@@ -0,0 +1,392 @@
+---- Minecraft Crash Report ----
+// Why is it breaking :(
+
+Time: 16/12/2020 下午6:03
+Description: Watching Server
+
+java.lang.Error: Watchdog
+	at app//brx.a(SourceFile:209)
+	at app//brz.a(SourceFile:128)
+	at app//brx.d(SourceFile:204)
+	at app//brx.d_(SourceFile:408)
+	at app//brc.a(SourceFile:59)
+	at app//brc$$Lambda$4041/0x000000080152a440.apply(Unknown Source)
+	at app//brc.a(SourceFile:181)
+	at app//brc.a(SourceFile:58)
+	at app//brp.a(SourceFile:125)
+	at app//brp.a(SourceFile:219)
+	at app//aag.a(SourceFile:1031)
+	at app//brx.a(SourceFile:573)
+	at app//bcw.k(SourceFile:100)
+	at app//bcw.j(SourceFile:88)
+	at app//aag.a(SourceFile:621)
+	at app//aag$$Lambda$3611/0x00000008013bf840.accept(Unknown Source)
+	at app//brx.a(SourceFile:561)
+	at app//aag.a(SourceFile:411)
+	at app//net.minecraft.server.MinecraftServer.b(SourceFile:871)
+	at app//zg.b(SourceFile:312)
+	at app//net.minecraft.server.MinecraftServer.a(SourceFile:811)
+	at app//net.minecraft.server.MinecraftServer.w(SourceFile:670)
+	at app//net.minecraft.server.MinecraftServer.a(SourceFile:257)
+	at app//net.minecraft.server.MinecraftServer$$Lambda$3355/0x00000008012d8040.run(Unknown Source)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Thread: Server Watchdog
+Stacktrace:
+	at app//brx.a(SourceFile:209)
+	at app//brz.a(SourceFile:128)
+	at app//brx.d(SourceFile:204)
+	at app//brx.d_(SourceFile:408)
+	at app//brc.a(SourceFile:59)
+	at app//brc$$Lambda$4041/0x000000080152a440.apply(Unknown Source)
+	at app//brc.a(SourceFile:181)
+	at app//brc.a(SourceFile:58)
+	at app//brp.a(SourceFile:125)
+	at app//brp.a(SourceFile:219)
+	at app//aag.a(SourceFile:1031)
+	at app//brx.a(SourceFile:573)
+	at app//bcw.k(SourceFile:100)
+	at app//bcw.j(SourceFile:88)
+	at app//aag.a(SourceFile:621)
+	at app//aag$$Lambda$3611/0x00000008013bf840.accept(Unknown Source)
+	at app//brx.a(SourceFile:561)
+	at app//aag.a(SourceFile:411)
+	at app//net.minecraft.server.MinecraftServer.b(SourceFile:871)
+	at app//zg.b(SourceFile:312)
+	at app//net.minecraft.server.MinecraftServer.a(SourceFile:811)
+	at app//net.minecraft.server.MinecraftServer.w(SourceFile:670)
+	at app//net.minecraft.server.MinecraftServer.a(SourceFile:257)
+
+-- Thread Dump --
+Details:
+	Threads: "Reference Handler" daemon prio=10 Id=2 RUNNABLE
+	at java.base@13.0.2/java.lang.ref.Reference.waitForReferencePendingList(Native Method)
+	at java.base@13.0.2/java.lang.ref.Reference.processPendingReferences(Reference.java:241)
+	at java.base@13.0.2/java.lang.ref.Reference$ReferenceHandler.run(Reference.java:213)
+
+
+"Finalizer" daemon prio=8 Id=3 WAITING on java.lang.ref.ReferenceQueue$Lock@534b1cb8
+	at java.base@13.0.2/java.lang.Object.wait(Native Method)
+	-  waiting on java.lang.ref.ReferenceQueue$Lock@534b1cb8
+	at java.base@13.0.2/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
+	at java.base@13.0.2/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:176)
+	at java.base@13.0.2/java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:170)
+
+
+"Signal Dispatcher" daemon prio=9 Id=4 RUNNABLE
+
+
+"Common-Cleaner" daemon prio=8 Id=11 TIMED_WAITING on java.lang.ref.ReferenceQueue$Lock@5d8ce8a1
+	at java.base@13.0.2/java.lang.Object.wait(Native Method)
+	-  waiting on java.lang.ref.ReferenceQueue$Lock@5d8ce8a1
+	at java.base@13.0.2/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
+	at java.base@13.0.2/jdk.internal.ref.CleanerImpl.run(CleanerImpl.java:148)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+	at java.base@13.0.2/jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:134)
+
+
+"Worker-Bootstrap-3" daemon prio=5 Id=17 TIMED_WAITING on java.util.concurrent.ForkJoinPool@59b377c8
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@59b377c8
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.parkUntil(LockSupport.java:276)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1624)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Bootstrap-7" daemon prio=5 Id=21 WAITING on java.util.concurrent.ForkJoinPool@59b377c8
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@59b377c8
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Timer hack thread" daemon prio=5 Id=22 TIMED_WAITING
+	at java.base@13.0.2/java.lang.Thread.sleep(Native Method)
+	at app//x$6.run(SourceFile:636)
+
+
+"Worker-Main-8" daemon prio=5 Id=23 WAITING on java.util.concurrent.ForkJoinPool@1cb1e29a
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@1cb1e29a
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Main-9" daemon prio=5 Id=24 WAITING on java.util.concurrent.ForkJoinPool@1cb1e29a
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@1cb1e29a
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Main-10" daemon prio=5 Id=25 WAITING on java.util.concurrent.ForkJoinPool@1cb1e29a
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@1cb1e29a
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Main-11" daemon prio=5 Id=27 WAITING on java.util.concurrent.ForkJoinPool@1cb1e29a
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@1cb1e29a
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Main-12" daemon prio=5 Id=29 TIMED_WAITING on java.util.concurrent.ForkJoinPool@1cb1e29a
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@1cb1e29a
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.parkUntil(LockSupport.java:276)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1624)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Main-13" daemon prio=5 Id=28 WAITING on java.util.concurrent.ForkJoinPool@1cb1e29a
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@1cb1e29a
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Main-14" daemon prio=5 Id=26 WAITING on java.util.concurrent.ForkJoinPool@1cb1e29a
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@1cb1e29a
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Snooper Timer" daemon prio=5 Id=31 WAITING on java.util.TaskQueue@17148368
+	at java.base@13.0.2/java.lang.Object.wait(Native Method)
+	-  waiting on java.util.TaskQueue@17148368
+	at java.base@13.0.2/java.lang.Object.wait(Object.java:326)
+	at java.base@13.0.2/java.util.TimerThread.mainLoop(Timer.java:527)
+	at java.base@13.0.2/java.util.TimerThread.run(Timer.java:506)
+
+
+"Server thread" prio=5 Id=30 RUNNABLE
+	at app//brx.a(SourceFile:209)
+	at app//brz.a(SourceFile:128)
+	at app//brx.d(SourceFile:204)
+	at app//brx.d_(SourceFile:408)
+	at app//brc.a(SourceFile:59)
+	at app//brc$$Lambda$4041/0x000000080152a440.apply(Unknown Source)
+	at app//brc.a(SourceFile:181)
+	at app//brc.a(SourceFile:58)
+	...
+
+
+"Server console handler" daemon prio=5 Id=33 RUNNABLE (in native)
+	at java.base@13.0.2/java.io.FileInputStream.readBytes(Native Method)
+	at java.base@13.0.2/java.io.FileInputStream.read(FileInputStream.java:273)
+	at java.base@13.0.2/java.io.BufferedInputStream.read1(BufferedInputStream.java:283)
+	at java.base@13.0.2/java.io.BufferedInputStream.read(BufferedInputStream.java:344)
+	-  locked java.io.BufferedInputStream@2d67b8cb
+	at java.base@13.0.2/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
+	at java.base@13.0.2/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
+	at java.base@13.0.2/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
+	-  locked java.io.InputStreamReader@6f288798
+	at java.base@13.0.2/java.io.InputStreamReader.read(InputStreamReader.java:185)
+	...
+
+
+"DestroyJavaVM" prio=5 Id=34 RUNNABLE
+
+
+"ObjectCleanerThread" daemon prio=1 Id=35 TIMED_WAITING on java.lang.ref.ReferenceQueue$Lock@7c9e1dd5
+	at java.base@13.0.2/java.lang.Object.wait(Native Method)
+	-  waiting on java.lang.ref.ReferenceQueue$Lock@7c9e1dd5
+	at java.base@13.0.2/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
+	at app//io.netty.util.internal.ObjectCleaner$1.run(ObjectCleaner.java:54)
+	at app//io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+"Netty Server IO #0" daemon prio=5 Id=36 RUNNABLE
+	at java.base@13.0.2/sun.nio.ch.KQueue.poll(Native Method)
+	at java.base@13.0.2/sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:122)
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:124)
+	-  locked sun.nio.ch.Util$2@4fa2deed
+	-  locked sun.nio.ch.KQueueSelectorImpl@5f139632
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.select(SelectorImpl.java:136)
+	at app//io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:756)
+	at app//io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:411)
+	at app//io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+"Server Watchdog" daemon prio=5 Id=39 RUNNABLE
+	at java.management@13.0.2/sun.management.ThreadImpl.dumpThreads0(Native Method)
+	at java.management@13.0.2/sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:502)
+	at java.management@13.0.2/sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:490)
+	at app//zj.run(SourceFile:49)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+"Netty Server IO #1" daemon prio=5 Id=40 RUNNABLE
+	at java.base@13.0.2/sun.nio.ch.KQueue.poll(Native Method)
+	at java.base@13.0.2/sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:122)
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:124)
+	-  locked sun.nio.ch.Util$2@742cce0f
+	-  locked sun.nio.ch.KQueueSelectorImpl@78d005ea
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.select(SelectorImpl.java:136)
+	at app//io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:756)
+	at app//io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:411)
+	at app//io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+"Netty Server IO #2" daemon prio=5 Id=41 RUNNABLE
+	at java.base@13.0.2/sun.nio.ch.KQueue.poll(Native Method)
+	at java.base@13.0.2/sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:122)
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:124)
+	-  locked sun.nio.ch.Util$2@21dcf9ab
+	-  locked sun.nio.ch.KQueueSelectorImpl@62bd49a4
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.select(SelectorImpl.java:136)
+	at app//io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:756)
+	at app//io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:411)
+	at app//io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+"Netty Server IO #3" daemon prio=5 Id=42 RUNNABLE
+	at java.base@13.0.2/sun.nio.ch.KQueue.poll(Native Method)
+	at java.base@13.0.2/sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:122)
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:124)
+	-  locked sun.nio.ch.Util$2@70f3af4a
+	-  locked sun.nio.ch.KQueueSelectorImpl@8740beb
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.select(SelectorImpl.java:136)
+	at app//io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:756)
+	at app//io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:411)
+	at app//io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+"Netty Server IO #4" daemon prio=5 Id=43 RUNNABLE
+	at java.base@13.0.2/sun.nio.ch.KQueue.poll(Native Method)
+	at java.base@13.0.2/sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:122)
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:124)
+	-  locked sun.nio.ch.Util$2@4e23baef
+	-  locked sun.nio.ch.KQueueSelectorImpl@465b2ae6
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.select(SelectorImpl.java:136)
+	at app//io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:756)
+	at app//io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:411)
+	at app//io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+"Netty Server IO #5" daemon prio=5 Id=44 RUNNABLE
+	at java.base@13.0.2/sun.nio.ch.KQueue.poll(Native Method)
+	at java.base@13.0.2/sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:122)
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:124)
+	-  locked sun.nio.ch.Util$2@2b3f4498
+	-  locked sun.nio.ch.KQueueSelectorImpl@3bc3947
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.select(SelectorImpl.java:136)
+	at app//io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:756)
+	at app//io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:411)
+	at app//io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+"Netty Server IO #6" daemon prio=5 Id=48 RUNNABLE
+	at java.base@13.0.2/sun.nio.ch.KQueue.poll(Native Method)
+	at java.base@13.0.2/sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:122)
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:124)
+	-  locked sun.nio.ch.Util$2@501b1f1d
+	-  locked sun.nio.ch.KQueueSelectorImpl@4f0813e2
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.select(SelectorImpl.java:136)
+	at app//io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:756)
+	at app//io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:411)
+	at app//io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+"Netty Server IO #7" daemon prio=5 Id=49 RUNNABLE
+	at java.base@13.0.2/sun.nio.ch.KQueue.poll(Native Method)
+	at java.base@13.0.2/sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:122)
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:124)
+	-  locked sun.nio.ch.Util$2@1ec2951f
+	-  locked sun.nio.ch.KQueueSelectorImpl@7cd6e181
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.select(SelectorImpl.java:136)
+	at app//io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:756)
+	at app//io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:411)
+	at app//io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+"Netty Server IO #8" daemon prio=5 Id=54 RUNNABLE
+	at java.base@13.0.2/sun.nio.ch.KQueue.poll(Native Method)
+	at java.base@13.0.2/sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:122)
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:124)
+	-  locked sun.nio.ch.Util$2@743dfaf1
+	-  locked sun.nio.ch.KQueueSelectorImpl@7b256097
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.select(SelectorImpl.java:136)
+	at app//io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:756)
+	at app//io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:411)
+	at app//io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+"IO-Worker-21" prio=5 Id=55 TIMED_WAITING on java.util.concurrent.SynchronousQueue$TransferStack@71457881
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.SynchronousQueue$TransferStack@71457881
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:235)
+	at java.base@13.0.2/java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:462)
+	at java.base@13.0.2/java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:361)
+	at java.base@13.0.2/java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:937)
+	at java.base@13.0.2/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1053)
+	at java.base@13.0.2/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1114)
+	at java.base@13.0.2/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
+	...
+
+
+"IO-Worker-22" prio=5 Id=56 TIMED_WAITING on java.util.concurrent.SynchronousQueue$TransferStack@71457881
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.SynchronousQueue$TransferStack@71457881
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:235)
+	at java.base@13.0.2/java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:462)
+	at java.base@13.0.2/java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:361)
+	at java.base@13.0.2/java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:937)
+	at java.base@13.0.2/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1053)
+	at java.base@13.0.2/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1114)
+	at java.base@13.0.2/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
+	...
+
+
+
+Stacktrace:
+	at zj.run(SourceFile:65)
+	at java.base/java.lang.Thread.run(Thread.java:830)
+
+-- Performance stats --
+Details:
+	Random tick rate: 3
+	Level stats: ResourceKey[minecraft:dimension / minecraft:overworld]: players: 1, entities: 12388 [minecraft:tnt:9656,minecraft:item:2365,minecraft:chicken:65,minecraft:pig:51,minecraft:cow:46], block_entities: 96 [minecraft:chest:43,minecraft:mob_spawner:41,minecraft:beehive:8,minecraft:furnace:2,minecraft:bell:1], block_ticks: 1719, fluid_ticks: 1332, chunk_source: ServerChunkCache: 3514,
+ResourceKey[minecraft:dimension / minecraft:the_nether]: players: 0, entities: 0 [], block_entities: 0 [], block_ticks: 0, fluid_ticks: 0, chunk_source: ServerChunkCache: 0,
+ResourceKey[minecraft:dimension / minecraft:the_end]: players: 0, entities: 0 [], block_entities: 0 [], block_ticks: 0, fluid_ticks: 0, chunk_source: ServerChunkCache: 0
+
+-- System Details --
+Details:
+	Minecraft Version: 1.16.4
+	Minecraft Version ID: 1.16.4
+	Operating System: Mac OS X (x86_64) version 10.16
+	Java Version: 13.0.2, Oracle Corporation
+	Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode, sharing), Oracle Corporation
+	Memory: 201782784 bytes (192 MB) / 1073741824 bytes (1024 MB) up to 1073741824 bytes (1024 MB)
+	CPUs: 8
+	JVM Flags: 2 total; -Xmx1024M -Xms1024M
+	Player Count: 1 / 99; [aah['Alanyeung'/7023, l='ServerLevel[world]', x=279.77, y=80.74, z=292.82]]
+	Data Packs: vanilla
+	Is Modded: Unknown (can't tell)
+	Type: Dedicated Server (map_server.txt)

+ 305 - 0
server/crash-reports/crash-2020-12-16_19.07.18-server.txt

@@ -0,0 +1,305 @@
+---- Minecraft Crash Report ----
+// Why is it breaking :(
+
+Time: 16/12/2020 下午7:07
+Description: Watching Server
+
+java.lang.Error: Watchdog
+	at java.base@13.0.2/java.util.HashMap$HashIterator.nextNode(HashMap.java:1499)
+	at java.base@13.0.2/java.util.HashMap$KeyIterator.next(HashMap.java:1518)
+	at app//aag.a(SourceFile:1007)
+	at app//brx.a(SourceFile:251)
+	at app//brx.a(SourceFile:217)
+	at app//brp.a(SourceFile:283)
+	at app//aag.a(SourceFile:1032)
+	at app//brx.a(SourceFile:573)
+	at app//bcw.k(SourceFile:100)
+	at app//bcw.j(SourceFile:88)
+	at app//aag.a(SourceFile:621)
+	at app//aag$$Lambda$3586/0x0000000800fb8440.accept(Unknown Source)
+	at app//brx.a(SourceFile:561)
+	at app//aag.a(SourceFile:411)
+	at app//net.minecraft.server.MinecraftServer.b(SourceFile:871)
+	at app//zg.b(SourceFile:312)
+	at app//net.minecraft.server.MinecraftServer.a(SourceFile:811)
+	at app//net.minecraft.server.MinecraftServer.w(SourceFile:670)
+	at app//net.minecraft.server.MinecraftServer.a(SourceFile:257)
+	at app//net.minecraft.server.MinecraftServer$$Lambda$3345/0x00000008012d4040.run(Unknown Source)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+-- Head --
+Thread: Server Watchdog
+Stacktrace:
+	at java.base@13.0.2/java.util.HashMap$HashIterator.nextNode(HashMap.java:1499)
+	at java.base@13.0.2/java.util.HashMap$KeyIterator.next(HashMap.java:1518)
+	at app//aag.a(SourceFile:1007)
+	at app//brx.a(SourceFile:251)
+	at app//brx.a(SourceFile:217)
+	at app//brp.a(SourceFile:283)
+	at app//aag.a(SourceFile:1032)
+	at app//brx.a(SourceFile:573)
+	at app//bcw.k(SourceFile:100)
+	at app//bcw.j(SourceFile:88)
+	at app//aag.a(SourceFile:621)
+	at app//aag$$Lambda$3586/0x0000000800fb8440.accept(Unknown Source)
+	at app//brx.a(SourceFile:561)
+	at app//aag.a(SourceFile:411)
+	at app//net.minecraft.server.MinecraftServer.b(SourceFile:871)
+	at app//zg.b(SourceFile:312)
+	at app//net.minecraft.server.MinecraftServer.a(SourceFile:811)
+	at app//net.minecraft.server.MinecraftServer.w(SourceFile:670)
+	at app//net.minecraft.server.MinecraftServer.a(SourceFile:257)
+
+-- Thread Dump --
+Details:
+	Threads: "Reference Handler" daemon prio=10 Id=2 RUNNABLE
+	at java.base@13.0.2/java.lang.ref.Reference.waitForReferencePendingList(Native Method)
+	at java.base@13.0.2/java.lang.ref.Reference.processPendingReferences(Reference.java:241)
+	at java.base@13.0.2/java.lang.ref.Reference$ReferenceHandler.run(Reference.java:213)
+
+
+"Finalizer" daemon prio=8 Id=3 WAITING on java.lang.ref.ReferenceQueue$Lock@1c77fd61
+	at java.base@13.0.2/java.lang.Object.wait(Native Method)
+	-  waiting on java.lang.ref.ReferenceQueue$Lock@1c77fd61
+	at java.base@13.0.2/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
+	at java.base@13.0.2/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:176)
+	at java.base@13.0.2/java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:170)
+
+
+"Signal Dispatcher" daemon prio=9 Id=4 RUNNABLE
+
+
+"Common-Cleaner" daemon prio=8 Id=11 TIMED_WAITING on java.lang.ref.ReferenceQueue$Lock@12b0009f
+	at java.base@13.0.2/java.lang.Object.wait(Native Method)
+	-  waiting on java.lang.ref.ReferenceQueue$Lock@12b0009f
+	at java.base@13.0.2/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
+	at java.base@13.0.2/jdk.internal.ref.CleanerImpl.run(CleanerImpl.java:148)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+	at java.base@13.0.2/jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:134)
+
+
+"Worker-Bootstrap-5" daemon prio=5 Id=19 WAITING on java.util.concurrent.ForkJoinPool@168f9611
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@168f9611
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Bootstrap-6" daemon prio=5 Id=20 TIMED_WAITING on java.util.concurrent.ForkJoinPool@168f9611
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@168f9611
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.parkUntil(LockSupport.java:276)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1624)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Bootstrap-7" daemon prio=5 Id=21 WAITING on java.util.concurrent.ForkJoinPool@168f9611
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@168f9611
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Timer hack thread" daemon prio=5 Id=22 TIMED_WAITING
+	at java.base@13.0.2/java.lang.Thread.sleep(Native Method)
+	at app//x$6.run(SourceFile:636)
+
+
+"Worker-Main-8" daemon prio=5 Id=23 WAITING on java.util.concurrent.ForkJoinPool@538d0aa4
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@538d0aa4
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Main-9" daemon prio=5 Id=24 WAITING on java.util.concurrent.ForkJoinPool@538d0aa4
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@538d0aa4
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Main-10" daemon prio=5 Id=26 WAITING on java.util.concurrent.ForkJoinPool@538d0aa4
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@538d0aa4
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Main-11" daemon prio=5 Id=27 WAITING on java.util.concurrent.ForkJoinPool@538d0aa4
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@538d0aa4
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Main-12" daemon prio=5 Id=28 WAITING on java.util.concurrent.ForkJoinPool@538d0aa4
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@538d0aa4
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Worker-Main-13" daemon prio=5 Id=29 RUNNABLE
+	at app//it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap.clone(Long2ObjectOpenHashMap.java:1100)
+	at app//cur$a.a(SourceFile:326)
+	at app//cur$a.b(SourceFile:310)
+	at app//cun.e(SourceFile:379)
+	at app//cul.a(SourceFile:203)
+	at app//cuo.a(SourceFile:61)
+	at app//aaj.b(SourceFile:176)
+	at app//aaj.a(SourceFile:108)
+	...
+
+
+"Worker-Main-14" daemon prio=5 Id=25 WAITING on java.util.concurrent.ForkJoinPool@538d0aa4
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.ForkJoinPool@538d0aa4
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1633)
+	at java.base@13.0.2/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
+
+
+"Snooper Timer" daemon prio=5 Id=31 WAITING on java.util.TaskQueue@70b27941
+	at java.base@13.0.2/java.lang.Object.wait(Native Method)
+	-  waiting on java.util.TaskQueue@70b27941
+	at java.base@13.0.2/java.lang.Object.wait(Object.java:326)
+	at java.base@13.0.2/java.util.TimerThread.mainLoop(Timer.java:527)
+	at java.base@13.0.2/java.util.TimerThread.run(Timer.java:506)
+
+
+"Server thread" prio=5 Id=30 RUNNABLE
+	at java.base@13.0.2/java.util.HashMap$HashIterator.nextNode(HashMap.java:1499)
+	at java.base@13.0.2/java.util.HashMap$KeyIterator.next(HashMap.java:1518)
+	at app//aag.a(SourceFile:1007)
+	at app//brx.a(SourceFile:251)
+	at app//brx.a(SourceFile:217)
+	at app//brp.a(SourceFile:283)
+	at app//aag.a(SourceFile:1032)
+	at app//brx.a(SourceFile:573)
+	...
+
+
+"Server console handler" daemon prio=5 Id=32 RUNNABLE (in native)
+	at java.base@13.0.2/java.io.FileInputStream.readBytes(Native Method)
+	at java.base@13.0.2/java.io.FileInputStream.read(FileInputStream.java:273)
+	at java.base@13.0.2/java.io.BufferedInputStream.read1(BufferedInputStream.java:283)
+	at java.base@13.0.2/java.io.BufferedInputStream.read(BufferedInputStream.java:344)
+	-  locked java.io.BufferedInputStream@62143b30
+	at java.base@13.0.2/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
+	at java.base@13.0.2/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
+	at java.base@13.0.2/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
+	-  locked java.io.InputStreamReader@8c1167d
+	at java.base@13.0.2/java.io.InputStreamReader.read(InputStreamReader.java:185)
+	...
+
+
+"DestroyJavaVM" prio=5 Id=34 RUNNABLE
+
+
+"ObjectCleanerThread" daemon prio=1 Id=35 TIMED_WAITING on java.lang.ref.ReferenceQueue$Lock@33a2f5eb
+	at java.base@13.0.2/java.lang.Object.wait(Native Method)
+	-  waiting on java.lang.ref.ReferenceQueue$Lock@33a2f5eb
+	at java.base@13.0.2/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
+	at app//io.netty.util.internal.ObjectCleaner$1.run(ObjectCleaner.java:54)
+	at app//io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+"Netty Server IO #0" daemon prio=5 Id=36 RUNNABLE
+	at java.base@13.0.2/sun.nio.ch.KQueue.poll(Native Method)
+	at java.base@13.0.2/sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:122)
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:124)
+	-  locked sun.nio.ch.Util$2@5039faaf
+	-  locked sun.nio.ch.KQueueSelectorImpl@13379623
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.select(SelectorImpl.java:136)
+	at app//io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:756)
+	at app//io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:411)
+	at app//io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+"Server Watchdog" daemon prio=5 Id=39 RUNNABLE
+	at java.management@13.0.2/sun.management.ThreadImpl.dumpThreads0(Native Method)
+	at java.management@13.0.2/sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:502)
+	at java.management@13.0.2/sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:490)
+	at app//zj.run(SourceFile:49)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+"Netty Server IO #1" daemon prio=5 Id=40 RUNNABLE
+	at java.base@13.0.2/sun.nio.ch.KQueue.poll(Native Method)
+	at java.base@13.0.2/sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:122)
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:124)
+	-  locked sun.nio.ch.Util$2@13c518c6
+	-  locked sun.nio.ch.KQueueSelectorImpl@37ecaaf8
+	at java.base@13.0.2/sun.nio.ch.SelectorImpl.select(SelectorImpl.java:136)
+	at app//io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:756)
+	at app//io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:411)
+	at app//io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
+	at java.base@13.0.2/java.lang.Thread.run(Thread.java:830)
+
+
+"IO-Worker-19" prio=5 Id=46 TIMED_WAITING on java.util.concurrent.SynchronousQueue$TransferStack@281fd228
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.SynchronousQueue$TransferStack@281fd228
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:235)
+	at java.base@13.0.2/java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:462)
+	at java.base@13.0.2/java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:361)
+	at java.base@13.0.2/java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:937)
+	at java.base@13.0.2/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1053)
+	at java.base@13.0.2/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1114)
+	at java.base@13.0.2/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
+	...
+
+
+"IO-Worker-20" prio=5 Id=47 TIMED_WAITING on java.util.concurrent.SynchronousQueue$TransferStack@281fd228
+	at java.base@13.0.2/jdk.internal.misc.Unsafe.park(Native Method)
+	-  waiting on java.util.concurrent.SynchronousQueue$TransferStack@281fd228
+	at java.base@13.0.2/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:235)
+	at java.base@13.0.2/java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:462)
+	at java.base@13.0.2/java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:361)
+	at java.base@13.0.2/java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:937)
+	at java.base@13.0.2/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1053)
+	at java.base@13.0.2/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1114)
+	at java.base@13.0.2/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
+	...
+
+
+
+Stacktrace:
+	at zj.run(SourceFile:65)
+	at java.base/java.lang.Thread.run(Thread.java:830)
+
+-- Performance stats --
+Details:
+	Random tick rate: 3
+	Level stats: ResourceKey[minecraft:dimension / minecraft:overworld]: players: 1, entities: 1497 [minecraft:item:1213,minecraft:tnt:81,minecraft:falling_block:37,minecraft:pig:27,minecraft:skeleton:21], block_entities: 43 [minecraft:mob_spawner:23,minecraft:chest:17,minecraft:beehive:3], block_ticks: 30, fluid_ticks: 517, chunk_source: ServerChunkCache: 2280,
+ResourceKey[minecraft:dimension / minecraft:the_nether]: players: 0, entities: 0 [], block_entities: 0 [], block_ticks: 0, fluid_ticks: 0, chunk_source: ServerChunkCache: 0,
+ResourceKey[minecraft:dimension / minecraft:the_end]: players: 0, entities: 0 [], block_entities: 0 [], block_ticks: 0, fluid_ticks: 0, chunk_source: ServerChunkCache: 0
+
+-- System Details --
+Details:
+	Minecraft Version: 1.16.4
+	Minecraft Version ID: 1.16.4
+	Operating System: Mac OS X (x86_64) version 10.16
+	Java Version: 13.0.2, Oracle Corporation
+	Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode, sharing), Oracle Corporation
+	Memory: 153855232 bytes (146 MB) / 1073741824 bytes (1024 MB) up to 1073741824 bytes (1024 MB)
+	CPUs: 8
+	JVM Flags: 2 total; -Xmx1024M -Xms1024M
+	Player Count: 1 / 99; [aah['Alanyeung'/39, l='ServerLevel[world]', x=5.07, y=92.60, z=-92.73]]
+	Data Packs: vanilla
+	Is Modded: Unknown (can't tell)
+	Type: Dedicated Server (map_server.txt)

TEMPAT SAMPAH
server/logs/.2020-12-15-2 2.log.gz.icloud


TEMPAT SAMPAH
server/logs/2020-12-16-1.log.gz


TEMPAT SAMPAH
server/logs/2020-12-16-2 2.log.gz


TEMPAT SAMPAH
server/logs/2020-12-16-2.log.gz


TEMPAT SAMPAH
server/logs/2020-12-16-3.log.gz


TEMPAT SAMPAH
server/logs/2020-12-16-4.log.gz


TEMPAT SAMPAH
server/logs/2020-12-16-5.log.gz


TEMPAT SAMPAH
server/logs/2020-12-16-6.log.gz


TEMPAT SAMPAH
server/logs/2020-12-16-7.log.gz


+ 47 - 25
server/logs/latest.log

@@ -1,25 +1,47 @@
-[00:00:03] [Server thread/INFO]: Starting minecraft server version 1.16.4
-[00:00:04] [Server thread/INFO]: Loading properties
-[00:00:04] [Server thread/INFO]: Default game type: CREATIVE
-[00:00:04] [Server thread/INFO]: Generating keypair
-[00:00:04] [Server thread/INFO]: Starting Minecraft server on *:25565
-[00:00:04] [Server thread/INFO]: Using default channel type
-[00:00:06] [Server thread/INFO]: Preparing level "world"
-[00:00:06] [Server thread/INFO]: Preparing start region for dimension minecraft:overworld
-[00:00:11] [Server thread/INFO]: Preparing spawn area: 0%
-[00:00:11] [Server thread/INFO]: Preparing spawn area: 0%
-[00:00:11] [Server thread/INFO]: Preparing spawn area: 0%
-[00:00:11] [Server thread/INFO]: Preparing spawn area: 0%
-[00:00:11] [Server thread/INFO]: Preparing spawn area: 0%
-[00:00:11] [Server thread/INFO]: Preparing spawn area: 0%
-[00:00:11] [Server thread/INFO]: Preparing spawn area: 0%
-[00:00:11] [Server thread/INFO]: Preparing spawn area: 0%
-[00:00:11] [Server thread/INFO]: Preparing spawn area: 0%
-[00:00:11] [Server thread/INFO]: Preparing spawn area: 0%
-[00:00:11] [Server thread/INFO]: Preparing spawn area: 0%
-[00:00:11] [Server thread/INFO]: Preparing spawn area: 0%
-[00:00:12] [Server thread/INFO]: Preparing spawn area: 0%
-[00:00:12] [Server thread/INFO]: Preparing spawn area: 0%
-[00:00:13] [Server thread/INFO]: Preparing spawn area: 83%
-[00:00:30] [Server thread/INFO]: Time elapsed: 23716 ms
-[00:00:30] [Server thread/INFO]: Done (23.981s)! For help, type "help"
+[19:15:28] [main/INFO]: Environment: authHost='https://authserver.mojang.com', accountsHost='https://api.mojang.com', sessionHost='https://sessionserver.mojang.com', servicesHost='https://api.minecraftservices.com', name='PROD'
+[19:15:29] [main/WARN]: Ambiguity between arguments [teleport, destination] and [teleport, targets] with inputs: [Player, 0123, @e, dd12be42-52a9-4a91-a8a1-11c01849e498]
+[19:15:29] [main/WARN]: Ambiguity between arguments [teleport, location] and [teleport, destination] with inputs: [0.1 -0.5 .9, 0 0 0]
+[19:15:29] [main/WARN]: Ambiguity between arguments [teleport, location] and [teleport, targets] with inputs: [0.1 -0.5 .9, 0 0 0]
+[19:15:29] [main/WARN]: Ambiguity between arguments [teleport, targets] and [teleport, destination] with inputs: [Player, 0123, dd12be42-52a9-4a91-a8a1-11c01849e498]
+[19:15:29] [main/WARN]: Ambiguity between arguments [teleport, targets, location] and [teleport, targets, destination] with inputs: [0.1 -0.5 .9, 0 0 0]
+[19:15:29] [main/INFO]: Reloading ResourceManager: Default
+[19:15:30] [Worker-Main-14/INFO]: Loaded 7 recipes
+[19:15:30] [Worker-Main-14/INFO]: Loaded 927 advancements
+[19:15:33] [Server thread/INFO]: Starting minecraft server version 1.16.4
+[19:15:33] [Server thread/INFO]: Loading properties
+[19:15:33] [Server thread/INFO]: Default game type: CREATIVE
+[19:15:33] [Server thread/INFO]: Generating keypair
+[19:15:33] [Server thread/INFO]: Starting Minecraft server on *:25565
+[19:15:33] [Server thread/INFO]: Using default channel type
+[19:15:34] [Server thread/INFO]: Preparing level "world"
+[19:15:34] [Server thread/INFO]: Preparing start region for dimension minecraft:overworld
+[19:15:36] [Server thread/INFO]: Preparing spawn area: 0%
+[19:15:36] [Server thread/INFO]: Preparing spawn area: 0%
+[19:15:36] [Server thread/INFO]: Preparing spawn area: 0%
+[19:15:36] [Server thread/INFO]: Preparing spawn area: 0%
+[19:15:36] [Server thread/INFO]: Preparing spawn area: 0%
+[19:15:36] [Server thread/INFO]: Preparing spawn area: 0%
+[19:15:37] [Server thread/INFO]: Preparing spawn area: 50%
+[19:15:40] [Server thread/INFO]: Time elapsed: 6529 ms
+[19:15:40] [Server thread/INFO]: Done (6.689s)! For help, type "help"
+[19:15:43] [Server thread/WARN]: Can't keep up! Is the server overloaded? Running 2063ms or 41 ticks behind
+[19:16:42] [User Authenticator #1/INFO]: UUID of player Alanyeung is 3d1c0ed1-d4d0-42ae-ac5e-a7557d5a6c4f
+[19:16:42] [Server thread/INFO]: Alanyeung[/127.0.0.1:57449] logged in with entity id 1373 at (5.070007431153043, 92.59663901238467, -92.73037502729215)
+[19:16:42] [Server thread/INFO]: Alanyeung joined the game
+[19:16:44] [Server thread/WARN]: Can't keep up! Is the server overloaded? Running 2013ms or 40 ticks behind
+[19:16:57] [Server thread/INFO]: <Alanyeung> dasdasda
+[19:17:02] [Server thread/WARN]: Can't keep up! Is the server overloaded? Running 2713ms or 54 ticks behind
+[19:17:03] [Server thread/INFO]: <Alanyeung> fuck you bitches
+[19:17:06] [Server thread/INFO]: <Alanyeung> testing
+[19:17:08] [Server thread/INFO]: <Alanyeung> ???
+[19:17:13] [Server thread/INFO]: <Alanyeung> hello world
+[19:17:15] [Server thread/INFO]: <Alanyeung> bye world
+[19:17:17] [Server thread/INFO]: <Alanyeung> test tets
+[19:17:35] [Server thread/INFO]: Nothing changed. The player already is an operator
+[19:17:38] [Server thread/INFO]: Made Alanyeung no longer a server operator
+[19:17:40] [Server thread/INFO]: Made Alanyeung a server operator
+[19:17:43] [Server thread/INFO]: Made Alanyeung no longer a server operator
+[19:17:45] [Server thread/INFO]: Alanyeung lost connection: Kicked by an operator
+[19:17:45] [Server thread/INFO]: Alanyeung left the game
+[19:17:45] [Server thread/INFO]: Kicked Alanyeung: Kicked by an operator
+[19:17:45] [Server thread/WARN]: handleDisconnection() called twice

+ 1 - 8
server/ops.json

@@ -1,8 +1 @@
-[
-  {
-    "uuid": "3d1c0ed1-d4d0-42ae-ac5e-a7557d5a6c4f",
-    "name": "Alanyeung",
-    "level": 4,
-    "bypassesPlayerLimit": false
-  }
-]
+[]

+ 2 - 2
server/server.properties

@@ -1,5 +1,5 @@
 #Minecraft server properties
-#Tue Dec 15 23:59:54 PST 2020
+#Wed Dec 16 19:15:28 PST 2020
 enable-jmx-monitoring=false
 rcon.port=25575
 level-seed=
@@ -15,8 +15,8 @@ generate-structures=true
 difficulty=easy
 network-compression-threshold=256
 max-tick-time=60000
-use-native-transport=true
 max-players=99
+use-native-transport=true
 online-mode=true
 enable-status=true
 allow-flight=false

+ 1 - 1
server/usercache.json

@@ -1 +1 @@
-[{"name":"Alanyeung","uuid":"3d1c0ed1-d4d0-42ae-ac5e-a7557d5a6c4f","expiresOn":"2021-01-15 23:56:00 -0800"},{"name":"HyperXraft","uuid":"2561594a-c282-4ab7-b50c-068770cb9c6c","expiresOn":"2021-01-15 23:44:27 -0800"}]
+[{"name":"Alanyeung","uuid":"3d1c0ed1-d4d0-42ae-ac5e-a7557d5a6c4f","expiresOn":"2021-01-16 19:16:42 -0800"},{"name":"HyperXraft","uuid":"2561594a-c282-4ab7-b50c-068770cb9c6c","expiresOn":"2021-01-15 23:44:27 -0800"}]

TEMPAT SAMPAH
server/world/DIM-1/data/raids.dat


TEMPAT SAMPAH
server/world/DIM1/data/raids_end.dat


+ 241 - 146
server/world/advancements/3d1c0ed1-d4d0-42ae-ac5e-a7557d5a6c4f.json

@@ -1,491 +1,586 @@
 {
-  "minecraft:recipes/building_blocks/pink_concrete_powder": {
+  "minecraft:recipes/tools/wooden_axe": {
     "criteria": {
-      "has_gravel": "2020-12-15 19:30:55 -0800"
+      "has_stick": "2020-12-13 13:09:33 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/red_concrete_powder": {
+  "minecraft:recipes/redstone/lever": {
     "criteria": {
-      "has_gravel": "2020-12-15 19:30:55 -0800"
+      "has_cobblestone": "2020-12-15 19:31:17 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/redstone/tnt": {
+  "minecraft:recipes/building_blocks/granite_stairs": {
     "criteria": {
-      "has_gunpowder": "2020-12-13 23:07:46 -0800"
+      "has_granite": "2020-12-16 19:05:39 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/tools/wooden_axe": {
+  "minecraft:recipes/building_blocks/cobblestone_stairs_from_cobblestone_stonecutting": {
     "criteria": {
-      "has_stick": "2020-12-13 13:09:33 -0800"
+      "has_cobblestone": "2020-12-15 19:31:17 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/redstone/lever": {
+  "minecraft:recipes/building_blocks/magenta_concrete_powder": {
     "criteria": {
-      "has_cobblestone": "2020-12-15 19:31:17 -0800"
+      "has_gravel": "2020-12-15 19:30:55 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/purple_concrete_powder": {
+  "minecraft:recipes/building_blocks/polished_andesite_stairs_from_andesite_stonecutting": {
     "criteria": {
-      "has_gravel": "2020-12-15 19:30:55 -0800"
+      "has_andesite": "2020-12-15 19:31:29 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/cobblestone_stairs_from_cobblestone_stonecutting": {
+  "minecraft:recipes/building_blocks/lime_concrete_powder": {
     "criteria": {
-      "has_cobblestone": "2020-12-15 19:31:17 -0800"
+      "has_gravel": "2020-12-15 19:30:55 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/tools/compass": {
+  "minecraft:recipes/building_blocks/diorite_stairs_from_diorite_stonecutting": {
     "criteria": {
-      "has_redstone": "2020-12-15 19:31:32 -0800"
+      "has_diorite": "2020-12-15 19:29:35 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/magenta_concrete_powder": {
+  "minecraft:recipes/building_blocks/yellow_concrete_powder": {
     "criteria": {
       "has_gravel": "2020-12-15 19:30:55 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/andesite_stairs_from_andesite_stonecutting": {
+  "minecraft:recipes/decorations/campfire": {
     "criteria": {
-      "has_andesite": "2020-12-15 19:31:29 -0800"
+      "has_stick": "2020-12-13 13:09:33 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/decorations/diorite_wall_from_diorite_stonecutting": {
+  "minecraft:recipes/building_blocks/diorite_slab_from_diorite_stonecutting": {
     "criteria": {
       "has_diorite": "2020-12-15 19:29:35 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/decorations/diorite_wall": {
+  "minecraft:recipes/decorations/ladder": {
     "criteria": {
-      "has_diorite": "2020-12-15 19:29:35 -0800"
+      "has_stick": "2020-12-13 13:09:33 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/polished_andesite_stairs_from_andesite_stonecutting": {
+  "minecraft:recipes/decorations/chest": {
     "criteria": {
-      "has_andesite": "2020-12-15 19:31:29 -0800"
+      "has_lots_of_items": "2020-12-15 19:31:29 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/lime_concrete_powder": {
+  "minecraft:end/elytra": {
+    "criteria": {
+      "elytra": "2020-12-13 23:30:24 -0800"
+    },
+    "done": true
+  },
+  "minecraft:recipes/building_blocks/brown_concrete_powder": {
     "criteria": {
       "has_gravel": "2020-12-15 19:30:55 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/stone": {
+  "minecraft:recipes/tools/wooden_shovel": {
     "criteria": {
-      "has_cobblestone": "2020-12-15 19:31:17 -0800"
+      "has_stick": "2020-12-13 13:09:33 -0800"
     },
     "done": true
   },
-  "minecraft:story/mine_stone": {
+  "minecraft:recipes/building_blocks/andesite_slab_from_andesite_stonecutting": {
     "criteria": {
-      "get_stone": "2020-12-15 19:31:17 -0800"
+      "has_andesite": "2020-12-15 19:31:29 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/polished_andesite": {
+  "minecraft:recipes/combat/arrow": {
     "criteria": {
-      "has_stone": "2020-12-15 19:31:29 -0800"
+      "has_flint": "2020-12-16 19:04:52 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/redstone/target": {
+  "minecraft:recipes/transportation/spruce_boat": {
     "criteria": {
-      "has_redstone": "2020-12-15 19:31:32 -0800"
+      "in_water": "2020-12-13 12:44:02 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/diorite_stairs_from_diorite_stonecutting": {
+  "minecraft:recipes/tools/flint_and_steel": {
     "criteria": {
-      "has_diorite": "2020-12-15 19:29:35 -0800"
+      "has_flint": "2020-12-16 19:04:52 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/decorations/furnace": {
+  "minecraft:recipes/combat/wooden_sword": {
+    "criteria": {
+      "has_stick": "2020-12-13 13:09:33 -0800"
+    },
+    "done": true
+  },
+  "minecraft:recipes/tools/stone_shovel": {
     "criteria": {
       "has_cobblestone": "2020-12-15 19:31:17 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/yellow_concrete_powder": {
+  "minecraft:recipes/building_blocks/oak_planks": {
+    "criteria": {
+      "has_logs": "2020-12-13 13:09:37 -0800"
+    },
+    "done": true
+  },
+  "minecraft:recipes/building_blocks/blue_concrete_powder": {
     "criteria": {
       "has_gravel": "2020-12-15 19:30:55 -0800"
     },
     "done": true
   },
-  "minecraft:adventure/adventuring_time": {
+  "minecraft:recipes/building_blocks/gray_concrete_powder": {
     "criteria": {
-      "minecraft:forest": "2020-12-13 01:08:54 -0800",
-      "minecraft:mountains": "2020-12-13 23:30:35 -0800",
-      "minecraft:taiga": "2020-12-13 23:29:25 -0800",
-      "minecraft:river": "2020-12-13 12:44:02 -0800",
-      "minecraft:wooded_hills": "2020-12-13 23:30:54 -0800"
+      "has_gravel": "2020-12-15 19:30:55 -0800"
     },
-    "done": false
+    "done": true
   },
-  "minecraft:recipes/decorations/campfire": {
+  "minecraft:recipes/building_blocks/diorite_stairs": {
     "criteria": {
-      "has_stick": "2020-12-13 13:09:33 -0800"
+      "has_diorite": "2020-12-15 19:29:35 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/misc/charcoal": {
+  "minecraft:recipes/building_blocks/granite_slab_from_granite_stonecutting": {
     "criteria": {
-      "has_log": "2020-12-13 13:09:37 -0800"
+      "has_granite": "2020-12-16 19:05:39 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/andesite_stairs": {
+  "minecraft:recipes/building_blocks/polished_granite_from_granite_stonecutting": {
     "criteria": {
-      "has_andesite": "2020-12-15 19:31:29 -0800"
+      "has_granite": "2020-12-16 19:05:39 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/tools/wooden_pickaxe": {
+  "minecraft:recipes/tools/wooden_hoe": {
     "criteria": {
       "has_stick": "2020-12-13 13:09:33 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/diorite_slab_from_diorite_stonecutting": {
+  "minecraft:recipes/building_blocks/andesite": {
+    "criteria": {
+      "has_stone": "2020-12-15 19:29:35 -0800"
+    },
+    "done": true
+  },
+  "minecraft:recipes/building_blocks/cobblestone_slab": {
+    "criteria": {
+      "has_cobblestone": "2020-12-15 19:31:17 -0800"
+    },
+    "done": true
+  },
+  "minecraft:recipes/building_blocks/diorite_slab": {
     "criteria": {
       "has_diorite": "2020-12-15 19:29:35 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/cobblestone_slab_from_cobblestone_stonecutting": {
+  "minecraft:recipes/building_blocks/cobblestone_stairs": {
     "criteria": {
       "has_cobblestone": "2020-12-15 19:31:17 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/decorations/ladder": {
+  "minecraft:recipes/building_blocks/black_concrete_powder": {
     "criteria": {
-      "has_stick": "2020-12-13 13:09:33 -0800"
+      "has_gravel": "2020-12-15 19:30:55 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/redstone/redstone_torch": {
+  "minecraft:recipes/building_blocks/coarse_dirt": {
+    "criteria": {
+      "has_gravel": "2020-12-15 19:30:55 -0800"
+    },
+    "done": true
+  },
+  "minecraft:recipes/decorations/granite_wall": {
+    "criteria": {
+      "has_granite": "2020-12-16 19:05:39 -0800"
+    },
+    "done": true
+  },
+  "minecraft:recipes/redstone/note_block": {
     "criteria": {
       "has_redstone": "2020-12-15 19:31:32 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/transportation/birch_boat": {
+  "minecraft:recipes/building_blocks/oak_wood": {
     "criteria": {
-      "in_water": "2020-12-13 12:44:02 -0800"
+      "has_log": "2020-12-13 13:09:37 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/decorations/chest": {
+  "minecraft:recipes/combat/crossbow": {
     "criteria": {
-      "has_lots_of_items": "2020-12-15 19:31:29 -0800"
+      "has_stick": "2020-12-13 13:09:33 -0800"
     },
     "done": true
   },
-  "minecraft:end/elytra": {
+  "minecraft:recipes/redstone/dropper": {
     "criteria": {
-      "elytra": "2020-12-13 23:30:24 -0800"
+      "has_redstone": "2020-12-15 19:31:32 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/brown_concrete_powder": {
+  "minecraft:recipes/building_blocks/light_gray_concrete_powder": {
     "criteria": {
       "has_gravel": "2020-12-15 19:30:55 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/combat/stone_sword": {
+  "minecraft:recipes/building_blocks/light_blue_concrete_powder": {
     "criteria": {
-      "has_cobblestone": "2020-12-15 19:31:17 -0800"
+      "has_gravel": "2020-12-15 19:30:55 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/decorations/cobblestone_wall": {
+  "minecraft:recipes/building_blocks/polished_diorite_from_diorite_stonecutting": {
     "criteria": {
-      "has_cobblestone": "2020-12-15 19:31:17 -0800"
+      "has_diorite": "2020-12-15 19:29:35 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/polished_andesite_slab_from_andesite_stonecutting": {
+  "minecraft:recipes/building_blocks/granite_stairs_from_granite_stonecutting": {
     "criteria": {
-      "has_andesite": "2020-12-15 19:31:29 -0800"
+      "has_granite": "2020-12-16 19:05:39 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/green_concrete_powder": {
+  "minecraft:recipes/building_blocks/pink_concrete_powder": {
     "criteria": {
       "has_gravel": "2020-12-15 19:30:55 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/tools/wooden_shovel": {
+  "minecraft:recipes/building_blocks/red_concrete_powder": {
     "criteria": {
-      "has_stick": "2020-12-13 13:09:33 -0800"
+      "has_gravel": "2020-12-15 19:30:55 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/polished_andesite_from_andesite_stonecutting": {
+  "minecraft:recipes/redstone/tnt": {
     "criteria": {
-      "has_andesite": "2020-12-15 19:31:29 -0800"
+      "has_gunpowder": "2020-12-13 23:07:46 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/transportation/acacia_boat": {
+  "minecraft:recipes/building_blocks/purple_concrete_powder": {
     "criteria": {
-      "in_water": "2020-12-13 12:44:02 -0800"
+      "has_gravel": "2020-12-15 19:30:55 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/tools/stone_pickaxe": {
+  "minecraft:recipes/tools/compass": {
     "criteria": {
-      "has_cobblestone": "2020-12-15 19:31:17 -0800"
+      "has_redstone": "2020-12-15 19:31:32 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/andesite_slab_from_andesite_stonecutting": {
+  "minecraft:adventure/kill_a_mob": {
     "criteria": {
-      "has_andesite": "2020-12-15 19:31:29 -0800"
+      "minecraft:zombie": "2020-12-16 18:01:37 -0800"
     },
     "done": true
   },
-  "minecraft:adventure/root": {
+  "minecraft:recipes/building_blocks/andesite_stairs_from_andesite_stonecutting": {
     "criteria": {
-      "killed_by_something": "2020-12-13 12:35:32 -0800"
+      "has_andesite": "2020-12-15 19:31:29 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/transportation/jungle_boat": {
+  "minecraft:recipes/decorations/diorite_wall_from_diorite_stonecutting": {
     "criteria": {
-      "in_water": "2020-12-13 12:44:02 -0800"
+      "has_diorite": "2020-12-15 19:29:35 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/transportation/spruce_boat": {
+  "minecraft:recipes/decorations/diorite_wall": {
     "criteria": {
-      "in_water": "2020-12-13 12:44:02 -0800"
+      "has_diorite": "2020-12-15 19:29:35 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/decorations/cobblestone_wall_from_cobblestone_stonecutting": {
+  "minecraft:recipes/building_blocks/stone": {
     "criteria": {
       "has_cobblestone": "2020-12-15 19:31:17 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/combat/wooden_sword": {
+  "minecraft:story/mine_stone": {
     "criteria": {
-      "has_stick": "2020-12-13 13:09:33 -0800"
+      "get_stone": "2020-12-15 19:31:17 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/white_concrete_powder": {
+  "minecraft:recipes/building_blocks/polished_andesite": {
     "criteria": {
-      "has_gravel": "2020-12-15 19:30:55 -0800"
+      "has_stone": "2020-12-15 19:31:29 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/tools/stone_shovel": {
+  "minecraft:recipes/redstone/target": {
+    "criteria": {
+      "has_redstone": "2020-12-15 19:31:32 -0800"
+    },
+    "done": true
+  },
+  "minecraft:recipes/decorations/furnace": {
     "criteria": {
       "has_cobblestone": "2020-12-15 19:31:17 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/oak_planks": {
+  "minecraft:adventure/adventuring_time": {
     "criteria": {
-      "has_logs": "2020-12-13 13:09:37 -0800"
+      "minecraft:forest": "2020-12-13 01:08:54 -0800",
+      "minecraft:mountains": "2020-12-13 23:30:35 -0800",
+      "minecraft:taiga": "2020-12-13 23:29:25 -0800",
+      "minecraft:river": "2020-12-13 12:44:02 -0800",
+      "minecraft:wooded_hills": "2020-12-13 23:30:54 -0800",
+      "minecraft:plains": "2020-12-16 18:01:58 -0800"
+    },
+    "done": false
+  },
+  "minecraft:recipes/misc/charcoal": {
+    "criteria": {
+      "has_log": "2020-12-13 13:09:37 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/blue_concrete_powder": {
+  "minecraft:recipes/building_blocks/andesite_stairs": {
     "criteria": {
-      "has_gravel": "2020-12-15 19:30:55 -0800"
+      "has_andesite": "2020-12-15 19:31:29 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/tools/stone_hoe": {
+  "minecraft:recipes/tools/wooden_pickaxe": {
+    "criteria": {
+      "has_stick": "2020-12-13 13:09:33 -0800"
+    },
+    "done": true
+  },
+  "minecraft:recipes/building_blocks/cobblestone_slab_from_cobblestone_stonecutting": {
     "criteria": {
       "has_cobblestone": "2020-12-15 19:31:17 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/tools/clock": {
+  "minecraft:recipes/redstone/redstone_torch": {
     "criteria": {
       "has_redstone": "2020-12-15 19:31:32 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/transportation/dark_oak_boat": {
+  "minecraft:recipes/transportation/birch_boat": {
     "criteria": {
       "in_water": "2020-12-13 12:44:02 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/gray_concrete_powder": {
+  "minecraft:recipes/combat/stone_sword": {
     "criteria": {
-      "has_gravel": "2020-12-15 19:30:55 -0800"
+      "has_cobblestone": "2020-12-15 19:31:17 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/diorite_stairs": {
+  "minecraft:recipes/decorations/cobblestone_wall": {
     "criteria": {
-      "has_diorite": "2020-12-15 19:29:35 -0800"
+      "has_cobblestone": "2020-12-15 19:31:17 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/decorations/andesite_wall_from_andesite_stonecutting": {
+  "minecraft:recipes/building_blocks/polished_andesite_slab_from_andesite_stonecutting": {
     "criteria": {
       "has_andesite": "2020-12-15 19:31:29 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/redstone/redstone_block": {
+  "minecraft:recipes/building_blocks/polished_granite_slab_from_granite_stonecutting": {
     "criteria": {
-      "has_redstone": "2020-12-15 19:31:32 -0800"
+      "has_granite": "2020-12-16 19:05:39 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/tools/wooden_hoe": {
+  "minecraft:recipes/building_blocks/green_concrete_powder": {
     "criteria": {
-      "has_stick": "2020-12-13 13:09:33 -0800"
+      "has_gravel": "2020-12-15 19:30:55 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/andesite": {
+  "minecraft:recipes/building_blocks/polished_andesite_from_andesite_stonecutting": {
     "criteria": {
-      "has_stone": "2020-12-15 19:29:35 -0800"
+      "has_andesite": "2020-12-15 19:31:29 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/redstone/piston": {
+  "minecraft:recipes/transportation/acacia_boat": {
     "criteria": {
-      "has_redstone": "2020-12-15 19:31:32 -0800"
+      "in_water": "2020-12-13 12:44:02 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/cobblestone_slab": {
+  "minecraft:recipes/tools/stone_pickaxe": {
     "criteria": {
       "has_cobblestone": "2020-12-15 19:31:17 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/diorite_slab": {
+  "minecraft:adventure/root": {
     "criteria": {
-      "has_diorite": "2020-12-15 19:29:35 -0800"
+      "killed_by_something": "2020-12-13 12:35:32 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/cobblestone_stairs": {
+  "minecraft:recipes/transportation/jungle_boat": {
+    "criteria": {
+      "in_water": "2020-12-13 12:44:02 -0800"
+    },
+    "done": true
+  },
+  "minecraft:recipes/decorations/cobblestone_wall_from_cobblestone_stonecutting": {
     "criteria": {
       "has_cobblestone": "2020-12-15 19:31:17 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/black_concrete_powder": {
+  "minecraft:recipes/building_blocks/white_concrete_powder": {
     "criteria": {
       "has_gravel": "2020-12-15 19:30:55 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/coarse_dirt": {
+  "minecraft:recipes/tools/stone_hoe": {
     "criteria": {
-      "has_gravel": "2020-12-15 19:30:55 -0800"
+      "has_cobblestone": "2020-12-15 19:31:17 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/redstone/note_block": {
+  "minecraft:recipes/tools/clock": {
     "criteria": {
       "has_redstone": "2020-12-15 19:31:32 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/polished_diorite": {
+  "minecraft:recipes/transportation/dark_oak_boat": {
     "criteria": {
-      "has_stone": "2020-12-15 19:29:35 -0800"
+      "in_water": "2020-12-13 12:44:02 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/oak_wood": {
+  "minecraft:recipes/decorations/andesite_wall_from_andesite_stonecutting": {
     "criteria": {
-      "has_log": "2020-12-13 13:09:37 -0800"
+      "has_andesite": "2020-12-15 19:31:29 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/decorations/andesite_wall": {
+  "minecraft:adventure/kill_all_mobs": {
     "criteria": {
-      "has_andesite": "2020-12-15 19:31:29 -0800"
+      "minecraft:skeleton": "2020-12-16 18:02:53 -0800",
+      "minecraft:spider": "2020-12-16 19:05:19 -0800",
+      "minecraft:creeper": "2020-12-16 18:02:51 -0800",
+      "minecraft:silverfish": "2020-12-16 18:03:21 -0800",
+      "minecraft:zombie": "2020-12-16 18:01:37 -0800"
+    },
+    "done": false
+  },
+  "minecraft:recipes/redstone/redstone_block": {
+    "criteria": {
+      "has_redstone": "2020-12-15 19:31:32 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/andesite_slab": {
+  "minecraft:recipes/building_blocks/polished_granite": {
     "criteria": {
-      "has_andesite": "2020-12-15 19:31:29 -0800"
+      "has_stone": "2020-12-16 19:05:39 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/transportation/oak_boat": {
+  "minecraft:recipes/building_blocks/granite_slab": {
     "criteria": {
-      "in_water": "2020-12-13 12:44:02 -0800"
+      "has_granite": "2020-12-16 19:05:39 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/decorations/soul_campfire": {
+  "minecraft:recipes/redstone/piston": {
     "criteria": {
-      "has_stick": "2020-12-13 13:09:33 -0800"
+      "has_redstone": "2020-12-15 19:31:32 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/combat/crossbow": {
+  "minecraft:recipes/decorations/fletching_table": {
     "criteria": {
-      "has_stick": "2020-12-13 13:09:33 -0800"
+      "has_flint": "2020-12-16 19:04:52 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/redstone/dropper": {
+  "minecraft:recipes/decorations/granite_wall_from_granite_stonecutting": {
     "criteria": {
-      "has_redstone": "2020-12-15 19:31:32 -0800"
+      "has_granite": "2020-12-16 19:05:39 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/light_gray_concrete_powder": {
+  "minecraft:recipes/building_blocks/polished_diorite": {
     "criteria": {
-      "has_gravel": "2020-12-15 19:30:55 -0800"
+      "has_stone": "2020-12-15 19:29:35 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/light_blue_concrete_powder": {
+  "minecraft:recipes/decorations/andesite_wall": {
     "criteria": {
-      "has_gravel": "2020-12-15 19:30:55 -0800"
+      "has_andesite": "2020-12-15 19:31:29 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/tools/stone_axe": {
+  "minecraft:recipes/building_blocks/polished_granite_stairs_from_granite_stonecutting": {
     "criteria": {
-      "has_cobblestone": "2020-12-15 19:31:17 -0800"
+      "has_granite": "2020-12-16 19:05:39 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/orange_concrete_powder": {
+  "minecraft:recipes/building_blocks/andesite_slab": {
     "criteria": {
-      "has_gravel": "2020-12-15 19:30:55 -0800"
+      "has_andesite": "2020-12-15 19:31:29 -0800"
     },
     "done": true
   },
-  "minecraft:recipes/building_blocks/polished_diorite_from_diorite_stonecutting": {
+  "minecraft:recipes/transportation/oak_boat": {
     "criteria": {
-      "has_diorite": "2020-12-15 19:29:35 -0800"
+      "in_water": "2020-12-13 12:44:02 -0800"
+    },
+    "done": true
+  },
+  "minecraft:recipes/decorations/soul_campfire": {
+    "criteria": {
+      "has_stick": "2020-12-13 13:09:33 -0800"
+    },
+    "done": true
+  },
+  "minecraft:recipes/tools/stone_axe": {
+    "criteria": {
+      "has_cobblestone": "2020-12-15 19:31:17 -0800"
+    },
+    "done": true
+  },
+  "minecraft:recipes/building_blocks/orange_concrete_powder": {
+    "criteria": {
+      "has_gravel": "2020-12-15 19:30:55 -0800"
     },
     "done": true
   },

TEMPAT SAMPAH
server/world/data/raids.dat


TEMPAT SAMPAH
server/world/level.dat


TEMPAT SAMPAH
server/world/level.dat_old


TEMPAT SAMPAH
server/world/playerdata/3d1c0ed1-d4d0-42ae-ac5e-a7557d5a6c4f.dat


TEMPAT SAMPAH
server/world/playerdata/3d1c0ed1-d4d0-42ae-ac5e-a7557d5a6c4f.dat_old


+ 0 - 0
server/world/poi/r.0.-2.mca


TEMPAT SAMPAH
server/world/poi/r.0.0.mca


TEMPAT SAMPAH
server/world/region/.r.-2.-1.mca.icloud


TEMPAT SAMPAH
server/world/region/r.-1.-1.mca


TEMPAT SAMPAH
server/world/region/r.-1.0.mca


TEMPAT SAMPAH
server/world/region/r.-1.1.mca


TEMPAT SAMPAH
server/world/region/r.-2.-1.mca


TEMPAT SAMPAH
server/world/region/r.0.-1.mca


TEMPAT SAMPAH
server/world/region/r.0.-2.mca


TEMPAT SAMPAH
server/world/region/r.0.0.mca


+ 0 - 0
server/world/region/r.0.1.mca


TEMPAT SAMPAH
server/world/region/r.1.-1.mca


+ 0 - 0
server/world/region/r.1.0.mca


+ 0 - 0
server/world/region/r.1.1.mca


+ 1 - 1
server/world/stats/3d1c0ed1-d4d0-42ae-ac5e-a7557d5a6c4f.json

@@ -1 +1 @@
-{"stats":{"minecraft:used":{"minecraft:creeper_spawn_egg":23,"minecraft:oak_log":94,"minecraft:lever":12,"minecraft:tnt":371,"minecraft:oak_sapling":2},"minecraft:killed_by":{"minecraft:creeper":2,"minecraft:wolf":2},"minecraft:custom":{"minecraft:time_since_rest":14961,"minecraft:play_one_minute":28326,"minecraft:crouch_one_cm":104,"minecraft:damage_taken":1525,"minecraft:sprint_one_cm":17183,"minecraft:walk_one_cm":40994,"minecraft:deaths":6,"minecraft:walk_under_water_one_cm":3758,"minecraft:sneak_time":201,"minecraft:aviate_one_cm":131205,"minecraft:jump":205,"minecraft:damage_dealt":48,"minecraft:leave_game":19,"minecraft:time_since_death":14927,"minecraft:walk_on_water_one_cm":4661,"minecraft:fall_one_cm":7378,"minecraft:fly_one_cm":95775},"minecraft:picked_up":{"minecraft:stick":5,"minecraft:apple":1,"minecraft:andesite":7,"minecraft:creeper_spawn_egg":64,"minecraft:lever":2,"minecraft:gravel":10,"minecraft:oak_log":26,"minecraft:diorite":2,"minecraft:gunpowder":7,"minecraft:oak_sapling":16,"minecraft:redstone":9,"minecraft:dirt":200,"minecraft:cobblestone":91},"minecraft:mined":{"minecraft:grass":1,"minecraft:grass_block":1,"minecraft:oak_log":20,"minecraft:oak_sapling":1,"minecraft:birch_leaves":4,"minecraft:oak_leaves":37}},"DataVersion":2584}
+{"stats":{"minecraft:killed":{"minecraft:sheep":7,"minecraft:skeleton":7,"minecraft:zombie":9,"minecraft:donkey":2,"minecraft:pig":5,"minecraft:chicken":6,"minecraft:salmon":4,"minecraft:silverfish":6,"minecraft:spider":3,"minecraft:bat":6,"minecraft:creeper":5,"minecraft:squid":8,"minecraft:cow":8},"minecraft:used":{"minecraft:creeper_spawn_egg":23,"minecraft:oak_log":94,"minecraft:lever":12,"minecraft:flint_and_steel":6,"minecraft:fire_charge":1,"minecraft:tnt":371,"minecraft:oak_sapling":2},"minecraft:killed_by":{"minecraft:wolf":2,"minecraft:creeper":2},"minecraft:custom":{"minecraft:time_since_rest":3925,"minecraft:sprint_one_cm":20469,"minecraft:damage_taken":1785,"minecraft:walk_one_cm":48244,"minecraft:mob_kills":76,"minecraft:damage_dealt":48,"minecraft:fly_one_cm":308210,"minecraft:play_one_minute":66125,"minecraft:crouch_one_cm":104,"minecraft:deaths":10,"minecraft:sneak_time":286,"minecraft:walk_under_water_one_cm":5990,"minecraft:aviate_one_cm":131205,"minecraft:jump":286,"minecraft:leave_game":26,"minecraft:time_since_death":3902,"minecraft:walk_on_water_one_cm":7284,"minecraft:fall_one_cm":10122},"minecraft:picked_up":{"minecraft:stick":5,"minecraft:andesite":8,"minecraft:gravel":62,"minecraft:flint":3,"minecraft:oak_log":26,"minecraft:diorite":2,"minecraft:gunpowder":7,"minecraft:redstone":9,"minecraft:dirt":205,"minecraft:apple":1,"minecraft:wheat_seeds":1,"minecraft:creeper_spawn_egg":64,"minecraft:lever":2,"minecraft:granite":10,"minecraft:oak_sapling":16,"minecraft:cobblestone":133},"minecraft:mined":{"minecraft:oak_sapling":1,"minecraft:birch_leaves":4,"minecraft:grass":1,"minecraft:grass_block":1,"minecraft:oak_log":20,"minecraft:oak_leaves":37}},"DataVersion":2584}

+ 1 - 0
web.go

@@ -18,6 +18,7 @@ func webServer(Dir string, Port string) {
 
 	//SYSTEM FUNCTION
 	http.HandleFunc("/sendcommand", SendCommand)
+	http.HandleFunc("/serverinfo", ServerInfo)
 
 	http.HandleFunc("/log", ReadLog)
 	http.HandleFunc("/log/from", ReadLogFrom)

+ 1359 - 0
webroot/css/minecraft-skinviewer.css

@@ -0,0 +1,1359 @@
+/*!
+ * Copyright 2018 Robert Koszewski
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+@keyframes spin {
+  from {
+    transform: rotateY(360deg);
+  }
+  to {
+    transform: rotateY(0);
+  }
+}
+@keyframes waving {
+  0% {
+    transform: rotateX(-2deg);
+  }
+  50% {
+    transform: rotateX(2deg);
+  }
+  100% {
+    transform: rotateX(-2deg);
+  }
+}
+.mc-face-viewer-4x {
+  image-rendering: optimizeSpeed;
+  /* Legal fallback */
+  image-rendering: -moz-crisp-edges;
+  /* Firefox        */
+  image-rendering: -o-crisp-edges;
+  /* Opera          */
+  image-rendering: -webkit-optimize-contrast;
+  /* Safari         */
+  image-rendering: optimize-contrast;
+  /* CSS3 Proposed  */
+  image-rendering: crisp-edges;
+  /* CSS4 Proposed  */
+  image-rendering: pixelated;
+  /* CSS4 Proposed  */
+  -ms-interpolation-mode: nearest-neighbor;
+  /* IE8+           */
+  background-size: 256px;
+  width: 32px;
+  height: 32px;
+  background-position: -32px -32px;
+  overflow: hidden;
+  display: inline-block;
+}
+.mc-face-viewer-4x::after {
+  content: " ";
+  width: 32px;
+  height: 32px;
+  background-size: 288px;
+  background-image: inherit;
+  background-position: -182px -38px;
+  overflow: hidden;
+  display: inline-block;
+}
+.mc-face-viewer-8x {
+  image-rendering: optimizeSpeed;
+  /* Legal fallback */
+  image-rendering: -moz-crisp-edges;
+  /* Firefox        */
+  image-rendering: -o-crisp-edges;
+  /* Opera          */
+  image-rendering: -webkit-optimize-contrast;
+  /* Safari         */
+  image-rendering: optimize-contrast;
+  /* CSS3 Proposed  */
+  image-rendering: crisp-edges;
+  /* CSS4 Proposed  */
+  image-rendering: pixelated;
+  /* CSS4 Proposed  */
+  -ms-interpolation-mode: nearest-neighbor;
+  /* IE8+           */
+  background-size: 512px;
+  width: 64px;
+  height: 64px;
+  background-position: -64px -64px;
+  overflow: hidden;
+  display: inline-block;
+}
+.mc-face-viewer-8x::after {
+  content: " ";
+  width: 64px;
+  height: 64px;
+  background-size: 576px;
+  background-image: inherit;
+  background-position: -364px -76px;
+  overflow: hidden;
+  display: inline-block;
+}
+.mc-skin-viewer-9x {
+  width: 72px;
+  height: 288px;
+  margin: 15px auto 40px auto;
+  perspective: 800px;
+  perspective-origin: 50% 100px;
+  transform-style: preserve-3d;
+  background-image: none !important;
+  image-rendering: optimizeSpeed;
+  /* Legal fallback */
+  image-rendering: -moz-crisp-edges;
+  /* Firefox        */
+  image-rendering: -o-crisp-edges;
+  /* Opera          */
+  image-rendering: -webkit-optimize-contrast;
+  /* Safari         */
+  image-rendering: optimize-contrast;
+  /* CSS3 Proposed  */
+  image-rendering: crisp-edges;
+  /* CSS4 Proposed  */
+  image-rendering: pixelated;
+  /* CSS4 Proposed  */
+  -ms-interpolation-mode: nearest-neighbor;
+  /* IE8+           */
+}
+.mc-skin-viewer-9x.hide-accessories .accessory {
+  display: none;
+}
+.mc-skin-viewer-9x.spin > .player {
+  animation: spin 12s infinite linear;
+}
+.mc-skin-viewer-9x .player {
+  transform-style: preserve-3d;
+}
+.mc-skin-viewer-9x .player .front,
+.mc-skin-viewer-9x .player .back,
+.mc-skin-viewer-9x .player .left,
+.mc-skin-viewer-9x .player .right,
+.mc-skin-viewer-9x .player .top,
+.mc-skin-viewer-9x .player .bottom {
+  position: absolute;
+  background-size: 576px;
+  background-repeat: no-repeat;
+  backface-visibility: hidden;
+}
+.mc-skin-viewer-9x .player .accessory {
+  background-image: none;
+}
+.mc-skin-viewer-9x .player .accessory .front,
+.mc-skin-viewer-9x .player .accessory .back,
+.mc-skin-viewer-9x .player .accessory .left,
+.mc-skin-viewer-9x .player .accessory .right,
+.mc-skin-viewer-9x .player .accessory .top,
+.mc-skin-viewer-9x .player .accessory .bottom {
+  backface-visibility: visible;
+}
+.mc-skin-viewer-9x .player > .head {
+  position: absolute;
+  transform-style: preserve-3d;
+  width: 72px;
+  height: 72px;
+  margin: 0 auto;
+  background-image: none !important;
+}
+.mc-skin-viewer-9x .player > .head .front,
+.mc-skin-viewer-9x .player > .head .back,
+.mc-skin-viewer-9x .player > .head .left,
+.mc-skin-viewer-9x .player > .head .right,
+.mc-skin-viewer-9x .player > .head .top,
+.mc-skin-viewer-9x .player > .head .bottom {
+  width: 72px;
+  height: 72px;
+}
+.mc-skin-viewer-9x .player > .head .front {
+  background-position: -72px -72px;
+  transform: rotateX(0deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(36px);
+}
+.mc-skin-viewer-9x .player > .head .back {
+  background-position: -216px -72px;
+  transform: rotateX(0deg) rotateY(180deg) translateX(0px) translateY(0px) translateZ(36px);
+}
+.mc-skin-viewer-9x .player > .head .right {
+  background-position: 0px -72px;
+  transform: rotateX(0deg) rotateY(270deg) translateX(0px) translateY(0px) translateZ(36px);
+}
+.mc-skin-viewer-9x .player > .head .left {
+  background-position: -144px -72px;
+  transform: rotateX(0deg) rotateY(90deg) translateX(0px) translateY(0px) translateZ(36px);
+}
+.mc-skin-viewer-9x .player > .head .top {
+  background-position: -72px 0px;
+  transform: rotateX(90deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(36px);
+}
+.mc-skin-viewer-9x .player > .head .bottom {
+  background-position: -144px 0px;
+  transform: rotateX(270deg) rotateY(0deg) rotateZ(180deg) translateX(0px) translateY(0px) translateZ(36px);
+}
+.mc-skin-viewer-9x .player > .head > .accessory {
+  transform-style: preserve-3d;
+  transform: scale3d(1.125, 1.125, 1.125) translateY(-3.5px);
+}
+.mc-skin-viewer-9x .player > .head > .accessory > .front {
+  background-position: -360px -72px;
+}
+.mc-skin-viewer-9x .player > .head > .accessory > .back {
+  background-position: -504px -72px;
+}
+.mc-skin-viewer-9x .player > .head > .accessory > .right {
+  background-position: -288px -72px;
+}
+.mc-skin-viewer-9x .player > .head > .accessory > .left {
+  background-position: -432px -72px;
+}
+.mc-skin-viewer-9x .player > .head > .accessory > .top {
+  background-position: -360px 0px;
+}
+.mc-skin-viewer-9x .player > .head > .accessory > .bottom {
+  background-position: -432px 0px;
+}
+.mc-skin-viewer-9x .player > .body {
+  position: absolute;
+  transform-style: preserve-3d;
+  width: 72px;
+  height: 72px;
+  margin: 0 auto;
+  transform: translateY(72px);
+  background-image: none !important;
+}
+.mc-skin-viewer-9x .player > .body .front,
+.mc-skin-viewer-9x .player > .body .back,
+.mc-skin-viewer-9x .player > .body .left,
+.mc-skin-viewer-9x .player > .body .right,
+.mc-skin-viewer-9x .player > .body .top,
+.mc-skin-viewer-9x .player > .body .bottom {
+  width: 72px;
+  height: 108px;
+}
+.mc-skin-viewer-9x .player > .body .left,
+.mc-skin-viewer-9x .player > .body .right {
+  width: 36px;
+}
+.mc-skin-viewer-9x .player > .body .top,
+.mc-skin-viewer-9x .player > .body .bottom {
+  height: 36px;
+}
+.mc-skin-viewer-9x .player > .body .front {
+  background-position: -180px -180px;
+  transform: rotateX(0deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(18px);
+}
+.mc-skin-viewer-9x .player > .body .back {
+  background-position: -288px -180px;
+  transform: rotateX(0deg) rotateY(180deg) translateX(0px) translateY(0px) translateZ(18px);
+}
+.mc-skin-viewer-9x .player > .body .right {
+  background-position: -144px -180px;
+  transform: rotateX(0deg) rotateY(270deg) translateX(0px) translateY(0px) translateZ(18px);
+}
+.mc-skin-viewer-9x .player > .body .left {
+  background-position: -252px -180px;
+  transform: rotateX(0deg) rotateY(90deg) translateX(0px) translateY(0px) translateZ(54px);
+}
+.mc-skin-viewer-9x .player > .body .top {
+  background-position: -180px -144px;
+  transform: rotateX(90deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(18px);
+}
+.mc-skin-viewer-9x .player > .body .bottom {
+  background-position: -252px -144px;
+  transform: rotateX(270deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(90px);
+}
+.mc-skin-viewer-9x .player > .body > .accessory {
+  transform-style: preserve-3d;
+  transform: scale3d(1.0625, 1.0625, 1.0625) translateY(-3.375px);
+}
+.mc-skin-viewer-9x .player > .body > .accessory > .front {
+  background-position: -180px -324px;
+}
+.mc-skin-viewer-9x .player > .body > .accessory > .back {
+  background-position: -288px -324px;
+}
+.mc-skin-viewer-9x .player > .body > .accessory > .right {
+  background-position: -144px -324px;
+}
+.mc-skin-viewer-9x .player > .body > .accessory > .left {
+  background-position: -252px -324px;
+}
+.mc-skin-viewer-9x .player > .body > .accessory > .top {
+  background-position: -180px -288px;
+}
+.mc-skin-viewer-9x .player > .body > .accessory > .bottom {
+  background-position: -252px -288px;
+}
+.mc-skin-viewer-9x .player > .left-arm,
+.mc-skin-viewer-9x .player > .right-arm {
+  position: absolute;
+  transform-style: preserve-3d;
+  width: 36px;
+  height: 108px;
+  margin: 0 auto;
+  transform: translateY(72px) translateX(-36px);
+  background-image: none !important;
+}
+.mc-skin-viewer-9x .player > .left-arm .front,
+.mc-skin-viewer-9x .player > .right-arm .front,
+.mc-skin-viewer-9x .player > .left-arm .back,
+.mc-skin-viewer-9x .player > .right-arm .back,
+.mc-skin-viewer-9x .player > .left-arm .left,
+.mc-skin-viewer-9x .player > .right-arm .left,
+.mc-skin-viewer-9x .player > .left-arm .right,
+.mc-skin-viewer-9x .player > .right-arm .right,
+.mc-skin-viewer-9x .player > .left-arm .top,
+.mc-skin-viewer-9x .player > .right-arm .top,
+.mc-skin-viewer-9x .player > .left-arm .bottom,
+.mc-skin-viewer-9x .player > .right-arm .bottom {
+  width: 36px;
+  height: 108px;
+}
+.mc-skin-viewer-9x .player > .left-arm .top,
+.mc-skin-viewer-9x .player > .right-arm .top,
+.mc-skin-viewer-9x .player > .left-arm .bottom,
+.mc-skin-viewer-9x .player > .right-arm .bottom {
+  height: 36px;
+}
+.mc-skin-viewer-9x .player > .left-arm .front,
+.mc-skin-viewer-9x .player > .right-arm .front {
+  background-position: -396px -180px;
+  transform: rotateX(0deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(18px);
+}
+.mc-skin-viewer-9x .player > .left-arm .back,
+.mc-skin-viewer-9x .player > .right-arm .back {
+  background-position: -468px -180px;
+  transform: rotateX(0deg) rotateY(180deg) translateX(0px) translateY(0px) translateZ(18px);
+}
+.mc-skin-viewer-9x .player > .left-arm .right,
+.mc-skin-viewer-9x .player > .right-arm .right {
+  background-position: -360px -180px;
+  transform: rotateX(0deg) rotateY(270deg) translateX(0px) translateY(0px) translateZ(18px);
+}
+.mc-skin-viewer-9x .player > .left-arm .left,
+.mc-skin-viewer-9x .player > .right-arm .left {
+  background-position: -432px -180px;
+  transform: rotateX(0deg) rotateY(90deg) translateX(0px) translateY(0px) translateZ(18px);
+}
+.mc-skin-viewer-9x .player > .left-arm .top,
+.mc-skin-viewer-9x .player > .right-arm .top {
+  background-position: -396px -144px;
+  transform: rotateX(90deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(18px);
+}
+.mc-skin-viewer-9x .player > .left-arm .bottom,
+.mc-skin-viewer-9x .player > .right-arm .bottom {
+  background-position: -432px -144px;
+  transform: rotateX(270deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(90px);
+}
+.mc-skin-viewer-9x .player > .left-arm > .accessory,
+.mc-skin-viewer-9x .player > .right-arm > .accessory {
+  transform-style: preserve-3d;
+  transform: scale3d(1.0625, 1.0625, 1.0625) translateY(-3.375px);
+}
+.mc-skin-viewer-9x .player > .left-arm > .accessory .front,
+.mc-skin-viewer-9x .player > .right-arm > .accessory .front {
+  background-position: -396px -324px;
+}
+.mc-skin-viewer-9x .player > .left-arm > .accessory .back,
+.mc-skin-viewer-9x .player > .right-arm > .accessory .back {
+  background-position: -468px -324px;
+}
+.mc-skin-viewer-9x .player > .left-arm > .accessory .right,
+.mc-skin-viewer-9x .player > .right-arm > .accessory .right {
+  background-position: -360px -324px;
+}
+.mc-skin-viewer-9x .player > .left-arm > .accessory .left,
+.mc-skin-viewer-9x .player > .right-arm > .accessory .left {
+  background-position: -432px -324px;
+}
+.mc-skin-viewer-9x .player > .left-arm > .accessory .top,
+.mc-skin-viewer-9x .player > .right-arm > .accessory .top {
+  background-position: -396px -288px;
+}
+.mc-skin-viewer-9x .player > .left-arm > .accessory .bottom,
+.mc-skin-viewer-9x .player > .right-arm > .accessory .bottom {
+  background-position: -432px -288px;
+}
+.mc-skin-viewer-9x .player > .right-arm {
+  transform: translateY(72px) translateX(72px) scaleX(-1);
+}
+.mc-skin-viewer-9x .player > .left-leg,
+.mc-skin-viewer-9x .player > .right-leg {
+  position: absolute;
+  transform-style: preserve-3d;
+  width: 36px;
+  height: 108px;
+  margin: 0 auto;
+  transform: translateY(180px);
+  background-image: none !important;
+}
+.mc-skin-viewer-9x .player > .left-leg .front,
+.mc-skin-viewer-9x .player > .right-leg .front,
+.mc-skin-viewer-9x .player > .left-leg .back,
+.mc-skin-viewer-9x .player > .right-leg .back,
+.mc-skin-viewer-9x .player > .left-leg .left,
+.mc-skin-viewer-9x .player > .right-leg .left,
+.mc-skin-viewer-9x .player > .left-leg .right,
+.mc-skin-viewer-9x .player > .right-leg .right,
+.mc-skin-viewer-9x .player > .left-leg .top,
+.mc-skin-viewer-9x .player > .right-leg .top,
+.mc-skin-viewer-9x .player > .left-leg .bottom,
+.mc-skin-viewer-9x .player > .right-leg .bottom {
+  width: 36px;
+  height: 108px;
+}
+.mc-skin-viewer-9x .player > .left-leg .top,
+.mc-skin-viewer-9x .player > .right-leg .top,
+.mc-skin-viewer-9x .player > .left-leg .bottom,
+.mc-skin-viewer-9x .player > .right-leg .bottom {
+  height: 36px;
+}
+.mc-skin-viewer-9x .player > .left-leg .front,
+.mc-skin-viewer-9x .player > .right-leg .front {
+  background-position: -36px -180px;
+  transform: rotateX(0deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(18px);
+}
+.mc-skin-viewer-9x .player > .left-leg .back,
+.mc-skin-viewer-9x .player > .right-leg .back {
+  background-position: -108px -180px;
+  transform: rotateX(0deg) rotateY(180deg) translateX(0px) translateY(0px) translateZ(18px);
+}
+.mc-skin-viewer-9x .player > .left-leg .right,
+.mc-skin-viewer-9x .player > .right-leg .right {
+  background-position: 0px -180px;
+  transform: rotateX(0deg) rotateY(270deg) translateX(0px) translateY(0px) translateZ(18px);
+}
+.mc-skin-viewer-9x .player > .left-leg .left,
+.mc-skin-viewer-9x .player > .right-leg .left {
+  background-position: -72px -180px;
+  transform: rotateX(0deg) rotateY(90deg) translateX(0px) translateY(0px) translateZ(18px);
+}
+.mc-skin-viewer-9x .player > .left-leg .top,
+.mc-skin-viewer-9x .player > .right-leg .top {
+  background-position: -36px -144px;
+  transform: rotateX(90deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(18px);
+}
+.mc-skin-viewer-9x .player > .left-leg .bottom,
+.mc-skin-viewer-9x .player > .right-leg .bottom {
+  background-position: -72px -144px;
+  transform: rotateX(270deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(90px);
+}
+.mc-skin-viewer-9x .player > .left-leg > .accessory,
+.mc-skin-viewer-9x .player > .right-leg > .accessory {
+  transform-style: preserve-3d;
+  transform: scale3d(1.03125, 1.03125, 1.03125) translateY(-1.6875px);
+}
+.mc-skin-viewer-9x .player > .left-leg > .accessory .front,
+.mc-skin-viewer-9x .player > .right-leg > .accessory .front {
+  background-position: -36px -324px;
+}
+.mc-skin-viewer-9x .player > .left-leg > .accessory .back,
+.mc-skin-viewer-9x .player > .right-leg > .accessory .back {
+  background-position: -108px -324px;
+}
+.mc-skin-viewer-9x .player > .left-leg > .accessory .right,
+.mc-skin-viewer-9x .player > .right-leg > .accessory .right {
+  background-position: 0px -324px;
+}
+.mc-skin-viewer-9x .player > .left-leg > .accessory .left,
+.mc-skin-viewer-9x .player > .right-leg > .accessory .left {
+  background-position: -72px -324px;
+}
+.mc-skin-viewer-9x .player > .left-leg > .accessory .top,
+.mc-skin-viewer-9x .player > .right-leg > .accessory .top {
+  background-position: -36px -288px;
+}
+.mc-skin-viewer-9x .player > .left-leg > .accessory .bottom,
+.mc-skin-viewer-9x .player > .right-leg > .accessory .bottom {
+  background-position: -72px -288px;
+}
+.mc-skin-viewer-9x .player > .right-leg {
+  transform: translateY(180px) translateX(36px) scaleX(-1);
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-arm {
+  transform: translateY(72px) translateX(72px);
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-arm .front {
+  background-position: -324px -468px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-arm .back {
+  background-position: -396px -468px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-arm .right {
+  background-position: -288px -468px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-arm .left {
+  background-position: -360px -468px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-arm .top {
+  background-position: -324px -432px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-arm .bottom {
+  background-position: -360px -432px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-arm > .accessory .front {
+  background-position: -468px -468px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-arm > .accessory .back {
+  background-position: -540px -468px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-arm > .accessory .right {
+  background-position: -432px -468px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-arm > .accessory .left {
+  background-position: -504px -468px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-arm > .accessory .top {
+  background-position: -468px -432px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-arm > .accessory .bottom {
+  background-position: -504px -432px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-leg {
+  transform: translateY(180px) translateX(36px);
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-leg .front {
+  background-position: -180px -468px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-leg .back {
+  background-position: -252px -468px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-leg .right {
+  background-position: -144px -468px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-leg .left {
+  background-position: -216px -468px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-leg .top {
+  background-position: -180px -432px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-leg .bottom {
+  background-position: -216px -432px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-leg > .accessory .front {
+  background-position: -36px -468px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-leg > .accessory .back {
+  background-position: -108px -468px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-leg > .accessory .right {
+  background-position: 0px -468px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-leg > .accessory .left {
+  background-position: -72px -468px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-leg > .accessory .top {
+  background-position: -36px -432px;
+}
+.mc-skin-viewer-9x:not(.legacy) .player > .right-leg > .accessory .bottom {
+  background-position: -72px -432px;
+}
+.mc-skin-viewer-9x.slim .player > .left-arm .front,
+.mc-skin-viewer-9x.slim .player > .right-arm .front,
+.mc-skin-viewer-9x.slim .player > .left-arm .back,
+.mc-skin-viewer-9x.slim .player > .right-arm .back,
+.mc-skin-viewer-9x.slim .player > .left-arm .top,
+.mc-skin-viewer-9x.slim .player > .right-arm .top,
+.mc-skin-viewer-9x.slim .player > .left-arm .bottom,
+.mc-skin-viewer-9x.slim .player > .right-arm .bottom {
+  width: 27px;
+}
+.mc-skin-viewer-9x.slim .player > .left-arm .front {
+  transform: rotateX(0deg) rotateY(0deg) translateX(9px) translateY(0px) translateZ(18px);
+}
+.mc-skin-viewer-9x.slim .player > .left-arm .back {
+  background-position: -459px -180px;
+  transform: rotateX(0deg) rotateY(180deg) translateX(-9px) translateY(0px) translateZ(18px);
+}
+.mc-skin-viewer-9x.slim .player > .left-arm .right {
+  transform: rotateX(0deg) rotateY(270deg) translateX(0px) translateY(0px) translateZ(9px);
+}
+.mc-skin-viewer-9x.slim .player > .left-arm .left {
+  background-position: -423px -180px;
+}
+.mc-skin-viewer-9x.slim .player > .left-arm .top {
+  transform: rotateX(90deg) rotateY(0deg) translateX(9px) translateY(0px) translateZ(18px);
+}
+.mc-skin-viewer-9x.slim .player > .left-arm .bottom {
+  background-position: -423px -144px;
+  transform: rotateX(270deg) rotateY(0deg) translateX(9px) translateY(0px) translateZ(90px);
+}
+.mc-skin-viewer-9x.slim .player > .left-arm > .accessory .back {
+  background-position: -459px -324px;
+}
+.mc-skin-viewer-9x.slim .player > .left-arm > .accessory .left {
+  background-position: -423px -324px;
+}
+.mc-skin-viewer-9x.slim .player > .left-arm > .accessory .bottom {
+  background-position: -423px -288px;
+}
+.mc-skin-viewer-9x.slim .player > .right-arm .back {
+  background-position: -387px -468px;
+}
+.mc-skin-viewer-9x.slim .player > .right-arm .left {
+  background-position: -351px -468px;
+  transform: rotateX(0deg) rotateY(90deg) translateX(0px) translateY(0px) translateZ(9px);
+}
+.mc-skin-viewer-9x.slim .player > .right-arm .bottom {
+  background-position: -351px -432px;
+}
+.mc-skin-viewer-9x.slim .player > .right-arm > .accessory .back {
+  background-position: -531px -468px;
+}
+.mc-skin-viewer-9x.slim .player > .right-arm > .accessory .left {
+  background-position: -495px -468px;
+}
+.mc-skin-viewer-9x.slim .player > .right-arm > .accessory .bottom {
+  background-position: -495px -432px;
+}
+.mc-skin-viewer-9x.slim.legacy .player > .right-arm {
+  transform: translateY(72px) translateX(63px) scaleX(-1);
+}
+.mc-skin-viewer-9x.slim.legacy .player > .right-arm .back {
+  background-position: -459px -180px;
+}
+.mc-skin-viewer-9x.slim.legacy .player > .right-arm > .accessory .back {
+  background-position: -459px -324px;
+}
+.mc-skin-viewer-9x .player .cape {
+  transform-style: preserve-3d;
+  transform: rotateY(180deg) translateX(-9px) translateZ(22.5px) translateY(67.5px) rotateX(5deg);
+}
+.mc-skin-viewer-9x .player .cape > .front,
+.mc-skin-viewer-9x .player .cape > .back,
+.mc-skin-viewer-9x .player .cape > .left,
+.mc-skin-viewer-9x .player .cape > .right,
+.mc-skin-viewer-9x .player .cape > .top,
+.mc-skin-viewer-9x .player .cape > .bottom {
+  position: absolute;
+  background-image: inherit!important;
+  background-size: 576px 288px;
+  backface-visibility: hidden;
+}
+.mc-skin-viewer-9x .player .cape > .front,
+.mc-skin-viewer-9x .player .cape > .back {
+  width: 90px;
+  height: 135px;
+}
+.mc-skin-viewer-9x .player .cape > .left,
+.mc-skin-viewer-9x .player .cape > .right {
+  width: 9px;
+  height: 135px;
+}
+.mc-skin-viewer-9x .player .cape > .top,
+.mc-skin-viewer-9x .player .cape > .bottom {
+  width: 90px;
+  height: 9px;
+}
+.mc-skin-viewer-9x .player .cape > .front {
+  background-position: -9px -9px;
+  transform: translateZ(4.5px);
+}
+.mc-skin-viewer-9x .player .cape > .back {
+  background-position: -108px -9px;
+  transform: translateZ(-4.5px) rotateY(180deg);
+}
+.mc-skin-viewer-9x .player .cape > .left {
+  background-position: 0px -9px;
+  transform: rotateY(270deg) translateZ(4.5px);
+}
+.mc-skin-viewer-9x .player .cape > .right {
+  background-position: -99px -9px;
+  transform: rotateY(-270deg) translateZ(85.5px);
+}
+.mc-skin-viewer-9x .player .cape > .top {
+  background-position: -9px 0px;
+  transform: rotateX(90deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(4.5px);
+}
+.mc-skin-viewer-9x .player .cape > .bottom {
+  background-position: -99px 0px;
+  transform: rotateX(-90deg) translateZ(130.5px);
+}
+.mc-skin-viewer-9x.legacy-cape > .player .cape > .front,
+.mc-skin-viewer-9x.legacy-cape > .player .cape > .back,
+.mc-skin-viewer-9x.legacy-cape > .player .cape > .left,
+.mc-skin-viewer-9x.legacy-cape > .player .cape > .right,
+.mc-skin-viewer-9x.legacy-cape > .player .cape > .top,
+.mc-skin-viewer-9x.legacy-cape > .player .cape > .bottom {
+  background-size: 198px 153px;
+}
+.mc-skin-viewer-11x {
+  width: 88px;
+  height: 352px;
+  margin: 15px auto 40px auto;
+  perspective: 800px;
+  perspective-origin: 50% 100px;
+  transform-style: preserve-3d;
+  background-image: none !important;
+  image-rendering: optimizeSpeed;
+  /* Legal fallback */
+  image-rendering: -moz-crisp-edges;
+  /* Firefox        */
+  image-rendering: -o-crisp-edges;
+  /* Opera          */
+  image-rendering: -webkit-optimize-contrast;
+  /* Safari         */
+  image-rendering: optimize-contrast;
+  /* CSS3 Proposed  */
+  image-rendering: crisp-edges;
+  /* CSS4 Proposed  */
+  image-rendering: pixelated;
+  /* CSS4 Proposed  */
+  -ms-interpolation-mode: nearest-neighbor;
+  /* IE8+           */
+}
+.mc-skin-viewer-11x.hide-accessories .accessory {
+  display: none;
+}
+.mc-skin-viewer-11x.spin > .player {
+  animation: spin 12s infinite linear;
+}
+.mc-skin-viewer-11x .player {
+  transform-style: preserve-3d;
+}
+.mc-skin-viewer-11x .player .front,
+.mc-skin-viewer-11x .player .back,
+.mc-skin-viewer-11x .player .left,
+.mc-skin-viewer-11x .player .right,
+.mc-skin-viewer-11x .player .top,
+.mc-skin-viewer-11x .player .bottom {
+  position: absolute;
+  background-size: 704px;
+  background-repeat: no-repeat;
+  backface-visibility: hidden;
+}
+.mc-skin-viewer-11x .player .accessory {
+  background-image: none;
+}
+.mc-skin-viewer-11x .player .accessory .front,
+.mc-skin-viewer-11x .player .accessory .back,
+.mc-skin-viewer-11x .player .accessory .left,
+.mc-skin-viewer-11x .player .accessory .right,
+.mc-skin-viewer-11x .player .accessory .top,
+.mc-skin-viewer-11x .player .accessory .bottom {
+  backface-visibility: visible;
+}
+.mc-skin-viewer-11x .player > .head {
+  position: absolute;
+  transform-style: preserve-3d;
+  width: 88px;
+  height: 88px;
+  margin: 0 auto;
+  background-image: none !important;
+}
+.mc-skin-viewer-11x .player > .head .front,
+.mc-skin-viewer-11x .player > .head .back,
+.mc-skin-viewer-11x .player > .head .left,
+.mc-skin-viewer-11x .player > .head .right,
+.mc-skin-viewer-11x .player > .head .top,
+.mc-skin-viewer-11x .player > .head .bottom {
+  width: 88px;
+  height: 88px;
+}
+.mc-skin-viewer-11x .player > .head .front {
+  background-position: -88px -88px;
+  transform: rotateX(0deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(44px);
+}
+.mc-skin-viewer-11x .player > .head .back {
+  background-position: -264px -88px;
+  transform: rotateX(0deg) rotateY(180deg) translateX(0px) translateY(0px) translateZ(44px);
+}
+.mc-skin-viewer-11x .player > .head .right {
+  background-position: 0px -88px;
+  transform: rotateX(0deg) rotateY(270deg) translateX(0px) translateY(0px) translateZ(44px);
+}
+.mc-skin-viewer-11x .player > .head .left {
+  background-position: -176px -88px;
+  transform: rotateX(0deg) rotateY(90deg) translateX(0px) translateY(0px) translateZ(44px);
+}
+.mc-skin-viewer-11x .player > .head .top {
+  background-position: -88px 0px;
+  transform: rotateX(90deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(44px);
+}
+.mc-skin-viewer-11x .player > .head .bottom {
+  background-position: -176px 0px;
+  transform: rotateX(270deg) rotateY(0deg) rotateZ(180deg) translateX(0px) translateY(0px) translateZ(44px);
+}
+.mc-skin-viewer-11x .player > .head > .accessory {
+  transform-style: preserve-3d;
+  transform: scale3d(1.125, 1.125, 1.125) translateY(-4.5px);
+}
+.mc-skin-viewer-11x .player > .head > .accessory > .front {
+  background-position: -440px -88px;
+}
+.mc-skin-viewer-11x .player > .head > .accessory > .back {
+  background-position: -616px -88px;
+}
+.mc-skin-viewer-11x .player > .head > .accessory > .right {
+  background-position: -352px -88px;
+}
+.mc-skin-viewer-11x .player > .head > .accessory > .left {
+  background-position: -528px -88px;
+}
+.mc-skin-viewer-11x .player > .head > .accessory > .top {
+  background-position: -440px 0px;
+}
+.mc-skin-viewer-11x .player > .head > .accessory > .bottom {
+  background-position: -528px 0px;
+}
+.mc-skin-viewer-11x .player > .body {
+  position: absolute;
+  transform-style: preserve-3d;
+  width: 88px;
+  height: 88px;
+  margin: 0 auto;
+  transform: translateY(88px);
+  background-image: none !important;
+}
+.mc-skin-viewer-11x .player > .body .front,
+.mc-skin-viewer-11x .player > .body .back,
+.mc-skin-viewer-11x .player > .body .left,
+.mc-skin-viewer-11x .player > .body .right,
+.mc-skin-viewer-11x .player > .body .top,
+.mc-skin-viewer-11x .player > .body .bottom {
+  width: 88px;
+  height: 132px;
+}
+.mc-skin-viewer-11x .player > .body .left,
+.mc-skin-viewer-11x .player > .body .right {
+  width: 44px;
+}
+.mc-skin-viewer-11x .player > .body .top,
+.mc-skin-viewer-11x .player > .body .bottom {
+  height: 44px;
+}
+.mc-skin-viewer-11x .player > .body .front {
+  background-position: -220px -220px;
+  transform: rotateX(0deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(22px);
+}
+.mc-skin-viewer-11x .player > .body .back {
+  background-position: -352px -220px;
+  transform: rotateX(0deg) rotateY(180deg) translateX(0px) translateY(0px) translateZ(22px);
+}
+.mc-skin-viewer-11x .player > .body .right {
+  background-position: -176px -220px;
+  transform: rotateX(0deg) rotateY(270deg) translateX(0px) translateY(0px) translateZ(22px);
+}
+.mc-skin-viewer-11x .player > .body .left {
+  background-position: -308px -220px;
+  transform: rotateX(0deg) rotateY(90deg) translateX(0px) translateY(0px) translateZ(66px);
+}
+.mc-skin-viewer-11x .player > .body .top {
+  background-position: -220px -176px;
+  transform: rotateX(90deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(22px);
+}
+.mc-skin-viewer-11x .player > .body .bottom {
+  background-position: -308px -176px;
+  transform: rotateX(270deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(110px);
+}
+.mc-skin-viewer-11x .player > .body > .accessory {
+  transform-style: preserve-3d;
+  transform: scale3d(1.0625, 1.0625, 1.0625) translateY(-4.125px);
+}
+.mc-skin-viewer-11x .player > .body > .accessory > .front {
+  background-position: -220px -396px;
+}
+.mc-skin-viewer-11x .player > .body > .accessory > .back {
+  background-position: -352px -396px;
+}
+.mc-skin-viewer-11x .player > .body > .accessory > .right {
+  background-position: -176px -396px;
+}
+.mc-skin-viewer-11x .player > .body > .accessory > .left {
+  background-position: -308px -396px;
+}
+.mc-skin-viewer-11x .player > .body > .accessory > .top {
+  background-position: -220px -352px;
+}
+.mc-skin-viewer-11x .player > .body > .accessory > .bottom {
+  background-position: -308px -352px;
+}
+.mc-skin-viewer-11x .player > .left-arm,
+.mc-skin-viewer-11x .player > .right-arm {
+  position: absolute;
+  transform-style: preserve-3d;
+  width: 44px;
+  height: 132px;
+  margin: 0 auto;
+  transform: translateY(88px) translateX(-44px);
+  background-image: none !important;
+}
+.mc-skin-viewer-11x .player > .left-arm .front,
+.mc-skin-viewer-11x .player > .right-arm .front,
+.mc-skin-viewer-11x .player > .left-arm .back,
+.mc-skin-viewer-11x .player > .right-arm .back,
+.mc-skin-viewer-11x .player > .left-arm .left,
+.mc-skin-viewer-11x .player > .right-arm .left,
+.mc-skin-viewer-11x .player > .left-arm .right,
+.mc-skin-viewer-11x .player > .right-arm .right,
+.mc-skin-viewer-11x .player > .left-arm .top,
+.mc-skin-viewer-11x .player > .right-arm .top,
+.mc-skin-viewer-11x .player > .left-arm .bottom,
+.mc-skin-viewer-11x .player > .right-arm .bottom {
+  width: 44px;
+  height: 132px;
+}
+.mc-skin-viewer-11x .player > .left-arm .top,
+.mc-skin-viewer-11x .player > .right-arm .top,
+.mc-skin-viewer-11x .player > .left-arm .bottom,
+.mc-skin-viewer-11x .player > .right-arm .bottom {
+  height: 44px;
+}
+.mc-skin-viewer-11x .player > .left-arm .front,
+.mc-skin-viewer-11x .player > .right-arm .front {
+  background-position: -484px -220px;
+  transform: rotateX(0deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(22px);
+}
+.mc-skin-viewer-11x .player > .left-arm .back,
+.mc-skin-viewer-11x .player > .right-arm .back {
+  background-position: -572px -220px;
+  transform: rotateX(0deg) rotateY(180deg) translateX(0px) translateY(0px) translateZ(22px);
+}
+.mc-skin-viewer-11x .player > .left-arm .right,
+.mc-skin-viewer-11x .player > .right-arm .right {
+  background-position: -440px -220px;
+  transform: rotateX(0deg) rotateY(270deg) translateX(0px) translateY(0px) translateZ(22px);
+}
+.mc-skin-viewer-11x .player > .left-arm .left,
+.mc-skin-viewer-11x .player > .right-arm .left {
+  background-position: -528px -220px;
+  transform: rotateX(0deg) rotateY(90deg) translateX(0px) translateY(0px) translateZ(22px);
+}
+.mc-skin-viewer-11x .player > .left-arm .top,
+.mc-skin-viewer-11x .player > .right-arm .top {
+  background-position: -484px -176px;
+  transform: rotateX(90deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(22px);
+}
+.mc-skin-viewer-11x .player > .left-arm .bottom,
+.mc-skin-viewer-11x .player > .right-arm .bottom {
+  background-position: -528px -176px;
+  transform: rotateX(270deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(110px);
+}
+.mc-skin-viewer-11x .player > .left-arm > .accessory,
+.mc-skin-viewer-11x .player > .right-arm > .accessory {
+  transform-style: preserve-3d;
+  transform: scale3d(1.0625, 1.0625, 1.0625) translateY(-4.125px);
+}
+.mc-skin-viewer-11x .player > .left-arm > .accessory .front,
+.mc-skin-viewer-11x .player > .right-arm > .accessory .front {
+  background-position: -484px -396px;
+}
+.mc-skin-viewer-11x .player > .left-arm > .accessory .back,
+.mc-skin-viewer-11x .player > .right-arm > .accessory .back {
+  background-position: -572px -396px;
+}
+.mc-skin-viewer-11x .player > .left-arm > .accessory .right,
+.mc-skin-viewer-11x .player > .right-arm > .accessory .right {
+  background-position: -440px -396px;
+}
+.mc-skin-viewer-11x .player > .left-arm > .accessory .left,
+.mc-skin-viewer-11x .player > .right-arm > .accessory .left {
+  background-position: -528px -396px;
+}
+.mc-skin-viewer-11x .player > .left-arm > .accessory .top,
+.mc-skin-viewer-11x .player > .right-arm > .accessory .top {
+  background-position: -484px -352px;
+}
+.mc-skin-viewer-11x .player > .left-arm > .accessory .bottom,
+.mc-skin-viewer-11x .player > .right-arm > .accessory .bottom {
+  background-position: -528px -352px;
+}
+.mc-skin-viewer-11x .player > .right-arm {
+  transform: translateY(88px) translateX(88px) scaleX(-1);
+}
+.mc-skin-viewer-11x .player > .left-leg,
+.mc-skin-viewer-11x .player > .right-leg {
+  position: absolute;
+  transform-style: preserve-3d;
+  width: 44px;
+  height: 132px;
+  margin: 0 auto;
+  transform: translateY(220px);
+  background-image: none !important;
+}
+.mc-skin-viewer-11x .player > .left-leg .front,
+.mc-skin-viewer-11x .player > .right-leg .front,
+.mc-skin-viewer-11x .player > .left-leg .back,
+.mc-skin-viewer-11x .player > .right-leg .back,
+.mc-skin-viewer-11x .player > .left-leg .left,
+.mc-skin-viewer-11x .player > .right-leg .left,
+.mc-skin-viewer-11x .player > .left-leg .right,
+.mc-skin-viewer-11x .player > .right-leg .right,
+.mc-skin-viewer-11x .player > .left-leg .top,
+.mc-skin-viewer-11x .player > .right-leg .top,
+.mc-skin-viewer-11x .player > .left-leg .bottom,
+.mc-skin-viewer-11x .player > .right-leg .bottom {
+  width: 44px;
+  height: 132px;
+}
+.mc-skin-viewer-11x .player > .left-leg .top,
+.mc-skin-viewer-11x .player > .right-leg .top,
+.mc-skin-viewer-11x .player > .left-leg .bottom,
+.mc-skin-viewer-11x .player > .right-leg .bottom {
+  height: 44px;
+}
+.mc-skin-viewer-11x .player > .left-leg .front,
+.mc-skin-viewer-11x .player > .right-leg .front {
+  background-position: -44px -220px;
+  transform: rotateX(0deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(22px);
+}
+.mc-skin-viewer-11x .player > .left-leg .back,
+.mc-skin-viewer-11x .player > .right-leg .back {
+  background-position: -132px -220px;
+  transform: rotateX(0deg) rotateY(180deg) translateX(0px) translateY(0px) translateZ(22px);
+}
+.mc-skin-viewer-11x .player > .left-leg .right,
+.mc-skin-viewer-11x .player > .right-leg .right {
+  background-position: 0px -220px;
+  transform: rotateX(0deg) rotateY(270deg) translateX(0px) translateY(0px) translateZ(22px);
+}
+.mc-skin-viewer-11x .player > .left-leg .left,
+.mc-skin-viewer-11x .player > .right-leg .left {
+  background-position: -88px -220px;
+  transform: rotateX(0deg) rotateY(90deg) translateX(0px) translateY(0px) translateZ(22px);
+}
+.mc-skin-viewer-11x .player > .left-leg .top,
+.mc-skin-viewer-11x .player > .right-leg .top {
+  background-position: -44px -176px;
+  transform: rotateX(90deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(22px);
+}
+.mc-skin-viewer-11x .player > .left-leg .bottom,
+.mc-skin-viewer-11x .player > .right-leg .bottom {
+  background-position: -88px -176px;
+  transform: rotateX(270deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(110px);
+}
+.mc-skin-viewer-11x .player > .left-leg > .accessory,
+.mc-skin-viewer-11x .player > .right-leg > .accessory {
+  transform-style: preserve-3d;
+  transform: scale3d(1.03125, 1.03125, 1.03125) translateY(-2.0625px);
+}
+.mc-skin-viewer-11x .player > .left-leg > .accessory .front,
+.mc-skin-viewer-11x .player > .right-leg > .accessory .front {
+  background-position: -44px -396px;
+}
+.mc-skin-viewer-11x .player > .left-leg > .accessory .back,
+.mc-skin-viewer-11x .player > .right-leg > .accessory .back {
+  background-position: -132px -396px;
+}
+.mc-skin-viewer-11x .player > .left-leg > .accessory .right,
+.mc-skin-viewer-11x .player > .right-leg > .accessory .right {
+  background-position: 0px -396px;
+}
+.mc-skin-viewer-11x .player > .left-leg > .accessory .left,
+.mc-skin-viewer-11x .player > .right-leg > .accessory .left {
+  background-position: -88px -396px;
+}
+.mc-skin-viewer-11x .player > .left-leg > .accessory .top,
+.mc-skin-viewer-11x .player > .right-leg > .accessory .top {
+  background-position: -44px -352px;
+}
+.mc-skin-viewer-11x .player > .left-leg > .accessory .bottom,
+.mc-skin-viewer-11x .player > .right-leg > .accessory .bottom {
+  background-position: -88px -352px;
+}
+.mc-skin-viewer-11x .player > .right-leg {
+  transform: translateY(220px) translateX(44px) scaleX(-1);
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-arm {
+  transform: translateY(88px) translateX(88px);
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-arm .front {
+  background-position: -396px -572px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-arm .back {
+  background-position: -484px -572px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-arm .right {
+  background-position: -352px -572px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-arm .left {
+  background-position: -440px -572px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-arm .top {
+  background-position: -396px -528px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-arm .bottom {
+  background-position: -440px -528px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-arm > .accessory .front {
+  background-position: -572px -572px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-arm > .accessory .back {
+  background-position: -660px -572px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-arm > .accessory .right {
+  background-position: -528px -572px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-arm > .accessory .left {
+  background-position: -616px -572px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-arm > .accessory .top {
+  background-position: -572px -528px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-arm > .accessory .bottom {
+  background-position: -616px -528px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-leg {
+  transform: translateY(220px) translateX(44px);
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-leg .front {
+  background-position: -220px -572px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-leg .back {
+  background-position: -308px -572px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-leg .right {
+  background-position: -176px -572px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-leg .left {
+  background-position: -264px -572px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-leg .top {
+  background-position: -220px -528px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-leg .bottom {
+  background-position: -264px -528px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-leg > .accessory .front {
+  background-position: -44px -572px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-leg > .accessory .back {
+  background-position: -132px -572px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-leg > .accessory .right {
+  background-position: 0px -572px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-leg > .accessory .left {
+  background-position: -88px -572px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-leg > .accessory .top {
+  background-position: -44px -528px;
+}
+.mc-skin-viewer-11x:not(.legacy) .player > .right-leg > .accessory .bottom {
+  background-position: -88px -528px;
+}
+.mc-skin-viewer-11x.slim .player > .left-arm .front,
+.mc-skin-viewer-11x.slim .player > .right-arm .front,
+.mc-skin-viewer-11x.slim .player > .left-arm .back,
+.mc-skin-viewer-11x.slim .player > .right-arm .back,
+.mc-skin-viewer-11x.slim .player > .left-arm .top,
+.mc-skin-viewer-11x.slim .player > .right-arm .top,
+.mc-skin-viewer-11x.slim .player > .left-arm .bottom,
+.mc-skin-viewer-11x.slim .player > .right-arm .bottom {
+  width: 33px;
+}
+.mc-skin-viewer-11x.slim .player > .left-arm .front {
+  transform: rotateX(0deg) rotateY(0deg) translateX(11px) translateY(0px) translateZ(22px);
+}
+.mc-skin-viewer-11x.slim .player > .left-arm .back {
+  background-position: -561px -220px;
+  transform: rotateX(0deg) rotateY(180deg) translateX(-11px) translateY(0px) translateZ(22px);
+}
+.mc-skin-viewer-11x.slim .player > .left-arm .right {
+  transform: rotateX(0deg) rotateY(270deg) translateX(0px) translateY(0px) translateZ(11px);
+}
+.mc-skin-viewer-11x.slim .player > .left-arm .left {
+  background-position: -517px -220px;
+}
+.mc-skin-viewer-11x.slim .player > .left-arm .top {
+  transform: rotateX(90deg) rotateY(0deg) translateX(11px) translateY(0px) translateZ(22px);
+}
+.mc-skin-viewer-11x.slim .player > .left-arm .bottom {
+  background-position: -517px -176px;
+  transform: rotateX(270deg) rotateY(0deg) translateX(11px) translateY(0px) translateZ(110px);
+}
+.mc-skin-viewer-11x.slim .player > .left-arm > .accessory .back {
+  background-position: -561px -396px;
+}
+.mc-skin-viewer-11x.slim .player > .left-arm > .accessory .left {
+  background-position: -517px -396px;
+}
+.mc-skin-viewer-11x.slim .player > .left-arm > .accessory .bottom {
+  background-position: -517px -352px;
+}
+.mc-skin-viewer-11x.slim .player > .right-arm .back {
+  background-position: -473px -572px;
+}
+.mc-skin-viewer-11x.slim .player > .right-arm .left {
+  background-position: -429px -572px;
+  transform: rotateX(0deg) rotateY(90deg) translateX(0px) translateY(0px) translateZ(11px);
+}
+.mc-skin-viewer-11x.slim .player > .right-arm .bottom {
+  background-position: -429px -528px;
+}
+.mc-skin-viewer-11x.slim .player > .right-arm > .accessory .back {
+  background-position: -649px -572px;
+}
+.mc-skin-viewer-11x.slim .player > .right-arm > .accessory .left {
+  background-position: -605px -572px;
+}
+.mc-skin-viewer-11x.slim .player > .right-arm > .accessory .bottom {
+  background-position: -605px -528px;
+}
+.mc-skin-viewer-11x.slim.legacy .player > .right-arm {
+  transform: translateY(88px) translateX(77px) scaleX(-1);
+}
+.mc-skin-viewer-11x.slim.legacy .player > .right-arm .back {
+  background-position: -561px -220px;
+}
+.mc-skin-viewer-11x.slim.legacy .player > .right-arm > .accessory .back {
+  background-position: -561px -396px;
+}
+.mc-skin-viewer-11x .player .cape {
+  transform-style: preserve-3d;
+  transform: rotateY(180deg) translateX(-11px) translateZ(27.5px) translateY(82.5px) rotateX(5deg);
+}
+.mc-skin-viewer-11x .player .cape > .front,
+.mc-skin-viewer-11x .player .cape > .back,
+.mc-skin-viewer-11x .player .cape > .left,
+.mc-skin-viewer-11x .player .cape > .right,
+.mc-skin-viewer-11x .player .cape > .top,
+.mc-skin-viewer-11x .player .cape > .bottom {
+  position: absolute;
+  background-image: inherit!important;
+  background-size: 704px 352px;
+  backface-visibility: hidden;
+}
+.mc-skin-viewer-11x .player .cape > .front,
+.mc-skin-viewer-11x .player .cape > .back {
+  width: 110px;
+  height: 165px;
+}
+.mc-skin-viewer-11x .player .cape > .left,
+.mc-skin-viewer-11x .player .cape > .right {
+  width: 11px;
+  height: 165px;
+}
+.mc-skin-viewer-11x .player .cape > .top,
+.mc-skin-viewer-11x .player .cape > .bottom {
+  width: 110px;
+  height: 11px;
+}
+.mc-skin-viewer-11x .player .cape > .front {
+  background-position: -11px -11px;
+  transform: translateZ(5.5px);
+}
+.mc-skin-viewer-11x .player .cape > .back {
+  background-position: -132px -11px;
+  transform: translateZ(-5.5px) rotateY(180deg);
+}
+.mc-skin-viewer-11x .player .cape > .left {
+  background-position: 0px -11px;
+  transform: rotateY(270deg) translateZ(5.5px);
+}
+.mc-skin-viewer-11x .player .cape > .right {
+  background-position: -121px -11px;
+  transform: rotateY(-270deg) translateZ(104.5px);
+}
+.mc-skin-viewer-11x .player .cape > .top {
+  background-position: -11px 0px;
+  transform: rotateX(90deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(5.5px);
+}
+.mc-skin-viewer-11x .player .cape > .bottom {
+  background-position: -121px 0px;
+  transform: rotateX(-90deg) translateZ(159.5px);
+}
+.mc-skin-viewer-11x.legacy-cape > .player .cape > .front,
+.mc-skin-viewer-11x.legacy-cape > .player .cape > .back,
+.mc-skin-viewer-11x.legacy-cape > .player .cape > .left,
+.mc-skin-viewer-11x.legacy-cape > .player .cape > .right,
+.mc-skin-viewer-11x.legacy-cape > .player .cape > .top,
+.mc-skin-viewer-11x.legacy-cape > .player .cape > .bottom {
+  background-size: 242px 187px;
+}
+.mc-cape-viewer-9x {
+  width: 90px;
+  height: 135px;
+  margin: 10px auto;
+  perspective: 800px;
+  perspective-origin: 50% 100px;
+  background-image: none;
+  image-rendering: optimizeSpeed;
+  /* Legal fallback */
+  image-rendering: -moz-crisp-edges;
+  /* Firefox        */
+  image-rendering: -o-crisp-edges;
+  /* Opera          */
+  image-rendering: -webkit-optimize-contrast;
+  /* Safari         */
+  image-rendering: optimize-contrast;
+  /* CSS3 Proposed  */
+  image-rendering: crisp-edges;
+  /* CSS4 Proposed  */
+  image-rendering: pixelated;
+  /* CSS4 Proposed  */
+  -ms-interpolation-mode: nearest-neighbor;
+  /* IE8+           */
+}
+.mc-cape-viewer-9x .wrapper {
+  transform-style: preserve-3d;
+  width: 90px;
+  height: 135px;
+  position: relative;
+  background-image: none !important;
+}
+.mc-cape-viewer-9x .wrapper .cape {
+  transform-style: preserve-3d;
+}
+.mc-cape-viewer-9x .wrapper .cape > .front,
+.mc-cape-viewer-9x .wrapper .cape > .back,
+.mc-cape-viewer-9x .wrapper .cape > .left,
+.mc-cape-viewer-9x .wrapper .cape > .right,
+.mc-cape-viewer-9x .wrapper .cape > .top,
+.mc-cape-viewer-9x .wrapper .cape > .bottom {
+  position: absolute;
+  background-size: 576px 288px;
+  backface-visibility: hidden;
+}
+.mc-cape-viewer-9x .wrapper .cape > .front,
+.mc-cape-viewer-9x .wrapper .cape > .back {
+  width: 90px;
+  height: 135px;
+}
+.mc-cape-viewer-9x .wrapper .cape > .left,
+.mc-cape-viewer-9x .wrapper .cape > .right {
+  width: 9px;
+  height: 135px;
+}
+.mc-cape-viewer-9x .wrapper .cape > .top,
+.mc-cape-viewer-9x .wrapper .cape > .bottom {
+  width: 90px;
+  height: 9px;
+}
+.mc-cape-viewer-9x .wrapper .cape > .front {
+  background-position: -9px -9px;
+  transform: translateZ(4.5px);
+}
+.mc-cape-viewer-9x .wrapper .cape > .back {
+  background-position: -108px -9px;
+  transform: translateZ(-4.5px) rotateY(180deg);
+}
+.mc-cape-viewer-9x .wrapper .cape > .left {
+  background-position: 0px -9px;
+  transform: rotateY(270deg) translateZ(4.5px);
+}
+.mc-cape-viewer-9x .wrapper .cape > .right {
+  background-position: -99px -9px;
+  transform: rotateY(-270deg) translateZ(85.5px);
+}
+.mc-cape-viewer-9x .wrapper .cape > .top {
+  background-position: -9px 0px;
+  transform: rotateX(90deg) rotateY(0deg) translateX(0px) translateY(0px) translateZ(4.5px);
+}
+.mc-cape-viewer-9x .wrapper .cape > .bottom {
+  background-position: -99px 0px;
+  transform: rotateX(-90deg) translateZ(130.5px);
+}
+.mc-cape-viewer-9x.legacy .wrapper .cape > .front,
+.mc-cape-viewer-9x.legacy .wrapper .cape > .back,
+.mc-cape-viewer-9x.legacy .wrapper .cape > .left,
+.mc-cape-viewer-9x.legacy .wrapper .cape > .right {
+  background-size: 198px 153px;
+}
+.mc-cape-viewer-9x.waving > .wrapper > .cape {
+  animation: waving 2s infinite ease-in-out;
+}
+.mc-cape-viewer-9x.spin > .wrapper > .cape {
+  animation: spin 12s infinite linear;
+}

+ 27 - 0
webroot/css/minecraft-skinviewer.less

@@ -0,0 +1,27 @@
+//
+// Copyright 2018 Robert Koszewski
+// 
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+// MC Skin Viewer
+
+@import "../mc-utils";
+@import "../mc-face-viewer";
+@import "../mc-skin-viewer";
+@import "../mc-viewer-effects";
+
+// 2D Face Viewer
+.mc-face-viewer(4); // MC Face Viewer with Zoom 4x.
+.mc-face-viewer(8); // MC Face Viewer with Zoom 8x.
+
+// 3D Skin Viewer
+.mc-skin-viewer(9); // MC Skin Viewer with Zoom 9x. Use mc-skin-viewer-9x
+.mc-skin-viewer(11); // MC Skin Viewer with Zoom 9x. Use mc-skin-viewer-11x
+
+// 3D Cape Viewer
+.mc-cape-viewer(9);

TEMPAT SAMPAH
webroot/img/3d1c0ed1-d4d0-42ae-ac5e-a7557d5a6c4f.png


TEMPAT SAMPAH
webroot/img/hyperxraft.png


+ 41 - 15
webroot/info.html

@@ -13,6 +13,8 @@
     <script src="https://code.jquery.com/jquery-3.1.1.min.js" crossorigin="anonymous"></script>
     <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css">
     <script src="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.js"></script>
+    <!-- MC Skin-->
+    <link rel="stylesheet" href="./css/minecraft-skinviewer.css">
 </head>
 
 <body>
@@ -61,23 +63,10 @@
 
     </div>
     <div class="ui clearing basic segment">
-        <div class="ui grid">
+        <div class="ui grid" id="userlist">
             <div class="sixteen wide column">
-                <h3>Online player(s) (0/99)</h3>
+                <h3>Online player(s) (N/A)</h3>
             </div>
-            <div class="four wide column">
-
-                <div class="ui massive horizontal list">
-                    <div class="item">
-                        <img class="ui avatar image" style="border-radius: 0 !important" alt="hyperxraft" src="/img/hyperxraft.png">
-                        <div class="content">
-                            <p>HyperXraft</p>
-                        </div>
-                    </div>
-                </div>
-
-            </div>
-            <div class="four wide column"></div>
         </div>
     </div>
 
@@ -104,6 +93,43 @@
             $("#status").html("Killing...");
         });
     }
+
+    $.get("serverinfo", function(data) {
+        $("#userlist").html(`
+            <div class="sixteen wide column">
+                <h3>Online player(s) (` + data.online + `/` + data.max + `)</h3>
+            </div>
+            `)
+        if (data.sample.length == 0) {
+            $("#userlist").append(`
+            <div class="four wide column">
+                <div class="ui massive horizontal list">
+                    <div class="item">
+                        <div class="content">
+                            <p>No one here :(</p>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            `)
+        }
+        $.each(data.sample, function(i, item) {
+            $("#userlist").append(`
+            <div class="four wide column">
+                <div class="ui massive horizontal list">
+                    <div class="item">
+                        <div class="ui avatar image">
+                            <div class="mc-face-viewer-8x" style="background-image:url('/img/` + item.uuid + `.png');width:64px"></div>
+                        </div>
+                        <div class="content">
+                            <p>` + item.name + `</p>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            `)
+        })
+    });
 </script>
 
 </html>

+ 24 - 9
webroot/log.html

@@ -29,36 +29,51 @@
 </body>
 <script>
     var currentLogID = 0;
+    var loading = false;
 
     function refreshLog() {
-        $.get("log/from?start=" + currentLogID, function(data) {
-            $.each(data, function(index, value) {
-                $("#log").append(value.Log + "\n");
-                currentLogID = value.ID + 1;
+        if (!loading) {
+            loading = true;
+            $.get("log/from?start=" + currentLogID, function(data) {
+                $.each(data, function(index, value) {
+                    $("#log").append(escapeHtml(value.Log) + "\n");
+                    currentLogID = value.ID + 1;
+                });
+                $('#log').scrollTop($('#log')[0].scrollHeight);
+                loading = false;
             });
-            $('#log').scrollTop($('#log')[0].scrollHeight);
-        });
+        }
+
     }
     setInterval(function() {
         refreshLog()
-    }, 3000);
+    }, 1000);
 
     function sendCmd() {
         var cmdVal = $("#command").val();
         $.get("sendcommand?command=" + cmdVal, function(data) {
             $("#log").append("Command: [" + cmdVal + "] sent\n");
-            $("#command").val("");
             //increase the refresh speed immd after sending command
-            setTimeout(refreshLog, 1000);
+            setTimeout(refreshLog, 200);
         });
     }
 
     $('#command').on("keypress", function(e) {
         if (e.keyCode == 13) {
             sendCmd();
+            $("#command").val("");
             return false; // prevent the button click from happening
         }
     });
+
+    function escapeHtml(text) {
+        return text
+            .replace(/&/g, "&amp;")
+            .replace(/</g, "&lt;")
+            .replace(/>/g, "&gt;")
+            .replace(/"/g, "&quot;")
+            .replace(/'/g, "&#039;");
+    }
 </script>
 
 </html>

+ 56 - 14
webroot/players.html

@@ -13,29 +13,71 @@
     <script src="https://code.jquery.com/jquery-3.1.1.min.js" crossorigin="anonymous"></script>
     <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css">
     <script src="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.js"></script>
+    <!-- MC Skin-->
+    <link rel="stylesheet" href="./css/minecraft-skinviewer.css">
 </head>
 
 <body>
-    <div class="ui divided items">
-        <div class="item">
-            <div class="ui mini image">
-                <img alt="hyperxraft" src="/img/hyperxraft.png">
+    <div class="ui divided items" id="userlist">
+    </div>
+</body>
+<script>
+    $.get("serverinfo", function(data) {
+        if (data.sample.length == 0) {
+            $("#userlist").append(`
+                    <div class="item">
+            <div class="content">
+                <div class="header">No one here :(</div>
+            </div>
+        </div>
+            `)
+        }
+        $.each(data.sample, function(i, item) {
+            $("#userlist").append(`
+                    <div class="item">
+            <div class="ui mini image" style="width:64px">
+                <div class="mc-face-viewer-8x" style="background-image:url('/img/` + item.uuid + `.png')"></div>
             </div>
             <div class="content">
-                <div class="header">HyperXraft</div>
+                <div class="header">` + item.name + `</div>
                 <div class="meta">
-                    <span>UUID</span>
+                    <span>` + item.uuid + `</span>
                 </div>
             </div>
-            <div class="ui right floated buttons">
-                <button class="ui green button">Op</button>
-                <button class="ui yellow button">De-Op</button>
-                <button class="ui orange button">Kick</button>
-                <button class="ui red button">Ban</button>
-
+            <div class="ui right floated buttons" username="` + item.name + `">
+                <button onclick="op(this)" class="ui green button">Op</button>
+                <button onclick="deop(this)" class="ui yellow button">De-Op</button>
+                <button onclick="kick(this)" class="ui orange button">Kick</button>
+                <button onclick="ban(this)" class="ui red button">Ban</button>
             </div>
         </div>
-    </div>
-</body>
+            `)
+        })
+    });
+
+    function op(btn) {
+        var username = $(btn).parent().attr("username");
+        sendCmd("op " + username);
+    }
+
+    function deop(btn) {
+        var username = $(btn).parent().attr("username");
+        sendCmd("deop " + username);
+    }
+
+    function kick(btn) {
+        var username = $(btn).parent().attr("username");
+        sendCmd("kick " + username);
+    }
+
+    function ban(btn) {
+        var username = $(btn).parent().attr("username");
+        sendCmd("ban " + username);
+    }
+
+    function sendCmd(cmdVal) {
+        $.get("sendcommand?command=" + cmdVal, function(data) {});
+    }
+</script>
 
 </html>