Giter Club home page Giter Club logo

multipaper's Introduction

MultiPaper

Discord

MultiPaper is in public beta. Most features work for most players most of the time, however things can occasionally break.

1.20.1 Purpur fork that enables a server admin to scale a single world across multiple servers. Multiple MultiPaper servers run the same world and use a MultiPaper-Master to coordinate with each other and store server data. While the MultiPaper-Master is usually run as a standalone server, it can also be run as a BungeeCord or Velocity plugin, which has some benefits including being able to send players to the least busy server when they join.

MultiPaper 2.0:

  • Works like a CDN

    • Each server caches chunks that are needed by the players it's serving
    • The servers keep each others' caches in sync with each other
    • The servers work together to ensure every chunk gets ticked
    • Does not require BungeeCord or Velocity, just some load balancing method to evenly distribute players across the servers
  • MultiPaper-Master

    • Stores the world files and data
    • Coordinates the servers
      • Decides who gets to tick the chunk (first in first served basis)
    • Runs as a standalone process
      • For your convenience, it can also run as a BungeeCord or Velocity plugin

MultiPaper diagram

How chunk syncing works:

  • When a server reads a chunk, it asks the Master to load the chunk from the region file. If another server has ownership of the chunk, the Master will notify the server to request the chunk from that server instead, so that it gets the most up-to-date copy.
  • When the server wants to tick an unowned chunk, it won't, but will instead send a request to the Master to take ownership of it. If ownership is granted, the chunk will be ticked on next tick. If ownership is denied since another server owns it, the server will keep the chunk in sync with that server.
  • A chunk may be loaded on a server but have no owner if it's outside the simulation distance. This is because the chunk won't be ticked by any server.
  • When a server has a chunk loaded into memory, it will subscribe to any changes made within that chunk. This means if any server changes a block inside the chunk, it will be updated on all servers subscribed to that chunk.

The use case

For servers that wish to maintain all vanilla mechanics while scaling up, MultiPaper is for you. Usually when a Minecraft server chooses to scale their player count up, they have to sacrifice various mechanics such as render distance, mob spawning, and redstone.

With MultiPaper, there is no need to ruin the vanilla experience. All you need are new servers when you wish to scale. Instead of having 1 server handling 100 players, you can have 10 servers handling 10 players each. This allows you to keep expensive vanilla mechanics like a large render distance, mob farms, and massive redstone contraptions.

It can scale

Perhaps 100 players isn't enough for you. You want to push the limits of your Minecraft server to the extreme with upwards of 1000 players online at once. Well, MultiPaper is also for you. With its ability to horizontally scale, the hardware's the limit.

Commands

MultiPaper includes a few commands mainly for debug purposes:

/servers
List all servers running on this MultiPaper cluster. Includes performance indicators such as TPS, tick duration, and player count.

/slist
List all online players and what server they're on.

/mpdebug
Toggle a debug visualisation showing chunks that your server is ticking (aqua) and chunks being ticked by another server (red). The server ticking the chunk you are standing in is displayed above the action bar.

/mpmap
Show a map of nearby chunks and which server owns them. Up represents north. If your server owns the chunk, the chunk is shown as aqua. If another server owns the chunk, it's shown as red. If the chunk is in memory but not within simulation range on your server, it's shown as white. Chunks not loaded on your server are shown as grey.

Setting up MultiPaper

  • Download MultiPaper and MultiPaper-Master from multipaper.io
  • Place your worlds inside the directory being used for MultiPaper-Master
  • Start the MultiPaper-Master by either:
    • Standalone: java -jar multipaper-master.jar <port> [optionalProxyPort]
    • BungeeCord plugin: Set the port in plugins/MultiPaperProxy/config.yml
    • Velocity plugin: Set the port in plugins/multipaper-velocity/config.toml
  • In each MultiPaper server:
    • Run the server once the generate the config file multipaper.yml
    • Put the name of the server used in the BungeeCord or Velocity config into bungeecordName
      • If you're not using BungeeCord or Velocity, just make it some unique identifier
      • eg. survival1
    • Put the address and port of the MultiPaper-Master in multipaperMasterAddress
      • eg. localhost:35353

Command line options

Command line options are provided that allow the config files server.properties, spigot.yml, paper.yml, and multipaper.yml to be overridden for easier scalability. For example:

java
  -DbungeecordName=server1
  -DmultipaperMasterAddress=127.0.0.1:35353
  -Dproperties.view-distance=16
  -Dpaper.global.proxies.proxy-protocol=true
  -Dspigot.world-settings.default.entity-tracking-range.players=128
  -Dmultipaper.sync-settings.files.files-to-sync-on-startup="myconfigfile.yml;plugins/MyPlugin.jar"
  -jar multipaper.jar

The built-in proxy

MultiPaper provides a proxy (like Bungeecord or Velocity) that can be used to hide the multipaper servers behind a single address. The proxy automatically selects the multipaper server with the lowest load and forwards the player to it. The proxy provides no extra features and is designed to be as fast and light-weight as possible. When using the proxy, you will need to set bungeecord to true in the multipapers' spigot.yml.

This proxy is only available when running a standalone MultiPaper-Master installation and can be started by specifying a port for it to listen on:

java -jar multipaper-master.jar <port> [proxy port]

For example, to run the MultiPaper-Master on port 35353 and the proxy on port 25565, you'd run:

java -jar multipaper-master.jar 35353 25565

Using MultiPaper with plugins

For a plugin to work with MultiPaper, it needs to support multiple servers. A good indication of this, but not a guarantee, is if a plugin uses a MySQL database.

Developing a plugin for MultiPaper

To make a plugin compatible with MultiPaper, no data must be stored on the server itself and must instead be stored on an external server such as a MySQL database.

Some other things to look out for:

  • Caches can prevent the plugin from getting the most up-to-date data.
  • PlayerJoinEvent and PlayerQuitEvent will only be called on one server, however other events for the player could be called on any server.
  • Bukkit.broadcastMessage will send the message to all players on all MultiPaper servers.
  • Bukkit.getOnlinePlayers will return the players only on your server. Use Bukkit.getAllOnlinePlayers to get the players across all servers.
  • You can use Player.isLocalPlayer, Chunk.isLocalChunk, Location.isChunkLocal, Entity.isInLocalChunk, Block.isInLocalChunk to check if its being managed by your server.

Using the MultiPaper API as a dependency

Clojars Project

If you want your plugin to still support regular Spigot and Paper servers, we recommend using MultiLib instead.

Add the following into your build.gradle:

repositories {
  maven {
    url "https://repo.clojars.org/"
  }
}

dependencies {
  compile "com.github.puregero:multipaper-api:1.20.1-R0.1-SNAPSHOT"
}

Or in your pom.xml:

<repositories>
    <repository>
        <id>clojars</id>
        <url>https://repo.clojars.org/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>com.github.puregero</groupId>
        <artifactId>multipaper-api</artifactId>
        <version>1.20.1-R0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

Building

Requirements:

  • You need git installed, with a configured user name and email. On windows you need to run from git bash.
  • You need jdk 17+ installed to compile (and jre 17+ to run)

Build instructions:

  1. Patch paper with: ./gradlew applyPatches
  2. Build the multipaper jars with: ./gradlew shadowjar createReobfPaperclipJar
  3. Get the multipaper jar from build/libs
  4. Get the multipaper-master jar from MultiPaper-Master/build/libs

Publishing to maven local

Publish to your local maven repository with: ./gradlew publishToMavenLocal

Note for mac users: The latest macOS version includes an incompatible version of diff and you'll need to install a compatible one. Use brew install diffutils to install it, and then reopen the terminal window.

If diff --version returns the following, it is incompatible and will not work:

Apple diff (based on FreeBSD diff)

Licensing

All code is licensed under GPLv3 excluding MultiPaper-Master which is licensed under MIT.

Acknowledgements

MultiPaper includes optimisations from both Airplane and Pufferfish.

MultiPaper uses PaperMC's paperweight framework found here.

multipaper's People

Contributors

euphillya avatar ham1255 avatar isteiger avatar noelvnx avatar paul19988 avatar prodpreva1l avatar puregero avatar robertnisipeanu avatar rushmead avatar sofianedjerbi avatar xymb-endcrystalme avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

multipaper's Issues

Datapacks aren't synced

When I place a datapack into the world/datapacks file on the MultiPaper-Master, it isn't loaded on the servers.

Use datapack terralith-v2-0-12a to test.

Multiserver

is multipaper master doesnt work with another server? i mean its like

  • Survival I -> MultiPaper
  • Survival II -> MultiPaper
  • Survival III -> MultiPaper
  • Skyblock -> Paper

because when i try to join Survival I and player disconnected from proxy. I'm using multipaper plugins bungeecord for teleporter suite

Cannot Connect with null reason

I have try to setup using MultiPaper as a server an using Bungeecord with plugin MultiPaperProxy, all have done with it. but the console from Bungeecord get spamming looks like this :

[03:09:41 INFO]: /*.*.*.*:62110 (null) closed
[03:09:41 INFO]: /*.*.*.*:62119 (null) closed

I hope this can be fixed, because player cannot connect to the server using MultiPaper port, and in server list MultiPaper port doesnt seem look like on.

Thanks,

Server-side security risks

I have found that if my MultiPaper port is compromised, it is possible that they could open their own server through the compromised port and incorporate it into MultiPaper, which could lead to some people creating exploits to access resources through this vulnerability. My suggestion is to add an authentication key to Multipaper-master to allow merging into Multipaper-master when the key is the same, although this is something I have not experimented with.

Chunk ban with chunks bigger than 2MB

  1. Create a chunk > 2MB loaded on one subserver. For example a chest with 16 * 140kB books. Keep the chunk loaded with a player.
  2. Take a second player (on a different subserver) and load the chunk.

The player will crash. The subserver will keep complaining about not getting a chunk:

[03:08:21 WARN]: [MultiPaperIO] Timed out reading world,region,1249,624, retrying...
[03:08:21 WARN]: [ExternalServerConnection] A chunk callback already existed for world, 1249, 624 (new request is to server15088)
[03:08:21 WARN]: [ExternalServerConnection] Stats for server15088: last packet sent=160ms ago; last packet received=85ms ago

And on a login the client will be stuck at Loading terrain.

Blocks aren't synced + Errors with entities

Hi! Today I downloaded MultiPaper, i setupped it but i tried it with some friends and I noticed that blocks aren synced, for example if I place a block on server A, X on server B won't see it, but we will see the block place animation.

And about the entities their pathfinder is broken, for example a zombie when is on fire running at speed 1000 everywhere

Exception if running with docker

I'm getting this error running the master server with docker. Everything still works though

118-master-1    | [MultiPaperServer] Listening on 0.0.0.0/0.0.0.0:35353
118-master-1    | Exception in thread "main" java.util.NoSuchElementException: No line found
118-master-1    |       at java.base/java.util.Scanner.nextLine(Scanner.java:1651)
118-master-1    |       at puregero.multipaper.server.CommandLineInput.run(CommandLineInput.java:12)
118-master-1    |       at puregero.multipaper.server.MultiPaperServer.main(MultiPaperServer.java:36)

Dripstone misbehaves

When a dripstone is dropped, it is visually and physically no longer there on the home shard, but foreign shards still see dripstone and can interact with it, even if no physics apply. I have not yet replicated this but am in the process of doing so

edit: Unable to replicate
edit 2: able to replicate by breaking block above instead of actual dripstone
edit 3: Ghost blocks are left on client of foreign shard
edit 4: If foreign client breaks block everything behaves

NBT on signs not working

Steps to reproduce;

  1. Place Sign
  2. Write something on it
  3. Hold CTRL + Middle Click while looking at the sign you want to copy
  4. With the new NBT sign, place it.

It would normally place the sign with the data on the sign you copied but instead brings up the new sign UI, as if it's ignoring the NBT. I've already checked chests and NBT works there, so it's likely just signs.

Video: https://cdn.thatprogrammer.dev/iaKnCvcsOF.mp4

Item Frame item drops don't drop

As the title explains, Item Frames, when attacked, normally drop the item they hold. Testing shows that nothing drops and this has been repeated in Foreign shard, and in local shard

Conduit Power not synced

  1. A player of from a shard not in charge of the conduit enters the range of the conduit and does not receive the effect, yes this is under water, a player from the shard in charge can be a recipient of the effect.

  2. A conduit can attack hostile entities such as zombies and drowned when they are within range, for a base I put a zombie in the conduit chamber, it was killed. I then went into the next chunk owned by another Shard and spawned a zombie, this zombie did not die. To ensure it wasn't a wall in the way, I then went back into the chunk with the conduit and mirrored my setup with the last zombie, I then summoned the zombie in the same place (relative) and it was killed.

I have these set up on your test server if you want to check them out to see if there was a flaw in my test.

Support upgrading 1.12.2 worlds

When upgrading from 1.12, an error is thrown when attempting to load chunks.

java.lang.NullPointerException: Cannot invoke "net.minecraft.nbt.NBTTagCompound.p(String)" because the return value of "net.minecraft.world.level.storage.WorldPersistentData.a(String, int)" is null
      at net.minecraft.world.level.levelgen.structure.LegacyStructureDataHandler.populateCaches(LegacyStructureDataHandler.java:180) ~[?:?]
      at net.minecraft.world.level.levelgen.structure.LegacyStructureDataHandler.<init>(LegacyStructureDataHandler.java:53) ~[?:?]
      at net.minecraft.world.level.levelgen.structure.LegacyStructureDataHandler.getLegacyStructureHandler(LegacyStructureDataHandler.java:239) ~[?:?]
      at net.minecraft.world.level.chunk.storage.ChunkStorage.upgradeChunkTag(ChunkStorage.java:98) ~[?:?]
      at com.destroystokyo.paper.io.chunk.ChunkLoadTask.executeTask(ChunkLoadTask.java:94) ~[multipaper-1.18.1.jar:git-MultiPaper-"454602d"]
      at com.destroystokyo.paper.io.chunk.ChunkLoadTask.run(ChunkLoadTask.java:38) ~[multipaper-1.18.1.jar:git-MultiPaper-"454602d"]
      at com.destroystokyo.paper.io.QueueExecutorThread.pollTasks(QueueExecutorThread.java:118) ~[multipaper-1.18.1.jar:git-MultiPaper-"454602d"]
      at com.destroystokyo.paper.io.QueueExecutorThread.run(QueueExecutorThread.java:51) ~[multipaper-1.18.1.jar:git-MultiPaper-"454602d"]```

Cake is not consumed

When eating in a foreign shard, you are sated but the cake does not deplete in size

Synced-Plugins

Make synced plugins directory generate after installing MultiPaper-Master, not when Multipaper.yml synced-files has an entry.

Also make plugin jars generate configuration folders inside of the synced plugins directory.

~ All before syncing into each MultiPaper server.

I need some help

I can't find the World/level.dat thing when I'm using it. But my subserver doesn't load the map at all and I don't know how he syncs it. I can't find those sync buttons either, I just want to know how it works! Thank you, for reading my message out of your busy schedule!

Error when using two proxies

I'm hitting an error when connecting to a offline mode bungeecord that connects to the MultiPaper-Master proxy Internal Exception: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 1 path $.
I was hoping to use the minecraft-stress-test project which only works on offline mode servers.
Strangely enough it does work in offline mode when using MultiPaper-Master as a plugin.

Alert when two servers with the same name connect

As evidenced here: #125

Two servers experience problems when their name is the same. MultiPaper Master should shout a loud warning on the console that the configuration is broken.
It's way too easy to do it by accident.

Teams do not sync

Vanilla teams do not sync between servers.

Replication steps:

  • /team add
  • /team join
  • /team list (both servers)

The server which created the team will show it in the list but the other will not.

Server Crash (MultiPaper)

[22:32:47] [Paper Watchdog Thread/ERROR]: If you are unsure or still think this is a Paper bug, please report this to https://github.com/PaperMC/Paper/issues
[22:32:47] [Paper Watchdog Thread/ERROR]: Be sure to include ALL relevant console errors and Minecraft crash reports
[22:32:47] [Paper Watchdog Thread/ERROR]: Paper version: git-MultiPaper-"3454702" (MC: 1.18.1)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Server thread dump (Look for plugins here before reporting to Paper!):
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: Server thread
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 27 | Suspended: false | Native: true | State: RUNNABLE
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.ch.FileDispatcherImpl.write0(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:62)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.ch.NioSocketImpl.tryWrite(NioSocketImpl.java:398)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.ch.NioSocketImpl.implWrite(NioSocketImpl.java:413)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.ch.NioSocketImpl.write(NioSocketImpl.java:440)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.ch.NioSocketImpl$2.write(NioSocketImpl.java:826)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.net.Socket$SocketOutputStream.write(Socket.java:1035)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.io.OutputStream.write(OutputStream.java:127)
[22:32:47] [Paper Watchdog Thread/ERROR]: puregero.multipaper.MultiPaperConnection.send(MultiPaperConnection.java:79)
[22:32:47] [Paper Watchdog Thread/ERROR]: puregero.multipaper.DataOutputSender.send(DataOutputSender.java:27)
[22:32:47] [Paper Watchdog Thread/ERROR]: puregero.multipaper.MultiPaperConnection.writeChunk(MultiPaperConnection.java:663)
[22:32:47] [Paper Watchdog Thread/ERROR]: puregero.multipaper.MultiPaperIO.scheduleSave(MultiPaperIO.java:34)
[22:32:47] [Paper Watchdog Thread/ERROR]: com.destroystokyo.paper.io.chunk.ChunkSaveTask.complete(ChunkSaveTask.java:102)
[22:32:47] [Paper Watchdog Thread/ERROR]: com.destroystokyo.paper.io.chunk.ChunkSaveTask.run(ChunkSaveTask.java:63)
[22:32:47] [Paper Watchdog Thread/ERROR]: com.destroystokyo.paper.io.chunk.ChunkTaskManager.pollNextChunkTask(ChunkTaskManager.java:231)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecraft.server.level.ServerChunkCache$MainThreadExecutor.pollTask(ServerChunkCache.java:1321)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecraft.server.level.ServerChunkCache.pollTask(ServerChunkCache.java:838)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecraft.server.MinecraftServer.pollTaskInternal(MinecraftServer.java:1409)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecraft.server.MinecraftServer.pollTask(MinecraftServer.java:1392)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecraft.util.thread.BlockableEventLoop.managedBlock(BlockableEventLoop.java:133)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecraft.server.MinecraftServer.waitUntilNextTick(MinecraftServer.java:1370)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1276)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecraft.server.MinecraftServer.lambda$spin$1(MinecraftServer.java:323)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecraft.server.MinecraftServer$$Lambda$3962/0x0000000801453978.run(Unknown Source)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.Thread.run(Thread.java:833)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Entire Thread Dump:
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: Reference Handler
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 2 | Suspended: false | Native: false | State: RUNNABLE
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.ref.Reference.waitForReferencePendingList(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.ref.Reference.processPendingReferences(Reference.java:253)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.ref.Reference$ReferenceHandler.run(Reference.java:215)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: Finalizer
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 3 | Suspended: false | Native: false | State: WAITING
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.Object.wait(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:176)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:172)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: Signal Dispatcher
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 4 | Suspended: false | Native: false | State: RUNNABLE
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: Notification Thread
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 10 | Suspended: false | Native: false | State: RUNNABLE
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: Common-Cleaner
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 11 | Suspended: false | Native: false | State: TIMED_WAITING
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.Object.wait(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/jdk.internal.ref.CleanerImpl.run(CleanerImpl.java:140)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.Thread.run(Thread.java:833)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:162)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: DestroyJavaVM
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 13 | Suspended: false | Native: false | State: RUNNABLE
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: Log4j2-AsyncAppenderEventDispatcher-1-Async
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 19 | Suspended: false | Native: false | State: RUNNABLE
[22:32:47] [Paper Watchdog Thread/ERROR]: Thread is waiting on monitor(s):
[22:32:47] [Paper Watchdog Thread/ERROR]: Locked on:org.apache.logging.log4j.core.appender.rolling.RollingRandomAccessFileManager.writeToDestination(RollingRandomAccessFileManager.java:147)
[22:32:47] [Paper Watchdog Thread/ERROR]: Locked on:org.apache.logging.log4j.core.appender.OutputStreamManager.flushBuffer(OutputStreamManager.java:283)
[22:32:47] [Paper Watchdog Thread/ERROR]: Locked on:org.apache.logging.log4j.core.appender.rolling.RollingRandomAccessFileManager.flush(RollingRandomAccessFileManager.java:173)
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.appender.rolling.RollingRandomAccessFileManager.writeToDestination(RollingRandomAccessFileManager.java:147)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.appender.OutputStreamManager.flushBuffer(OutputStreamManager.java:283)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.appender.rolling.RollingRandomAccessFileManager.flush(RollingRandomAccessFileManager.java:173)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.directEncodeEvent(AbstractOutputStreamAppender.java:199)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.tryAppend(AbstractOutputStreamAppender.java:190)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:181)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.append(RollingRandomAccessFileAppender.java:243)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:161)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:134)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:125)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:89)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.appender.rewrite.RewriteAppender.append(RewriteAppender.java:84)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:161)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:134)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:125)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:89)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.appender.rewrite.RewriteAppender.append(RewriteAppender.java:84)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:161)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:134)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:125)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:89)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.appender.AsyncAppenderEventDispatcher.dispatch(AsyncAppenderEventDispatcher.java:119)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.appender.AsyncAppenderEventDispatcher.dispatchAll(AsyncAppenderEventDispatcher.java:81)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.apache.logging.log4j.core.appender.AsyncAppenderEventDispatcher.run(AsyncAppenderEventDispatcher.java:63)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: MultiPaperConnection Thread
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 21 | Suspended: false | Native: true | State: RUNNABLE
[22:32:47] [Paper Watchdog Thread/ERROR]: Thread is waiting on monitor(s):
[22:32:47] [Paper Watchdog Thread/ERROR]: Locked on:[email protected]/java.io.BufferedInputStream.read(BufferedInputStream.java:263)
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.ch.SocketDispatcher.read0(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:47)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.ch.NioSocketImpl.tryRead(NioSocketImpl.java:261)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:312)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.net.Socket$SocketInputStream.read(Socket.java:966)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.io.BufferedInputStream.fill(BufferedInputStream.java:244)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.io.BufferedInputStream.read(BufferedInputStream.java:263)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.io.DataInputStream.readInt(DataInputStream.java:393)
[22:32:47] [Paper Watchdog Thread/ERROR]: puregero.multipaper.MultiPaperConnection.run(MultiPaperConnection.java:141)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: MultiPaperFileSyncer
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 23 | Suspended: false | Native: false | State: WAITING
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/jdk.internal.misc.Unsafe.park(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.locks.LockSupport.park(LockSupport.java:341)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3463)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3434)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:485)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.LinkedBlockingDeque.take(LinkedBlockingDeque.java:673)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.fs.AbstractWatchService.take(AbstractWatchService.java:118)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.methvin.watcher.DirectoryWatcher.watch(DirectoryWatcher.java:231)
[22:32:47] [Paper Watchdog Thread/ERROR]: puregero.multipaper.MultiPaperFileSyncer.run(MultiPaperFileSyncer.java:79)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: FileSystemWatchService
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 24 | Suspended: false | Native: true | State: RUNNABLE
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.fs.LinuxWatchService.poll(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.fs.LinuxWatchService$Poller.run(LinuxWatchService.java:314)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.Thread.run(Thread.java:833)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: Timer hack thread
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 25 | Suspended: false | Native: false | State: TIMED_WAITING
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.Thread.sleep(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecraft.Util$6.run(Util.java:664)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: Worker-Main-1
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 26 | Suspended: false | Native: false | State: WAITING
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/jdk.internal.misc.Unsafe.park(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.locks.LockSupport.park(LockSupport.java:341)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3463)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3434)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:435)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1062)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1122)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.Thread.run(Thread.java:833)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: Server thread
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 27 | Suspended: false | Native: true | State: RUNNABLE
[22:32:47] [Paper Watchdog Thread/ERROR]: Thread is waiting on monitor(s):
[22:32:47] [Paper Watchdog Thread/ERROR]: Locked on:puregero.multipaper.MultiPaperConnection.send(MultiPaperConnection.java:79)
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.ch.FileDispatcherImpl.write0(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:62)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.ch.NioSocketImpl.tryWrite(NioSocketImpl.java:398)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.ch.NioSocketImpl.implWrite(NioSocketImpl.java:413)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.ch.NioSocketImpl.write(NioSocketImpl.java:440)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.nio.ch.NioSocketImpl$2.write(NioSocketImpl.java:826)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.net.Socket$SocketOutputStream.write(Socket.java:1035)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.io.OutputStream.write(OutputStream.java:127)
[22:32:47] [Paper Watchdog Thread/ERROR]: puregero.multipaper.MultiPaperConnection.send(MultiPaperConnection.java:79)
[22:32:47] [Paper Watchdog Thread/ERROR]: puregero.multipaper.DataOutputSender.send(DataOutputSender.java:27)
[22:32:47] [Paper Watchdog Thread/ERROR]: puregero.multipaper.MultiPaperConnection.writeChunk(MultiPaperConnection.java:663)
[22:32:47] [Paper Watchdog Thread/ERROR]: puregero.multipaper.MultiPaperIO.scheduleSave(MultiPaperIO.java:34)
[22:32:47] [Paper Watchdog Thread/ERROR]: com.destroystokyo.paper.io.chunk.ChunkSaveTask.complete(ChunkSaveTask.java:102)
[22:32:47] [Paper Watchdog Thread/ERROR]: com.destroystokyo.paper.io.chunk.ChunkSaveTask.run(ChunkSaveTask.java:63)
[22:32:47] [Paper Watchdog Thread/ERROR]: com.destroystokyo.paper.io.chunk.ChunkTaskManager.pollNextChunkTask(ChunkTaskManager.java:231)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecraft.server.level.ServerChunkCache$MainThreadExecutor.pollTask(ServerChunkCache.java:1321)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecraft.server.level.ServerChunkCache.pollTask(ServerChunkCache.java:838)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecraft.server.MinecraftServer.pollTaskInternal(MinecraftServer.java:1409)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecraft.server.MinecraftServer.pollTask(MinecraftServer.java:1392)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecraft.util.thread.BlockableEventLoop.managedBlock(BlockableEventLoop.java:133)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecraft.server.MinecraftServer.waitUntilNextTick(MinecraftServer.java:1370)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1276)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecraft.server.MinecraftServer.lambda$spin$1(MinecraftServer.java:323)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecraft.server.MinecraftServer$$Lambda$3962/0x0000000801453978.run(Unknown Source)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.Thread.run(Thread.java:833)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: Paper Watchdog Thread
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 35 | Suspended: false | Native: false | State: RUNNABLE
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.management.ThreadImpl.dumpThreads0(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:521)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:509)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.spigotmc.WatchdogThread.run(WatchdogThread.java:204)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: Server console handler
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 30 | Suspended: false | Native: false | State: RUNNABLE
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.io.FileInputStream.read0(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.io.FileInputStream.read(FileInputStream.java:228)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.jline.terminal.impl.AbstractPty$PtyInputStream.read(AbstractPty.java:73)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.jline.utils.NonBlockingInputStream.read(NonBlockingInputStream.java:62)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.jline.utils.NonBlocking$NonBlockingInputStreamReader.read(NonBlocking.java:168)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.jline.utils.NonBlockingReader.read(NonBlockingReader.java:57)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.jline.keymap.BindingReader.readCharacter(BindingReader.java:160)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.jline.keymap.BindingReader.readBinding(BindingReader.java:110)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.jline.keymap.BindingReader.readBinding(BindingReader.java:61)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.jline.reader.impl.LineReaderImpl.doReadBinding(LineReaderImpl.java:923)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.jline.reader.impl.LineReaderImpl.readBinding(LineReaderImpl.java:956)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:651)
[22:32:47] [Paper Watchdog Thread/ERROR]: org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:468)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecrell.terminalconsole.SimpleTerminalConsole.readCommands(SimpleTerminalConsole.java:158)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecrell.terminalconsole.SimpleTerminalConsole.start(SimpleTerminalConsole.java:141)
[22:32:47] [Paper Watchdog Thread/ERROR]: net.minecraft.server.dedicated.DedicatedServer$1.run(DedicatedServer.java:112)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: pool-4-thread-1
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 36 | Suspended: false | Native: false | State: TIMED_WAITING
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/jdk.internal.misc.Unsafe.park(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:252)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1672)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1182)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:899)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1062)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1122)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.Thread.run(Thread.java:833)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: Netty Epoll Server IO #0
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 39 | Suspended: false | Native: true | State: RUNNABLE
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.Native.epollWait0(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.Native.epollWait(Native.java:176)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.EpollEventLoop.epollWait(EpollEventLoop.java:281)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:351)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.Thread.run(Thread.java:833)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: Netty Epoll Server IO #1
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 40 | Suspended: false | Native: true | State: RUNNABLE
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.Native.epollWait0(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.Native.epollWait(Native.java:176)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.EpollEventLoop.epollWait(EpollEventLoop.java:281)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:351)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.Thread.run(Thread.java:833)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: Netty Epoll MultiPaper IO #0
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 41 | Suspended: false | Native: true | State: RUNNABLE
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.Native.epollWait(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.Native.epollWait(Native.java:192)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.Native.epollWait(Native.java:185)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.EpollEventLoop.epollWaitNoTimerChange(EpollEventLoop.java:290)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:347)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.Thread.run(Thread.java:833)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: Java2D Disposer
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 42 | Suspended: false | Native: false | State: WAITING
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.Object.wait(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:176)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/sun.java2d.Disposer.run(Disposer.java:145)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.Thread.run(Thread.java:833)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: Craft Async Scheduler Management Thread
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 44 | Suspended: false | Native: false | State: WAITING
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/jdk.internal.misc.Unsafe.park(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.locks.LockSupport.park(LockSupport.java:341)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3463)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3434)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:435)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1062)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1122)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.Thread.run(Thread.java:833)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: Netty Epoll Server IO #2
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 45 | Suspended: false | Native: true | State: RUNNABLE
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.Native.epollWait0(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.Native.epollWait(Native.java:176)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.EpollEventLoop.epollWait(EpollEventLoop.java:281)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:351)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.Thread.run(Thread.java:833)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: CompletableFutureDelayScheduler
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 51 | Suspended: false | Native: false | State: WAITING
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/jdk.internal.misc.Unsafe.park(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.locks.LockSupport.park(LockSupport.java:341)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3463)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3434)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1170)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:899)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1062)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1122)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.Thread.run(Thread.java:833)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:47] [Paper Watchdog Thread/ERROR]: Current Thread: Netty Epoll Server IO #3
[22:32:47] [Paper Watchdog Thread/ERROR]: PID: 55 | Suspended: false | Native: true | State: RUNNABLE
[22:32:47] [Paper Watchdog Thread/ERROR]: Stack:
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.Native.epollWait0(Native Method)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.Native.epollWait(Native.java:176)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.EpollEventLoop.epollWait(EpollEventLoop.java:281)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:351)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
[22:32:47] [Paper Watchdog Thread/ERROR]: io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
[22:32:47] [Paper Watchdog Thread/ERROR]: [email protected]/java.lang.Thread.run(Thread.java:833)
[22:32:47] [Paper Watchdog Thread/ERROR]: ------------------------------
[22:32:48] [Paper Watchdog Thread/INFO]: Stopping main thread (Ignore any thread death message you see! - DO NOT REPORT THREAD DEATH TO PAPER)

Enchantment: Manage Shards from Masters

It would be nice to have if you could make:
/restart [Shard], /stop [Shard] or even /sleep [Shard] and /wakeup [Shard]

/restart

Just restarts the Shard that was selected by the Command.

/stop

Just stops the Shard that was selected by the Command.

/sleep

Restarts the Server in a "Sleep Mode" where there is just a listener for /wakeup.
Could be linked with Player count so a Server that had 0 Players for 10 Minutes could be set in Sleepmode if enabled.

/wakeup

Wakes up Server that are in Sleep Mode and than normally starts them
Could also be linked to Player count so that if Players > x Servers get wokenup.

If you have anything to add just comment and I can will add it ๐Ÿ‘๐Ÿผ

Chunk item duplication is possible

  1. Fill a chunk with things to duplicate.
  2. Log out and wait a minute for a chunk to save.
  3. Log back in and move things to a neighboring chunk. Put 20 140kB books into the duplicated chunk.
  4. Log out and log back in after a minute - the chunk will revert with things inside.

MultiPaper doesn't support .mcc files which store chunks too big to fit into .mca.
Thus after overloading it with books, it's never saved and reverts.

Text on signs fails to show/register when written in foreign chunk

When placing a sign and entering text in your own shard's chunk you can view the text which was written, it does not however show for members of other shards. If you go to a foreign chunk and write on a sign, the text will flash briefly then disappear, when you copy with NBT, the NBT does register and can be placed showing original text, but is not viewable to those from foreign shards. This was explained horribly, @ me on discord if you have any questions

Enchantment: Add Global Plugin Directory

A Global Plugin Directory that can be used to Plugins/Configs on every Shard with a Single Plugin and Config.
And maybe allow some Plugins that do not support MySQL to work

MultiPaper
|
|-gplugin
             | - Plugin#0
             | - ConfigFolder#0
|-shard1
             | - Plugins
                          | - Plugin#1
                          | - ConfigFolder#1
|-shard2
             | - Plugins
                          | - Plugin#2
                          | - ConfigFolter#2

And then the Plugins loaded are
shard1: Plugin#0, Plugin#1
shard2: Plugin#0, Plugin#2

I would suggest to make people put in a absoult Path.
Because than there is no mess with getting to Parent Directorys.

Config Example

use-global-plugin: false
global-plugin-path: /put/the/path/here

Command Examples
/plugins = Returns all Loaded Plugin.
/gplugins = Returns all Plugins that are loaded Global.
/Lplugins = Returns all Plugins that are loaded "normal". - Thank you HetMasterTje

Send chunks to players from closest to furthest

Currently MultiPaper can send chunks that are far from the player before it sends chunks that are closer to the player. This makes loading the world appear to take longer for the player, and can have some negative effects on Bedrock players using Geyser. MultiPaper should send the closest chunks before chunks that are further away.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.