Bug Fixes:
• More reliable mount handling during outfit changes: randomized mounts
now resolve to no mount when invalid/unavailable and incompatible mounts
are cleared.
• Login outfit replacement now only applies for specific looks when the
player lacks group access.
• Outfit mount compatibility is pre-evaluated to ensure accurate
validation.
Tests:
• Added unit tests for randomized-mount resolution and
mount-compatibility checks.
Chores:
• Test target updated to include the new tests.
New Features:
• Added MONK vocation: Players can now create characters of the new MONK
class with specialized starting equipment, including a jo staff, brass
armor set, boots, scarf, and a starter container filled with essentials
like a shield, rope, shovel, and health potions.
feat: add Way of the Monk quest, monster updates, and core data improvements
This commit introduces the complete implementation of the Way of the Monk quest, along with multiple updates to monsters, bosses, items, and core gameplay data.
Quest:
• Added full quest definition for Way of the Monk, including mission flow, shrine tracking, and storage handling.
• Registered the new quest module in the quest catalog.
• Introduced new storage keys related to monk quest progression and items.
• Added a sample monk player migration (DB version 55) for testing purposes.
• Added Blue Valley to the towns list to support quest locations.
Monsters and Bosses:
• Added new monster Tame Terror Bird with complete stats, behaviors, and loot.
• Reworked Mitmah Vanguard boss with updated events, attributes, attacks, defenses, elemental modifiers, loot, and lifecycle hooks.
• Expanded loot tables for bosses such as The Brainstealer and The Monster, including monk-related items and potions.
Items and Loot:
• Updated frazzlemaw and guzzlemaw loot to drop traditional sai instead of sai.
• Added monk-related item IDs to destruction scripts and Dawnport cleanup logic.
Gameplay:
• Added Monk’s Apparition to the Soul War quest apparition list.
• Introduced a new combat formula for fist fighting skill.
• Removed legacy fist fighting attack speed configuration from server settings.
Workflow:
• Improved GitHub Actions workflow to ensure reusable checks run on the correct branch.
These changes make a small but significant fix to the familiar system
on player login. It ensures that the remaining familiar summon time is
never negative by clamping the value to zero. This prevents potential
issues if the stored summon time is in the past.
- Clamp `familiarTimeLeft` to zero to prevent negative values by using
`math.max(0, familiarSummonTime - os.time())` in
`familiarOnLogin.onLogin`
(`data/scripts/creaturescripts/familiar/on_login.lua`).
Resolves#3710
This way the killer list will show who gave the final hit, who did the
most damage and all other participants, whether monsters or players.
PR Complement: https://github.com/opentibiabr/myaac/pull/134
I made corrections to the `death.lua` script to resolve nil value errors
in the `handleGuildWar` function. I added checks to ensure that both the
player and the killer are valid and that both belong to a guild before
proceeding with the guild war logic. This helps prevent failures when
one of the objects is undefined.
Fixes from: 3c98b4161c
This refactors the PlayerDeath event script to improve code
readability and maintainability. The original function has been split
into smaller, more focused functions, each handling a specific part of
the player death processing logic. This includes identifying the killer,
logging deaths in the database, sending messages to the guild channel,
and checking guild wars.
With this refactoring, the code is more modular and easier to
understand, making future modifications and maintenance more manageable.
The PlayerDeath event logic remains unchanged, ensuring the system
continues to function as expected.
Changes:
•. Split the onDeath function into smaller local functions.
•. Improved SQL query formatting using string.format for clarity and to
avoid repetitive code.
•. Renamed local variables to follow the camelCase convention.
1. Fixes a minor issue where, when emptying the balloons, they were
transformed into 255 instead of being reset to 1.
2. Adjusts the usage of the "bathtub" in datapacks, in addition to the
RLMap, ensuring better compatibility.
3. Makes minor aesthetic changes to enhance the code's readability.
Resolves#2923
This ensures the integrity of the name during searches. If a name is
added with a different capitalization than the monster's actual name, it
can lead to conflicts, preventing the onDeath code from executing
properly.
- Previously, players were not being removed from the room upon killing
the boss, as the relevant script was confined to rlmap only. This update
ensures its functionality across any datapack.
- Hirelings are now accessible beyond rlmap environments.
- Addressed an issue with the loading of VIP days library.
- Relocated the large sea shell asset to the core.
- Implemented VIP status check and associated actions.
- Transferred weapons scripts to the core.
Remove redundant configuration information and leave the default behavior. Add the condition for mana regeneration when leveling up, as suggested by some friends.
Allows you to setup boss loot event similar to experience, spawnrate and
loot.
See updated examples in events.xml
---------
Co-authored-by: Sebastian Nobbelin <sebastiannobbelin@gmail.com>
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
# Description
- Fixed stackable items in store;
- Created script to remove empty parcels from the store inbox on login.
---------
Co-authored-by: Luan Luciano <luanluciano@outlook.com>
With this modification, we will be able to focus on just one repository (the canary), and archive otservbr-global repository.
The intention is that we can have two datapacks in the same repository, being able to easily switch from one to the other, just change in config.lua the "dataPackDirectory" from "data-otservbr-global" to "data-canary" or vice versa.
The main purpose is to facilitate our development, at the same time that the community will be able to contribute in a single repository, but keeping the choice of using a "clean" datapack.
I made some more modifications, such as removing the unused C++ gamestore, I also removed the "allowPickupable" tag, which was duplicated, and I made some other adjustments.
Folder structure changes
Now we have the following structure:
• data = this will be the "core" folder, it is where the files that are absolutely necessary for the executable to open correctly, such as libs, xmls, etc. Here we will have files that both the global and the canary datapack will share with each other
• data-otservbr-global = here will be the global datapack files, some libs and folders that are only for the global server, such as scripts, monsters, npcs, world.
• data-canary = a "clean" datapack as far as possible, with only the scripts and files necessary for the server to work.
• NOTE: The "data" folder is actually the "core" of the server, we didn't rename it to avoid having to make changes to the sites and login.php, since they read the "data/xml". The other two folders, data-otservbr-global and data-canary can be changed in config.lua, which one you want the executable to read, by default we'll point to the global one, as that's what most use. If you want to start a custom server with "as few files and scripts as possible", then switch to "data-canary".
We also added a boolean in config.lua that allows choosing another name for the datapack, by default we will also keep this disabled, since we will only maintain support for these two datapacks, it is up to each one to know what they are doing in case they want to change it.
So, in the end, we have the reorganization in the folders:

Note that we made few real changes to the files, the abundance of modified files is due to moving from one folder to another and also adding the global datapack to this repository (with an abundance of files). If you want to migrate your datapack to the global one, you should know what you're doing, if you don't know, just pass your modifications to the "new files" or get in touch on our discord group so we can help you: https://discord.gg/X3mSnMH8jg
The new objects will help us with boss scripts, quests, and spectator checks, reducing the complexity and size of a lot of code. Added an example of how the mechanics work in the lever of threatened dreams quest.
Fixed player death event name typo (from "Player Death" to "PlayerDeath"), on login.lua is: player:registerEvent("PlayerDeath")
Fixed a bug that we have in the discord webhook in the project, and the bug happens when the server can't access the discord because of an invalid url or a lack of connection from the discord itself
Behaviour actual:
Server crash "closes unexpectedly" if invalid url is set in "config.lua" or "discord_webhook.lua"
Expected:
The server has to work normally regardless of whether the url is correct or not and whether discord receives it or not
Somes familiars fixes and adjusts
Rename from "pet/Pet" to "familiar/Familiar"
Removed "familiar = false" from monsters, this is false by default
Renamed from "mtype:isPet" to "mtype:familiar"
Co-authored-by: @dudantas <eduardo.dantas@hotmail.com.br>
Rework on exercise weapon with tibia global equal behavior
Added config key "maxAllowedOnADummy ", default is "1"
Created table for exercise functions and variables
Start training with someone already training on that dummy and the message will be sent that someone is already training.
If someone is training and connects to the game, that user appears as Exercise Dummy Training .
If someone is training, send request to add this player on vip list, that user appears as Exercise Dummy Training.
When are training and disconnect from the game, on reconnect, the training stopped.cise Dummy Training
When are training and disconnect from the game, on reconnect, the training stopped