If staff join any game normally with /vanish disabled, then vanish
before the game starts, you still participate in the game except you're
invisible to everyone.
PlayerKeyValueRepository<V> is a key/value store whose keys are Strings
and whose value type is parameterized by V. Each repository is backed by
a MySQL table in the Accounts database.
Access to PlayerKeyValueRepository's values is restricted via
CompletableFuture to enforce async database access.
BukkitFuture contains helpful utilities for producing, transforming, and
terminating CompletableFutures with actions on the main thread. A
typical PlayerKeyValueRepository action may look similar to the
following, where we retrieve all key/value pairs for a player and
perform an action with the result on the main thread:
PlayerKeyValueRepository<String> repo = [...]; // init repo
UUID uuid = [...]; // a player's UUID
repo.getAll(uuid).thenCompose(BukkitFuture.accept(values -> {
// this will be run on the main thread!
// `values` is of type `Map<String,String>`
}));
Key notes:
* RAM usage decreased on startup
* Startup speed much quicker
* Map is entirely rendered on startup
Details:
Changed TutorialWorldManager Stack -> LinkedList because no need for
synchronization
Documented map methods and magic numbers
Remove loading all chunks on startup
Render map on startup
Optimize map rendering by replacing ArrayList with LinkedList
Optimize map rendering by reading chunk directly from disk and caching to
prevent entity ticking
Optimize map rendering by using a global BlockPosition
Save results for showing zoom