OTClient is an alternative Tibia client for usage with OTServ. It aims to be complete and flexible:
For a server to connect to, you can build your own with theforgottenserver or canary.
[!NOTE] Based on edubart/otclient β’ Rev: 2.760
Beyond its flexibility with scripts, OTClient comes with many features that enable client-side innovation in OTServ: sound system, graphics effects with shaders, modules/addons, animated textures, styleable UI, transparency, multi-language, in-game LUA terminal, and an OpenGL 2.0 ES engine that allows porting to mobile platforms. It is also flexible enough to create Tibia tools like map editors using scriptsβOTClient is a framework + Tibia APIs.
https://github.com/user-attachments/assets/fe5f1d7f-7195-4d65-bca6-c2b5d62d3890
π¦ Asynchronous Texture LoadingDescription: with this the spr file is not cached, consequently, less RAM is consumed.
Video:
https://github.com/kokekanon/otclient.readme/assets/114332266/f3b7916a-d6ed-46f5-b516-30421de4616d
Main Thread
Thread 2
Thread 3
Image:
Description (1):
Garbage Collection is the feature responsible for automatically managing memory by identifying and releasing objects that are no longer in use. This allows the client to maintain efficient memory usage, avoid unnecessary data accumulation, and improve overall stability.
Description (2):
Garbage collector is used to check what is no longer being used and remove it from memory. (lua, texture, drawpool, thingtype)
(coming with engine improvements and draw-call reduction)
Description: Improvements in the UI algorithm; better performance in add/remove/reposition widgets. Visible in the battle module.
Video:
https://github.com/user-attachments/assets/35c79819-b78b-4578-a4a2-af1235139807
Activate: g_modules.enableAutoReload() (init.lua)
Video:
https://github.com/kokekanon/otclient.readme/assets/114332266/0c382d93-6217-4efa-8f22-b51844801df4
β¨ Attached Effects System (aura, wingsβ¦)[!TIP] You can adjust offsets per looktype using ThingConfig when a default offset doesnβt align perfectly for a given sprite.
![]() |
![]() |
![]() |
| ThingCategory Attached Effect | Texture (PNG) Attached Effect | Particule |
A safer way to create modules, without the need to unbind keys, disconnect events, or destroy widgets.
Example: (modules/game_minimap/minimap.lua)
GIF:
Video:
https://github.com/kokekanon/otclient.readme/assets/114332266/c2567f3f-136e-4e11-964f-3ade89c0056b
π§± Tile WidgetWiki: https://github.com/mehah/otclient/wiki/Tutorial-Attached-Effects
![]() |
![]() |
![]() |
| Title Attached Effect | Title Widget | Title Particule |
https://github.com/user-attachments/assets/b16359d3-09a4-4181-bcb8-c76339b64b37
https://github.com/user-attachments/assets/d3844223-7e35-45da-a872-3141f1c5860a
https://github.com/user-attachments/assets/9f20814f-0aed-4b70-8852-334ac745ec11
https://github.com/user-attachments/assets/3ac8473c-8e90-4639-b815-ef183c7e2adf
Module examples:
π₯ Latency-adaptive cameraBasically the camera adapts to the server latency to always remain smooth and avoid stuttering while walking.
If the ping gets high, the camera moves slower to keep up with the server's response time; if the ping drops, the camera moves faster. (Depends on character speed.)
g_game.enableFeature(GameNegativeOffset)Video:
https://github.com/kokekanon/otclient.readme/assets/114332266/16aaa78b-fc55-4c6e-ae63-7c4063c5b032
[!NOTE] See section π― Support Protocol for a full compatibility matrix and required flags.
ENABLE_DISCORD_RPC and configure the others definitionsif (Test-Path -Path build) { Remove-Item -Path build -Recurse -Force; New-Item -Path build -ItemType Directory }cmake -B build -G "Ninja" -DENABLE_DISCORD_RPC=ONcmake --build build![]() |
![]() |
![]() |
| Example interface | Example in game | future discord-game-sdk |
--encrypt, set ENABLE_ENCRYPTION_BUILDER=1 (by @TheMaoci) β removes encryption code from production build--encrypt SET_YOUR_PASSWORD_HERE (or omit to use the password from config.h)β¬οΈ Client Updater β @conde2[!WARNING] This encryption implementation is considered unsafe. Use at your own risk.
files in your www and paste init.lua, modules, data, and exewidget:setColoredText("{Colored text, #ff00ff} normal text")code-border: 2code: Hail OTClient Redemption - Conde2 Devdraw-typing: true
g_game.enableFeature(GameSmoothWalkElevation))
void ProtocolGame::sendWorldTime()function Player.sendWorldTime(self, time)void ProtocolGame::sendTibiaTime(int32_t time)client_bottommenu (activate Services.status array in init.lua)Status service
Put ./otclient/tools/api/status.php in:C:/UniServerZ/www/api/
If it doesn't work, enable curl:
![]() |
![]() |
| Interface | In-game |
![]() |
![]() |
![]() |
| Interface | Density Pixel | Joystick |
widget.childId β by @Hugo0x1337![]() |
![]() |
![]() |
| Creature | Map | Mount |
ADJUST_CREATURE_INFORMATION_BASED_ON_CROP_SIZE in setup.otml β by @SkullzOTS| Example 1 | Example 2 | Example 3 |
|---|---|---|
Bot V8 β (@luanluciano93, @SkullzOTS, @kokekanon, @FranciskoKing, @Kizuno18)
Shader with Framebuffer β (@SkullzOTS, @Mryukiimaru, @JeanTheOne, @KizaruHere)
![]() |
![]() |
![]() |
| Creature | Items | UICreature |
Full Cyclopedia β (@luanluciano93, @kokekanon, @MUN1Z, @qatari)
Wheel of Destiny β (R!ck, ZLukSrT#8740, Christianlb, @andreoam, @Libergod)
This is a fork of edubart's OTClient. The objective of this fork is to develop a runnable OTClient on mobile devices.
Tasks
If you are interested in compiling this project, visit the Wiki.
In order to build the app for production, run the following commands:
1) Build the image
docker build -t mehah/otclient .
2) Run the built image
# Disable access control for the X server.
xhost +
# Run the container image with the required bindings to the host devices and volumes.
docker run -it --rm \
--env DISPLAY \
--volume /tmp/.X11-unix:/tmp/.X11-unix \
--device /dev/dri \
--device /dev/snd mehah/otclient /bin/bash
# Enable access control for the X server.
xhost -
Ask questions on Discord: https://discord.gg/tUjTBZzMCy
Found a bug? Please create an issue in our bug tracker.
[!TIP] If using Nostalrius 7.2, Nekiro TFS-1.5-Downgrades-7.72 OR any protocol below 860 and the walking system is stuttering, set
force-new-walking-formula: trueindata/setup.otml.
In old protocols, if item speed feels too fast, adjustitem-ticks-per-frame: 75indata/setup.otml.
if you use TVP or Nostalrius 7.72 activate the feature
g_game.enableFeature(GameTileAddThingWithStackpos)in game_feature .
| TO-DO list | Status | PR |
|---|---|---|
| Sound tibia 13 | #1098 | |
| Prey and tasks | #1380 | |
| Compendium | #1625 | |
| Party List | None | |
| Proficiency | #1593 | |
| New Imbui 15x/14x | #1616 |
| Protocol / version | Description | Required Feature | Compatibility |
|---|---|---|---|
| TFS (7.72) | Downgrade nekiro / Nostalrius | force-new-walking-formula: true β’ item-ticks-per-frame: 500 | β |
| TFS 0.4 (8.6) | Fir3element | item-ticks-per-frame: 500 | β |
| TFS 1.5 (8.0 / 8.60) | Downgrade nekiro / MillhioreBT | force-new-walking-formula: true β’ item-ticks-per-frame: 500 | β |
| TFS 1.4.2 (10.98) | Release Otland | β | |
| TFS 1.6 (13.10) | Main repo otland (2024) | See wiki | β |
| Canary (13.21 / 13.32 / 13.40) | OpenTibiaBr | See Wiki | β |
| Canary (14.00 ~ 14.12) | OpenTibiaBr | See Wiki | β |
| Canary (15.00 ~ 15.24) | OpenTibiaBr | See Wiki | β |
OTClient is made available under the MIT License β you are free to use it for commercial, non-commercial, closed or open projects.
See: MIT License
If you are interested in supporting the project, donate here:
PayPal