- Added 1.20 support
- Added NumberUtils#evaluateExpressionOrNull
- Registering placeholders will now override existing placeholders with the same pattern
- Added check to configs to prevent the mysterious apparition of !!float
- Exceptions in packet listeners will now be handled without kicking players
- Added PatternUtils#compileLiteral to cache literal pattern compilation
- Non-dynamic placeholders will now use cached pattern compilation
- Added local server ID to fix collisions over networks
- Added global price display names, see here: https://plugins.auxilor.io/all-plugins/prices
- Added autogenerated server UUIDs accessed through ServerProfile
- Added support for a new server / player count tracking system called playerflow (in very early alpha)
- Fixed PvPManager support (Thanks ChanceSD!)
- Added RoyaleEconomy integration (Thanks Sen!)
- Hotfix from last version
- Fixed data not saving correctly for some users
- Fixed PersistentDataKeyType.BIG_DECIMAL
- Fixed nestedMap and nestedListMap
- Fixed dynamically registered command aliases
- Added new createTasks() lifecycle to add support for loading without wiping tasks
- Added PersistentDataKeyType#BIG_DECIMAL
- Fixed T?.toSingletonList()
- Fixed NestedMap and NestedListMap
- Fixed possible crash exploit where players could spam GUIs to force renders
- Added StringUtils#lineWrap to line wrap text while preserving formatting
- Added Kotlin extensions to NumberUtils methods
- Added MenuBuilder#defaultPage
- Fixed Registry locking
- Fixed command aliases not working on paper or for dynamic commands
- Fixed load order bugs between eco plugins
- More optimisations down the evaluation pipeline
- Removed LegacyMySQLDataHandler
- Fixed extension loading with new plugin field
- Improved and added missing hashCode functions down evaluation pipeline
- Added PluginLike#getFile
- Added plugin and plugin-version to extension.yml
- Added a nicer recipe error message
- Fixed bug with duplicate placeholders in configs
- Improved PlaceholderAPI integration
- Completely recoded Placeholder system
- Placeholder is no longer a sealed interface
- Added PlaceholderContext as unified way of providing values to placeholders
- Deprecated MathContext for removal, move to PlaceholderContext instead
- Recoded and massively optimised expression evaluation: under load performance has increased by ~3x
- Fixed data desync (Thanks Cyramek!)
- Improved Config so all default get<X>FromExpression methods all feed to the default getDoubleFromExpression(String, PlaceholderContext) to improve flexibility with custom implementations
- Added StringUtils#replaceQuickly
- Removed unused use-lower-protocollib-priority option
- Added more options related to expression eval
- Added Denizen support (Thanks FireML!)
- Added PlayerPoints support (Thanks SenMC!)
- Fixed UltraEconomy integration
- Fixed integrations not unloading themselves when exceptions are thrown
- EcoConfig now uses a ConcurrentHashMap to store injections
- Reimplemented BlockUtils#getVein to use an iterative approach, removing the 2500 block limit
- Fixed some plugins not loading if the server hardware was using a Turkish locale
- Registry can now be locked / unlocked
- Registry is now iterable
- Added KRegistrable to make Registrable better for Kotlin users
- Added Version to be a cross-version compatible frontend to DefaultArtifactVersion
- Added OutdatedEcoVersionError to prevent plugins from loading if an outdated version of eco is installedd
- Added IntegrationRegistry, isolated all integration behaviour: if an integration throws an exception it will be automatically unregistered
- Integrations are now registrable
- Updated Kingdoms integration
- Added ExternalDataStoreObjectAdapter
- Fixed Oraxen support (Thanks Casper!)
- Fixed SNBT support (Thanks Casper!)
- Integrations will now gracefully fail to load
- Isolated lifecycle task / handler loading to allow them to gracefully fail
- Added json() kotlin helper method
- Added Prerequisite#HAS_1_19_4
- Fixed tab completion on dynamically registered commands