Visit https://inconcessus.nl for an example server & client. The client software can be found here.
The server runs on NodeJS and is lightweight. It requires only two NPM modules that can be installed using npm install
. The client directory needs to be hosted and accessible over HTTP e.g., cd client; python3 -m http.server
. It does not have to be Python but can also be done using Node, NGINX or Apache, or even GitHub pages.
The server can be started by running node engine.js
.
The login server can be started by running node login.js
.
The IPC client can be started using node ipcclient.js
.
This is the main engine for the server. It runs over the WebSocket protocol and required a valid login token from the login server to upgrade HTTP connections to the WebSocket protocol.
The login server is responsible for creating and managing player accounts. If the player succesfully logs in with a valid account number and password an SHA256-HMAC token is returned including a pointer to the data to load. This token is automatically passed to the gameserver by the game client and has its signature verified. The verification is done by a shared secret in the configuration file.
Windows named pipes and Unix domain sockets are used to communicate with the gameserver locally. For example for getting the number of players online, broadcasting a message, or shutting down the server. The IPC client is exposed through an HTTP API (node ipcclient.js
). In config.json the HTTP API will be exposed on the configured host/port. The socket represents the name of the Unix Domain Socket or Named Pipe (windows) and is arbitrary.
"IPC": {
"HOST": "0.0.0.0",
"PORT": 2000,
"SOCKET": "game.sock"
}
Example calls to the HTTP API:
http://127.0.0.1:2000/status # Returns the status of the server
http://127.0.0.1:2000/shutdown?seconds=10 # Shuts the server down gracefully after 10 seconds
http://127.0.0.1:2000/broadcast?message=hello # Broadcast a message to all players
Additional paths and methods should be implemented in src/ipchttpapi.js
. The IPC packets constructed by the API should be handled by the gameserver too in src/ipcsocket.js
.
-
Support for Tibia versions:
- 740
- 1098
-
Damage types (e.g., physical, fire, energy)
-
Necklaces
-
Guilds
-
Trade system
-
Skill advancing
-
Mailboxes for sending parcels and letters
-
Mailbox for receiving items either in inventory or depot
-
Keyring (container) that automatically opens doors with available keys
-
Player houses (preliminary)
-
Tibia walking speed handling
-
Books and writeables
-
Client auto-scaling screen window & support for fixed resolutions
-
Anti-aliasing feature
-
Doors of expertise
-
Doors against unwanted intruders
-
Depot
-
Programmable action events
-
Programmable unique events
-
World clock
-
Friendlist
-
Chats
- Default chat
- Global chats
- Private chats
-
Changeable outfits
-
Lighting (e.g., dark in underground or arbitrary RGBA)
-
Support for different world zones (e.g., "Now entering Borne")
-
Weather effects (e.g., clouds)
-
Regeneration (Default or modified; e.g., Life Ring, Ring of Healing)
-
Experience and leveling
-
Spells and spellbook
- Learn new spells
- Spells with cooldowns
- Spell hotbar with key shortcuts
-
Conditions (e.g., Poision, Burning, Electrified, Drunk, Healing)
-
Drunk Suppression (e.g., Dwarven Ring)
-
Invisibility
-
Distance weapons
-
Runes
-
Ground walking speed
-
Client auto-walk (Within visible chunks)
-
Protection Zones
-
Monsters
- A* Pathfinding
- Targeting
- Loot
- Spells
- Attacks
- Sounds
- Behaviour
- Open doors
- Different behaviours (e.g., flee on attack, neutral, hostile, hostile on attack)
- Kill weaker creatures
- Push or destroy items
-
NPCs
- Talk actions
- Trades
- Cutscenes
- World time sensitive behaviour (e.g., move indoors at night)
-
Vocations
-
PvP