123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432 |
- //===== rAthena Documentation ================================
- //= Source Documentation
- //===== By: ==================================================
- //= rAthena Dev Team
- //===== Last Updated: ========================================
- //= 20140218
- //===== Description: =========================================
- //= Explanation of source behaviours and structures.
- //============================================================
- This file provides basic information about rAthena's source code.
- The format of this file is as follows:
- 1. Glossary
- 2. Intro & Emulation
- 3. Interface and Communications
- 4. Databases and Independence
- 5. Package and Module Purposes
- 6. Nomenclature
- 7. Variable Notes
- 8. Building
- 9. Atcommands & Script Commands
- ===============
- | 1. Glossary |
- ===============
- The following terms will be frequently used throughout this file, so it is
- important to have a thorough understanding of what they are to avoid confusion.
- Term Description
- ---- -----------
- serv a program/daemon that runs indefinitely offering a service
- host a machine that has one or more servs running
- command a request of an action on the server or client
- (atcommand, script_command, packet_request)
- interface a class/module that offers a list of commands
- ========================
- | 2. Intro & Emulation |
- ========================
- rAthena is an emulation of Ragnarok Online, which runs on software known as AEGIS.
- AEGIS is separated into 4 servs:
- Serv Description
- ---- -----------
- account handles player account information and logins.
- char handles character data (persistent information).
- inter handles broadcasting across map-serv. [merged into rAthena's char-serv]
- map handles all player runtime actions.
- These servs are an aggregation of each other:
- login-serv => 1 - * char-serv, 1 - * map-serv
- In this case, * is 30. This means that 1 login-serv is able to manage up to
- 30 char-serv, which itself can manage up to 30 map-serv. Note that due to these
- aggregations, the login-serv and map-serv never directly communicate with each other.
- ===================================
- | 3. Interface and Communications |
- ===================================
- We have 3 types of communication:
- 1. serv <=> serv (AH,HA,HZ,ZH)
- This type of server-to-server communication is referred to as "inter-serv" communication.
- 2. serv <=> client (AC,CA,HC,CH,ZC,CZ)
- This is what our servs send or receive to a player client.
-
- 3. serv <=> console/terminal
- This is the only kind of communication which doesn't use packets (currently).
- It's only done in localhost from console to servs (a way to input args in servs runtime).
- The packet notation and structure are well defined in 'doc/packet_struct_notation.txt'.
- Note that scripts and atcommands are another kind of interface, as they allow
- users to input data into the serv.
- =================================
- | 4. Databases and Independence |
- =================================
- Each server can theoretically be set in a different host with its own databases
- associated (although this is currently broken due to years without documentation).
- In other words, you shouldn't expect to find char-serv data on a map-serv host
- and access it directly, but rather ask the char-serv to fetch it.
- The list below details the association of database tables with the servs.
- For real table names, see 'conf/inter_athena.conf'.
- ==============
- | Login-serv |
- ==============
- Table Contents
- ----- --------
- login_db all account-related information
- reg_db permanent account variables (ex. #CASHPOINTS)
- =============
- | Char-serv |
- =============
- Table Contents
- ----- --------
- char_db all char-related information
- hotkey_db hotkeys set for each character
- scdata_db character status at disconnection
- cart_db list of items in each character's cart
- inventory_db list of items in each character's inventory
- charlog_db char-serv logs
- storage_db list of items in each character's storage (Kafra)
- reg_db permanent character variables (ex. ADVJOB)
- skill_db character learned skill database
- interlog_db inter-serv logs
- memo_db character Memo_point database
- guild_db guild record (name, master, lv, exp, emblem, etc.)
- guild_alliance_db guild relations database (allies, enemies)
- guild_castle_db guild owned castle database
- guild_expulsion_db guild expulsion logs
- guild_member_db guild current member titles and positions
- guild_skill_db guild learned skills database
- guild_position_db guild positions configuration (names, taxes, rights)
- guild_storage_db guild item storage
- party_db party record (name, leader, shared_exp, shared_item)
- pet_db saved pet objects database
- friend_db character friends database
- mail_db mail database
- auction_db auction database
- quest_db character quest realisation database
- homunculus_db saved homunculus objects database
- skill_homunculus_db homunculus learned skills database
- mercenary_db saved mercenary objects database (HP, SP, level, etc.)
- mercenary_owner_db character proprietary link to mercenary object save and use stats
- elemental_db saved Elemental objects database (HP, SP, FLEE, etc.)
- ragsrvinfo_db map-serv rate record (similar to 'conf/battle/drop.conf', possibly a leftover?)
- skillcooldown_db character skill cooldowns at disconnection
- bonus_script_db character bonus_script at disconnection
- ============
- | Map-serv |
- ============
- Table Contents
- ----- --------
- mapreg_db permanent map-serv global variables (ex. $agit_result_timer)
- buyingstore_db live buyers database (map_pos, aid, shop title, etc.)
- buyingstore_items_db items currently being purchased by live buyers
- vending_db live vendors database (map_pos, aid, shop title, etc.)
- vending_items_db items currently being sold by live vendors
- The tables below are optional alternatives to TXT databases located in 'db/*.txt'.
- item_db item database (Pre-Renewal)
- item_db_re item database (Renewal)
- item_db2 item database import (Pre-Renewal)
- item_db2_re item database import (Renewal)
- item_cash_db cash shop database
- item_cash_db2 cash shop database (import)
- mob_db monster database (Pre-Renewal)
- mob_db_re monster database (Renewal)
- mob_db2 monster database import (Pre-Renewal)
- mob_db2_re monster database import (Renewal)
- mob_skill_db monster skill database (Pre-Renewal)
- mob_skill_db_re monster skill database (Renewal)
- mob_skill_db2 monster skill database import (Pre-Renewal)
- mob_skill_db2_re monster skill database import (Renewal)
- ==================================
- | 5. Package and Module Purposes |
- ==================================
- The following list describes each module and its purpose.
- ============
- | 3rdparty |
- ============
- The '3rdparty/' folder contains libraries used by the project but are not maintained by us.
- ==========
- | Common |
- ==========
- The 'src/common' folder contains all the modules which are used by more then 1 serv.
- Module Description
- ------ -----------
- cbasetypes adapter to OS and arch specification (function name, bit representation)
- cli console Line Interface handling (get arguments from terminal at beginning and runtime)
- conf facade of libconfig api
- core MAIN program entry (initialization of each serv starts here)
- db database module (create, parse, and destroy databases)
- des Data Encryption Standard algorithm modified for rAthena
- ers Entry Reusage System to help memory allocation
- grfio handles *.grf files (searches for files in them and decodes them)
- malloc handles runtime memory allocation (so that memory manager could check for leaks)
- mapindex handles the processing and reading of the mapcache.dat
- md5calc offers md5 encryption
- mmo.hpp common structures and defines across serv
- msg_conf handles msg in src from configuration
- nullpo checks and dumps info for debug mode
- random generation of random numbers
- showmsg display messages in console with a certain color
- socket handling of sockets (listening, close, open, etc.)
- sql.cpp MySQL database proxy
- strlib.cpp string handling
- timer.cpp timer-related functions
- utils.cpp misc functions
- winapi.hpp Windows redefine and include
- ==============
- | Login-serv |
- ==============
- Module Description
- ------ -----------
- account persistence for account data
- ipban offers IP banishment
- login main module of login-serv
- loginclif client <=> login-serv connections interface (send and receive packets to/from client)
- loginchrif char-serv <=> login-serv connections interface (send and receive packets to char-serv)
- logincsnlif console <=> login-serv connections interface (send and receive packets to/from console (internal buffer))
- loginlog records all operations into log for login-serv
- =============
- | Char-serv |
- =============
- The char-serv is responsible for persistence (save/load data permanently) and
- also serves as a controller that handles all associated map-servs. Further, it
- is responsible for ensuring that there are no duplicate party names among the
- map-servs (which could create conflicts if a party transfers map-servs).
- Module Description
- ------ -----------
- char currently holds all the char-serv (EA) process
- -- char_clif client <=> char-serv connections interface (send and receive packets to/from client)
- -- char_csnlif console <=> char-serv connections interface (send and receive packets to/from console (internal buffer))
- -- char_mapif map-serv <=> char-serv connections interface (send and receive packets to map-serv)
- -- char_logif login-serv <=> char-serv connections interface (send and receive packets to login-serv)
- inter main entry to inter-serv; delegates packet handling to submodules
- -- int_auction handles auction request and saving
- -- int_elemental handles elemental data (BL_ELE => Sorcerer mob)
- -- int_guild handles guild data (creation, destruction, add member, etc.)
- -- int_homun handles homunculus data (BL_HOM => Alchemist mob)
- -- int_mail handles mail data
- -- int_mercenary handles mercenary data (BL_MER => All class mob)
- -- int_party handles party data (creation, destruction, add member, etc.)
- -- int_pet handles pet data (BL_PET => All class mob)
- -- int_quest handles quest data
- -- int_storage handles storage data (save storage, load storage, etc.)
- ============
- | Map-serv |
- ============
- Module Description
- ------ -----------
- atcommand handles GM commands (ex. @who)
- battle handles damage calculation where target is enemy and battle configuration settings
- battleground functions for Battleground system (create, destroy, messaging, join, etc.)
- buyingstore functions for player Buying Stores (create, search, sell)
- cashshop functions to set up the server cashshop (from cashshop_db), and contains function to buy items from cashshop
- channel functions for the channel system (create, delete, join/auto-join, leave, broadcast, alter options)
- chat functions for the chatroom system (create, delete, trigger chatroom_event, change owner, etc.)
- chrif char-serv <=> map-serv connections interface (send and receive packets to char-serv)
- clif client <=> map-serv connections interface (send and receive packets to/from client)
- date functions for time
- duel functions for the duel system
- elemental functions for Sorcerer Elementals processing (create, delete, etc.)
- guild functions for the guild system
- homunculus functions for Alchemist Homunculi processing (create, delete, get stats, death, etc.)
- instance functions for instance system
- intif map-serv <=> inter-serv interface (meant to communicate with 'char/inter.cpp' or its submodules)
- itemdb functions for the item database
- log functions for server log system
- mail functions for mail system
- map map-serv main module, and a representation of a map object
- adds or removes other objects into map (blocklist) and provides iterators (ex. map_foreachpc)
- mapreg functions to save or read variables in mapreg_db (global variables for all map-serv)
- mercenary functions for Mercenary system (create, search, get stats, dead)
- mob functions for mob data, structures, and mob routines
- npc functions for NPC data (create, delete, calling NPCs)
- npc_chat functions for PCRE and NPC interaction
- party functions for the party system (create, join, delete, alter options, etc.)
- path functions for path finding (check_distance, search path unit will use)
- pc functions for player processing (loot/drop/delete items, player bonus handling, player dead, etc.)
- pc_groups functions for players groups system (manage player permissions and atcommand access)
- pet functions for the pet system (similar to mercenary, homunculus, player, etc.)
- quest functions for the quest log system (add, complete, remove, etc.)
- script handles script language logic (used in NPC scripts), script commands, and mapflags
- searchstore functions for the Vendor Shop Search feature
- skill functions for skills (skill_casttime calculation, skill behaviours, skill_chk_cast, requirement checks, 'db/skill_*.txt' processing)
- status functions for statuses on a bl (add, remove, calculation of effects as a temporary bonus)
- status is a struct available by most units as common attributes (bl_type only attribute are dealt in bl specific files, like 'pc.cpp' or 'mob.cpp')
- storage functions for the storage system: Kafra, cart, guild, inventory (add, transfer, remove items between containers)
- also ensures container mutex (e.g. guild_storage) and preparation for save requests
- trade functions to perform a trade (request, accept, add items/Zeny, checks, complete trade)
- unit functions for controlling player/mob/NPC actions (walk, follow, skill use)
- vending functions for Merchant Vending (create, purchase)
- ===================
- | 6. Nomenclature |
- ===================
- The following are standard naming conventions used by rAthena.
- Type Prefix Example
- ---- ------ -------
- function module_ pc_addspiritball -> located in pc.cpp file
- structure s_ s_quest_db
- enum e_ e_race
- status SC_ SC_INTOABYSS
- skill classmid_ AL_TELEPORT -> AL = Acolyte
- bonus SP_ SP_ATK_RATE
- NOTES:
- - If a status name conflicts with a skill name, another '_' is added (e.g. SC__WEAKNESS).
- - All constants should be written in all caps.
- - battle_config vs. #define macro:
- battle_config can be changed during runtime (ex. @setbattleflag), but this requires
- more processing and could render the server less stable than a macro would.
- =====================
- | 7. Variable Notes |
- =====================
- The following variables are commonly used in the source code.
- Variable Full Name Description
- -------- --------- -----------
- sd session data represents the session of a client into a serv (login, char, or map)
- tsd target sd same as sd, but for a target
- pl_sd usually in an iteration loop, the current sd of index
- it_sd a variant of pl_sd (for iter_sd)
- fd file descriptor a link to an I/O like a socket or file
- md mob data represents monster information; also used to represent mercenary information
- hd homunculus data represents homunculus information
- nd NPC data represents NPC information
- ed elemental data represents elemental information
- pd pet data represents pet information
- sc status change a structure containing all the possible status applied to a character
- tsc target sc same as sc, but for a target
- sce status change entry represents data of a specific inflicted status
- bl blocklist common data of one object (a skill, pet, player, etc); also represents a 2-way chain-link
- tbl target bl same as bl, but for a target
- st script stack the stack of an NPC
- aid account id a player account ID
- gid game id the general unique ID of a Unit, which is the aid for players
- (since a single character per account can be connected at one time)
- cid character id a player character ID
- rid character id a variant of cid
- su skill unit a skill with a unit that remains on the ground
- ===============
- | 8. Building |
- ===============
- When adding a new src file or library (new.cpp and its header, new.hpp), you'll also
- need to update the following files to fully integrate it into the project so that
- users can compile it.
- There are 3 ways to compile the project:
- > configure + makefile (requires POSIX environment + C compiler)
- This flow is mainly used by Linux users, but can be done in any POSIX environment (ex. Windows + Cygwin).
- - Configure.in: Template file to generate the configure script by autoconf.
- - Makefile.in: Template makefile to generate the real makefile according to configure. Each subfolder needs its own makefile.
- - Makefile: File filled with rules for gcc to compile folder.
- The sequence is as follows:
- 1) configure.in => configure by autoconf ('autoconf configure.in > configure')
- 2) configure => Makefile by Makefile.in
- 3) Makefile => binary by 'make all' or alternative
- > cmake (requires C compiler + cmake)
- - CmakeList: Comparable to Makefile, but in a more cross-OS way.
- The sequence is as follows:
- 1) Define which toolchain to use, acting like a configure ('cmake -G "Unix Makefiles"' or 'cmake -G "Visual Studio 10"')
- 2) Enter the build folder where the Makefiles are generated and launch 'make install' to produce binaries from them
- > sln (requires Visual Studio)
- - *.sln: Solution project for Visual Studio (Windows).
- See https://github.com/rathena/rathena/wiki/compiling for more detailed compilation instructions.
- ===================================
- | 9. Atcommands & Script Commands |
- ===================================
- To implement an atcommand or script command, you must define a function and
- add its reference to the appropriate array. See the files in 'src/custom/'
- for examples.
- Atcommands
- ----------
- ACMD_FUNC(name)
- {
- <code>
- }
- ACMD_DEF(name) - OR - ACMD_DEFR(name,restriction)
- - OR -
- ACMD_DEF2("alias",name) - OR - ACMD_DEF2R("alias",name,restriction)
- Restriction Description
- ----------- -----------
- 1 restrict usage in console
- 2 restrict usage in script_command
- Script Commands
- ---------------
- BUILDIN_FUNC(name)
- {
- <code>
- }
- BUILDIN_DEF(name,"arguments")
- - OR -
- BUILDIN_DEF2(name,"alias","arguments")
- Argument Description
- -------- -----------
- i integer
- s string
- v variable
- l label
- r reference (of a variable)
- ? optional parameter (one)
- * optional parameter (unknown count)
- null (no arguments)
- Useful functions:
- script_hasdata(st,i); // Returns if the stack contains data at the target index
- script_getdata(st,i); // Returns the script_data at the target index (data is a glob type)
- script_getnum(st,val); // Returns the int at the target index
- script_getstr(st,val); // Returns the string at the target index
- script_getref(st,val); // Returns the reference of a variable at the target index (useful for arrays, ex. 'checkweight2')
- script_getfuncname(st); // Returns the current function name (useful for function variants, ex. 'sc_start')
- script_pushint(st,val); // Pushes an int into the stack
- script_pushstr(st,val); // Pushes a string into the stack
- script_isstring(st,i); // Returns if the data at at the target index is a string
- script_isint(st,i); // Returns if the data at at the target index is an int
|