فهرست منبع

- Moved START_ACCOUNT_NUM and END_ACCOUNT_NUM from login.h to mmo.h and changed clif_guess_PacketVer to use that.
- Made the script engine big-endian compatible. (i know it's pointless because of the move to eApp, but just couldn't resist :S)
- Commented out the remnants of ladmin packet parsing in map-server.
- Added a warning when a player has an invalid packet version (shouldn't happen)

PS- also added info on clif_guild_basicinfo packet fields, if anyone is interested

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@9408 54d463be-8e91-2dee-dedb-b68131a5f0ec

FlavioJS 18 سال پیش
والد
کامیت
6fda364348
5فایلهای تغییر یافته به همراه627 افزوده شده و 622 حذف شده
  1. 8 0
      Changelog-Trunk.txt
  2. 535 531
      src/common/mmo.h
  3. 44 46
      src/login/login.h
  4. 28 33
      src/map/clif.c
  5. 12 12
      src/map/script.c

+ 8 - 0
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

+ 535 - 531
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_

+ 44 - 46
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

+ 28 - 33
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;
 		}

+ 12 - 12
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: