diff options
-rw-r--r-- | Changelog-Trunk.txt | 8 | ||||
-rw-r--r-- | src/common/mmo.h | 1066 | ||||
-rw-r--r-- | src/login/login.h | 90 | ||||
-rw-r--r-- | src/map/clif.c | 61 | ||||
-rw-r--r-- | src/map/script.c | 24 |
5 files changed, 627 insertions, 622 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 359d29cac..d32b3fd05 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -3,6 +3,14 @@ Date Added AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK. IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. +2004/12/05 + * Moved START_ACCOUNT_NUM and END_ACCOUNT_NUM from login.h to mmo.h and + changed clif_guess_PacketVer to use that. [FlavioJS] + * Made the script engine big-endian compatible. [FlavioJS] + * Commented out the remnants of ladmin packet parsing in map-server. + [FlavioJS] + * Added a warning when a player has an invalid packet version (shouldn't + happen). [FlavioJS] 2006/12/04 * Fixed HVAN_INSTRUCT int bonuses. [Skotlex] * Renamed mob_db's "adelay" column to ThinkTime and made the mob.c code use diff --git a/src/common/mmo.h b/src/common/mmo.h index 3095e1491..f65da260b 100644 --- a/src/common/mmo.h +++ b/src/common/mmo.h @@ -1,531 +1,535 @@ -// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _MMO_H_
-#define _MMO_H_
-
-#include <time.h>
-#include "utils.h" // _WIN32
-
-#if ! defined(Assert)
-#if defined(RELEASE)
-#define Assert(EX)
-#else
-// extern "C" {
-#include <assert.h>
-// }
-#ifndef DEFCPP
-#if defined(_WIN32) && !defined(MINGW)
-#include <crtdbg.h>
-#endif
-#endif
-#define Assert(EX) assert(EX)
-#endif
-#endif /* ! defined(Assert) */
-
-#ifdef CYGWIN
-// txtやlogなどの書き出すファイルの改行コード
-#define RETCODE "\r\n" // (CR/LF:Windows系)
-#else
-#define RETCODE "\n" // (LF:Unix系)
-#endif
-
-#define RET RETCODE
-
-#define FIFOSIZE_SERVERLINK 256*1024
-
-// set to 0 to not check IP of player between each server.
-// set to another value if you want to check (1)
-#define CMP_AUTHFIFO_IP 1
-
-#define CMP_AUTHFIFO_LOGIN2 1
-
-//Remove/Comment this line to disable sc_data saving. [Skotlex]
-#define ENABLE_SC_SAVING
-
-#define MAX_MAP_PER_SERVER 1024
-#define MAX_INVENTORY 100
-//Number of slots carded equipment can have. Never set to less than 4 as they are also used to keep the data of forged items/equipment. [Skotlex]
-//Note: The client seems unable to receive data for more than 4 slots due to all related packets having a fixed size.
-#define MAX_SLOTS 4
-#define MAX_AMOUNT 30000
-#define MAX_ZENY 1000000000
-#define MAX_FAME 1000000000
-#define MAX_CART 100
-#define MAX_SKILL 1100 // Bumped to 1100 for new quest skills, will need to further increase one day... [DracoRPG]
-#define GLOBAL_REG_NUM 96
-#define ACCOUNT_REG_NUM 64
-#define ACCOUNT_REG2_NUM 16
-//Should hold the max of GLOBAL/ACCOUNT/ACCOUNT2 (needed for some arrays that hold all three)
-#define MAX_REG_NUM 96
-#define DEFAULT_WALK_SPEED 150
-#define MIN_WALK_SPEED 0
-#define MAX_WALK_SPEED 1000
-#define MAX_STORAGE 300
-#define MAX_GUILD_STORAGE 1000
-#define MAX_PARTY 12
-#define MAX_GUILD 16+10*6 // increased max guild members +6 per 1 extension levels [Lupus]
-#define MAX_GUILDPOSITION 20 // increased max guild positions to accomodate for all members [Valaris] (removed) [PoW]
-#define MAX_GUILDEXPULSION 32
-#define MAX_GUILDALLIANCE 16
-#define MAX_GUILDSKILL 15 // increased max guild skills because of new skills [Sara-chan]
-#define MAX_GUILDCASTLE 24 // increased to include novice castles [Valaris]
-#define MAX_GUILDLEVEL 50
-#define MAX_GUARDIANS 8 //Local max per castle. [Skotlex]
-
-#define MIN_HAIR_STYLE battle_config.min_hair_style
-#define MAX_HAIR_STYLE battle_config.max_hair_style
-#define MIN_HAIR_COLOR battle_config.min_hair_color
-#define MAX_HAIR_COLOR battle_config.max_hair_color
-#define MIN_CLOTH_COLOR battle_config.min_cloth_color
-#define MAX_CLOTH_COLOR battle_config.max_cloth_color
-
-// for produce
-#define MIN_ATTRIBUTE 0
-#define MAX_ATTRIBUTE 4
-#define ATTRIBUTE_NORMAL 0
-#define MIN_STAR 0
-#define MAX_STAR 3
-
-#define MIN_PORTAL_MEMO 0
-#define MAX_PORTAL_MEMO 2
-
-#define MAX_STATUS_TYPE 5
-
-#define WEDDING_RING_M 2634
-#define WEDDING_RING_F 2635
-
-//For character names, title names, guilds, maps, etc.
-//Includes null-terminator as it is the length of the array.
-#define NAME_LENGTH 24
-//For item names, which tend to have much longer names.
-#define ITEM_NAME_LENGTH 50
-//For Map Names, which the client considers to be 16 in length
-#define MAP_NAME_LENGTH 16
-
-#define MAX_FRIENDS 40
-#define MAX_MEMOPOINTS 10
-
-//Size of the fame list arrays.
-#define MAX_FAME_LIST 10
-//These max values can be exceeded and the char/map servers will update them with no problems
-//These are just meant to minimize the updating needed between char/map servers as players login.
-//Room for initial 10K accounts
-#define DEFAULT_MAX_ACCOUNT_ID 2010000
-//Room for initial 100k characters
-#define DEFAULT_MAX_CHAR_ID 250000
-
-#define CHAR_CONF_NAME "conf/char_athena.conf"
-
-//Base Homun skill.
-#define HM_SKILLBASE 8000
-#define MAX_HOMUNSKILL 16
-#define MAX_HOMUNCULUS_CLASS 16 //[orn]
-#define HM_CLASS_BASE 6001
-#define HM_CLASS_MAX 6099
-
-struct item {
- int id;
- short nameid;
- short amount;
- unsigned short equip;
- char identify;
- char refine;
- char attribute;
- short card[MAX_SLOTS];
-};
-
-struct point{
- unsigned short map;
- short x,y;
-};
-
-struct skill {
- unsigned short id,lv,flag;
-};
-
-struct global_reg {
- char str[32];
- char value[256]; // [zBuffer]
-};
-
-//Holds array of global registries, used by the char server and converter.
-struct accreg {
- int account_id, char_id;
- int reg_num;
- struct global_reg reg[MAX_REG_NUM];
-};
-
-//For saving status changes across sessions. [Skotlex]
-struct status_change_data {
- unsigned short type; //SC_type
- int val1, val2, val3, val4, tick; //Remaining duration.
-};
-
-struct s_pet {
- int account_id;
- int char_id;
- int pet_id;
- short class_;
- short level;
- short egg_id;//pet egg id
- short equip;//pet equip name_id
- short intimate;//pet friendly
- short hungry;//pet hungry
- char name[NAME_LENGTH];
- char rename_flag;
- char incuvate;
-};
-
-struct s_homunculus { //[orn]
- char name[NAME_LENGTH];
- int hom_id;
- int char_id;
- short class_;
- int hp,max_hp,sp,max_sp;
- unsigned int intimacy; //[orn]
- short hunger;
- struct skill hskill[MAX_HOMUNSKILL]; //albator
- short skillpts;
- short level;
- unsigned int exp;
- short rename_flag;
- short vaporize; //albator
- int str ;
- int agi ;
- int vit ;
- int int_ ;
- int dex ;
- int luk ;
-};
-
-struct friend {
- int account_id;
- int char_id;
- char name[NAME_LENGTH];
-};
-
-struct mmo_charstatus {
- int char_id;
- int account_id;
- int partner_id;
- int father;
- int mother;
- int child;
-
- unsigned int base_exp,job_exp;
- int zeny;
-
- short class_;
- unsigned short status_point,skill_point;
- int hp,max_hp,sp,max_sp;
- unsigned int option;
- short manner;
- unsigned char karma;
- short hair,hair_color,clothes_color;
- int party_id,guild_id,pet_id,hom_id;
- int fame;
-
- short weapon,shield;
- short head_top,head_mid,head_bottom;
-
- char name[NAME_LENGTH];
- unsigned int base_level,job_level;
- short str,agi,vit,int_,dex,luk;
- unsigned char char_num,sex;
-
- unsigned long mapip;
- unsigned int mapport;
-
- struct point last_point,save_point,memo_point[MAX_MEMOPOINTS];
- struct item inventory[MAX_INVENTORY],cart[MAX_CART];
- struct skill skill[MAX_SKILL];
-
- struct friend friends[MAX_FRIENDS]; //New friend system [Skotlex]
-};
-
-struct registry {
- int global_num;
- struct global_reg global[GLOBAL_REG_NUM];
- int account_num;
- struct global_reg account[ACCOUNT_REG_NUM];
- int account2_num;
- struct global_reg account2[ACCOUNT_REG2_NUM];
-};
-
-struct storage {
- int dirty;
- int account_id;
- short storage_status;
- short storage_amount;
- struct item storage_[MAX_STORAGE];
-};
-
-struct guild_storage {
- int dirty;
- int guild_id;
- short storage_status;
- short storage_amount;
- struct item storage_[MAX_GUILD_STORAGE];
-};
-
-struct map_session_data;
-
-struct gm_account {
- int account_id;
- int level;
-};
-
-struct party_member {
- int account_id;
- int char_id;
- char name[NAME_LENGTH];
- unsigned short class_;
- unsigned short map;
- unsigned short lv;
- unsigned leader : 1,
- online : 1;
-};
-
-struct party {
- int party_id;
- char name[NAME_LENGTH];
- unsigned char count; //Count of online characters.
- unsigned exp : 1,
- item : 2; //&1: Party-Share (round-robin), &2: pickup style: shared.
- struct party_member member[MAX_PARTY];
-};
-
-struct guild_member {
- int account_id, char_id;
- short hair,hair_color,gender,class_,lv;
- unsigned int exp;
- int exp_payper;
- short online,position;
- int rsv1,rsv2;
- char name[NAME_LENGTH];
- struct map_session_data *sd;
- unsigned char modified;
-};
-
-struct guild_position {
- char name[NAME_LENGTH];
- int mode;
- int exp_mode;
- unsigned char modified;
-};
-
-struct guild_alliance {
- int opposition;
- int guild_id;
- char name[NAME_LENGTH];
-};
-
-struct guild_expulsion {
- char name[NAME_LENGTH];
- char mes[40];
- char acc[40];
- int account_id;
- int rsv1,rsv2,rsv3;
-};
-
-struct guild_skill {
- int id,lv;
-};
-
-struct guild {
- int guild_id;
- short guild_lv, connect_member, max_member, average_lv;
- unsigned int exp,next_exp;
- int skill_point;
-#ifdef TXT_ONLY
- //FIXME: Gotta remove this variable completely, but doing so screws up the format of the txt save file...
- int castle_id;
-#endif
- char name[NAME_LENGTH],master[NAME_LENGTH];
- struct guild_member member[MAX_GUILD];
- struct guild_position position[MAX_GUILDPOSITION];
- char mes1[60],mes2[120];
- int emblem_len,emblem_id;
- char emblem_data[2048];
- struct guild_alliance alliance[MAX_GUILDALLIANCE];
- struct guild_expulsion expulsion[MAX_GUILDEXPULSION];
- struct guild_skill skill[MAX_GUILDSKILL];
-#ifndef TXT_ONLY
- unsigned short save_flag;
-#endif
-};
-
-struct guild_castle {
- int castle_id;
- char map_name[MAP_NAME_LENGTH];
- char castle_name[NAME_LENGTH];
- char castle_event[NAME_LENGTH];
- int guild_id;
- int economy;
- int defense;
- int triggerE;
- int triggerD;
- int nextTime;
- int payTime;
- int createTime;
- int visibleC;
- struct {
- unsigned visible : 1;
- int hp;
- int id;
- } guardian[MAX_GUARDIANS]; //New simplified structure. [Skotlex]
-};
-struct square {
- int val1[5];
- int val2[5];
-};
-
-struct fame_list {
- int id;
- int fame;
- char name[NAME_LENGTH];
-};
-
-enum {
- GBI_EXP =1, // ギルドのEXP
- GBI_GUILDLV, // ギルドのLv
- GBI_SKILLPOINT, // ギルドのスキルポイント
- GBI_SKILLLV, // ギルドスキルLv
-};
-
-enum {
- GMI_POSITION =0, // メンバーの役職変更
- GMI_EXP,
- GMI_HAIR,
- GMI_HAIR_COLOR,
- GMI_GENDER,
- GMI_CLASS,
- GMI_LEVEL,
-};
-
-enum {
- GD_SKILLBASE=10000,
- GD_APPROVAL=10000,
- GD_KAFRACONTRACT=10001,
- GD_GUARDIANRESEARCH=10002,
- GD_GUARDUP=10003,
- GD_EXTENSION=10004,
- GD_GLORYGUILD=10005,
- GD_LEADERSHIP=10006,
- GD_GLORYWOUNDS=10007,
- GD_SOULCOLD=10008,
- GD_HAWKEYES=10009,
- GD_BATTLEORDER=10010,
- GD_REGENERATION=10011,
- GD_RESTORE=10012,
- GD_EMERGENCYCALL=10013,
- GD_DEVELOPMENT=10014,
-};
-
-
-//These mark the ID of the jobs, as expected by the client. [Skotlex]
-enum {
- JOB_NOVICE,
- JOB_SWORDMAN,
- JOB_MAGE,
- JOB_ARCHER,
- JOB_ACOLYTE,
- JOB_MERCHANT,
- JOB_THIEF,
- JOB_KNIGHT,
- JOB_PRIEST,
- JOB_WIZARD,
- JOB_BLACKSMITH,
- JOB_HUNTER,
- JOB_ASSASSIN,
- JOB_KNIGHT2,
- JOB_CRUSADER,
- JOB_MONK,
- JOB_SAGE,
- JOB_ROGUE,
- JOB_ALCHEMIST,
- JOB_BARD,
- JOB_DANCER,
- JOB_CRUSADER2,
- JOB_WEDDING,
- JOB_SUPER_NOVICE,
- JOB_GUNSLINGER,
- JOB_NINJA,
- JOB_XMAS,
-
- JOB_NOVICE_HIGH = 4001,
- JOB_SWORDMAN_HIGH,
- JOB_MAGE_HIGH,
- JOB_ARCHER_HIGH,
- JOB_ACOLYTE_HIGH,
- JOB_MERCHANT_HIGH,
- JOB_THIEF_HIGH,
- JOB_LORD_KNIGHT,
- JOB_HIGH_PRIEST,
- JOB_HIGH_WIZARD,
- JOB_WHITESMITH,
- JOB_SNIPER,
- JOB_ASSASSIN_CROSS,
- JOB_LORD_KNIGHT2,
- JOB_PALADIN,
- JOB_CHAMPION,
- JOB_PROFESSOR,
- JOB_STALKER,
- JOB_CREATOR,
- JOB_CLOWN,
- JOB_GYPSY,
- JOB_PALADIN2,
-
- JOB_BABY,
- JOB_BABY_SWORDMAN,
- JOB_BABY_MAGE,
- JOB_BABY_ARCHER,
- JOB_BABY_ACOLYTE,
- JOB_BABY_MERCHANT,
- JOB_BABY_THIEF,
- JOB_BABY_KNIGHT,
- JOB_BABY_PRIEST,
- JOB_BABY_WIZARD,
- JOB_BABY_BLACKSMITH,
- JOB_BABY_HUNTER,
- JOB_BABY_ASSASSIN,
- JOB_BABY_KNIGHT2,
- JOB_BABY_CRUSADER,
- JOB_BABY_MONK,
- JOB_BABY_SAGE,
- JOB_BABY_ROGUE,
- JOB_BABY_ALCHEMIST,
- JOB_BABY_BARD,
- JOB_BABY_DANCER,
- JOB_BABY_CRUSADER2,
- JOB_SUPER_BABY,
-
- JOB_TAEKWON,
- JOB_STAR_GLADIATOR,
- JOB_STAR_GLADIATOR2,
- JOB_SOUL_LINKER,
-};
-
-#ifndef __WIN32
- #ifndef strcmpi
- #define strcmpi strcasecmp
- #endif
- #ifndef stricmp
- #define stricmp strcasecmp
- #endif
- #ifndef strncmpi
- #define strncmpi strncasecmp
- #endif
- #ifndef strnicmp
- #define strnicmp strncasecmp
- #endif
-#else
- #define snprintf _snprintf
- #define vsnprintf _vsnprintf
- #ifndef strncmpi
- #define strncmpi strnicmp
- #endif
-#endif
-
-#endif // _MMO_H_
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#ifndef _MMO_H_ +#define _MMO_H_ + +#include <time.h> +#include "utils.h" // _WIN32 + +#if ! defined(Assert) +#if defined(RELEASE) +#define Assert(EX) +#else +// extern "C" { +#include <assert.h> +// } +#ifndef DEFCPP +#if defined(_WIN32) && !defined(MINGW) +#include <crtdbg.h> +#endif +#endif +#define Assert(EX) assert(EX) +#endif +#endif /* ! defined(Assert) */ + +#ifdef CYGWIN +// txtやlogなどの書き出すファイルの改行コード +#define RETCODE "\r\n" // (CR/LF:Windows系) +#else +#define RETCODE "\n" // (LF:Unix系) +#endif + +#define RET RETCODE + +#define FIFOSIZE_SERVERLINK 256*1024 + +// set to 0 to not check IP of player between each server. +// set to another value if you want to check (1) +#define CMP_AUTHFIFO_IP 1 + +#define CMP_AUTHFIFO_LOGIN2 1 + +//Remove/Comment this line to disable sc_data saving. [Skotlex] +#define ENABLE_SC_SAVING + +#define MAX_MAP_PER_SERVER 1024 +#define MAX_INVENTORY 100 +//Number of slots carded equipment can have. Never set to less than 4 as they are also used to keep the data of forged items/equipment. [Skotlex] +//Note: The client seems unable to receive data for more than 4 slots due to all related packets having a fixed size. +#define MAX_SLOTS 4 +#define MAX_AMOUNT 30000 +#define MAX_ZENY 1000000000 +#define MAX_FAME 1000000000 +#define MAX_CART 100 +#define MAX_SKILL 1100 // Bumped to 1100 for new quest skills, will need to further increase one day... [DracoRPG] +#define GLOBAL_REG_NUM 96 +#define ACCOUNT_REG_NUM 64 +#define ACCOUNT_REG2_NUM 16 +//Should hold the max of GLOBAL/ACCOUNT/ACCOUNT2 (needed for some arrays that hold all three) +#define MAX_REG_NUM 96 +#define DEFAULT_WALK_SPEED 150 +#define MIN_WALK_SPEED 0 +#define MAX_WALK_SPEED 1000 +#define MAX_STORAGE 300 +#define MAX_GUILD_STORAGE 1000 +#define MAX_PARTY 12 +#define MAX_GUILD 16+10*6 // increased max guild members +6 per 1 extension levels [Lupus] +#define MAX_GUILDPOSITION 20 // increased max guild positions to accomodate for all members [Valaris] (removed) [PoW] +#define MAX_GUILDEXPULSION 32 +#define MAX_GUILDALLIANCE 16 +#define MAX_GUILDSKILL 15 // increased max guild skills because of new skills [Sara-chan] +#define MAX_GUILDCASTLE 24 // increased to include novice castles [Valaris] +#define MAX_GUILDLEVEL 50 +#define MAX_GUARDIANS 8 //Local max per castle. [Skotlex] + +#define MIN_HAIR_STYLE battle_config.min_hair_style +#define MAX_HAIR_STYLE battle_config.max_hair_style +#define MIN_HAIR_COLOR battle_config.min_hair_color +#define MAX_HAIR_COLOR battle_config.max_hair_color +#define MIN_CLOTH_COLOR battle_config.min_cloth_color +#define MAX_CLOTH_COLOR battle_config.max_cloth_color + +// for produce +#define MIN_ATTRIBUTE 0 +#define MAX_ATTRIBUTE 4 +#define ATTRIBUTE_NORMAL 0 +#define MIN_STAR 0 +#define MAX_STAR 3 + +#define MIN_PORTAL_MEMO 0 +#define MAX_PORTAL_MEMO 2 + +#define MAX_STATUS_TYPE 5 + +#define WEDDING_RING_M 2634 +#define WEDDING_RING_F 2635 + +//For character names, title names, guilds, maps, etc. +//Includes null-terminator as it is the length of the array. +#define NAME_LENGTH 24 +//For item names, which tend to have much longer names. +#define ITEM_NAME_LENGTH 50 +//For Map Names, which the client considers to be 16 in length +#define MAP_NAME_LENGTH 16 + +#define MAX_FRIENDS 40 +#define MAX_MEMOPOINTS 10 + +//Size of the fame list arrays. +#define MAX_FAME_LIST 10 +//These max values can be exceeded and the char/map servers will update them with no problems +//These are just meant to minimize the updating needed between char/map servers as players login. +//Room for initial 10K accounts +#define DEFAULT_MAX_ACCOUNT_ID 2010000 + +#define START_ACCOUNT_NUM 2000000 +#define END_ACCOUNT_NUM 100000000 + +//Room for initial 100k characters +#define DEFAULT_MAX_CHAR_ID 250000 + +#define CHAR_CONF_NAME "conf/char_athena.conf" + +//Base Homun skill. +#define HM_SKILLBASE 8000 +#define MAX_HOMUNSKILL 16 +#define MAX_HOMUNCULUS_CLASS 16 //[orn] +#define HM_CLASS_BASE 6001 +#define HM_CLASS_MAX 6099 + +struct item { + int id; + short nameid; + short amount; + unsigned short equip; + char identify; + char refine; + char attribute; + short card[MAX_SLOTS]; +}; + +struct point{ + unsigned short map; + short x,y; +}; + +struct skill { + unsigned short id,lv,flag; +}; + +struct global_reg { + char str[32]; + char value[256]; // [zBuffer] +}; + +//Holds array of global registries, used by the char server and converter. +struct accreg { + int account_id, char_id; + int reg_num; + struct global_reg reg[MAX_REG_NUM]; +}; + +//For saving status changes across sessions. [Skotlex] +struct status_change_data { + unsigned short type; //SC_type + int val1, val2, val3, val4, tick; //Remaining duration. +}; + +struct s_pet { + int account_id; + int char_id; + int pet_id; + short class_; + short level; + short egg_id;//pet egg id + short equip;//pet equip name_id + short intimate;//pet friendly + short hungry;//pet hungry + char name[NAME_LENGTH]; + char rename_flag; + char incuvate; +}; + +struct s_homunculus { //[orn] + char name[NAME_LENGTH]; + int hom_id; + int char_id; + short class_; + int hp,max_hp,sp,max_sp; + unsigned int intimacy; //[orn] + short hunger; + struct skill hskill[MAX_HOMUNSKILL]; //albator + short skillpts; + short level; + unsigned int exp; + short rename_flag; + short vaporize; //albator + int str ; + int agi ; + int vit ; + int int_ ; + int dex ; + int luk ; +}; + +struct friend { + int account_id; + int char_id; + char name[NAME_LENGTH]; +}; + +struct mmo_charstatus { + int char_id; + int account_id; + int partner_id; + int father; + int mother; + int child; + + unsigned int base_exp,job_exp; + int zeny; + + short class_; + unsigned short status_point,skill_point; + int hp,max_hp,sp,max_sp; + unsigned int option; + short manner; + unsigned char karma; + short hair,hair_color,clothes_color; + int party_id,guild_id,pet_id,hom_id; + int fame; + + short weapon,shield; + short head_top,head_mid,head_bottom; + + char name[NAME_LENGTH]; + unsigned int base_level,job_level; + short str,agi,vit,int_,dex,luk; + unsigned char char_num,sex; + + unsigned long mapip; + unsigned int mapport; + + struct point last_point,save_point,memo_point[MAX_MEMOPOINTS]; + struct item inventory[MAX_INVENTORY],cart[MAX_CART]; + struct skill skill[MAX_SKILL]; + + struct friend friends[MAX_FRIENDS]; //New friend system [Skotlex] +}; + +struct registry { + int global_num; + struct global_reg global[GLOBAL_REG_NUM]; + int account_num; + struct global_reg account[ACCOUNT_REG_NUM]; + int account2_num; + struct global_reg account2[ACCOUNT_REG2_NUM]; +}; + +struct storage { + int dirty; + int account_id; + short storage_status; + short storage_amount; + struct item storage_[MAX_STORAGE]; +}; + +struct guild_storage { + int dirty; + int guild_id; + short storage_status; + short storage_amount; + struct item storage_[MAX_GUILD_STORAGE]; +}; + +struct map_session_data; + +struct gm_account { + int account_id; + int level; +}; + +struct party_member { + int account_id; + int char_id; + char name[NAME_LENGTH]; + unsigned short class_; + unsigned short map; + unsigned short lv; + unsigned leader : 1, + online : 1; +}; + +struct party { + int party_id; + char name[NAME_LENGTH]; + unsigned char count; //Count of online characters. + unsigned exp : 1, + item : 2; //&1: Party-Share (round-robin), &2: pickup style: shared. + struct party_member member[MAX_PARTY]; +}; + +struct guild_member { + int account_id, char_id; + short hair,hair_color,gender,class_,lv; + unsigned int exp; + int exp_payper; + short online,position; + int rsv1,rsv2; + char name[NAME_LENGTH]; + struct map_session_data *sd; + unsigned char modified; +}; + +struct guild_position { + char name[NAME_LENGTH]; + int mode; + int exp_mode; + unsigned char modified; +}; + +struct guild_alliance { + int opposition; + int guild_id; + char name[NAME_LENGTH]; +}; + +struct guild_expulsion { + char name[NAME_LENGTH]; + char mes[40]; + char acc[40]; + int account_id; + int rsv1,rsv2,rsv3; +}; + +struct guild_skill { + int id,lv; +}; + +struct guild { + int guild_id; + short guild_lv, connect_member, max_member, average_lv; + unsigned int exp,next_exp; + int skill_point; +#ifdef TXT_ONLY + //FIXME: Gotta remove this variable completely, but doing so screws up the format of the txt save file... + int castle_id; +#endif + char name[NAME_LENGTH],master[NAME_LENGTH]; + struct guild_member member[MAX_GUILD]; + struct guild_position position[MAX_GUILDPOSITION]; + char mes1[60],mes2[120]; + int emblem_len,emblem_id; + char emblem_data[2048]; + struct guild_alliance alliance[MAX_GUILDALLIANCE]; + struct guild_expulsion expulsion[MAX_GUILDEXPULSION]; + struct guild_skill skill[MAX_GUILDSKILL]; +#ifndef TXT_ONLY + unsigned short save_flag; +#endif +}; + +struct guild_castle { + int castle_id; + char map_name[MAP_NAME_LENGTH]; + char castle_name[NAME_LENGTH]; + char castle_event[NAME_LENGTH]; + int guild_id; + int economy; + int defense; + int triggerE; + int triggerD; + int nextTime; + int payTime; + int createTime; + int visibleC; + struct { + unsigned visible : 1; + int hp; + int id; + } guardian[MAX_GUARDIANS]; //New simplified structure. [Skotlex] +}; +struct square { + int val1[5]; + int val2[5]; +}; + +struct fame_list { + int id; + int fame; + char name[NAME_LENGTH]; +}; + +enum { + GBI_EXP =1, // ギルドのEXP + GBI_GUILDLV, // ギルドのLv + GBI_SKILLPOINT, // ギルドのスキルポイント + GBI_SKILLLV, // ギルドスキルLv +}; + +enum { + GMI_POSITION =0, // メンバーの役職変更 + GMI_EXP, + GMI_HAIR, + GMI_HAIR_COLOR, + GMI_GENDER, + GMI_CLASS, + GMI_LEVEL, +}; + +enum { + GD_SKILLBASE=10000, + GD_APPROVAL=10000, + GD_KAFRACONTRACT=10001, + GD_GUARDIANRESEARCH=10002, + GD_GUARDUP=10003, + GD_EXTENSION=10004, + GD_GLORYGUILD=10005, + GD_LEADERSHIP=10006, + GD_GLORYWOUNDS=10007, + GD_SOULCOLD=10008, + GD_HAWKEYES=10009, + GD_BATTLEORDER=10010, + GD_REGENERATION=10011, + GD_RESTORE=10012, + GD_EMERGENCYCALL=10013, + GD_DEVELOPMENT=10014, +}; + + +//These mark the ID of the jobs, as expected by the client. [Skotlex] +enum { + JOB_NOVICE, + JOB_SWORDMAN, + JOB_MAGE, + JOB_ARCHER, + JOB_ACOLYTE, + JOB_MERCHANT, + JOB_THIEF, + JOB_KNIGHT, + JOB_PRIEST, + JOB_WIZARD, + JOB_BLACKSMITH, + JOB_HUNTER, + JOB_ASSASSIN, + JOB_KNIGHT2, + JOB_CRUSADER, + JOB_MONK, + JOB_SAGE, + JOB_ROGUE, + JOB_ALCHEMIST, + JOB_BARD, + JOB_DANCER, + JOB_CRUSADER2, + JOB_WEDDING, + JOB_SUPER_NOVICE, + JOB_GUNSLINGER, + JOB_NINJA, + JOB_XMAS, + + JOB_NOVICE_HIGH = 4001, + JOB_SWORDMAN_HIGH, + JOB_MAGE_HIGH, + JOB_ARCHER_HIGH, + JOB_ACOLYTE_HIGH, + JOB_MERCHANT_HIGH, + JOB_THIEF_HIGH, + JOB_LORD_KNIGHT, + JOB_HIGH_PRIEST, + JOB_HIGH_WIZARD, + JOB_WHITESMITH, + JOB_SNIPER, + JOB_ASSASSIN_CROSS, + JOB_LORD_KNIGHT2, + JOB_PALADIN, + JOB_CHAMPION, + JOB_PROFESSOR, + JOB_STALKER, + JOB_CREATOR, + JOB_CLOWN, + JOB_GYPSY, + JOB_PALADIN2, + + JOB_BABY, + JOB_BABY_SWORDMAN, + JOB_BABY_MAGE, + JOB_BABY_ARCHER, + JOB_BABY_ACOLYTE, + JOB_BABY_MERCHANT, + JOB_BABY_THIEF, + JOB_BABY_KNIGHT, + JOB_BABY_PRIEST, + JOB_BABY_WIZARD, + JOB_BABY_BLACKSMITH, + JOB_BABY_HUNTER, + JOB_BABY_ASSASSIN, + JOB_BABY_KNIGHT2, + JOB_BABY_CRUSADER, + JOB_BABY_MONK, + JOB_BABY_SAGE, + JOB_BABY_ROGUE, + JOB_BABY_ALCHEMIST, + JOB_BABY_BARD, + JOB_BABY_DANCER, + JOB_BABY_CRUSADER2, + JOB_SUPER_BABY, + + JOB_TAEKWON, + JOB_STAR_GLADIATOR, + JOB_STAR_GLADIATOR2, + JOB_SOUL_LINKER, +}; + +#ifndef __WIN32 + #ifndef strcmpi + #define strcmpi strcasecmp + #endif + #ifndef stricmp + #define stricmp strcasecmp + #endif + #ifndef strncmpi + #define strncmpi strncasecmp + #endif + #ifndef strnicmp + #define strnicmp strncasecmp + #endif +#else + #define snprintf _snprintf + #define vsnprintf _vsnprintf + #ifndef strncmpi + #define strncmpi strnicmp + #endif +#endif + +#endif // _MMO_H_ diff --git a/src/login/login.h b/src/login/login.h index 1581a068e..5a12902c7 100644 --- a/src/login/login.h +++ b/src/login/login.h @@ -1,46 +1,44 @@ -// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _LOGIN_H_
-#define _LOGIN_H_
-
-#include "../common/mmo.h"
-
-#define MAX_SERVERS 30
-
-#define LOGIN_CONF_NAME "conf/login_athena.conf"
-#define LAN_CONF_NAME "conf/subnet_athena.conf"
-#define PASSWORDENC 3 // A definition is given when making an encryption password correspond.
- // It is 1 at the time of passwordencrypt.
- // It is made into 2 at the time of passwordencrypt2.
- // When it is made 3, it corresponds to both.
-#define START_ACCOUNT_NUM 2000000
-#define END_ACCOUNT_NUM 100000000
-
-extern int login_port;
-struct mmo_account {
- int version; //Added for version check [Sirius]
- char userid[NAME_LENGTH];
- char passwd[NAME_LENGTH];
- int passwdenc;
-
- long account_id;
- long login_id1;
- long login_id2;
- long char_id;
- char lastlogin[24];
- int sex;
-};
-
-struct mmo_char_server {
- char name[21];
- long ip;
- short port;
- int users;
- int maintenance;
- int new_;
-};
-
-extern struct mmo_char_server server[MAX_SERVERS];
-extern int server_fd[MAX_SERVERS];
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#ifndef _LOGIN_H_ +#define _LOGIN_H_ + +#include "../common/mmo.h" + +#define MAX_SERVERS 30 + +#define LOGIN_CONF_NAME "conf/login_athena.conf" +#define LAN_CONF_NAME "conf/subnet_athena.conf" +#define PASSWORDENC 3 // A definition is given when making an encryption password correspond. + // It is 1 at the time of passwordencrypt. + // It is made into 2 at the time of passwordencrypt2. + // When it is made 3, it corresponds to both. + +extern int login_port; +struct mmo_account { + int version; //Added for version check [Sirius] + char userid[NAME_LENGTH]; + char passwd[NAME_LENGTH]; + int passwdenc; + + long account_id; + long login_id1; + long login_id2; + long char_id; + char lastlogin[24]; + int sex; +}; + +struct mmo_char_server { + char name[21]; + long ip; + short port; + int users; + int maintenance; + int new_; +}; + +extern struct mmo_char_server server[MAX_SERVERS]; +extern int server_fd[MAX_SERVERS]; +#endif diff --git a/src/map/clif.c b/src/map/clif.c index 1e81c2f34..b419fdae6 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -6827,10 +6827,10 @@ int clif_guild_basicinfo(struct map_session_data *sd) WFIFOL(fd,18)=g->average_lv; WFIFOL(fd,22)=g->exp; WFIFOL(fd,26)=g->next_exp; - WFIFOL(fd,30)=0; // 上納 - WFIFOL(fd,34)=0; // VW(性格の悪さ?:性向グラフ左右) - WFIFOL(fd,38)=0; // RF(正義の度合い?:性向グラフ上下) - WFIFOL(fd,42)=0; // 人数? + WFIFOL(fd,30)=0; // Tax Points + WFIFOL(fd,34)=0; // Tendency: (left) Vulgar [-100,100] Famed (right) + WFIFOL(fd,38)=0; // Tendency: (down) Wicked [-100,100] Righteous (up) + WFIFOL(fd,42)=0; //## Unknown... // 人数? memcpy(WFIFOP(fd,46),g->name, NAME_LENGTH); memcpy(WFIFOP(fd,70),g->master, NAME_LENGTH); @@ -8111,40 +8111,29 @@ static int clif_guess_PacketVer(int fd, int get_previous) packet_ver = clif_config.packet_db_ver; cmd = RFIFOW(fd,0); packet_len = RFIFOREST(fd); - - if ( - cmd == clif_config.connect_cmd[packet_ver] && - packet_len == packet_db[packet_ver][cmd].len && - ((value = RFIFOB(fd, packet_db[packet_ver][cmd].pos[4])) == 0 || value == 1) && - (value = RFIFOL(fd, packet_db[packet_ver][cmd].pos[0])) > 700000 && //Account ID is valid - value <= max_account_id && - (value = RFIFOL(fd, packet_db[packet_ver][cmd].pos[1])) > 0 && //Char ID is valid - value <= max_char_id && - (int)RFIFOL(fd, packet_db[packet_ver][cmd].pos[2]) > 0 //Login 1 is a positive value (?) - ) + +#define IS_PACKET_VER \ +(\ + ( cmd == clif_config.connect_cmd[packet_ver] ) /* it's the wanttoconnection for this version. */ &&\ + ( packet_len == packet_db[packet_ver][cmd].len ) /* has the right size */ &&\ + ( (value=(int)RFIFOL(fd, packet_db[packet_ver][cmd].pos[0])) >= START_ACCOUNT_NUM && value <= max_account_id ) /* valid account ID */ &&\ + ( (value=(int)RFIFOL(fd, packet_db[packet_ver][cmd].pos[1])) > 0 && value <= max_char_id ) /* valid char ID */ &&\ + /* RFIFOL(fd, packet_db[packet_ver][cmd].pos[2]) - don't care about login_id1 */\ + /* RFIFOL(fd, packet_db[packet_ver][cmd].pos[3]) - don't care about client_tick */\ + ( (value=(int)RFIFOB(fd, packet_db[packet_ver][cmd].pos[4])) == 0 || value == 1 ) /* valid sex */\ +) + + if (IS_PACKET_VER) return clif_config.packet_db_ver; //Default packet version found. for (packet_ver = MAX_PACKET_VER; packet_ver > 0; packet_ver--) { //Start guessing the version, giving priority to the newer ones. [Skotlex] - if (cmd != clif_config.connect_cmd[packet_ver] || //it is not a wanttoconnection for this version. - packet_len != packet_db[packet_ver][cmd].len) //The size of the wantoconnection packet does not matches. - continue; - - if ( - (value = RFIFOL(fd, packet_db[packet_ver][cmd].pos[0])) < 700000 || value > max_account_id - || (value = RFIFOL(fd, packet_db[packet_ver][cmd].pos[1])) < 1 || value > max_char_id - //What is login 1? In my tests it is a very very high value. - || (int)RFIFOL(fd, packet_db[packet_ver][cmd].pos[2]) < 1 - //This check seems redundant, all wanttoconnection packets have the gender on the very - //last byte of the packet. - || (value = RFIFOB(fd, packet_db[packet_ver][cmd].pos[4])) < 0 || value > 1 - ) - continue; - - return packet_ver; //This is our best guess. + if (IS_PACKET_VER) + return packet_ver; //This is our best guess. } packet_ver = -1; return -1; +#undef IS_PACKET_VER } // ------------ @@ -11741,7 +11730,7 @@ void clif_parse_debug(int fd,struct map_session_data *sd) */ int clif_parse(int fd) { int packet_len = 0, cmd, packet_ver, dump = 0; - struct map_session_data *sd; + TBL_PC *sd; RFIFOHEAD(fd); if (fd <= 0) @@ -11750,7 +11739,7 @@ int clif_parse(int fd) { return 0; } - sd = (struct map_session_data*)session[fd]->session_data; + sd = (TBL_PC *)session[fd]->session_data; if (sd && sd->fd != fd) { //FIXME: Temporal debug until a certain mysterious crash is fixed. @@ -11792,6 +11781,10 @@ int clif_parse(int fd) { cmd = RFIFOW(fd,0); + /* + // These are remants of ladmin packet processing, only in the login server now. [FlavioJS] + // @see int parse_admin(int) + // 管理用パケット処理 if (cmd >= 30000) { switch(cmd) { @@ -11820,12 +11813,14 @@ int clif_parse(int fd) { } return 0; } + */ // get packet version before to parse packet_ver = 0; if (sd) { packet_ver = sd->packet_ver; if (packet_ver < 0 || packet_ver > MAX_PACKET_VER) { // This should never happen unless we have some corrupted memory issues :X [Skotlex] + ShowWarning("clif_parse: Invalid packet_ver=%d (AID/CID: %d:%d), disconnecting session #%d.", packet_ver, sd->status.account_id, sd->status.char_id, fd); session[fd]->eof = 1; return 0; } diff --git a/src/map/script.c b/src/map/script.c index e6a673d22..36094bfb9 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -25,6 +25,7 @@ #include "../common/nullpo.h" #include "../common/showmsg.h" #include "../common/strlib.h" +#include "../common/utils.h" #include "map.h" #include "clif.h" @@ -60,6 +61,9 @@ enum { LABEL_NEXTLINE=1,LABEL_START }; static unsigned char * script_buf = NULL; static int script_pos,script_size; +#define GETVALUE(buf,i) ((int)MakeDWord(MakeWord((buf)[i],(buf)[i+1]),MakeWord((buf)[i+2],0))) +#define SETVALUE(buf,i,n) ((buf)[i]=GetByte(n,0),(buf)[i+1]=GetByte(n,1),(buf)[i+2]=GetByte(n,2)) + static char *str_buf; static int str_pos,str_size; static struct str_data_struct { @@ -444,11 +448,9 @@ void set_label(int l,int pos, unsigned char *script_pos) str_data[l].type=(str_data[l].type == C_USERFUNC ? C_USERFUNC_POS : C_POS); str_data[l].label=pos; for(i=str_data[l].backpatch;i>=0 && i!=0x00ffffff;){ - next=(*(int*)(script_buf+i)) & 0x00ffffff; + next=GETVALUE(script_buf,i); script_buf[i-1]=(str_data[l].type == C_USERFUNC ? C_USERFUNC_POS : C_POS); - script_buf[i]=pos; - script_buf[i+1]=pos>>8; - script_buf[i+2]=pos>>16; + SETVALUE(script_buf,i,pos); i=next; } } @@ -1694,10 +1696,8 @@ struct script_code* parse_script(unsigned char *src,const char *file,int line) str_data[i].type=C_NAME; str_data[i].label=i; for(j=str_data[i].backpatch;j>=0 && j!=0x00ffffff;){ - next=(*(int*)(script_buf+j)) & 0x00ffffff; - script_buf[j]=i; - script_buf[j+1]=i>>8; - script_buf[j+2]=i>>16; + next=GETVALUE(script_buf,j); + SETVALUE(script_buf,j,i); j=next; } } @@ -2628,7 +2628,7 @@ void run_script_main(struct script_state *st) st->state = RUN; while(st->state == RUN){ - c= get_com((unsigned char *) st->script->script_buf,&st->pos); + c= get_com(st->script->script_buf,&st->pos); switch(c){ case C_EOL: if(stack->sp!=stack->defsp){ @@ -2647,18 +2647,18 @@ void run_script_main(struct script_state *st) } break; case C_INT: - push_val(stack,C_INT,get_num((unsigned char *) st->script->script_buf,&st->pos)); + push_val(stack,C_INT,get_num(st->script->script_buf,&st->pos)); break; case C_POS: case C_NAME: - push_val(stack,c,(*(int*)(st->script->script_buf+st->pos))&0xffffff); + push_val(stack,c,GETVALUE(st->script->script_buf,st->pos)); st->pos+=3; break; case C_ARG: push_val(stack,c,0); break; case C_STR: - push_str(stack,C_CONSTSTR,(unsigned char *) (st->script->script_buf+st->pos)); + push_str(stack,C_CONSTSTR,(st->script->script_buf+st->pos)); while(st->script->script_buf[st->pos++]); break; case C_FUNC: |