initial testing has been done
Improve exception handling (so we actually get a stacktrace if
something goes wrong).
Check if users can report before showing the category gui.
Tell user if the report failed (due to some sort of internal error).
Correctly get the id of a report when inserting into the database for
the first time.
Shorten some lambdas by using method references.
Remove some unused imports.
Small variable name changes.
Re-enabled report feature (merge from develop disabled it).
Moved reports from Redis to MySQL.
Made everything asynchronous.
Many many other miscellaneous changes.
Bugs will now be worked out and then this should be ready for QA testing
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>`
}));