AY 5 лет назад
Родитель
Сommit
fe240fab73
52 измененных файлов с 2882 добавлено и 240 удалено
  1. BIN
      __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. BIN
      server/logs/.2020-12-15-2 2.log.gz.icloud
  10. BIN
      server/logs/2020-12-16-1.log.gz
  11. BIN
      server/logs/2020-12-16-2 2.log.gz
  12. BIN
      server/logs/2020-12-16-2.log.gz
  13. BIN
      server/logs/2020-12-16-3.log.gz
  14. BIN
      server/logs/2020-12-16-4.log.gz
  15. BIN
      server/logs/2020-12-16-5.log.gz
  16. BIN
      server/logs/2020-12-16-6.log.gz
  17. BIN
      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. BIN
      server/world/DIM-1/data/raids.dat
  23. BIN
      server/world/DIM1/data/raids_end.dat
  24. 241 146
      server/world/advancements/3d1c0ed1-d4d0-42ae-ac5e-a7557d5a6c4f.json
  25. BIN
      server/world/data/raids.dat
  26. BIN
      server/world/level.dat
  27. BIN
      server/world/level.dat_old
  28. BIN
      server/world/playerdata/3d1c0ed1-d4d0-42ae-ac5e-a7557d5a6c4f.dat
  29. BIN
      server/world/playerdata/3d1c0ed1-d4d0-42ae-ac5e-a7557d5a6c4f.dat_old
  30. 0 0
      server/world/poi/r.0.-2.mca
  31. BIN
      server/world/poi/r.0.0.mca
  32. BIN
      server/world/region/.r.-2.-1.mca.icloud
  33. BIN
      server/world/region/r.-1.-1.mca
  34. BIN
      server/world/region/r.-1.0.mca
  35. BIN
      server/world/region/r.-1.1.mca
  36. BIN
      server/world/region/r.-2.-1.mca
  37. BIN
      server/world/region/r.0.-1.mca
  38. BIN
      server/world/region/r.0.-2.mca
  39. BIN
      server/world/region/r.0.0.mca
  40. 0 0
      server/world/region/r.0.1.mca
  41. BIN
      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. BIN
      webroot/img/3d1c0ed1-d4d0-42ae-ac5e-a7557d5a6c4f.png
  49. BIN
      webroot/img/hyperxraft.png
  50. 41 15
      webroot/info.html
  51. 24 9
      webroot/log.html
  52. 56 14
      webroot/players.html

+ 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)

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


BIN
server/logs/2020-12-16-1.log.gz


BIN
server/logs/2020-12-16-2 2.log.gz


BIN
server/logs/2020-12-16-2.log.gz


BIN
server/logs/2020-12-16-3.log.gz


BIN
server/logs/2020-12-16-4.log.gz


BIN
server/logs/2020-12-16-5.log.gz


BIN
server/logs/2020-12-16-6.log.gz


BIN
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"}]

BIN
server/world/DIM-1/data/raids.dat


BIN
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
   },

BIN
server/world/data/raids.dat


BIN
server/world/level.dat


BIN
server/world/level.dat_old


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


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


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


BIN
server/world/poi/r.0.0.mca


BIN
server/world/region/.r.-2.-1.mca.icloud


BIN
server/world/region/r.-1.-1.mca


BIN
server/world/region/r.-1.0.mca


BIN
server/world/region/r.-1.1.mca


BIN
server/world/region/r.-2.-1.mca


BIN
server/world/region/r.0.-1.mca


BIN
server/world/region/r.0.-2.mca


BIN
server/world/region/r.0.0.mca


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


BIN
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);

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


BIN
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>