Update current client protocol compatibility to 15.25 byte contract
This commit updates the current client runtime profile to match the Tibia 15.25 byte contract and keeps the changes behind explicit runtime protocol feature flags.
The goal is to make the current client able to log in and keep running without message boundary debug errors while preserving the existing multiprotocol structure. This is a compatibility update focused on sending and consuming the bytes expected by the current client. It does not implement the full gameplay systems behind the new official windows dialogs rewards shops progression or balance features.
The current profile now enables versioned payload flags for the confirmed 15.25 differences. These flags gate the new packet shapes so the modern client can receive the expected payloads while older profiles do not automatically inherit incompatible message layouts.
The update also adds minimal byte compatible shims for new current client module windows and side dialogs. Taskboard and Soul Seals now have official client packet shims that respond with structurally valid empty windows where the gameplay system is not fully implemented yet. This keeps the client protocol stable without pretending that the complete feature set exists server side.
Several current client payloads were aligned with the 15.25 format. This includes resource balances graphical effects vocation specific data skill wheel weapon proficiency game events quest related payloads store summary parsing and related request parsers.
Main changes included in this commit
• Updates the current client runtime profile to the 15.25 byte contract
• Adds runtime feature flags for confirmed current client payload differences
• Gates 15.25 specific packet layouts behind explicit ProtocolFeature flags
• Adds support for official skill wheel payload differences
• Adds support for official weapon proficiency payload differences
• Adds support for graphical effect source byte differences
• Adds support for official vocation specific player data
• Adds support for official Taskboard packet family handling
• Adds support for official Soul Seals packet family handling
• Adds minimal byte compatible Taskboard shims for the current client
• Adds minimal byte compatible Soul Seals shims for the current client
• Adds explicit parsers for several previously unhandled current client opcodes
• Aligns resource balance request parsing with the current client payload
• Aligns graphical effect payloads with the current client format
• Aligns vocation specific data payloads with the current client format
• Aligns skill wheel payloads including quest bonus and gem list layout
• Aligns weapon proficiency payloads including detail list support
• Aligns game event payloads and related request handling
• Expands GameStore parsing for offer descriptions and events
• Adds stricter packet parsing and trailing byte handling where needed
• Improves protocol aware login logging with richer asset signature details
• Adds a god level protocol probe command for live protocol and message testing
• Documents the 15.25 compatibility scope and versioned payload flags
Protocol profile changes
The current profile mask now includes the new protocol feature flags required by the 15.25 byte contract. These flags allow the server to describe exactly which current client payloads are active instead of tying every behavior only to a raw client version number.
This keeps the compatibility layer safer for multiprotocol support because older profiles can continue using their own packet shapes while the current profile enables the official 15.25 payload differences.
Module shim changes
Taskboard support was added as a minimal official client shim. The server consumes the expected current client packet shape and returns structurally valid empty Taskboard windows. This keeps the client UI protocol satisfied while leaving the full Taskboard gameplay implementation for future work.
Soul Seals support was also added as a minimal official client shim. The server reads the expected request data validates the packet shape and responds with a structurally valid empty placeholder response. This prevents message boundary issues for the current client without implementing the complete Soul Seals system yet.
Payload compatibility changes
The current client expects several packet layouts that differ from older protocol profiles. This commit updates the server to match those confirmed layouts for the active current profile.
The affected areas include skill wheel payloads weapon proficiency details vocation specific player data resource balance requests graphical effects game events store parsing quest related payloads and related packet parsers.
These changes are focused on byte compatibility. They make the packet boundaries and payload shapes stable so the current client can operate without protocol debug breaks.
Bug fixes and robustness improvements
This commit also includes several protocol adjacent fixes found during the compatibility work. Packet parsing was made stricter in selected paths. Quest tracker validation and logging were updated. Store parser state handling was improved by avoiding shared global mutation for the default entries per page value.
The update also fixes precision and argument handling issues in related current client payload paths including level percent casting and forge skill stat argument placement.
Protocol probe tooling
A god only protocol probe command was added for live protocol testing. This gives maintainers a way to test selected protocol and message flows in game while keeping the command restricted to god group access.
The probe tool includes built in probes and file driven local probes, making it useful for reproducing current client packet behavior without exposing the tool to normal players.
Documentation changes
The systems documentation was updated with the 15.25 compatibility scope and multiprotocol feature notes. The documentation explains that this PR is a byte compatibility update and not a full gameplay implementation for every new current client window or system.
It also documents the versioned payload flags so future protocol updates can continue using explicit feature gated packet differences instead of mixing incompatible layouts into shared paths.
Validation performed
• Tested current client login locally
• Tested key current client UI surfaces locally while fixing reported client debug cases
• Confirmed fixes for skill wheel payload boundaries
• Confirmed fixes for character stats payload boundaries
• Confirmed fixes for store summary payload boundaries
• Confirmed fixes for defense stats payload boundaries
• Confirmed fixes for game event payload boundaries
• Confirmed fixes for graphical effect payload boundaries
• Confirmed fixes for related current client request parsers
• Full compile and build validation was not run
Known scope limitation
This commit intentionally does not implement the full gameplay systems behind the new current client windows dialogs rewards shops progression systems or balance features.
The purpose is to stabilize the message shape first. Full gameplay behavior can be implemented later on top of the now compatible packet structure.
Overall this commit brings the current client protocol path in line with the Tibia 15.25 byte contract. It adds explicit feature gated compatibility for confirmed payload differences introduces minimal shims for new official client windows improves parser coverage and documents the compatibility boundary while preserving the existing multiprotocol architecture.
This refactors a comprehensive set of modules for the GameStore system,
including constants, helpers, and parsers. The changes establish a
robust foundation for handling store offers, user actions, and
transactions in a modular and maintainable way. The most important
changes are the addition of a detailed constants file, helper functions
for offer handling, and a parser module that manages all store-related
protocol events and purchase logic.
**GameStore System Foundation**
* Added a new `gamestore.constants.lua` file containing all core
constants for the GameStore, such as offer types, sub-actions, action
types, coin types, error codes, packet codes, default values,
descriptions, and item limits. This centralizes configuration and
improves maintainability.
**Helper Functions**
* Introduced `gamestore.helpers.lua` with utility functions for
converting offer types to display types and determining if an offer
requires configuration, improving code reuse and clarity in offer
handling.
**Store Event and Purchase Parsing**
* Added `gamestore.parsers.lua` which handles all GameStore protocol
events, including opening the store, searching offers, buying offers,
transferring coins, and transaction history. This module coordinates
with helpers and senders to process requests and responses, including
error handling and purchase validation.
These changes collectively lay out the structure for a feature-rich,
extensible GameStore system, making future enhancements and debugging
easier.
---------
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Refined the logic for purchasing all blessings in the game store,
ensuring that players cannot exceed the maximum blessing count and that
purchases correctly handle partial blessing states. The changes focus on
improving the validation and processing of the "All Blessings" offer to
prevent over-purchasing and to handle edge cases where some blessings
are already at their maximum.
Blessing purchase logic improvements:
- Updated the validation in `Player.canBuyOffer` to check blessings 2
through 8 for maximum count before disabling the "All Blessings" offer,
ensuring players can only buy it if at least one blessing is not maxed.
- Refactored `GameStore.processAllBlessingsPurchase` to add only the
necessary amount of each blessing, respecting the maximum count per
blessing and handling cases where some blessings are already partially
acquired.
Fix gamestore homepage offer state display inconsistency by implementing proper state validation logic in sendHomePage() function. This change aligns the homepage behavior with other gamestore functions that already implement correct offer state handling.
Co-authored-by: Madara <158350170+caiozord@users.noreply.github.com>
Fixed the exploit when holding enter and clicking the buy button multiple times, buying the same item multiple times even though it was charged for each purchase, this was used to stock up on many exp buffs.
# 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>
This add the ability to set ownership on items. An owned item cannot be
picked up or used by anyone except the character that owns it.
If an owned item is inside a container (backpack, etc) that container is
now also treated as owned. "looking" at an owned item shows you the
owner.
New function:
- `item:setOwner(ownerPlayer or id)`
- `item:getOwnerId()`
- `item:getOwnerName()`
- `item:hasOwner()`
- `item:canBeMoved()`
I also sneaked in some other unrelated improvements that didn't fit any
individual PR in here, but the are pretty small.
---------
Co-authored-by: Eduardo Dantas <eduardo.dantas@hotmail.com.br>
Adds a `/namelock` command to help you ax those offensive names from
your server.
It works by providing the player with a "free" mandatory name change
upon login.
---------
Co-authored-by: Elson Costa <elsongabriel@hotmail.com>
Make the debug message: "[NetworkMessage::addString] - Value string is
empty" less vague by adding a context parameter to it.
- addString(value, function)
Resolves#1926
Addressed a conflict between hireling system and gamestore subaction IDs, which led to occasional loss of offers and inconvenienced players who had to repurchase the offers. To resolve this issue, we increased the IDs to larger numbers and conducted a minor system overhaul. This involved transitioning to the use of Key-Value (KV) storage, removing obsolete cache code, and enhancing system clarity and performance for a smoother player experience.
Co-authored-by: Luan Santos <git@luan.sh>
Fixes bug introduced from #1821
A mount was added that does not yet exist in appearances, until we add a new dat, we will just ignore their existence.
Removed invalid mounts.
Continues fixing of #1784 and #1847
• Improved message on exercise_training.
• Fixes reward charges.
• Created flag in prison bosses' scripts to enable minus players and removed already created functions.
• Removed create torch when player login.
• Fixes in 'clearBossRoom' function usage on bosses teleports.
• Fixed count days and time on ferumbras_lever and fixed mechanic of Ascending Ferumbras boss.
• Fixed xp boost storage resetter (on very ss, the storage was being presented, and the player always buy it with 30 tc).
• Added 13.21 new mounts, reordered and fixed typos, changed the word moveable to movable.
• Removed unnecessary spaces.
Continues fixing of #1741
• Created a function to check time in levers and changed with `creature:getStorageValue(config.storage) > os.time()`;
• Adjusted save_interval messages.
• Added check to show msg with payment information when traveling as free.
• Fixed loot to custodian.
• Fixed some typos.
• Adjusted reward talkaction, to check cap.
• Fixed adventurer's stone usage.
• Added messages when starting or stopping using exercise weapons.
• Fixed some events of bosses.
The transfer of houses is now permitted only during server restarts to
prevent server freezing when moving items to the depot. While this is
not the most sophisticated solution, it's the simplest and least
error-prone due to the base's complexity. This approach mirrors what
CipSoft employs in the global version of Tibia and effectively addresses
the issue without introducing possible new bugs.
Additional updates include modifications to NPCs to sell the new kit,
which displays the item's sprite in the wrap container. Support for
using old kits remains, allowing players to convert them into new ones.
Unrelated changes affecting houses:
• Purchasing a house with items still inside is no longer possible. This
prevents issues in rare scenarios, such as incomplete item transfers due
to console closure.
• Introduced an "all" parameter to the "/r" command for removing all
items from a tile.
• Removed the "allowpickUpAble" tags from ground/border and derived
items. These were initially implemented to enable item "throwing" onto
tiles. Now, an item can be thrown only if its type is "trashholder,"
fulfilling the same purpose. This change was made because the check for
items inside the house before purchasing relies on the "pickupable" tag,
which is not applicable to tiles and derivatives.
Stylua is easier to configure than what we had before, since it's
already available as a code action. It also parses the code while it
formats which will help catch syntax errors on PRs automatically.
Hard one to describe because it's a lot of datapack changes bundle
together. Non-exhaustive list:
- Fixed a bunch of small quest details that prevented them for being
completable
- Fixes a few raid locations
- Added a new NPC "Battlemart" that can be used a refiller NPC
- Adjusted spawn densities in some spawns
- Fixed a few details with certain spells
Created vip system functionality with some validations and improvements:
• Adjusted store checking to sell VIP or premium;
• Created configs and scripts;
• Fixed and created validation to auto-loot flag enabled by each player.
Features (Vip Accounts):
• Gain more XP
• Gain more loot
• Gain more skill
• Gain coins to be online
• Gain tokens (customized) to be online
• Toggle auto-loot exclusive
• Reduce familiar cooldown time
• Corrected the behaviour of coins to ensure they function properly. In the market, only transferable coins will be deducted.
• In the store, non-transferable coins will be used first, followed by transferable ones.
• Resolved issues with coins in client version 11.00.
• Fixed several typographical errors.
• Replaced coin management in Lua with C++ functions to eliminate the need for direct SQL queries in Lua scripts.
This adds support for the Tibia client 10x, which connects directly to the server without the need for an AAC login. No changes are required on the AAC side, and you can continue to use the acc/login.php endpoint for the client 11+.
To use the client 10x, simply set the tag "allowOldProtocol" to true or false in the config.lua file. You can only log in using your account name on client 10x, and only using your email on client 11+.
Please note that you will need to update the client 10x to your server's sprites/items data. You can download the client 10x from this link: https://github.com/dudantas/tibia-client/releases/download/13.16.13209/client-10x-outdated-11.00.zip.
For update your .spr and .dat can use the SpiderClientConverter: https://github.com/Arch-Mina/ClientConverter
This changes only includes the protocol update up to 13.16. For the changes related to the features, please check PR #531
Disclaimer: this changes removes tournament system and coins completely since Cipsoft removed it from their client, no way back.
Client for login: https://github.com/dudantas/tibia-client/releases/tag/13.16.13209
Client notes:
• Use the client "client-127.0.0.1-13.16.13209" to test local, it already uses the OpenTibia RSA key and the local ip.
• Place the files "cache/eventscheduler.json" and "cache/boostedcreature.json" as read-only for the correct functioning of the systems by the server.
Exhaustion in all actions, as some other buttons generate a large load of information, such as "parseRequestStoreOffers", thus preventing someone from abusing this to generate a freeze on the server.