diff options
-rw-r--r-- | src/char_sql/char.c | 16 | ||||
-rw-r--r-- | src/map/chrif.c | 21 | ||||
-rw-r--r-- | src/map/chrif.h | 4 | ||||
-rw-r--r-- | src/map/clif.c | 23 |
4 files changed, 62 insertions, 2 deletions
diff --git a/src/char_sql/char.c b/src/char_sql/char.c index ed6940228..9c3d5492d 100644 --- a/src/char_sql/char.c +++ b/src/char_sql/char.c @@ -2758,6 +2758,22 @@ int parse_frommap(int fd) } break; + case 0x2b07: // Remove RFIFOL(fd,6) (friend_id) from RFIFOL(fd,2) (char_id) friend list [Ind] + if (RFIFOREST(fd) < 6) + return 0; + { + int char_id, friend_id; + char_id = RFIFOL(fd,2); + friend_id = RFIFOL(fd,6); + if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d' AND `friend_id`='%d' LIMIT 1", + friend_db, char_id, friend_id) ) { + Sql_ShowDebug(sql_handle); + break; + } + RFIFOSKIP(fd,10); + } + break; + case 0x2b08: // char name request if (RFIFOREST(fd) < 6) return 0; diff --git a/src/map/chrif.c b/src/map/chrif.c index a8984eb70..3e603969c 100644 --- a/src/map/chrif.c +++ b/src/map/chrif.c @@ -38,7 +38,7 @@ static DBMap* auth_db; // int id -> struct auth_node* static const int packet_len_table[0x3d] = { // U - used, F - free 60, 3,-1,27,10,-1, 6,-1, // 2af8-2aff: U->2af8, U->2af9, U->2afa, U->2afb, U->2afc, U->2afd, U->2afe, U->2aff - 6,-1,18, 7,-1,35,30, 0, // 2b00-2b07: U->2b00, U->2b01, U->2b02, U->2b03, U->2b04, U->2b05, U->2b06, F->2b07 + 6,-1,18, 7,-1,35,30, 10, // 2b00-2b07: U->2b00, U->2b01, U->2b02, U->2b03, U->2b04, U->2b05, U->2b06, F->2b07 6,30, 0, 0,86, 7,44,34, // 2b08-2b0f: U->2b08, U->2b09, F->2b0a, F->2b0b, U->2b0c, U->2b0d, U->2b0e, U->2b0f 11,10,10, 0,11, 0,266,10, // 2b10-2b17: U->2b10, U->2b11, U->2b12, F->2b13, U->2b14, F->2b15, U->2b16, U->2b17 2,10, 2,-1,-1,-1, 2, 7, // 2b18-2b1f: U->2b18, U->2b19, U->2b1a, U->2b1b, U->2b1c, U->2b1d, U->2b1e, U->2b1f @@ -61,7 +61,7 @@ static const int packet_len_table[0x3d] = { // U - used, F - free //2b04: Incoming, chrif_recvmap -> 'getting maps from charserver of other mapserver's' //2b05: Outgoing, chrif_changemapserver -> 'Tell the charserver the mapchange / quest for ok...' //2b06: Incoming, chrif_changemapserverack -> 'awnser of 2b05, ok/fail, data: dunno^^' -//2b07: FREE +//2b07: Outgoing, chrif_removefriend -> 'Tell charserver to remove friend_id from char_id friend list' //2b08: Outgoing, chrif_searchcharid -> '...' //2b09: Incoming, map_addchariddb -> 'Adds a name to the nick db' //2b0a: FREE @@ -1555,6 +1555,23 @@ static int check_connect_char_server(int tid, unsigned int tick, int id, intptr_ return 0; } +/*========================================== + * Asks char server to remove friend_id from the friend list of char_id + *------------------------------------------*/ +int chrif_removefriend(int char_id, int friend_id) { +#ifndef TXT_ONLY + chrif_check(-1); + + WFIFOHEAD(char_fd,10); + WFIFOW(char_fd,0) = 0x2b07; + WFIFOL(char_fd,2) = char_id; + WFIFOL(char_fd,6) = friend_id; + WFIFOSET(char_fd,10); +#endif + return 0; +} + + int auth_db_final(DBKey k,void *d,va_list ap) { struct auth_node *node=(struct auth_node*)d; diff --git a/src/map/chrif.h b/src/map/chrif.h index 1f11cc6f2..1d85ab7a2 100644 --- a/src/map/chrif.h +++ b/src/map/chrif.h @@ -57,6 +57,10 @@ int chrif_char_online(struct map_session_data *sd); int chrif_changesex(struct map_session_data *sd); int chrif_chardisconnect(struct map_session_data *sd); int chrif_divorce(int partner_id1, int partner_id2); +/** + * rAthena + **/ +int chrif_removefriend(int char_id, int friend_id); int do_final_chrif(void); int do_init_chrif(void); diff --git a/src/map/clif.c b/src/map/clif.c index 101504944..8b6284a9c 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -12358,6 +12358,7 @@ void clif_parse_FriendsListReply(int fd, struct map_session_data *sd) void clif_parse_FriendsListRemove(int fd, struct map_session_data *sd) { // 0x203 </o> <ID to be removed W 4B> + struct map_session_data *f_sd = NULL; int account_id, char_id; int i, j; @@ -12380,6 +12381,28 @@ void clif_parse_FriendsListRemove(int fd, struct map_session_data *sd) memset(&sd->status.friends[MAX_FRIENDS-1], 0, sizeof(sd->status.friends[MAX_FRIENDS-1])); clif_displaymessage(fd, "Friend removed"); + //remove from friends list + if( (f_sd = map_id2sd(account_id)) ) { + for (i = 0; i < MAX_FRIENDS && + (f_sd->status.friends[i].char_id != sd->status.char_id || f_sd->status.friends[i].account_id != sd->status.account_id); i++); + + if (i != MAX_FRIENDS) { + // move all chars down + for(j = i + 1; j < MAX_FRIENDS; j++) + memcpy(&f_sd->status.friends[j-1], &f_sd->status.friends[j], sizeof(f_sd->status.friends[0])); + + memset(&f_sd->status.friends[MAX_FRIENDS-1], 0, sizeof(f_sd->status.friends[MAX_FRIENDS-1])); + //should the guy be notified of some message? we should add it here if so + WFIFOHEAD(f_sd->fd,packet_len(0x20a)); + WFIFOW(f_sd->fd,0) = 0x20a; + WFIFOL(f_sd->fd,2) = sd->status.account_id; + WFIFOL(f_sd->fd,6) = sd->status.char_id; + WFIFOSET(f_sd->fd, packet_len(0x20a)); + } + + } else { //friend not online -- ask char server to delete from his friendlist + chrif_removefriend(char_id,sd->status.char_id); + } WFIFOHEAD(fd,packet_len(0x20a)); WFIFOW(fd,0) = 0x20a; WFIFOL(fd,2) = account_id; |