diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/char/int_guild.c | 1 | ||||
-rw-r--r-- | src/char_sql/int_mail.c | 46 | ||||
-rw-r--r-- | src/map/clif.c | 25 | ||||
-rw-r--r-- | src/map/intif.c | 54 | ||||
-rw-r--r-- | src/map/map.c | 15 | ||||
-rw-r--r-- | src/map/map.h | 1 |
6 files changed, 57 insertions, 85 deletions
diff --git a/src/char/int_guild.c b/src/char/int_guild.c index 235ddc77a..563ad360e 100644 --- a/src/char/int_guild.c +++ b/src/char/int_guild.c @@ -8,6 +8,7 @@ #include "../common/db.h" #include "../common/lock.h" #include "../common/showmsg.h" +#include "../common/strlib.h" #include "char.h" #include "inter.h" #include "int_storage.h" diff --git a/src/char_sql/int_mail.c b/src/char_sql/int_mail.c index bdf7653f1..528c1be11 100644 --- a/src/char_sql/int_mail.c +++ b/src/char_sql/int_mail.c @@ -128,10 +128,10 @@ static int mail_savemessage(struct mail_message* msg) || SQL_SUCCESS != SqlStmt_BindParam(stmt, 3, SQLDT_STRING, msg->body, strnlen(msg->body, MAIL_BODY_LENGTH)) || SQL_SUCCESS != SqlStmt_Execute(stmt) ) { - Sql_ShowDebug(sql_handle); + SqlStmt_ShowDebug(stmt); j = 0; } else - j = (int)Sql_LastInsertId(sql_handle); + j = (int)SqlStmt_LastInsertId(stmt); StringBuf_Destroy(&buf); @@ -190,7 +190,8 @@ static bool mail_loadmessage(int char_id, int mail_id, struct mail_message* msg) StringBuf_Destroy(&buf); Sql_FreeResult(sql_handle); - ShowDebug("Loaded message (had read flag %d)\n", msg->read); + // this thing converts the database value (0,1,2) into a boolean yes/no + //TODO: provide decent enum instead of using 'magic' values if (msg->read == 1) { msg->read = 0; @@ -374,7 +375,8 @@ static void mapif_Mail_send(int fd, struct mail_message* msg) static void mapif_parse_Mail_send(int fd) { struct mail_message msg; - int mail_id = 0, account_id = 0; + char esc_name[NAME_LENGTH*2+1]; + int account_id = 0; if(RFIFOW(fd,2) != 8 + sizeof(struct mail_message)) return; @@ -383,32 +385,28 @@ static void mapif_parse_Mail_send(int fd) account_id = RFIFOL(fd,4); - if( !msg.dest_id ) + // Try to find the Dest Char by Name + Sql_EscapeStringLen(sql_handle, esc_name, msg.dest_name, strnlen(msg.dest_name, NAME_LENGTH)); + if ( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id`, `char_id` FROM `%s` WHERE `name` = '%s'", char_db, esc_name) ) + Sql_ShowDebug(sql_handle); + else + if ( SQL_SUCCESS == Sql_NextRow(sql_handle) ) { - // Try to find the Dest Char by Name - char esc_name[NAME_LENGTH*2+1]; - - Sql_EscapeStringLen(sql_handle, esc_name, msg.dest_name, strnlen(msg.dest_name, NAME_LENGTH)); - if ( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id`, `char_id` FROM `%s` WHERE `name` = '%s'", char_db, esc_name) ) - Sql_ShowDebug(sql_handle); - else - if ( SQL_SUCCESS == Sql_NextRow(sql_handle) ) - { - char *data; - Sql_GetData(sql_handle, 0, &data, NULL); - if (atoi(data) != account_id) - { // Cannot send mail to char in the same account - Sql_GetData(sql_handle, 1, &data, NULL); - msg.dest_id = atoi(data); - } + char *data; + Sql_GetData(sql_handle, 0, &data, NULL); + if (atoi(data) != account_id) + { // Cannot send mail to char in the same account + Sql_GetData(sql_handle, 1, &data, NULL); + msg.dest_id = atoi(data); } - Sql_FreeResult(sql_handle); } + Sql_FreeResult(sql_handle); if( msg.dest_id > 0 ) - mail_id = mail_savemessage(&msg); + msg.id = mail_savemessage(&msg); + else + msg.id = 0; - msg.id = mail_id; mapif_Mail_send(fd, &msg); } diff --git a/src/map/clif.c b/src/map/clif.c index 3b2fefc1c..0d0aa997b 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -11465,7 +11465,10 @@ void clif_parse_Mail_getattach(int fd, struct map_session_data *sd) weight = data->weight * sd->mail.inbox.msg[i].item.amount; if (weight > sd->max_weight - sd->weight) { - clif_displaymessage(fd, "Attachment to heavy for you..."); + WFIFOHEAD(fd,packet_len(0x245)); + WFIFOW(fd,0) = 0x245; + WFIFOB(fd,2) = 2; + WFIFOSET(fd,packet_len(0x245)); return; } } @@ -11635,7 +11638,6 @@ void clif_Mail_send(int fd, unsigned char flag) /// S 0248 <packet len>.w <nick>.24B <title>.40B <body len>.B <message>.?B void clif_parse_Mail_send(int fd, struct map_session_data *sd) { - struct map_session_data *rd; struct mail_message msg; int body_len; nullpo_retv(sd); @@ -11653,14 +11655,6 @@ void clif_parse_Mail_send(int fd, struct map_session_data *sd) } body_len = RFIFOB(fd,68); - rd = map_nick2sd_nocase(RFIFOP(fd,4)); - - if (rd && rd == sd) { - clif_Mail_send(fd, 1); - mail_removeitem(sd,0); - mail_removezeny(sd,0); - return; - } if (body_len > MAIL_BODY_LENGTH) body_len = MAIL_BODY_LENGTH; @@ -11674,16 +11668,9 @@ void clif_parse_Mail_send(int fd, struct map_session_data *sd) } msg.send_id = sd->status.char_id; + msg.dest_id = 0; // will attempt to resolve name safestrncpy(msg.send_name, sd->status.name, NAME_LENGTH); - - if (rd) { - msg.dest_id = rd->status.char_id; - safestrncpy(msg.dest_name, rd->status.name, NAME_LENGTH); - } else { - msg.dest_id = 0; - safestrncpy(msg.dest_name, (char*)RFIFOP(fd,4), NAME_LENGTH); - } - + safestrncpy(msg.dest_name, (char*)RFIFOP(fd,4), NAME_LENGTH); safestrncpy(msg.title, (char*)RFIFOP(fd,28), MAIL_TITLE_LENGTH); if (body_len) diff --git a/src/map/intif.c b/src/map/intif.c index d6839b180..702ab244a 100644 --- a/src/map/intif.c +++ b/src/map/intif.c @@ -1669,44 +1669,46 @@ int intif_Mail_send(int account_id, struct mail_message *msg) int intif_parse_Mail_send(int fd) { - struct map_session_data *sd = map_charid2sd(RFIFOL(fd,4)); + struct map_session_data* sd = map_charid2sd(RFIFOL(fd,4)); int mail_id = RFIFOL(fd,8); int dest_id = RFIFOL(fd,12); + struct map_session_data* rd; - if (sd == NULL && mail_id > 0) - { - if (battle_config.error_log) + if( mail_id == 0 ) + {// nick->charid lookup failed, no such char + // Return the items to the owner + mail_removeitem(sd, 0); + mail_removezeny(sd, 0); + clif_Mail_send(sd->fd, 1); // failed + return 0; + } + + if( sd == NULL ) + {// original sender disconnected, item cannot be deleted! + if( battle_config.error_log ) ShowError("intif_parse_Mail_send: char not found %d\n",RFIFOL(fd,2)); - // If sd = NULL attachment haven't been removed from sender inventory. + // the best thing we can do at this point is requesting removal of the mail with the duped item intif_Mail_delete(dest_id, mail_id); return 0; } - if (mail_id > 0) + // physically delete the item + mail_removeitem(sd, 1); + mail_removezeny(sd, 1); + clif_Mail_send(sd->fd, 0); // success + + // notify recipient about new mail + rd = map_charid2sd(dest_id); + if( rd != NULL ) { - struct map_session_data *rd = map_charid2sd(dest_id); - - mail_removeitem(sd, 1); - mail_removezeny(sd, 1); - - if (rd != NULL) - { - char title[MAIL_TITLE_LENGTH]; - memcpy(title, RFIFOP(fd,16), RFIFOW(fd,2) - 16); - - rd->mail.inbox.changed = 1; - clif_Mail_new(rd->fd, mail_id, sd->status.name, title); - } - } - else - { // Return the items to the owner - mail_removeitem(sd, 0); - mail_removezeny(sd, 0); + char title[MAIL_TITLE_LENGTH]; + memcpy(title, RFIFOP(fd,16), RFIFOW(fd,2) - 16); + + rd->mail.inbox.changed = 1; + clif_Mail_new(rd->fd, mail_id, sd->status.name, title); } - clif_Mail_send(sd->fd, (mail_id > 0)?0:1); - return 0; } diff --git a/src/map/map.c b/src/map/map.c index 43a05810c..fd50012e4 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -1847,21 +1847,6 @@ struct map_session_data * map_nick2sd(const char *nick) return NULL; } -struct map_session_data * map_nick2sd_nocase(const char *nick) -{ - int i, users; - struct map_session_data **pl_allsd; - - pl_allsd = map_getallusers(&users); - for (i = 0; i < users; i++) - { - if ( !strcmp(pl_allsd[i]->status.name, nick) ) - return pl_allsd[i]; - } - - return NULL; -} - /*========================================== * id番?の物を探す * 一三bjectの場合は配列を引くのみ diff --git a/src/map/map.h b/src/map/map.h index 896af5507..cb866bbb8 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -1344,7 +1344,6 @@ struct map_session_data** map_getallusers(int *users); void map_foreachpc(int (*func)(DBKey,void*,va_list),...); int map_foreachiddb(int (*)(DBKey,void*,va_list),...); struct map_session_data * map_nick2sd(const char*); -struct map_session_data * map_nick2sd_nocase(const char *); // その他 int map_check_dir(int s_dir,int t_dir); |