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.
Deadly TNT was updated in order to display a cooldown bar until
the next TNT throw, just above the player's inventory.
Fishing Day was removed from rotation as requested.
Building Champion achievement was implemented as a replacement
for quick climber achievement, since quick climber is almost impossible
to complete in public games. Build Champion is based on Build Race challenge,
and it requires players to place all blocks in their inventory,
within 15 seconds. Moreover, chicken minions can now attack players,
even if they are stuck in the water.
The getPlayersAlive().size() has been replaced with
getPlayersWithRemainingLives(), since during map generation
players have not been reset yet. With that, all players are
selected properly.
Every time chicken attack is triggered for a player, a chat message will
be displayed that explains why the player is being attacked by chickens.
Also, two debug messages were removed, since they were no longer used.
Fixed some NBT tools
Added and tested schematic support for entities and tile entities
All conversion and creations for schematics should now also be fixed. So
creating schematics from two points inside a world. Converting
schematics to bytes and converting bytes to schematics.
Adds another fix for winroom speed
Moves gadgets to individual packages, easier to manage in a future update
Adds gadget persistence (Or maybe not)
Changed mount locked item data to 8 instead of 7
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>`
}));