### Added
- Logging
- Ingame logging
- Logging during `/q reload`
- New command `/q debug ingame`
- Debug logging to separate file
- Log history length can be freely configured
- Quest Templates
- A new folder `QuestTemplates` can now be used to define templates for packages
- templates can also extend templates
- add AureliumSkills Compatiblity
- added AureliumSkillsLevelCondition
- All existing users must add aureliumskills: 'true' to their config.yml's hook section.
- added AureliumStatsLevelCondition
- added AureliumSkillsLevelExperienceEvent
- add DecentHolograms Compatibility
- holograms from DecentHolograms are a direct alternative to HolographicDisplays
- add LuckPerms context integration for tags
- All existing users must add luckperms: 'true' to their config.yml's hook section.
- add FakeBlock Compatibility
- added `fakeblock` event that has the arguments `showgroup` and `hidegroup` to show and hide FakeBlock groups
- added `hook.fake-block` config option, default: `true`
- add RedisChat Compatibility
- added `redischat` chat interceptor
- added Event Schedules to replace old static-events system
- static events from schedulers now respect static conditions
- events called by schedules are always called player independent
- `runForAll` event can now be used to run events for all players that match a condition
- `runIndepent` event can be used to run events static (player independent) from player dependent contexts
- added support for Base64 encode custom heads
- can be created from items in inventory using the BetonQuest `item` command (Paper only, Bukkit/Spigot can be configured manually)
- can be given to players using the BetonQuest `give` command
- NotifyIO "totemIO"
- Support for MythicLib
- player attribute to QuestCompassTargetChangeEvent
- added PlayerObjectiveChangeEvent, PlayerJournalAddEvent, PlayerJournalDeleteEvent
- Allow %player% variable for PLAYER_HEAD quest items
- allow access to objective variable properties from other packages
- allow point variables from other packages
- API method in objective API that starts and stops it per player
- config option `default_hologram` to set hologram priority if multiple hologram plugins are loaded at once
- config option `journal.show_in_backpack` to remove the journal from the backpack
- config option `journal.lock_default_journal_slot` to lock the journal to the `default_journal_slot`
- config option `journal.give_on_respawn` to add the journal to the inventory after the player respawns
- config option `journal.custom_model_data` to give the journal a ressource pack based skin
- config option `mysql.reconnect_interval` to set the reconnect interval if the connection to the database gets lost
- compass now supports items from other packages
- new messages.yml entries `inventory_full_backpack` and `inventory_full_drop` to have more specific messages,
when the inventory of the player is full
- `menu` conversationIO option `npc_name_newline_separator`
- added `q download` command
- variable support for menu titles
- configurable cooldown to menu conversation IO
- holograms
- variable support
- top lists ordered by point values of players
- `npcs` list now supports global variables as NPC ID in NPC Holograms
- menus now support global variables
- exposed the Citizen variable and enhanced location capabilities
- menus now support string with newline or string list text values for lore
- amount of objectives now support variables
- added quest item flag recording and restore
- Conversations now support cross conversation pointers to conversations in other packages
- QuestCancelers can now be referenced across packages
- Chat Interceptor `packet` is now 1.20.4 compatible
- `freeze` event - ProtocolLib compatibility feature: Blocks the player from moving for the specified amount of ticks
- `block` objective - properties: `absoluteAmount`, `absoluteLeft` and `absoluteTotal`
- `command` objective
- `equip` objective
- `delay` objective - now support variables
- `sudo` event - now supports variables
- `opsudo` event - now supports variables
- `variable` condition - now supports variables
- `bossbar` notify style now supports variables for the `progress` and `stay` arguments
- `delay` objective property: `rawSeconds`
- `fish` objective now has `hookLocation` and `range` settings.
- `consume` objective now has `amount` argument.
- `mmoprofessionlevelup` objective can now check the main character level as well
- `burning` condition
- `inconversation` condition
- `language` condition
- `heroesattribute` condition - Heroes compatibility feature: Checks a player's level for a particular attribute against a value
- `variable` condition - regex can now also be a variable
- `mmspawn` event now has argument `target` Makes the spawned mob target the player
- `mmspawn` event now has argument `private` Visually hides the spawned mob from other players. Does not stop sound or particles
- `mmspawn` event now supports the `marked` argument
- `objective` event now supports a comma separated list of objectives
- `mmobkill` objective now supports the `marked` and `deathRadiusAllPlayers` argument
- `marked` argument now supports %player% variable
- `globaltag` and `globalpoint` variables
- `burn` event - ignites player for given seconds, supports variables
- `velocity` event - throws the player by a vector (can be variable) with a direction and modification
- `block` objective - added argument `noSafety` which disables removing progress when the player does the opposite of what the objective asks for
- `block` objective - added property variables `absoluteLeft`, `absoluteTotal`, `absoluteAmount` that always return absolute values
- `hunger` condition and event
- `variable` condition - forceSync argument forces the condition to be checked on the main thread
- `variable` condition - now supports variables as both the input and the regular expression
- `command` event - now suppress console output
- `cancelconversation` event
- `time` event - now supports subtraction and world selection, which made it persistent and static
- `globalpoint` event - new syntax for manipulating global points
- `experience` event - it's now possible to change xp, change and set levels and set the xp bar
- `deleteglobalpoint` event
- `score` event - more options for manipulating the scoreboard
- `item` variable - new `name` and `lore` argument and now supports items from other packages
- `randomnumber` variable added - supports variables
- `give` event - new `backpack` argument to place items in the backpack (if a valid QuestItem)
- `party` event - new optional `amount` of maximal affected players
- `drop` event
- `itemdurability` event, condition and variable
- `numbercompare` condition
- `cancelOnLogout` argument for `folder` event
- `npcinteract` objective - now supports the argument `interaction` to choose between left, right or both clicks
- `log` event
- `party` event - new range 0 and -1 to select players in the same world or server wide
- `stage` objective, condition and event
- `first` event - attempts to run a list of events until one successfully runs, like a compressed `if` event
### Changed
- Java 17 is now required
- changed package names from `pl.betoncraft.betonquest` to `org.betonquest.betonquest`
- Changed quest package structure
- Quest packages are now searched and loaded from the folder `BetonQuest/QuestPackages/`
- Quest packages can now contain more quest packages in sub folders
- Relative paths can now navigate downwards and not only upwards
- `main.yml` was renamed to `package.yml`
- Any file and folder structure with any file and folder names is now allowed, except `package.yml`, as that file
indicates a quest package
- `events`, `objectives`, `conditions`, `journal` and `items` are now defined in a config section matching their
names
- `conversations` and `menus` are now defined in a config section matching their names and a unique identifier like
the file name before
- The `enabled` boolean is now defined in the `package` section
- all objectives that can be advanced without directly completing now support notify
- all objectives that can be advanced without directly completing now support `left`, `amount` and `total` variables
- the `left` and `amount` variables of some objectives were swapped and have been corrected: `left` is the amount
left, `amount` is the amount done
- NPC Holograms are reworked
- individual refresh rate for each hologram
- the boolean follow is now set per hologram
- the vector offset origin has been changed. The hologram is now directly above the NPCs head by default. This means all previously custom vectors are now increased by 3 blocks on the y-axis.
- npc_effects are reworked
- the section changed its naming from `npc_effects` to `effectlib`
- the section `disabled` got removed
- the section `check_interval` is now an inner section of the effect and now called `checkinterval`
- next to the `npcs` section there is now an `locations` section
- effects will now follow npcs if they're pathing to another spot
- AureliumSkills updated to version Beta1.2.5
- PikaMug Quests updated to version 4.1.3
- Items now support AIR
- Menus now support new `click` options `shiftLeft`, `shiftRight` and `middleMouse` to execute events on item clicks
- Therefore `left` and `right` in the `click` section no longer include shift clicks
- `folder` event - now executes events immediately if no delay is set
- `weather` event - now has an optional variable duration (in seconds) and an optional world param
- `paste` event - can now be static
- `chestput` objective - can now block other players from accessing a chest while someone is putting items inside
- The location and region objectives now register movement of players inside a vehicle
- written book is now readable as a quest item
- HolographicDisplays updated to 3.0.0
- Added staticness indicator to variables that can be executed without a direct player connection
- written book quest items can now be read
- `experience` objective event and condition were reworked
- condition and objective do not support raw experience anymore
- all allow decimal level and variables now
- changed backpack configuration. "" will hide the compass or canceler
- `smelt` objective - now requires a QuestItem instead of a BlockSelector
- `cancelquest` command - has its own permission now
- `compass` command - has its own permission now
- `language` command - is now persistent
- `point` command - list can now be filtered by beginning letters
- `tag` command - list can now be filtered by beginning letters
- `globalpoint` command - list can now be filtered by beginning letters
- `globaltag` command - list can now be filtered by beginning letters
- `journal` command - list can now be filtered by beginning letters
- `objective` command - list can now be filtered by beginning letters
- `variable` condition supports escapable underscores to avoid replacement
- `kill` event - now kills the player, instead of dealing damage, which is more reliable
- `lightning` event - now has a new noDamage argument
- `clear` and `killmob' events - got replaced by new `removeentity` event
- the line length of `SlowTellRaw` conversation IO from 60 to 50 to fit the actual minecraft chat
- Item enchantments was changed to include zero as a legal value, not just positive numbers
- the objectives mmocorecastskill and mmoitemcastability were merged into the mmoskill objective
- `command` event no longer runs for all players on the server if a variable is used
- `math` and `version` variables - now static
- `alternative` and `check` condition - now static
- `open_events` in a menu are now called before the menu actually opens
- `conversation` event now support a start option
### Removed
- deprecated internals, code and old features
- Support for MMOLib
- `message` event
- `title` event
- `playsound` event
### Fixed
- added missing spaces to time left property of delay objective
- catchup now works even if schedule was never executed before
- q version now works again
- RPGMenu error when teleport events are used as click events
- RPGMenu bound items not always working
- npc_holograms do now show errors during reload and not one tick later
- first slot in backpack stays empty when journal is in player inventory
- npc_holograms are not shown correctly with multiple defined npcs
- spectator mode is now disabled for chest conversation io to prevent being stuck in the conversation
- packet chat interceptor does not catch action bar anymore
- time event does not work with floating point values
- global variable recursive resolution cross packages
- inaccurate location variable decimal rounding
- NPC holograms from Citizens are not hidden correctly
- `location` objective - is now more robust if the player changes a world
- `brew` objective - now counts newly brewed potions even if there were already some potions of the desired type in
- `chestput` objective - did now work with double chests
other slots present
- `menu`(open) event - showed the previous menu again
- non .yml files causing errors when loading quest packages
- `pickrandom` event - did not calculated chance correctly
- `pickrandom` event - did not allowed dashes in event names
- `action` objective - ignored offhand at all
- `enchant` objective - did not work at all, now has `amount` and `requirementMode` parameters
- Hologram topX line not working with profiles
- the craft objective could be completed without consuming materials
- LocationObjective resolves variable for a player who does not have the objective, and so maybe also dont have the variable
- performance when using many conditions / events / ... repeatedly
- `/q journal` command allowed invalid journal pointers
- AsyncSaver will shut itself down if the database connection is lost, resulting in data loss
- Journal entries did count color codes as line length, affecting the formatting of pages
- Notification categories could be modified during runtime with the notify event
- Leading spaces are now preserved in conversation messages and journal entries
- giving `air` with the give command or the give event crashes the server
- duplication of holograms when reloading BetonQuest and the hologram is hidden
- `menu` conversation IO kicked players when conversation started in the air caused by flying detection
- `menu` conversation IO did not stopped scrolling at the bottom and began to scroll from the top again
- removed the hearts of the Armorstand in the Menu Conversation IO
- journal entries now keep their leading whitespaces
- exceptions in `sudo` and `command` events leading to broken conversations that could not be exited
- the NPC's head could be stolen from conversations with the `chest` style
### Security
- it was possible to put a QuestItem into a chest
- bump log4j dependency 2.15.0 to fix CVE-2021-44228
- `take` event - is now threadsafe
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }