summaryrefslogtreecommitdiff
path: root/src/char_sql
diff options
context:
space:
mode:
Diffstat (limited to 'src/char_sql')
-rw-r--r--src/char_sql/char.c338
-rw-r--r--src/char_sql/inter.c273
2 files changed, 290 insertions, 321 deletions
diff --git a/src/char_sql/char.c b/src/char_sql/char.c
index f9a431f73..b9abe1038 100644
--- a/src/char_sql/char.c
+++ b/src/char_sql/char.c
@@ -743,27 +743,15 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
int memitemdata_to_sql(struct itemtmp mapitem[], int count, int char_id, int tableswitch)
{
int i,j, flag, id;
- char *tablename;
+ char* tablename;
char selectoption[16];
- char * str_p = tmp_sql;
+ char* str_p = tmp_sql;
switch (tableswitch) {
- case TABLE_INVENTORY:
- tablename = inventory_db; // no need for sprintf here as *_db are char*.
- sprintf(selectoption,"char_id");
- break;
- case TABLE_CART:
- tablename = cart_db;
- sprintf(selectoption,"char_id");
- break;
- case TABLE_STORAGE:
- tablename = storage_db;
- sprintf(selectoption,"account_id");
- break;
- case TABLE_GUILD_STORAGE:
- tablename = guild_storage_db;
- sprintf(selectoption,"guild_id");
- break;
+ case TABLE_INVENTORY: tablename = inventory_db; sprintf(selectoption,"char_id"); break;
+ case TABLE_CART: tablename = cart_db; sprintf(selectoption,"char_id"); break;
+ case TABLE_STORAGE: tablename = storage_db; sprintf(selectoption,"account_id"); break;
+ case TABLE_GUILD_STORAGE: tablename = guild_storage_db; sprintf(selectoption,"guild_id"); break;
default:
ShowError("Invalid table name!\n");
return 1;
@@ -1578,50 +1566,45 @@ int count_users(void)
/// Writes char data to the buffer in the format used by the client.
/// Used in packets 0x6b (chars info) and 0x6d (new char info)
/// Returns the size (106 or 108)
-int mmo_char_tobuf(uint8* buf, struct mmo_charstatus *p)
+int mmo_char_tobuf(uint8* buf, struct mmo_charstatus* p)
{
if( buf == NULL || p == NULL )
return 0;
WBUFL(buf,0) = p->char_id;
- WBUFL(buf,4) = p->base_exp>LONG_MAX?LONG_MAX:p->base_exp;
+ WBUFL(buf,4) = min(p->base_exp, LONG_MAX);
WBUFL(buf,8) = p->zeny;
- WBUFL(buf,12) = p->job_exp>LONG_MAX?LONG_MAX:p->job_exp;
+ WBUFL(buf,12) = min(p->job_exp, LONG_MAX);
WBUFL(buf,16) = p->job_level;
-
- WBUFL(buf,20) = 0;// probably opt1
- WBUFL(buf,24) = 0;// probably opt2
+ WBUFL(buf,20) = 0; // probably opt1
+ WBUFL(buf,24) = 0; // probably opt2
WBUFL(buf,28) = p->option;
-
WBUFL(buf,32) = p->karma;
WBUFL(buf,36) = p->manner;
-
- WBUFW(buf,40) = (p->status_point > SHRT_MAX) ? SHRT_MAX : p->status_point;
- WBUFW(buf,42) = (p->hp > SHRT_MAX) ? SHRT_MAX : p->hp;
- WBUFW(buf,44) = (p->max_hp > SHRT_MAX) ? SHRT_MAX : p->max_hp;
- WBUFW(buf,46) = (p->sp > SHRT_MAX) ? SHRT_MAX : p->sp;
- WBUFW(buf,48) = (p->max_sp > SHRT_MAX) ? SHRT_MAX : p->max_sp;
+ WBUFW(buf,40) = min(p->status_point, SHRT_MAX);
+ WBUFW(buf,42) = min(p->hp, SHRT_MAX);
+ WBUFW(buf,44) = min(p->max_hp, SHRT_MAX);
+ WBUFW(buf,46) = min(p->sp, SHRT_MAX);
+ WBUFW(buf,48) = min(p->max_sp, SHRT_MAX);
WBUFW(buf,50) = DEFAULT_WALK_SPEED; // p->speed;
WBUFW(buf,52) = p->class_;
WBUFW(buf,54) = p->hair;
WBUFW(buf,56) = p->option&0x20 ? 0 : p->weapon; //When the weapon is sent and your option is riding, the client crashes on login!?
WBUFW(buf,58) = p->base_level;
- WBUFW(buf,60) = (p->skill_point > SHRT_MAX) ? SHRT_MAX : p->skill_point;
+ WBUFW(buf,60) = min(p->skill_point, SHRT_MAX);
WBUFW(buf,62) = p->head_bottom;
WBUFW(buf,64) = p->shield;
WBUFW(buf,66) = p->head_top;
WBUFW(buf,68) = p->head_mid;
WBUFW(buf,70) = p->hair_color;
WBUFW(buf,72) = p->clothes_color;
-
memcpy(WBUFP(buf,74), p->name, NAME_LENGTH);
-
- WBUFB(buf,98) = (p->str > UCHAR_MAX) ? UCHAR_MAX : p->str;
- WBUFB(buf,99) = (p->agi > UCHAR_MAX) ? UCHAR_MAX : p->agi;
- WBUFB(buf,100) = (p->vit > UCHAR_MAX) ? UCHAR_MAX : p->vit;
- WBUFB(buf,101) = (p->int_ > UCHAR_MAX) ? UCHAR_MAX : p->int_;
- WBUFB(buf,102) = (p->dex > UCHAR_MAX) ? UCHAR_MAX : p->dex;
- WBUFB(buf,103) = (p->luk > UCHAR_MAX) ? UCHAR_MAX : p->luk;
+ WBUFB(buf,98) = min(p->str, UCHAR_MAX);
+ WBUFB(buf,99) = min(p->agi, UCHAR_MAX);
+ WBUFB(buf,100) = min(p->vit, UCHAR_MAX);
+ WBUFB(buf,101) = min(p->int_, UCHAR_MAX);
+ WBUFB(buf,102) = min(p->dex, UCHAR_MAX);
+ WBUFB(buf,103) = min(p->luk, UCHAR_MAX);
//Updated packet structure with rename-button included. Credits to Sara-chan
#if PACKETVER > 7
WBUFW(buf,104) = p->char_num;
@@ -1633,11 +1616,11 @@ int mmo_char_tobuf(uint8* buf, struct mmo_charstatus *p)
#endif
}
-int mmo_char_send006b(int fd, struct char_session_data *sd)
+int mmo_char_send006b(int fd, struct char_session_data* sd)
{
int i, j, found_num = 0;
- set_char_online(-1, 99,sd->account_id);
+ set_char_online(-1, 99, sd->account_id);
//search char.
sprintf(tmp_sql, "SELECT `char_id` FROM `%s` WHERE `account_id` = '%d' AND `char_num` < '%d'",char_db, sd->account_id, MAX_CHARS);
@@ -1664,19 +1647,17 @@ int mmo_char_send006b(int fd, struct char_session_data *sd)
ShowInfo("Loading Char Data ("CL_BOLD"%d"CL_RESET")\n",sd->account_id);
- j = 24;// offset
+ j = 24; // offset
+ WFIFOHEAD(fd, j + found_num*108);
+ WFIFOW(fd,0) = 0x6b;
+ memset(WFIFOP(fd,4), 0, 20); // unknown bytes
+ for(i = 0; i < found_num; i++)
{
- WFIFOHEAD(fd, j + found_num*108);
- WFIFOW(fd,0) = 0x6b;
- memset(WFIFOP(fd,4), 0, 20);// unknown bytes
- for(i = 0; i < found_num; i++)
- {
- mmo_char_fromsql(sd->found_char[i], &char_dat, false);
- j += mmo_char_tobuf(WFIFOP(fd,j), &char_dat);
- }
- WFIFOW(fd,2) = j;// packet len
- WFIFOSET(fd,j);
+ mmo_char_fromsql(sd->found_char[i], &char_dat, false);
+ j += mmo_char_tobuf(WFIFOP(fd,j), &char_dat);
}
+ WFIFOW(fd,2) = j; // packet len
+ WFIFOSET(fd,j);
return 0;
}
@@ -1728,7 +1709,7 @@ static void char_auth_ok(int fd, struct char_session_data *sd)
int send_accounts_tologin(int tid, unsigned int tick, int id, int data);
-int parse_tologin(int fd)
+int parse_fromlogin(int fd)
{
int i;
struct char_session_data *sd;
@@ -1749,8 +1730,9 @@ int parse_tologin(int fd)
// hehe. no need to set user limit on SQL version. :P
// but char limitation is good way to maintain server. :D
- while(RFIFOREST(fd) >= 2) {
-// printf("parse_tologin : %d %d %x\n", fd, RFIFOREST(fd), RFIFOW(fd, 0));
+ while(RFIFOREST(fd) >= 2)
+ {
+// printf("parse_fromlogin : %d %d %x\n", fd, RFIFOREST(fd), RFIFOW(fd, 0));
switch(RFIFOW(fd,0)) {
case 0x2711:
@@ -2608,13 +2590,11 @@ int parse_frommap(int fd)
if (RFIFOREST(fd) < 35)
return 0;
{
- unsigned short name;
int map_id, map_fd = -1;
struct online_char_data* data;
struct mmo_charstatus* char_data;
- name = RFIFOW(fd,18);
- map_id = search_mapserver(name, ntohl(RFIFOL(fd,24)), ntohs(RFIFOW(fd,28))); //Locate mapserver by ip and port.
+ map_id = search_mapserver(RFIFOW(fd,18), ntohl(RFIFOL(fd,24)), ntohs(RFIFOW(fd,28))); //Locate mapserver by ip and port.
if (map_id >= 0)
map_fd = server_fd[map_id];
//Char should just had been saved before this packet, so this should be safe. [Skotlex]
@@ -2975,20 +2955,23 @@ int parse_frommap(int fd)
return 0;
}
+// Searches for the mapserver that has a given map (and optionally ip/port, if not -1).
+// If found, returns the server's index in the 'server' array (otherwise returns -1).
int search_mapserver(unsigned short map, uint32 ip, uint16 port)
{
int i, j;
-
+
for(i = 0; i < MAX_MAP_SERVERS; i++)
- if (server_fd[i] > 0)
+ {
+ if (server_fd[i] > 0
+ && (ip == (uint32)-1 || server[i].ip == ip)
+ && (port == (uint16)-1 || server[i].port == port))
+ {
for (j = 0; server[i].map[j]; j++)
- if (server[i].map[j] == map) {
- if (ip != (uint32)-1 && server[i].ip != ip)
- continue;
- if (port != (uint16)-1 && server[i].port != port)
- continue;
+ if (server[i].map[j] == map)
return i;
- }
+ }
+ }
return -1;
}
@@ -3615,7 +3598,7 @@ int check_connect_login_server(int tid, unsigned int tick, int id, int data)
login_fd = 0;
return 0;
}
- session[login_fd]->func_parse = parse_tologin;
+ session[login_fd]->func_parse = parse_fromlogin;
realloc_fifo(login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
WFIFOHEAD(login_fd,86);
@@ -3705,16 +3688,16 @@ int char_lan_config_read(const char *lancfgName)
}
#endif //TXT_SQL_CONVERT
-void sql_config_read(const char *cfgName)
+void sql_config_read(const char* cfgName)
{
char line[1024], w1[1024], w2[1024];
- FILE *fp;
+ FILE* fp;
ShowInfo("Reading file %s...\n", cfgName);
if ((fp = fopen(cfgName, "r")) == NULL) {
- ShowFatalError("file not found: %s\n", cfgName);
- exit(1);
+ ShowError("file not found: %s\n", cfgName);
+ return;
}
while(fgets(line, sizeof(line), fp))
@@ -3725,96 +3708,93 @@ void sql_config_read(const char *cfgName)
if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2)
continue;
- if(strcmpi(w1,"char_db")==0){
+ if(!strcmpi(w1,"char_db"))
strcpy(char_db,w2);
#ifndef TXT_SQL_CONVERT
- } else if(strcmpi(w1, "gm_read_method") == 0) {
- if(atoi(w2) != 0)
- char_gm_read = true;
- else
- char_gm_read = false;
+ else if(!strcmpi(w1,"gm_read_method"))
+ char_gm_read = config_switch(w2);
//custom columns for login database
- }else if(strcmpi(w1,"login_db")==0){
- strcpy(login_db, w2);
- }else if(strcmpi(w1,"login_db_level")==0){
+ else if(!strcmpi(w1,"login_db"))
+ strcpy(login_db,w2);
+ else if(!strcmpi(w1,"login_db_level"))
strcpy(login_db_level,w2);
- }else if(strcmpi(w1,"login_db_account_id")==0){
+ else if(!strcmpi(w1,"login_db_account_id"))
strcpy(login_db_account_id,w2);
- }else if(strcmpi(w1,"lowest_gm_level")==0){
+ else if(!strcmpi(w1,"lowest_gm_level")) {
lowest_gm_level = atoi(w2);
- ShowStatus("set lowest_gm_level : %s\n",w2);
+ ShowStatus("set lowest_gm_level : %s\n", w2);
+ }
#endif
- }else if(strcmpi(w1,"scdata_db")==0){
+ else if(!strcmpi(w1,"scdata_db"))
strcpy(scdata_db,w2);
- }else if(strcmpi(w1,"cart_db")==0){
+ else if(!strcmpi(w1,"cart_db"))
strcpy(cart_db,w2);
- }else if(strcmpi(w1,"inventory_db")==0){
- strcpy(inventory_db,w2);
- }else if(strcmpi(w1,"charlog_db")==0){
+ else if(!strcmpi(w1,"inventory_db"))
+ strcpy(inventory_db, w2);
+ else if(!strcmpi(w1,"charlog_db"))
strcpy(charlog_db,w2);
- }else if(strcmpi(w1,"storage_db")==0){
+ else if(!strcmpi(w1,"storage_db"))
strcpy(storage_db,w2);
- }else if(strcmpi(w1,"reg_db")==0){
+ else if(!strcmpi(w1,"reg_db"))
strcpy(reg_db,w2);
- }else if(strcmpi(w1,"skill_db")==0){
+ else if(!strcmpi(w1,"skill_db"))
strcpy(skill_db,w2);
- }else if(strcmpi(w1,"interlog_db")==0){
+ else if(!strcmpi(w1,"interlog_db"))
strcpy(interlog_db,w2);
- }else if(strcmpi(w1,"memo_db")==0){
+ else if(!strcmpi(w1,"memo_db"))
strcpy(memo_db,w2);
- }else if(strcmpi(w1,"guild_db")==0){
+ else if(!strcmpi(w1,"guild_db"))
strcpy(guild_db,w2);
- }else if(strcmpi(w1,"guild_alliance_db")==0){
+ else if(!strcmpi(w1,"guild_alliance_db"))
strcpy(guild_alliance_db,w2);
- }else if(strcmpi(w1,"guild_castle_db")==0){
+ else if(!strcmpi(w1,"guild_castle_db"))
strcpy(guild_castle_db,w2);
- }else if(strcmpi(w1,"guild_expulsion_db")==0){
+ else if(!strcmpi(w1,"guild_expulsion_db"))
strcpy(guild_expulsion_db,w2);
- }else if(strcmpi(w1,"guild_member_db")==0){
+ else if(!strcmpi(w1,"guild_member_db"))
strcpy(guild_member_db,w2);
- }else if(strcmpi(w1,"guild_skill_db")==0){
+ else if(!strcmpi(w1,"guild_skill_db"))
strcpy(guild_skill_db,w2);
- }else if(strcmpi(w1,"guild_position_db")==0){
+ else if(!strcmpi(w1,"guild_position_db"))
strcpy(guild_position_db,w2);
- }else if(strcmpi(w1,"guild_storage_db")==0){
+ else if(!strcmpi(w1,"guild_storage_db"))
strcpy(guild_storage_db,w2);
- }else if(strcmpi(w1,"party_db")==0){
+ else if(!strcmpi(w1,"party_db"))
strcpy(party_db,w2);
- }else if(strcmpi(w1,"pet_db")==0){
+ else if(!strcmpi(w1,"pet_db"))
strcpy(pet_db,w2);
- }else if(strcmpi(w1,"friend_db")==0){
+ else if(!strcmpi(w1,"friend_db"))
strcpy(friend_db,w2);
#ifndef TXT_SQL_CONVERT
- }else if(strcmpi(w1,"db_path")==0){
+ else if(!strcmpi(w1,"db_path"))
strcpy(db_path,w2);
- //Map server option to use SQL db or not
- }else if(strcmpi(w1,"use_sql_db")==0){ // added for sql item_db read for char server [Valaris]
+ //Map server option to use SQL item/mob-db or not
+ else if(!strcmpi(w1,"use_sql_db")==0){
db_use_sqldbs = config_switch(w2);
ShowStatus("Using SQL dbs: %s\n",w2);
- }else if(strcmpi(w1,"item_db_db")==0){
+ }
+ else if(!strcmpi(w1,"item_db_db"))
strcpy(item_db_db,w2);
- }else if(strcmpi(w1,"item_db2_db")==0){
+ else if(!strcmpi(w1,"item_db2_db"))
strcpy(item_db2_db,w2);
#endif
//support the import command, just like any other config
- }else if(strcmpi(w1,"import")==0){
+ else if(!strcmpi(w1,"import"))
sql_config_read(w2);
- }
-
}
fclose(fp);
ShowInfo("Done reading %s.\n", cfgName);
}
#ifndef TXT_SQL_CONVERT
-int char_config_read(const char *cfgName)
+int char_config_read(const char* cfgName)
{
char line[1024], w1[1024], w2[1024];
FILE* fp = fopen(cfgName, "r");
if (fp == NULL) {
- ShowFatalError("Configuration file not found: %s.\n", cfgName);
- exit(1);
+ ShowError("Configuration file not found: %s.\n", cfgName);
+ return 1;
}
ShowInfo("Reading configuration file %s...\n", cfgName);
@@ -3968,7 +3948,6 @@ int char_config_read(const char *cfgName)
void do_final(void)
{
ShowInfo("Doing final stage...\n");
- //inter_save();
do_final_itemdb();
//check SQL save progress.
//wait until save char complete
@@ -4074,11 +4053,8 @@ int do_init(int argc, char **argv)
mmo_char_sql_init();
ShowInfo("char server initialized.\n");
-// ShowDebug("set parser -> parse_char()...\n");
set_defaultparse(parse_char);
-// ShowDebug("set terminate function -> do_final().....\n");
-
if ((naddr_ != 0) && (!login_ip || !char_ip))
{
char ip_str[16];
@@ -4124,32 +4100,32 @@ int do_init(int argc, char **argv)
{
//##TODO invoke a CONSOLE_START plugin event
}
-
+
//Cleaning the tables for NULL entrys @ startup [Sirius]
- //Chardb clean
- ShowInfo("Cleaning the '%s' table...\n", char_db);
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `account_id` = '0'", char_db);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- //guilddb clean
- ShowInfo("Cleaning the '%s' table...\n", guild_db);
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_lv` = '0' AND `max_member` = '0' AND `exp` = '0' AND `next_exp` = '0' AND `average_lv` = '0'", guild_db);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- //guildmemberdb clean
- ShowInfo("Cleaning the '%s' table...\n", guild_member_db);
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '0' AND `account_id` = '0' AND `char_id` = '0'", guild_member_db);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
+ //Chardb clean
+ ShowInfo("Cleaning the '%s' table...\n", char_db);
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `account_id` = '0'", char_db);
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ //guilddb clean
+ ShowInfo("Cleaning the '%s' table...\n", guild_db);
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_lv` = '0' AND `max_member` = '0' AND `exp` = '0' AND `next_exp` = '0' AND `average_lv` = '0'", guild_db);
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
+ //guildmemberdb clean
+ ShowInfo("Cleaning the '%s' table...\n", guild_member_db);
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '0' AND `account_id` = '0' AND `char_id` = '0'", guild_member_db);
+ if(mysql_query(&mysql_handle, tmp_sql)){
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+
ShowInfo("End of char server initilization function.\n");
ShowStatus("The char-server is "CL_GREEN"ready"CL_RESET" (Server is listening on the port %d).\n\n", char_port);
return 0;
@@ -4157,47 +4133,47 @@ int do_init(int argc, char **argv)
int char_child(int parent_id, int child_id)
{
- int tmp_id = 0;
- sprintf (tmp_sql, "SELECT `child` FROM `%s` WHERE `char_id` = '%d'", char_db, parent_id);
- if (mysql_query (&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result (&mysql_handle);
- sql_row = sql_res?mysql_fetch_row (sql_res):NULL;
- if (sql_row)
- tmp_id = atoi (sql_row[0]);
- else
- ShowError("CHAR: child Failed!\n");
- if (sql_res) mysql_free_result (sql_res);
- if ( tmp_id == child_id )
- return 1;
- else
- return 0;
+ int tmp_id = 0;
+ sprintf (tmp_sql, "SELECT `child` FROM `%s` WHERE `char_id` = '%d'", char_db, parent_id);
+ if (mysql_query (&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result (&mysql_handle);
+ sql_row = sql_res?mysql_fetch_row (sql_res):NULL;
+ if (sql_row)
+ tmp_id = atoi (sql_row[0]);
+ else
+ ShowError("CHAR: child Failed!\n");
+ if (sql_res) mysql_free_result (sql_res);
+ if ( tmp_id == child_id )
+ return 1;
+ else
+ return 0;
}
-int char_married(int pl1,int pl2)
+int char_married(int pl1, int pl2)
{
- int tmp_id = 0;
- sprintf (tmp_sql, "SELECT `partner_id` FROM `%s` WHERE `char_id` = '%d'", char_db, pl1);
- if (mysql_query (&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result (&mysql_handle);
- sql_row = sql_res?mysql_fetch_row (sql_res):NULL;
- if (sql_row)
- tmp_id = atoi (sql_row[0]);
- else
- ShowError("CHAR: married Failed!\n");
- if (sql_res) mysql_free_result (sql_res);
- if ( tmp_id == pl2 )
- return 1;
- else
- return 0;
+ int tmp_id = 0;
+ sprintf (tmp_sql, "SELECT `partner_id` FROM `%s` WHERE `char_id` = '%d'", char_db, pl1);
+ if (mysql_query (&mysql_handle, tmp_sql)) {
+ ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ }
+ sql_res = mysql_store_result (&mysql_handle);
+ sql_row = sql_res?mysql_fetch_row (sql_res):NULL;
+ if (sql_row)
+ tmp_id = atoi (sql_row[0]);
+ else
+ ShowError("CHAR: married Failed!\n");
+ if (sql_res) mysql_free_result (sql_res);
+ if ( tmp_id == pl2 )
+ return 1;
+ else
+ return 0;
}
-int char_family(int pl1,int pl2,int pl3)
+int char_family(int pl1, int pl2, int pl3)
{
int charid, partnerid, childid;
sprintf (tmp_sql, "SELECT `char_id`,`partner_id`,`child` FROM `%s` WHERE `char_id` IN ('%d','%d','%d')", char_db, pl1, pl2, pl3);
diff --git a/src/char_sql/inter.c b/src/char_sql/inter.c
index 8f2386a91..fbff7b7fb 100644
--- a/src/char_sql/inter.c
+++ b/src/char_sql/inter.c
@@ -51,29 +51,29 @@ char main_chat_nick[16] = "Main";
// sending packet list
// NOTE: This variable ain't used at all! And it's confusing.. where do I add that the length of packet 0x2b07 is 10? x.x [Skotlex]
-int inter_send_packet_length[]={
- -1,-1,27,-1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- -1, 7, 0, 0, 0, 0, 0, 0, -1,11, 0, 0, 0, 0, 0, 0,
- 35,-1,11,15, 34,29, 7,-1, 0, 0, 0, 0, 0, 0, 0, 0,
- 10,-1,15, 0, 79,19, 7,-1, 0,-1,-1,-1, 14,67,186,-1,
- 9, 9,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 11,-1, 7, 3, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+int inter_send_packet_length[] = {
+ -1,-1,27,-1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3800-
+ -1, 7, 0, 0, 0, 0, 0, 0, -1,11, 0, 0, 0, 0, 0, 0, // 3810-
+ 35,-1,11,15, 34,29, 7,-1, 0, 0, 0, 0, 0, 0, 0, 0, // 3820-
+ 10,-1,15, 0, 79,19, 7,-1, 0,-1,-1,-1, 14,67,186,-1, // 3830-
+ 9, 9,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3840-
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3850-
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3860-
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3870-
+ 11,-1, 7, 3, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3880-
};
// recv. packet list
-int inter_recv_packet_length[]={
- -1,-1, 7,-1, -1,13,36, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3000-0x300f
- 6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 0, 0, 0, 0, 0, 0, //0x3010-0x301f
- -1, 6,-1,14, 14,19, 6,-1, 14,14, 0, 0, 0, 0, 0, 0, //0x3020-0x302f
- -1, 6,-1,-1, 55,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1, //0x3030-0x303f
- 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 48,14,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3080-0x308f
- -1,10,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x3090 - 0x309f Homunculus packets [albator]
+int inter_recv_packet_length[] = {
+ -1,-1, 7,-1, -1,13,36, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3000-
+ 6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 0, 0, 0, 0, 0, 0, // 3010-
+ -1, 6,-1,14, 14,19, 6,-1, 14,14, 0, 0, 0, 0, 0, 0, // 3020-
+ -1, 6,-1,-1, 55,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1, // 3030-
+ 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3040-
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3050-
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3060-
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3070-
+ 48,14,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3080-
+ -1,10,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3090- Homunculus packets [albator]
};
struct WisData {
@@ -187,86 +187,83 @@ int inter_accreg_sql_init(void)
/*==========================================
* read config file
*------------------------------------------*/
-static int inter_config_read(const char *cfgName)
+static int inter_config_read(const char* cfgName)
{
int i;
char line[1024], w1[1024], w2[1024];
- FILE *fp;
+ FILE* fp;
- fp=fopen(cfgName,"r");
- if(fp==NULL){
+ fp = fopen(cfgName, "r");
+ if(fp == NULL) {
ShowError("file not found: %s\n", cfgName);
return 1;
}
- ShowInfo("reading file %s...\n",cfgName);
+ ShowInfo("reading file %s...\n", cfgName);
while(fgets(line, sizeof(line), fp))
{
- i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
- if(i!=2)
+ i = sscanf(line, "%[^:]: %[^\r\n]", w1, w2);
+ if(i != 2)
continue;
- if(strcmpi(w1,"char_server_ip")==0){
- strcpy(char_server_ip, w2);
- ShowStatus ("set char_server_ip : %s\n",w2);
- }
- else if(strcmpi(w1,"char_server_port")==0){
- char_server_port=atoi(w2);
- ShowStatus ("set char_server_port : %s\n",w2);
- }
- else if(strcmpi(w1,"char_server_id")==0){
- strcpy(char_server_id, w2);
- ShowStatus ("set char_server_id : %s\n",w2);
- }
- else if(strcmpi(w1,"char_server_pw")==0){
- strcpy(char_server_pw, w2);
- ShowStatus ("set char_server_pw : %s\n",w2);
- }
- else if(strcmpi(w1,"char_server_db")==0){
- strcpy(char_server_db, w2);
- ShowStatus ("set char_server_db : %s\n",w2);
- }
- else if(strcmpi(w1,"default_codepage")==0){
- strcpy(default_codepage, w2);
- ShowStatus ("set default_codepage : %s\n",w2);
+ if(!strcmpi(w1,"char_server_ip")) {
+ strcpy(char_server_ip,w2);
+ ShowStatus ("set char_server_ip : %s\n", w2);
+ } else
+ if(!strcmpi(w1,"char_server_port")) {
+ char_server_port = atoi(w2);
+ ShowStatus ("set char_server_port : %s\n", w2);
+ } else
+ if(!strcmpi(w1,"char_server_id")) {
+ strcpy(char_server_id,w2);
+ ShowStatus ("set char_server_id : %s\n", w2);
+ } else
+ if(!strcmpi(w1,"char_server_pw")) {
+ strcpy(char_server_pw,w2);
+ ShowStatus ("set char_server_pw : %s\n", w2);
+ } else
+ if(!strcmpi(w1,"char_server_db")) {
+ strcpy(char_server_db,w2);
+ ShowStatus ("set char_server_db : %s\n", w2);
+ } else
+ if(!strcmpi(w1,"default_codepage")) {
+ strcpy(default_codepage,w2);
+ ShowStatus ("set default_codepage : %s\n", w2);
}
//Logins information to be read from the inter_athena.conf
//for character deletion (checks email in the loginDB)
- else if(strcmpi(w1,"login_server_ip")==0){
+ else
+ if(!strcmpi(w1,"login_server_ip")) {
strcpy(login_server_ip, w2);
- ShowStatus ("set login_server_ip : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_port")==0){
- login_server_port=atoi(w2);
- ShowStatus ("set login_server_port : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_id")==0){
+ ShowStatus ("set login_server_ip : %s\n", w2);
+ } else
+ if(!strcmpi(w1,"login_server_port")) {
+ login_server_port = atoi(w2);
+ ShowStatus ("set login_server_port : %s\n", w2);
+ } else
+ if(!strcmpi(w1,"login_server_id")) {
strcpy(login_server_id, w2);
- ShowStatus ("set login_server_id : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_pw")==0){
+ ShowStatus ("set login_server_id : %s\n", w2);
+ } else
+ if(!strcmpi(w1,"login_server_pw")) {
strcpy(login_server_pw, w2);
- ShowStatus ("set login_server_pw : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_db")==0){
+ ShowStatus ("set login_server_pw : %s\n", w2);
+ } else
+ if(!strcmpi(w1,"login_server_db")) {
strcpy(login_server_db, w2);
- ShowStatus ("set login_server_db : %s\n",w2);
+ ShowStatus ("set login_server_db : %s\n", w2);
}
#ifndef TXT_SQL_CONVERT
- else if(strcmpi(w1,"party_share_level")==0){
- party_share_level=(unsigned int)atof(w2);
- }
- else if(strcmpi(w1,"log_inter")==0){
+ else if(!strcmpi(w1,"party_share_level"))
+ party_share_level = atoi(w2);
+ else if(!strcmpi(w1,"log_inter"))
log_inter = atoi(w2);
- }
- else if(strcmpi(w1, "main_chat_nick")==0){ // Main chat nick [LuzZza]
- strcpy(main_chat_nick, w2); //
- }
+ else if(!strcmpi(w1,"main_chat_nick"))
+ strcpy(main_chat_nick, w2);
#endif //TXT_SQL_CONVERT
- else if(strcmpi(w1,"import")==0){
+ else if(!strcmpi(w1,"import"))
inter_config_read(w2);
- }
}
fclose(fp);
@@ -277,7 +274,7 @@ static int inter_config_read(const char *cfgName)
#ifndef TXT_SQL_CONVERT
// Save interlog into sql
-int inter_log(char *fmt,...)
+int inter_log(char* fmt, ...)
{
char str[255];
char temp_str[510]; //Needs be twice as long as str[] //Skotlex
@@ -438,7 +435,8 @@ int inter_sql_test (void)
}
// finalize
-void inter_final(void) {
+void inter_final(void)
+{
wis_db->destroy(wis_db, NULL);
inter_guild_sql_final();
@@ -451,7 +449,8 @@ void inter_final(void) {
return;
}
-int inter_mapif_init(int fd) {
+int inter_mapif_init(int fd)
+{
inter_guild_mapif_init(fd);
return 0;
@@ -461,20 +460,22 @@ int inter_mapif_init(int fd) {
//--------------------------------------------------------
// GM message sending
-int mapif_GMmessage(unsigned char *mes, int len, unsigned long color, int sfd) {
+int mapif_GMmessage(unsigned char *mes, int len, unsigned long color, int sfd)
+{
unsigned char buf[2048];
if (len > 2048) len = 2047; //Make it fit to avoid crashes. [Skotlex]
- WBUFW(buf, 0) = 0x3800;
- WBUFW(buf, 2) = len;
- WBUFL(buf, 4) = color;
- memcpy(WBUFP(buf, 8), mes, len-8);
+ WBUFW(buf,0) = 0x3800;
+ WBUFW(buf,2) = len;
+ WBUFL(buf,4) = color;
+ memcpy(WBUFP(buf,8), mes, len - 8);
mapif_sendallwos(sfd, buf, len);
return 0;
}
// Wis sending
-int mapif_wis_message(struct WisData *wd) {
+int mapif_wis_message(struct WisData *wd)
+{
unsigned char buf[2048];
if (wd->len > 2047-56) wd->len = 2047-56; //Force it to fit to avoid crashes. [Skotlex]
@@ -549,11 +550,11 @@ int mapif_send_gmaccounts()
WBUFW(buf,0) = 0x2b15;
for(i = 0; i < GM_num; i++) {
- WBUFL(buf, len) = gm_account[i].account_id;
- WBUFB(buf, len+4) = (unsigned char)gm_account[i].level;
+ WBUFL(buf,len) = gm_account[i].account_id;
+ WBUFB(buf,len+4) = (uint8)gm_account[i].level;
len += 5;
}
- WBUFW(buf, 2) = len;
+ WBUFW(buf,2) = len;
mapif_sendall(buf, len);
return 0;
@@ -588,7 +589,8 @@ int mapif_disconnectplayer(int fd, int account_id, int char_id, int reason)
//--------------------------------------------------------
// Existence check of WISP data
-int check_ttl_wisdata_sub(DBKey key, void *data, va_list ap) {
+int check_ttl_wisdata_sub(DBKey key, void *data, va_list ap)
+{
unsigned long tick;
struct WisData *wd = (struct WisData *)data;
tick = va_arg(ap, unsigned long);
@@ -599,7 +601,8 @@ int check_ttl_wisdata_sub(DBKey key, void *data, va_list ap) {
return 0;
}
-int check_ttl_wisdata(void) {
+int check_ttl_wisdata(void)
+{
unsigned long tick = gettick();
int i;
@@ -623,18 +626,18 @@ int check_ttl_wisdata(void) {
// GM message sending
int mapif_parse_GMmessage(int fd)
{
- RFIFOHEAD(fd);
- mapif_GMmessage(RFIFOP(fd, 8), RFIFOW(fd, 2), RFIFOL(fd, 4), fd);
+ mapif_GMmessage(RFIFOP(fd,8), RFIFOW(fd,2), RFIFOL(fd,4), fd);
return 0;
}
// Wisp/page request to send
-int mapif_parse_WisRequest(int fd) {
+int mapif_parse_WisRequest(int fd)
+{
struct WisData* wd;
static int wisid = 0;
char name[NAME_LENGTH], t_name[NAME_LENGTH*2]; //Needs space to allocate names with escaped chars [Skotlex]
- RFIFOHEAD(fd);
+
if ( fd <= 0 ) {return 0;} // check if we have a valid fd
if (RFIFOW(fd,2)-52 >= sizeof(wd->msg)) {
@@ -676,7 +679,7 @@ int mapif_parse_WisRequest(int fd) {
mapif_send(fd, buf, 27);
} else {
- CREATE(wd, struct WisData, 1);
+ CREATE(wd, struct WisData, 1);
// Whether the failure of previous wisp/page transmission (timeout)
check_ttl_wisdata();
@@ -703,10 +706,11 @@ int mapif_parse_WisRequest(int fd) {
// Wisp/page transmission result
-int mapif_parse_WisReply(int fd) {
+int mapif_parse_WisReply(int fd)
+{
int id, flag;
struct WisData *wd;
- RFIFOHEAD(fd);
+
id = RFIFOL(fd,2);
flag = RFIFOB(fd,6);
wd = idb_get(wis_db, id);
@@ -722,9 +726,10 @@ int mapif_parse_WisReply(int fd) {
}
// Received wisp message from map-server for ALL gm (just copy the message and resends it to ALL map-servers)
-int mapif_parse_WisToGM(int fd) {
+int mapif_parse_WisToGM(int fd)
+{
unsigned char buf[2048]; // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B
- RFIFOHEAD(fd);
+
ShowDebug("Sent packet back!\n");
memcpy(WBUFP(buf,0), RFIFOP(fd,0), RFIFOW(fd,2));
WBUFW(buf, 0) = 0x3803;
@@ -738,7 +743,7 @@ int mapif_parse_Registry(int fd)
{
int j,p,len, max;
struct accreg *reg=accreg_pt;
- RFIFOHEAD(fd);
+
memset(accreg_pt,0,sizeof(struct accreg));
switch (RFIFOB(fd, 12)) {
case 3: //Character registry
@@ -770,26 +775,23 @@ int mapif_parse_Registry(int fd)
// Request the value of all registries.
int mapif_parse_RegistryRequest(int fd)
{
- RFIFOHEAD(fd);
//Load Char Registry
- if (RFIFOB(fd,12))
- mapif_account_reg_reply(fd,RFIFOL(fd,2),RFIFOL(fd,6),3);
+ if (RFIFOB(fd,12)) mapif_account_reg_reply(fd,RFIFOL(fd,2),RFIFOL(fd,6),3);
//Load Account Registry
- if (RFIFOB(fd,11))
- mapif_account_reg_reply(fd,RFIFOL(fd,2),RFIFOL(fd,6),2);
+ if (RFIFOB(fd,11)) mapif_account_reg_reply(fd,RFIFOL(fd,2),RFIFOL(fd,6),2);
//Ask Login Server for Account2 values.
- if (RFIFOB(fd,10))
- request_accreg2(RFIFOL(fd,2),RFIFOL(fd,6)-2);
+ if (RFIFOB(fd,10)) request_accreg2(RFIFOL(fd,2),RFIFOL(fd,6)-2);
return 1;
}
-static void mapif_namechange_ack(int fd, int account_id, int char_id, int type, int flag, char *name){
+static void mapif_namechange_ack(int fd, int account_id, int char_id, int type, int flag, char *name)
+{
WFIFOHEAD(fd, NAME_LENGTH+13);
- WFIFOW(fd, 0) =0x3806;
- WFIFOL(fd, 2) =account_id;
- WFIFOL(fd, 6) =char_id;
- WFIFOB(fd,10) =type;
- WFIFOB(fd,11) =flag;
+ WFIFOW(fd, 0) = 0x3806;
+ WFIFOL(fd, 2) = account_id;
+ WFIFOL(fd, 6) = char_id;
+ WFIFOB(fd,10) = type;
+ WFIFOB(fd,11) = flag;
memcpy(WFIFOP(fd, 12), name, NAME_LENGTH);
WFIFOSET(fd, NAME_LENGTH+13);
}
@@ -800,11 +802,10 @@ int mapif_parse_NameChangeRequest(int fd)
char* name;
int i;
- RFIFOHEAD(fd);
- account_id = RFIFOL(fd, 2);
- char_id = RFIFOL(fd, 6);
- type = RFIFOB(fd, 10);
- name = RFIFOP(fd, 11);
+ account_id = RFIFOL(fd,2);
+ char_id = RFIFOL(fd,6);
+ type = RFIFOB(fd,10);
+ name = RFIFOP(fd,11);
// Check Authorised letters/symbols in the name
if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
@@ -833,22 +834,17 @@ int mapif_parse_NameChangeRequest(int fd)
int inter_parse_frommap(int fd)
{
int cmd;
- int len=0;
- RFIFOHEAD(fd);
- cmd=RFIFOW(fd,0);
+ int len = 0;
+ cmd = RFIFOW(fd,0);
// inter鯖管轄かを調べる
- if(cmd < 0x3000 || cmd >= 0x3000 + (sizeof(inter_recv_packet_length)/
- sizeof(inter_recv_packet_length[0]) ) )
+ if(cmd < 0x3000 || cmd >= 0x3000 + ARRAYLENGTH(inter_recv_packet_length) || inter_recv_packet_length[cmd - 0x3000] == 0)
return 0;
- if (inter_recv_packet_length[cmd-0x3000] == 0) //This is necessary, because otherwise we return 2 and the char server will just hang waiting for packets! [Skotlex]
- return 0;
-
// パケット長を調べる
if((len = inter_check_length(fd, inter_recv_packet_length[cmd - 0x3000])) == 0)
return 2;
- switch(cmd){
+ switch(cmd) {
case 0x3000: mapif_parse_GMmessage(fd); break;
case 0x3001: mapif_parse_WisRequest(fd); break;
case 0x3002: mapif_parse_WisReply(fd); break;
@@ -857,17 +853,15 @@ int inter_parse_frommap(int fd)
case 0x3005: mapif_parse_RegistryRequest(fd); break;
case 0x3006: mapif_parse_NameChangeRequest(fd); break;
default:
- if(inter_party_parse_frommap(fd))
- break;
- if(inter_guild_parse_frommap(fd))
- break;
- if(inter_storage_parse_frommap(fd))
+ if( inter_party_parse_frommap(fd)
+ || inter_guild_parse_frommap(fd)
+ || inter_storage_parse_frommap(fd)
+ || inter_pet_parse_frommap(fd)
+ || inter_homunculus_parse_frommap(fd)
+ )
break;
- if(inter_pet_parse_frommap(fd))
- break;
- if(inter_homunculus_parse_frommap(fd)) //albator
- break;
- return 0;
+ else
+ return 0;
}
RFIFOSKIP(fd, len);
@@ -877,9 +871,8 @@ int inter_parse_frommap(int fd)
// RFIFO check
int inter_check_length(int fd, int length)
{
- RFIFOHEAD(fd);
- if(length==-1){ // v-len packet
- if(RFIFOREST(fd)<4) // packet not yet
+ if(length == -1) { // v-len packet
+ if(RFIFOREST(fd) < 4) // packet not yet
return 0;
length = RFIFOW(fd, 2);
}