From cb10231838c918dbf380899a947599331818a4bc Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Wed, 10 Aug 2016 01:03:32 +0300 Subject: Add gm command for send restart events to all servers. For now it support only one char and one map server. For support this actions need use hercules wrapper. --- src/Makefile.am | 2 ++ src/echar/char.c | 28 ++++++++++++++++++++++++++++ src/echar/char.h | 4 ++++ src/echar/init.c | 1 + src/elogin/init.c | 1 + src/elogin/parse.c | 17 +++++++++++++++++ src/elogin/parse.h | 1 + src/emap/atcommand.c | 21 ++++++++++++++++++++- src/emap/atcommand.h | 1 + src/emap/init.c | 1 + src/emap/inter.c | 23 +++++++++++++++++++++++ src/emap/inter.h | 9 +++++++++ 12 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 src/emap/inter.c create mode 100644 src/emap/inter.h (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index 7243854..9888bcf 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -52,6 +52,8 @@ MAP_SRC = emap/atcommand.c \ emap/horse.c \ emap/horse.h \ emap/init.c \ + emap/inter.c \ + emap/inter.h \ emap/itemdb.c \ emap/itemdb.h \ emap/lang.c \ diff --git a/src/echar/char.c b/src/echar/char.c index e5649ad..26e6c61 100644 --- a/src/echar/char.c +++ b/src/echar/char.c @@ -14,6 +14,7 @@ #include "common/socket.h" #include "common/strlib.h" #include "common/sql.h" +#include "common/utils.h" #include "common/timer.h" #include "char/char.h" #include "char/inter.h" @@ -320,3 +321,30 @@ void echar_parse_frommap_request_stats_report_pre(int *fdPtr) RFIFOFLUSH(fd); hookStop(); } + +void echar_parse_map_serverexit(int mapFd) +{ + const int code = RFIFOW(mapFd, 2); + switch (code) + { + case 100: // all exit + case 101: // all restart + case 102: // restart char and map server + echat_send_login_serverexit(code); + HSleep(1); + core->shutdown_callback(); + break; + case 103: // restart map server + break; + default: + ShowWarning("Unknown termination code: %d\n", code); + } +} + +void echat_send_login_serverexit(const int code) +{ + WFIFOHEAD(chr->login_fd, 4); + WFIFOW(chr->login_fd, 0) = 0x5003; + WFIFOW(chr->login_fd, 2) = code; + WFIFOSET(chr->login_fd, 4); +} diff --git a/src/echar/char.h b/src/echar/char.h index 726f2c2..e05bde0 100644 --- a/src/echar/char.h +++ b/src/echar/char.h @@ -27,4 +27,8 @@ void echar_parse_char_connect_post(int fd, struct char_session_data *sd, uint32 void echar_parse_frommap_request_stats_report_pre(int *fdPtr); +void echar_parse_map_serverexit(int mapFd); + +void echat_send_login_serverexit(const int code); + #endif // EVOL_CHAR_CHAR diff --git a/src/echar/init.c b/src/echar/init.c index e876065..c8b7e0b 100644 --- a/src/echar/init.c +++ b/src/echar/init.c @@ -51,6 +51,7 @@ HPExport void plugin_init (void) { addPacket(0x0061, 50, echar_parse_change_paassword, hpParse_Char); addPacket(0x5001, 7, echar_parse_login_password_change_ack, hpParse_FromLogin); + addPacket(0x5002, 4, echar_parse_map_serverexit, hpParse_FromMap); addHookPre(chr, parse_char_create_new_char, echar_parse_char_create_new_char); addHookPre(chr, creation_failed, echar_creation_failed); diff --git a/src/elogin/init.c b/src/elogin/init.c index af725a0..c3d3fb7 100644 --- a/src/elogin/init.c +++ b/src/elogin/init.c @@ -46,6 +46,7 @@ HPExport void plugin_init (void) addPacket(0x7530, 22, login_parse_version, hpParse_Login); addPacket(0x027c, 91, elogin_parse_client_login2, hpParse_Login); addPacket(0x5000, 54, elogin_parse_change_paassword, hpParse_FromChar); + addPacket(0x5003, 4, elogin_parse_serverexit, hpParse_FromChar); addHookPre(login, client_login, elogin_client_login_pre); addHookPre(login, check_password, elogin_check_password_pre); diff --git a/src/elogin/parse.c b/src/elogin/parse.c index d9e644e..78b59c2 100644 --- a/src/elogin/parse.c +++ b/src/elogin/parse.c @@ -214,3 +214,20 @@ void elogin_parse_change_paassword(int fd) } send_char_password_change_ack(fd, accountId, status); } + +void elogin_parse_serverexit(int fd) +{ + const int code = RFIFOW(fd, 2); + switch (code) + { + case 100: // all exit + case 101: // all restart + core->shutdown_callback(); + break; + case 102: // restart char and map server + case 103: // restart map server + break; + default: + ShowWarning("Unknown termination code: %d\n", code); + } +} diff --git a/src/elogin/parse.h b/src/elogin/parse.h index 07d2a3d..824a355 100644 --- a/src/elogin/parse.h +++ b/src/elogin/parse.h @@ -14,5 +14,6 @@ void elogin_parse_client_login2(int fd); enum parsefunc_rcode elogin_parse_ping_pre(int *fd, struct login_session_data **sdPtr); void elogin_parse_change_paassword(int fd); +void elogin_parse_serverexit(int fd); #endif // EVOL_LOGIN_PARSE diff --git a/src/emap/atcommand.c b/src/emap/atcommand.c index 7c3f345..1928620 100644 --- a/src/emap/atcommand.c +++ b/src/emap/atcommand.c @@ -23,6 +23,7 @@ #include "emap/atcommand.h" #include "emap/lang.h" +#include "emap/inter.h" const char* eatcommand_msgsd_pre(struct map_session_data **sdPtr, int *msgPtr) @@ -131,12 +132,30 @@ ACMD2(slide) } ACMD1(mapExit) +{ + int code = 1; + if (!*message || sscanf(message, "%5d", &code) < 1) + code = 1; + + map->retval = code; + map->do_shutdown(); + return true; +} + +// 100 - terminate all servers +// 101 - restart all servers +// 102 - restart char and map servers +// 103 - restart map server +ACMD1(serverExit) { int code = 0; if (!*message || sscanf(message, "%5d", &code) < 1) - code = 0; + return false; + + send_char_exit(code); map->retval = code; map->do_shutdown(); + return true; } diff --git a/src/emap/atcommand.h b/src/emap/atcommand.h index cd4cd41..95e7e75 100644 --- a/src/emap/atcommand.h +++ b/src/emap/atcommand.h @@ -22,5 +22,6 @@ const char* eatcommand_msgfd_pre(int *fdPtr, ACMD2(setSkill); ACMD2(slide); ACMD1(mapExit); +ACMD1(serverExit); #endif // EVOL_MAP_ATCOMMAND diff --git a/src/emap/init.c b/src/emap/init.c index 33d5025..cb14450 100644 --- a/src/emap/init.c +++ b/src/emap/init.c @@ -94,6 +94,7 @@ HPExport void plugin_init (void) addAtcommand("setskill", setSkill); addAtcommand("slide", slide); addAtcommand("mapexit", mapExit); + addAtcommand("serverexit", serverExit); addScriptCommand("chatjoin", "i*", chatJoin); addScriptCommand("setcamnpc", "*", setCamNpc); diff --git a/src/emap/inter.c b/src/emap/inter.c new file mode 100644 index 0000000..8f36be9 --- /dev/null +++ b/src/emap/inter.c @@ -0,0 +1,23 @@ +// Copyright (c) Copyright (c) Hercules Dev Team, licensed under GNU GPL. +// Copyright (c) 2014 - 2015 Evol developers + +#include "common/hercules.h" + +#include +#include +#include + +#include "common/HPMi.h" +#include "common/memmgr.h" +#include "common/nullpo.h" +#include "common/socket.h" +#include "common/strlib.h" +#include "map/chrif.h" + +void send_char_exit(const int code) +{ + WFIFOHEAD(chrif->fd, 4); + WFIFOW(chrif->fd, 0) = 0x5002; + WFIFOW(chrif->fd, 2) = code; + WFIFOSET(chrif->fd, 4); +} diff --git a/src/emap/inter.h b/src/emap/inter.h new file mode 100644 index 0000000..2876ee8 --- /dev/null +++ b/src/emap/inter.h @@ -0,0 +1,9 @@ +// Copyright (c) Copyright (c) Hercules Dev Team, licensed under GNU GPL. +// Copyright (c) 2014 - 2015 Evol developers + +#ifndef EVOL_MAP_INTER +#define EVOL_MAP_INTER + +void send_char_exit(const int code); + +#endif // EVOL_MAP_INTER -- cgit v1.2.3-60-g2f50