summaryrefslogtreecommitdiff
path: root/src/map/clif.cpp
diff options
context:
space:
mode:
authorBen Longbons <b.r.longbons@gmail.com>2014-04-17 16:10:11 -0700
committerBen Longbons <b.r.longbons@gmail.com>2014-04-17 16:10:11 -0700
commitae7b06ff8ad775a945bd677effd72b7fafa13d8d (patch)
tree3de2693f18a39e57008f63926fedf169da5b23ac /src/map/clif.cpp
parent15dc4a8c51d0704bb82407c1dc79c751cda7fb42 (diff)
downloadtmwa-ae7b06ff8ad775a945bd677effd72b7fafa13d8d.tar.gz
tmwa-ae7b06ff8ad775a945bd677effd72b7fafa13d8d.tar.bz2
tmwa-ae7b06ff8ad775a945bd677effd72b7fafa13d8d.tar.xz
tmwa-ae7b06ff8ad775a945bd677effd72b7fafa13d8d.zip
Die sensibly, take 1
Diffstat (limited to 'src/map/clif.cpp')
-rw-r--r--src/map/clif.cpp64
1 files changed, 40 insertions, 24 deletions
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<block_list> bl, LOOK type, int val,
dumb_ptr<map_session_data> dstsd);
+static
+void clif_quitsave(Session *, dumb_ptr<map_session_data> 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<map_session_data> sd = dumb_ptr<map_session_data>(static_cast<map_session_data *>(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);
}