From ae7b06ff8ad775a945bd677effd72b7fafa13d8d Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Thu, 17 Apr 2014 16:10:11 -0700 Subject: Die sensibly, take 1 --- src/map/chrif.cpp | 14 ++++-------- src/map/chrif.hpp | 1 + src/map/clif.cpp | 64 ++++++++++++++++++++++++++++++++++--------------------- 3 files changed, 45 insertions(+), 34 deletions(-) (limited to 'src/map') diff --git a/src/map/chrif.cpp b/src/map/chrif.cpp index 9a70d63..86506b0 100644 --- a/src/map/chrif.cpp +++ b/src/map/chrif.cpp @@ -1048,15 +1048,9 @@ void chrif_parse(Session *s) // only char-server can have an access to here. // so, if it isn't the char-server, we disconnect the session (fd != char_fd). - if (s != char_session || s->eof) + if (s != char_session) { - if (s == char_session) - { - PRINTF("Map-server can't connect to char-server (connection #%d).\n", - s); - char_session = nullptr; - } - delete_session(s); + s->set_eof(); return; } @@ -1077,7 +1071,7 @@ void chrif_parse(Session *s) if (r == 2) return; // intifで処理したが、データが足りない - s->eof = 1; + s->set_eof(); return; } packet_len = packet_len_table[cmd - 0x2af8]; @@ -1160,7 +1154,7 @@ void chrif_parse(Session *s) if (battle_config.error_log) PRINTF("chrif_parse : unknown packet %d %d\n", s, RFIFOW(s, 0)); - s->eof = 1; + s->set_eof(); return; } RFIFOSKIP(s, packet_len); diff --git a/src/map/chrif.hpp b/src/map/chrif.hpp index 5e8263d..afeba75 100644 --- a/src/map/chrif.hpp +++ b/src/map/chrif.hpp @@ -59,6 +59,7 @@ int chrif_send_divorce(int char_id); void do_init_chrif(void); // only used by intif.cpp +// and clif.cpp for the new on_delete stuff ... extern Session *char_session; #endif // TMWA_MAP_CHRIF_HPP diff --git a/src/map/clif.cpp b/src/map/clif.cpp index ea92d15..8f9565e 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -145,6 +145,36 @@ int map_port = 5121; static int clif_changelook_towards(dumb_ptr bl, LOOK type, int val, dumb_ptr dstsd); +static +void clif_quitsave(Session *, dumb_ptr sd); + +static +void on_delete(Session *s) +{ + if (s == char_session) + { + PRINTF("Map-server can't connect to char-server (connection #%d).\n", + s); + char_session = nullptr; + } + else + { + dumb_ptr sd = dumb_ptr(static_cast(s->session_data.get())); + if (sd && sd->state.auth) + { + pc_logout(sd); + clif_quitsave(s, sd); + + PRINTF("Player [%s] has logged off your server.\n", sd->status_key.name); // Player logout display [Valaris] + } + else if (sd) + { // not authentified! (refused by char-server or disconnect before to be authentified) + PRINTF("Player with account [%d] has logged off your server (not auth account).\n", sd->bl_id); // Player logout display [Yor] + map_deliddb(sd); // account_id has been included in the DB before auth answer + } + } +} + /*========================================== * map鯖のip設定 @@ -1099,7 +1129,7 @@ static void clif_waitclose(TimerData *, tick_t, Session *s) { if (s) - s->eof = 1; + s->set_eof(); } /*========================================== @@ -5203,7 +5233,7 @@ int clif_check_packet_flood(Session *s, int cmd) PRINTF("packet flood detected from %s [0x%x]\n", sd->status_key.name, cmd); if (battle_config.packet_spam_kick) { - s->eof = 1; // Kick + s->set_eof(); return 1; } sd->packet_flood_in = 0; @@ -5338,32 +5368,18 @@ void clif_parse(Session *s) { if (RFIFOREST(s) < 2) { // too small a packet disconnect - s->eof = 1; + s->set_eof(); } if (RFIFOW(s, 0) != 0x72 && RFIFOW(s, 0) != 0x7530) { // first packet must be auth or finger - s->eof = 1; + s->set_eof(); } } - // 接続が切れてるので後始末 - if (!chrif_isconnect() || s->eof) - { // char鯖に繋がってない間は接続禁止 (!chrif_isconnect()) - if (sd && sd->state.auth) - { - pc_logout(sd); - clif_quitsave(s, sd); - - PRINTF("Player [%s] has logged off your server.\n", sd->status_key.name); // Player logout display [Valaris] - } - else if (sd) - { // not authentified! (refused by char-server or disconnect before to be authentified) - PRINTF("Player with account [%d] has logged off your server (not auth account).\n", sd->bl_id); // Player logout display [Yor] - map_deliddb(sd); // account_id has been included in the DB before auth answer - } - if (s) - delete_session(s); + if (!chrif_isconnect()) + { + s->set_eof(); return; } @@ -5384,7 +5400,7 @@ void clif_parse(Session *s) RFIFOSKIP(s, 2); break; case 0x7532: // 接続の切断 - s->eof = 1; + s->set_eof(); break; } return; @@ -5403,7 +5419,7 @@ void clif_parse(Session *s) packet_len = RFIFOW(s, 2); if (packet_len < 4 || packet_len > 32768) { - s->eof = 1; + s->set_eof(); return; // Runt packet (variable out of bounds) } } @@ -5499,6 +5515,6 @@ void clif_parse(Session *s) void do_init_clif(void) { - set_defaultparse(clif_parse); + set_defaultparse(clif_parse, on_delete); make_listen_port(map_port); } -- cgit v1.2.3-60-g2f50