diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ast/npc.cpp | 55 | ||||
-rw-r--r-- | src/ast/npc.hpp | 11 | ||||
-rw-r--r-- | src/ast/npc_test.cpp | 68 | ||||
-rw-r--r-- | src/map/chrif.cpp | 89 | ||||
-rw-r--r-- | src/map/clif.cpp | 4 | ||||
-rw-r--r-- | src/map/npc-parse.cpp | 122 | ||||
-rw-r--r-- | src/map/npc.cpp | 2 | ||||
-rw-r--r-- | src/map/script-fun.cpp | 36 | ||||
-rw-r--r-- | src/monitor/fwd.hpp | 37 | ||||
-rw-r--r-- | src/monitor/globals.cpp | 33 | ||||
-rw-r--r-- | src/monitor/globals.hpp | 33 | ||||
-rw-r--r-- | src/monitor/main.cpp | 243 |
12 files changed, 76 insertions, 657 deletions
diff --git a/src/ast/npc.cpp b/src/ast/npc.cpp index e9c3464..8d4a43e 100644 --- a/src/ast/npc.cpp +++ b/src/ast/npc.cpp @@ -306,7 +306,7 @@ namespace npc static Result<ScriptNone> parse_script_none_head(io::LineSpan span, std::vector<Spanned<std::vector<Spanned<RString>>>>& bits) { - // ScriptNone: -|script|script name|-1{code} + // ScriptNone: -|script|script name|32767{code} if (bits.size() != 4) { return Err(span.error_str("expect 4 |component|s"_s)); @@ -319,10 +319,10 @@ namespace npc { return Err(bits[2].span.error_str("in |component 3| expect 1 ,component,s"_s)); } - assert(bits[3].data[0].data == "-1"_s); + assert(bits[3].data[0].data == "32767"_s); if (bits[3].data.size() != 1) { - return Err(bits[3].span.error_str("in |component 4| should be just -1"_s)); + return Err(bits[3].span.error_str("in |component 4| should be just 32767"_s)); } ScriptNone script_none; @@ -333,39 +333,6 @@ namespace npc return Ok(std::move(script_none)); } static - Result<ScriptMapNone> parse_script_map_none_head(io::LineSpan span, std::vector<Spanned<std::vector<Spanned<RString>>>>& bits) - { - // ScriptMapNone: m,x,y,d|script|script name|-1{code} - if (bits.size() != 4) - { - return Err(span.error_str("expect 4 |component|s"_s)); - } - if (bits[0].data.size() != 4) - { - return Err(bits[0].span.error_str("in |component 1| expect 3 ,component,s"_s)); - } - assert(bits[1].data.size() == 1); - assert(bits[1].data[0].data == "script"_s); - if (bits[2].data.size() != 1) - { - return Err(bits[2].span.error_str("in |component 3| expect 1 ,component,s"_s)); - } - if (bits[3].data.size() != 1 || bits[3].data[0].data != "-1"_s) - { - return Err(bits[3].span.error_str("in |component 4| should be just -1"_s)); - } - - ScriptMapNone script_map_none; - TRY_EXTRACT(bits[0].data[0], script_map_none.m); - TRY_EXTRACT(bits[0].data[1], script_map_none.x); - TRY_EXTRACT(bits[0].data[2], script_map_none.y); - TRY_EXTRACT(bits[0].data[3], script_map_none.d); - TRY_EXTRACT(bits[2].data[0], script_map_none.name); - script_map_none.key4_span = bits[3].data[0].span; - // also expect '{' and parse real script (in caller) - return Ok(std::move(script_map_none)); - } - static Result<ScriptMap> parse_script_map_head(io::LineSpan span, std::vector<Spanned<std::vector<Spanned<RString>>>>& bits) { // ScriptMap: m,x,y,d|script|script name|class,xs,ys{code} @@ -417,10 +384,9 @@ namespace npc static Result<Script> parse_script_any(io::LineSpan span, std::vector<Spanned<std::vector<Spanned<RString>>>>& bits, io::LineCharReader& lr) { - // 4 cases: + // 3 cases: // ScriptFunction: function|script|Fun Name{code} - // ScriptNone: -|script|script name|-1{code} - // ScriptMapNone: m,x,y,d|script|script name|-1{code} + // ScriptNone: -|script|script name|32767{code} // ScriptMap: m,x,y,d|script|script name|class,xs,ys{code} if (bits[0].data[0].data == "function"_s) { @@ -445,17 +411,6 @@ namespace npc rv.body = TRY(ast::script::parse_script_body(lr, opt)); return Ok(std::move(rv)); } - else if (bits.size() >= 4 && bits[3].data[0].data == "-1"_s) - { - Script rv = TRY(parse_script_map_none_head(span, bits)); - rv.key_span = bits[1].data[0].span; - - ast::script::ScriptOptions opt; - opt.implicit_start = true; - opt.no_start = true; - rv.body = TRY(ast::script::parse_script_body(lr, opt)); - return Ok(std::move(rv)); - } else { ScriptMap script_map = TRY(parse_script_map_head(span, bits)); diff --git a/src/ast/npc.hpp b/src/ast/npc.hpp index a51acd3..ca6479e 100644 --- a/src/ast/npc.hpp +++ b/src/ast/npc.hpp @@ -103,14 +103,6 @@ namespace npc Spanned<NpcName> name; io::LineSpan key4_span; }; - struct ScriptMapNone - { - Spanned<MapName> m; - Spanned<unsigned> x, y; - Spanned<DIR> d; - Spanned<NpcName> name; - io::LineSpan key4_span; - }; struct ScriptMap { Spanned<MapName> m; @@ -120,13 +112,12 @@ namespace npc Spanned<Species> npc_class; Spanned<unsigned> xs, ys; }; - using ScriptBase = Variant<ScriptFunction, ScriptNone, ScriptMapNone, ScriptMap>; + using ScriptBase = Variant<ScriptFunction, ScriptNone, ScriptMap>; struct Script : ScriptBase { Script() = default; Script(ScriptFunction s) : ScriptBase(std::move(s)) {} Script(ScriptNone s) : ScriptBase(std::move(s)) {} - Script(ScriptMapNone s) : ScriptBase(std::move(s)) {} Script(ScriptMap s) : ScriptBase(std::move(s)) {} io::LineSpan key_span; diff --git a/src/ast/npc_test.cpp b/src/ast/npc_test.cpp index a753623..dadeba7 100644 --- a/src/ast/npc_test.cpp +++ b/src/ast/npc_test.cpp @@ -423,11 +423,11 @@ namespace npc { // 1 2 3 //23456789012345678901234567890123456789 - "-|script|#config|-1{end;}"_s, + "-|script|#config|32767{end;}"_s, // 123456 - "-|script|#config|-1\n{end;}\n"_s, + "-|script|#config|32767\n{end;}\n"_s, // 1234567 - "-|script|#config|-1\n \n {end;} "_s, + "-|script|#config|32767\n \n {end;} "_s, }; for (auto input : inputs) { @@ -435,7 +435,7 @@ namespace npc auto res = TRY_UNWRAP(parse_top(lr), FAIL()); EXPECT_TRUE(res.get_success().is_some()); auto top = TRY_UNWRAP(std::move(res.get_success()), FAIL()); - EXPECT_SPAN(top.span, 1,1, 1,19); + EXPECT_SPAN(top.span, 1,1, 1,22); auto script = top.get_if<Script>(); EXPECT_TRUE(script); auto p = script->get_if<ScriptNone>(); @@ -446,66 +446,10 @@ namespace npc EXPECT_SPAN(script->key_span, 1,3, 1,8); EXPECT_SPAN(p->name.span, 1,10, 1,16); EXPECT_EQ(p->name.data, stringish<NpcName>("#config"_s)); - EXPECT_SPAN(p->key4_span, 1,18, 1,19); + EXPECT_SPAN(p->key4_span, 1,18, 1,22); if (input.endswith('}')) { - EXPECT_SPAN(script->body.span, 1,20, 1,25); - } - else if (input.endswith('\n')) - { - EXPECT_SPAN(script->body.span, 2,1, 2,6); - } - else if (input.endswith(' ')) - { - EXPECT_SPAN(script->body.span, 3,2, 3,7); - } - else - { - FAIL(); - } - EXPECT_EQ(script->body.braced_body, "{end;}"_s); - } - } - } - TEST(npcast, scriptmapnone) - { - QuietFd q; - LString inputs[] = - { - // 1 2 3 - //23456789012345678901234567890123456789 - "map.gat,1,2,3|script|Init|-1{end;}"_s, - "map.gat,1,2,3|script|Init|-1\n{end;}\n"_s, - "map.gat,1,2,3|script|Init|-1\n \n {end;} "_s, - }; - for (auto input : inputs) - { - io::LineCharReader lr(io::from_string, "<string>"_s, input); - auto res = TRY_UNWRAP(parse_top(lr), FAIL()); - EXPECT_TRUE(res.get_success().is_some()); - auto top = TRY_UNWRAP(std::move(res.get_success()), FAIL()); - EXPECT_SPAN(top.span, 1,1, 1,28); - auto script = top.get_if<Script>(); - EXPECT_TRUE(script); - auto p = script->get_if<ScriptMapNone>(); - EXPECT_TRUE(p); - if (p) - { - EXPECT_SPAN(p->m.span, 1,1, 1,7); - EXPECT_EQ(p->m.data, stringish<MapName>("map"_s)); - EXPECT_SPAN(p->x.span, 1,9, 1,9); - EXPECT_EQ(p->x.data, 1); - EXPECT_SPAN(p->y.span, 1,11, 1,11); - EXPECT_EQ(p->y.data, 2); - EXPECT_SPAN(p->d.span, 1,13, 1,13); - EXPECT_EQ(p->d.data, DIR::NW); - EXPECT_SPAN(script->key_span, 1,15, 1,20); - EXPECT_SPAN(p->name.span, 1,22, 1,25); - EXPECT_EQ(p->name.data, stringish<NpcName>("Init"_s)); - EXPECT_SPAN(p->key4_span, 1,27, 1,28); - if (input.endswith('}')) - { - EXPECT_SPAN(script->body.span, 1,29, 1,34); + EXPECT_SPAN(script->body.span, 1,23, 1,28); } else if (input.endswith('\n')) { diff --git a/src/map/chrif.cpp b/src/map/chrif.cpp index 3ffeaf2..2606911 100644 --- a/src/map/chrif.cpp +++ b/src/map/chrif.cpp @@ -218,7 +218,7 @@ int chrif_changemapserverack(Session *, const Packet_Fixed<0x2b06>& fixed) if (fixed.error == 1) { if (battle_config.error_log) - PRINTF("map server change failed.\n"_fmt); + PRINTF("Changing the map server failed.\n"_fmt); pc_authfail(sd->status_key.account_id); return 0; } @@ -241,7 +241,7 @@ int chrif_connectack(Session *s, const Packet_Fixed<0x2af9>& fixed) { if (fixed.code) { - PRINTF("Connected to char-server failed %d.\n"_fmt, fixed.code); + PRINTF("Connecting to char-server failed %d.\n"_fmt, fixed.code); exit(1); } PRINTF("Connected to char-server (connection #%d).\n"_fmt, s); @@ -249,11 +249,6 @@ int chrif_connectack(Session *s, const Packet_Fixed<0x2af9>& fixed) chrif_sendmap(s); - PRINTF("chrif: OnCharIfInit event done. (%d events)\n"_fmt, - npc_event_doall(stringish<ScriptLabel>("OnCharIfInit"_s))); - PRINTF("chrif: OnInterIfInit event done. (%d events)\n"_fmt, - npc_event_doall(stringish<ScriptLabel>("OnInterIfInit"_s))); - return 0; } @@ -266,7 +261,7 @@ int chrif_sendmapack(Session *, Packet_Fixed<0x2afb> fixed) { if (fixed.unknown) //impossible { - PRINTF("chrif : send map list to char server failed %d\n"_fmt, + PRINTF("chrif: sending the map list to char-server failed %d\n"_fmt, fixed.unknown); exit(1); } @@ -388,7 +383,7 @@ void chrif_char_ask_name(AccountId id, CharName character_name, short operation_ fixed_0e.operation = operation_type; // type of operation if (operation_type == 2) fixed_0e.ban_add = modif; - PRINTF("chrif : sended 0x2b0e\n"_fmt); + PRINTF("chrif: sent 0x2b0e\n"_fmt); send_fpacket<0x2b0e, 44>(char_session, fixed_0e); } @@ -402,7 +397,7 @@ void chrif_char_ask_name(AccountId id, CharName character_name, short operation_ * 4: unban * 5: changesex * type of answer: - * 0: login-server resquest done + * 0: login-server request done * 1: player not found * 2: gm level too low * 3: login-server offline @@ -419,7 +414,7 @@ int chrif_char_ask_name_answer(Session *, const Packet_Fixed<0x2b0f>& fixed) { AString output; if (fixed.error == 1) // player not found - output = STRPRINTF("The player '%s' doesn't exist."_fmt, + output = STRPRINTF("The player, '%s,' doesn't exist."_fmt, player_name); else { @@ -428,20 +423,20 @@ int chrif_char_ask_name_answer(Session *, const Packet_Fixed<0x2b0f>& fixed) case 1: // block switch (fixed.error) { - case 0: // login-server resquest done + case 0: // login-server request done output = STRPRINTF( - "Login-server has been asked to block the player '%s'."_fmt, + "Login-server has been asked to block '%s'."_fmt, player_name); break; //case 1: // player not found case 2: // gm level too low output = STRPRINTF( - "Your GM level don't authorise you to block the player '%s'."_fmt, + "Your GM level doesn't authorize you to block the player '%s'."_fmt, player_name); break; case 3: // login-server offline output = STRPRINTF( - "Login-server is offline. Impossible to block the the player '%s'."_fmt, + "Login-server is offline, so it's impossible to block '%s'."_fmt, player_name); break; } @@ -449,20 +444,20 @@ int chrif_char_ask_name_answer(Session *, const Packet_Fixed<0x2b0f>& fixed) case 2: // ban switch (fixed.error) { - case 0: // login-server resquest done + case 0: // login-server request done output = STRPRINTF( - "Login-server has been asked to ban the player '%s'."_fmt, + "Login-server has been asked to ban '%s'."_fmt, player_name); break; //case 1: // player not found case 2: // gm level too low output = STRPRINTF( - "Your GM level don't authorise you to ban the player '%s'."_fmt, + "Your GM level doesn't authorize you to ban '%s'."_fmt, player_name); break; case 3: // login-server offline output = STRPRINTF( - "Login-server is offline. Impossible to ban the the player '%s'."_fmt, + "Login-server is offline, so it's impossible to ban '%s'."_fmt, player_name); break; } @@ -470,20 +465,20 @@ int chrif_char_ask_name_answer(Session *, const Packet_Fixed<0x2b0f>& fixed) case 3: // unblock switch (fixed.error) { - case 0: // login-server resquest done + case 0: // login-server request done output = STRPRINTF( - "Login-server has been asked to unblock the player '%s'."_fmt, + "Login-server has been asked to unblock '%s'."_fmt, player_name); break; //case 1: // player not found case 2: // gm level too low output = STRPRINTF( - "Your GM level don't authorise you to unblock the player '%s'."_fmt, + "Your GM level doesn't authorize you to unblock '%s'."_fmt, player_name); break; case 3: // login-server offline output = STRPRINTF( - "Login-server is offline. Impossible to unblock the the player '%s'."_fmt, + "Login-server is offline, so it's impossible to unblock '%s'."_fmt, player_name); break; } @@ -491,20 +486,20 @@ int chrif_char_ask_name_answer(Session *, const Packet_Fixed<0x2b0f>& fixed) case 4: // unban switch (fixed.error) { - case 0: // login-server resquest done + case 0: // login-server request done output = STRPRINTF( - "Login-server has been asked to unban the player '%s'."_fmt, + "Login-server has been asked to unban '%s'."_fmt, player_name); break; //case 1: // player not found case 2: // gm level too low output = STRPRINTF( - "Your GM level don't authorise you to unban the player '%s'."_fmt, + "Your GM level doesn't authorize you to unban '%s'."_fmt, player_name); break; case 3: // login-server offline output = STRPRINTF( - "Login-server is offline. Impossible to unban the the player '%s'."_fmt, + "Login-server is offline, so it's impossible to unban '%s'."_fmt, player_name); break; } @@ -512,20 +507,20 @@ int chrif_char_ask_name_answer(Session *, const Packet_Fixed<0x2b0f>& fixed) case 5: // changesex switch (fixed.error) { - case 0: // login-server resquest done + case 0: // login-server request done output = STRPRINTF( - "Login-server has been asked to change the sex of the player '%s'."_fmt, + "Login-server has been asked to change the sex of '%s'."_fmt, player_name); break; //case 1: // player not found case 2: // gm level too low output = STRPRINTF( - "Your GM level don't authorise you to change the sex of the player '%s'."_fmt, + "Your GM level doesn't authorize you to change the sex of '%s'."_fmt, player_name); break; case 3: // login-server offline output = STRPRINTF( - "Login-server is offline. Impossible to change the sex of the the player '%s'."_fmt, + "Login-server is offline, so it's impossible to change the sex of '%s'."_fmt, player_name); break; } @@ -536,7 +531,7 @@ int chrif_char_ask_name_answer(Session *, const Packet_Fixed<0x2b0f>& fixed) clif_displaymessage(sd->sess, output); } else - PRINTF("chrif_char_ask_name_answer failed - player not online.\n"_fmt); + PRINTF("chrif_char_ask_name_answer failed because the player is not online.\n"_fmt); return 0; } @@ -704,14 +699,14 @@ int chrif_accountdeletion(Session *, const Packet_Fixed<0x2b13>& fixed) { sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters clif_displaymessage(sd->sess, - "Your account has been deleted (disconnection)..."_s); + "Your account has been deleted. You will now be disconnected..."_s); clif_setwaitclose(sd->sess); // forced to disconnect for the change } } else { if (sd != nullptr) - PRINTF("chrif_accountdeletion failed - player not online.\n"_fmt); + PRINTF("chrif_accountdeletion failed because the player is not online.\n"_fmt); } return 0; @@ -741,11 +736,11 @@ int chrif_accountban(Session *, const Packet_Fixed<0x2b14>& fixed) { // status or final date of a banishment case 1: // 0 = Unregistered ID clif_displaymessage(sd->sess, - "Your account has 'Unregistered'."_s); + "Your account has an unregistered ID."_s); break; case 2: // 1 = Incorrect Password clif_displaymessage(sd->sess, - "Your account has an 'Incorrect Password'..."_s); + "Your password is incorrect."_s); break; case 3: // 2 = This ID is expired clif_displaymessage(sd->sess, @@ -753,7 +748,7 @@ int chrif_accountban(Session *, const Packet_Fixed<0x2b14>& fixed) break; case 4: // 3 = Rejected from Server clif_displaymessage(sd->sess, - "Your account has been rejected from server."_s); + "Your account has been rejected by the server."_s); break; case 5: // 4 = You have been blocked by the GM Team clif_displaymessage(sd->sess, @@ -761,19 +756,19 @@ int chrif_accountban(Session *, const Packet_Fixed<0x2b14>& fixed) break; case 6: // 5 = Your Game's EXE file is not the latest version clif_displaymessage(sd->sess, - "Your Game's EXE file is not the latest version."_s); + "You need to update your client."_s); break; case 7: // 6 = Your are Prohibited to log in until %s clif_displaymessage(sd->sess, - "Your account has been prohibited to log in."_s); + "Your account has been prohibited from logging in."_s); break; case 8: // 7 = Server is jammed due to over populated clif_displaymessage(sd->sess, - "Server is jammed due to over populated."_s); + "The server is overpopulated."_s); break; case 9: // 8 = No MSG (actually, all states after 9 except 99 are No MSG, use only this) clif_displaymessage(sd->sess, - "Your account has not more authorised."_s); + "Your account must be authorized."_s); break; case 100: // 99 = This ID has been totally erased clif_displaymessage(sd->sess, @@ -781,7 +776,7 @@ int chrif_accountban(Session *, const Packet_Fixed<0x2b14>& fixed) break; default: clif_displaymessage(sd->sess, - "Your account has not more authorised."_s); + "Your account must be authorized."_s); break; } } @@ -800,7 +795,7 @@ int chrif_accountban(Session *, const Packet_Fixed<0x2b14>& fixed) else { if (sd != nullptr) - PRINTF("chrif_accountban failed - player not online.\n"_fmt); + PRINTF("chrif_accountban failed because the player is not online.\n"_fmt); } return 0; @@ -813,7 +808,7 @@ int chrif_accountban(Session *, const Packet_Fixed<0x2b14>& fixed) static int chrif_recvgmaccounts(Session *s, const std::vector<Packet_Repeat<0x2b15>>& repeat) { - PRINTF("From login-server: receiving of %d GM accounts information.\n"_fmt, + PRINTF("Receiving information on %d GM accounts from login-server.\n"_fmt, pc_read_gm_account(s, repeat)); return 0; @@ -823,7 +818,7 @@ static void chrif_delete(Session *s) { assert (s == char_session); - PRINTF("Map-server can't connect to char-server (connection #%d).\n"_fmt, + PRINTF("map-server can't connect to char-server (connection #%d).\n"_fmt, s); char_session = nullptr; } @@ -1012,7 +1007,7 @@ void chrif_parse(Session *s) return; if (battle_config.error_log) - PRINTF("chrif_parse : unknown packet %d %d\n"_fmt, s, + PRINTF("chrif_parse: unknown packet %d %d\n"_fmt, s, packet_id); s->set_eof(); return; @@ -1066,7 +1061,7 @@ void check_connect_char_server(TimerData *, tick_t) { if (!char_session) { - PRINTF("Attempt to connect to char-server...\n"_fmt); + PRINTF("Attempting to connect to char-server...\n"_fmt); chrif_state = 0; char_session = make_connection(map_conf.char_ip, map_conf.char_port, SessionParsers{.func_parse= chrif_parse, .func_delete= chrif_delete}); diff --git a/src/map/clif.cpp b/src/map/clif.cpp index e3cd55f..2c65d44 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -901,7 +901,7 @@ int clif_spawnnpc(dumb_ptr<npc_data> nd) { nullpo_retz(nd); - if (nd->npc_class == NEGATIVE_SPECIES || nd->flag & 1 || nd->npc_class == INVISIBLE_CLASS) + if (nd->flag & 1 || nd->npc_class == INVISIBLE_CLASS) return 0; Packet_Fixed<0x007c> fixed_7c; @@ -2320,7 +2320,7 @@ void clif_getareachar_npc(dumb_ptr<map_session_data> sd, dumb_ptr<npc_data> nd) nullpo_retv(sd); nullpo_retv(nd); - if (nd->npc_class == NEGATIVE_SPECIES || nd->flag & 1 || nd->npc_class == INVISIBLE_CLASS) + if (nd->flag & 1 || nd->npc_class == INVISIBLE_CLASS) return; Buffer buf; diff --git a/src/map/npc-parse.cpp b/src/map/npc-parse.cpp index 9c9a22c..4d9fcbd 100644 --- a/src/map/npc-parse.cpp +++ b/src/map/npc-parse.cpp @@ -446,7 +446,7 @@ bool npc_load_script_none(ast::script::ScriptBody& body, ast::npc::ScriptNone& s nd->bl_id = npc_get_new_npc_id(); nd->dir = DIR::S; nd->flag = 0; - nd->npc_class = NEGATIVE_SPECIES; + nd->npc_class = INVISIBLE_CLASS; nd->speed = 200_ms; nd->scr.script = std::move(script); nd->option = Opt0::ZERO; @@ -514,115 +514,6 @@ bool npc_load_script_none(ast::script::ScriptBody& body, ast::npc::ScriptNone& s } static -bool npc_load_script_map_none(ast::script::ScriptBody& body, ast::npc::ScriptMapNone& script_map_none) -{ - MapName mapname = script_map_none.m.data; - int x = script_map_none.x.data, y = script_map_none.y.data; - DIR dir = script_map_none.d.data; - P<map_local> m = TRY_UNWRAP(map_mapname2mapid(mapname), - { - script_map_none.m.span.error("No such map"_s); - return false; - }); - - std::unique_ptr<const ScriptBuffer> script = compile_script(STRPRINTF("script npc \"%s\""_fmt, script_map_none.name.data), body, false); - if (script == nullptr) - return false; - - dumb_ptr<npc_data_script> nd; - nd.new_(); - nd->scr.event_needs_map = false; - - nd->name = script_map_none.name.data; - - nd->bl_prev = nd->bl_next = nullptr; - nd->bl_m = m; - nd->bl_x = x; - nd->bl_y = y; - nd->bl_id = npc_get_new_npc_id(); - nd->dir = dir; - nd->flag = 0; - nd->npc_class = NEGATIVE_SPECIES; - nd->speed = 200_ms; - nd->scr.script = std::move(script); - nd->option = Opt0::ZERO; - nd->opt1 = Opt1::ZERO; - nd->opt2 = Opt2::ZERO; - nd->opt3 = Opt3::ZERO; - - npc_script++; - nd->bl_type = BL::NPC; - nd->npc_subtype = NpcSubtype::SCRIPT; - - nd->n = map_addnpc(m, nd); - map_addblock(nd); - - { - struct event_data ev {}; - ev.nd = nd; - ev.pos = 0; - NpcEvent npcev; - npcev.npc = nd->name; - npcev.label = ScriptLabel(); - ev_db.insert(npcev, ev); - } - - register_npc_name(nd); - - for (auto& pair : scriptlabel_db) - npc_convertlabel_db(pair.first, pair.second, nd); - - for (npc_label_list& el : nd->scr.label_listv) - { - ScriptLabel lname = el.name; - int pos = el.pos; - - if (lname.startswith("On"_s)) - { - struct event_data ev {}; - ev.nd = nd; - ev.pos = pos; - NpcEvent buf; - buf.npc = nd->name; - buf.label = lname; - ev_db.insert(buf, ev); - } - } - - for (npc_label_list& el : nd->scr.label_listv) - { - int t_ = 0; - ScriptLabel lname = el.name; - int pos = el.pos; - if (lname.startswith("OnTimer"_s) && extract(lname.xslice_t(7), &t_) && t_ > 0) - { - interval_t t = static_cast<interval_t>(t_); - - npc_timerevent_list tel {}; - tel.timer = t; - tel.pos = pos; - - auto it = std::lower_bound(nd->scr.timer_eventv.begin(), nd->scr.timer_eventv.end(), tel, - [](const npc_timerevent_list& l, const npc_timerevent_list& r) - { - return l.timer < r.timer; - } - ); - assert (it == nd->scr.timer_eventv.end() || it->timer != tel.timer); - - nd->scr.timer_eventv.insert(it, std::move(tel)); - } - } - // The counter starts stopped with 0 ticks, which is the first event, - // unless there is none, in which case begin == end. - nd->scr.timer = interval_t::zero(); - nd->scr.next_event = nd->scr.timer_eventv.begin(); - // nd->scr.timerid = nullptr; - - return true; -} - -static bool npc_load_script_map(ast::script::ScriptBody& body, ast::npc::ScriptMap& script_map) { MapName mapname = script_map.m.data; @@ -761,17 +652,6 @@ bool npc_load_script_any(ast::npc::Script *script) { return npc_load_script_none(script->body, script_none); } - MATCH_CASE (ast::npc::ScriptMapNone&, script_map_none) - { - auto& mapname = script_map_none.m; - Option<P<map_local>> m = map_mapname2mapid(mapname.data); - if (m.is_none()) - { - mapname.span.error(STRPRINTF("Map not found: %s"_fmt, mapname.data)); - return false; - } - return npc_load_script_map_none(script->body, script_map_none); - } MATCH_CASE (ast::npc::ScriptMap&, script_map) { auto& mapname = script_map.m; diff --git a/src/map/npc.cpp b/src/map/npc.cpp index 56c33cc..4296432 100644 --- a/src/map/npc.cpp +++ b/src/map/npc.cpp @@ -583,7 +583,7 @@ int npc_checknear(dumb_ptr<map_session_data> sd, BlockId id) if (nd->bl_type != BL::NPC) return 1; - if (nd->npc_class == NEGATIVE_SPECIES) + if (nd->npc_class == INVISIBLE_CLASS) return 0; // エリア判定 diff --git a/src/map/script-fun.cpp b/src/map/script-fun.cpp index 2065c27..7fafd91 100644 --- a/src/map/script-fun.cpp +++ b/src/map/script-fun.cpp @@ -108,7 +108,7 @@ void builtin_goto(ScriptState *st) { if (!AARG(0).is<ScriptDataPos>()) { - PRINTF("script: goto: not label !\n"_fmt); + PRINTF("script: goto: that's not a label!\n"_fmt); st->state = ScriptEndState::END; return; } @@ -149,7 +149,7 @@ void builtin_callfunc(ScriptState *st) } OMATCH_CASE_NONE () { - PRINTF("script:callfunc: function not found! [%s]\n"_fmt, str); + PRINTF("script: callfunc: function not found! [%s]\n"_fmt, str); st->state = ScriptEndState::END; } } @@ -553,7 +553,7 @@ void builtin_setarray(ScriptState *st) if (prefix != '$' && prefix != '@') { - PRINTF("builtin_setarray: illegal scope !\n"_fmt); + PRINTF("builtin_setarray: illegal scope!\n"_fmt); return; } if (prefix != '$') @@ -584,7 +584,7 @@ void builtin_cleararray(ScriptState *st) if (prefix != '$' && prefix != '@') { - PRINTF("builtin_cleararray: illegal scope !\n"_fmt); + PRINTF("builtin_cleararray: illegal scope!\n"_fmt); return; } if (prefix != '$') @@ -641,7 +641,7 @@ void builtin_getarraysize(ScriptState *st) if (prefix != '$' && prefix != '@') { - PRINTF("builtin_copyarray: illegal scope !\n"_fmt); + PRINTF("builtin_copyarray: illegal scope!\n"_fmt); return; } @@ -660,7 +660,7 @@ void builtin_getelementofarray(ScriptState *st) int i = conv_num(st, &AARG(1)); if (i > 255 || i < 0) { - PRINTF("script: getelementofarray (operator[]): param2 illegal number %d\n"_fmt, + PRINTF("script: getelementofarray (operator[]): param2 illegal number: %d\n"_fmt, i); push_int<ScriptDataInt>(st->stack, 0); } @@ -672,7 +672,7 @@ void builtin_getelementofarray(ScriptState *st) } else { - PRINTF("script: getelementofarray (operator[]): param1 not name !\n"_fmt); + PRINTF("script: getelementofarray (operator[]): param1 not named!\n"_fmt); push_int<ScriptDataInt>(st->stack, 0); } } @@ -750,7 +750,7 @@ void builtin_countitem(ScriptState *st) else { if (battle_config.error_log) - PRINTF("wrong item ID : countitem (%i)\n"_fmt, nameid); + PRINTF("wrong item ID: countitem (%i)\n"_fmt, nameid); } push_int<ScriptDataInt>(st->stack, count); @@ -788,7 +788,7 @@ void builtin_checkweight(ScriptState *st) amount = conv_num(st, &AARG(1)); if (amount <= 0 || !nameid) { - //if get wrong item ID or amount<=0, don't count weight of non existing items + //If it gets the wrong item ID or the amount<=0, don't count its weight (assume it's a non-existent item) push_int<ScriptDataInt>(st->stack, 0); return; } @@ -940,7 +940,7 @@ void builtin_delitem(ScriptState *st) if (!nameid || amount <= 0) { - //by Lupus. Don't run FOR if u got wrong item ID or amount<=0 + //By Lupus. Don't run FOR if you've got the wrong item ID or amount<=0 return; } @@ -1949,7 +1949,7 @@ static void builtin_debugmes(ScriptState *st) { RString mes = conv_str(st, &AARG(0)); - PRINTF("script debug : %d %d : %s\n"_fmt, + PRINTF("script debug: %d %d: '%s'\n"_fmt, st->rid, st->oid, mes); } @@ -2585,7 +2585,7 @@ void builtin_npcwarp(ScriptState *st) if (!nd) { - PRINTF("builtin_npcwarp: no such npc: %s\n"_fmt, npc); + PRINTF("builtin_npcwarp: no such npc: '%s'\n"_fmt, npc); return; } @@ -2628,7 +2628,7 @@ void builtin_npcareawarp(ScriptState *st) if (!nd) { - PRINTF("builtin_npcareawarp: no such npc: %s\n"_fmt, npc); + PRINTF("builtin_npcareawarp: no such npc: '%s'\n"_fmt, npc); return; } @@ -2873,7 +2873,7 @@ void builtin_shop(ScriptState *st) nd = npc_name2id(name); if (!nd) { - PRINTF("builtin_shop: no such npc: %s\n"_fmt, name); + PRINTF("builtin_shop: no such npc: '%s'\n"_fmt, name); return; } @@ -2906,7 +2906,7 @@ void builtin_fakenpcname(ScriptState *st) dumb_ptr<npc_data> nd = npc_name2id(name); if (!nd) { - PRINTF("builtin_fakenpcname: no such npc: %s\n"_fmt, name); + PRINTF("builtin_fakenpcname: no such npc: '%s'\n"_fmt, name); return; } nd->name = newname; @@ -2968,7 +2968,7 @@ void builtin_strnpcinfo(ScriptState *st) nd = npc_name2id(npc); if (!nd) { - PRINTF("builtin_strnpcinfo: no such npc: %s\n"_fmt, npc); + PRINTF("builtin_strnpcinfo: no such npc: '%s'\n"_fmt, npc); return; } } else { @@ -3008,7 +3008,7 @@ void builtin_getnpcx(ScriptState *st) nd = npc_name2id(name); if (!nd) { - PRINTF("builtin_getnpcx: no such npc: %s\n"_fmt, name); + PRINTF("builtin_getnpcx: no such npc: '%s'\n"_fmt, name); return; } } else { @@ -3032,7 +3032,7 @@ void builtin_getnpcy(ScriptState *st) nd = npc_name2id(name); if (!nd) { - PRINTF("builtin_getnpcy: no such npc: %s\n"_fmt, name); + PRINTF("builtin_getnpcy: no such npc: '%s'\n"_fmt, name); return; } } else { diff --git a/src/monitor/fwd.hpp b/src/monitor/fwd.hpp deleted file mode 100644 index 6900e8e..0000000 --- a/src/monitor/fwd.hpp +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once -// monitor/fwd.hpp - list of type names for monitor nonserver -// -// Copyright © 2014 Ben Longbons <b.r.longbons@gmail.com> -// -// This file is part of The Mana World (Athena server) -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. - -#include "../sanity.hpp" - -#include "../strings/fwd.hpp" // rank 1 -#include "../io/fwd.hpp" // rank 4 -#include "../net/fwd.hpp" // rank 5 -#include "../mmo/fwd.hpp" // rank 6 -#include "../high/fwd.hpp" // rank 9 -// monitor/fwd.hpp is rank ∞ because it is an executable - - -namespace tmwa -{ -namespace monitor -{ - struct MonitorConf; -} // namespace monitor -} // namespace tmwa diff --git a/src/monitor/globals.cpp b/src/monitor/globals.cpp deleted file mode 100644 index 49e814d..0000000 --- a/src/monitor/globals.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "globals.hpp" -// globals.cpp - Evil global variables for tmwa-monitor. -// -// Copyright © 2014 Ben Longbons <b.r.longbons@gmail.com> -// -// This file is part of The Mana World (Athena server) -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. - -#include "monitor_conf.hpp" - -#include "../poison.hpp" - - -namespace tmwa -{ - namespace monitor - { - MonitorConf monitor_conf; - pid_t pid_login, pid_char, pid_map; - } // namespace monitor -} // namespace tmwa diff --git a/src/monitor/globals.hpp b/src/monitor/globals.hpp deleted file mode 100644 index aa797d3..0000000 --- a/src/monitor/globals.hpp +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once -// globals.hpp - Evil global variables for tmwa-monitor. -// -// Copyright © 2014 Ben Longbons <b.r.longbons@gmail.com> -// -// This file is part of The Mana World (Athena server) -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. - -#include "fwd.hpp" - -#include <sys/types.h> - - -namespace tmwa -{ - namespace monitor - { - extern MonitorConf monitor_conf; - extern pid_t pid_login, pid_char, pid_map; - } // namespace monitor -} // namespace tmwa diff --git a/src/monitor/main.cpp b/src/monitor/main.cpp deleted file mode 100644 index f21a4a7..0000000 --- a/src/monitor/main.cpp +++ /dev/null @@ -1,243 +0,0 @@ -// monitor/main.cpp - Old daemon to restart servers when they crashed. -// -// Copyright © ???? Bartosz Waszak <waszi@evil.org.pl> -// Copyright © 2011-2014 Ben Longbons <b.r.longbons@gmail.com> -// -// This file is part of The Mana World (Athena server) -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. - -#include <sys/wait.h> - -#include <fcntl.h> -#include <unistd.h> - -#include <csignal> -#include <cstdlib> - -#include "../strings/mstring.hpp" -#include "../strings/astring.hpp" -#include "../strings/zstring.hpp" -#include "../strings/xstring.hpp" -#include "../strings/literal.hpp" - -#include "../io/cxxstdio.hpp" -#include "../io/fd.hpp" -#include "../io/line.hpp" - -#include "../mmo/config_parse.hpp" -#include "../mmo/version.hpp" - -#include "../net/timestamp-utils.hpp" - -#include "globals.hpp" -#include "monitor_conf.hpp" - -#include "../poison.hpp" - - -namespace tmwa -{ -namespace monitor -{ -static -AString make_path(XString base, XString path) -{ - MString m; - m += base; - m += '/'; - m += path; - return AString(m); -} - -static -pid_t start_process(ZString exec) -{ - const char *args[2] = {exec.c_str(), nullptr}; - pid_t pid = fork(); - if (pid == -1) - { - FPRINTF(stderr, "Failed to fork"_fmt); - return 0; - } - if (pid == 0) - { - DIAG_PUSH(); - DIAG_I(cast_qual); - execv(exec.c_str(), const_cast<char **>(args)); - DIAG_POP(); - perror("Failed to exec"); - kill(getppid(), SIGABRT); - exit(1); - } - return pid; -} - -// Kill all children with the same signal we got, then ourself. -static -void stop_process(int sig) -{ - if (pid_login) - kill(pid_login, sig); - if (pid_char) - kill(pid_char, sig); - if (pid_map) - kill(pid_map, sig); - DIAG_PUSH(); - DIAG_I(old_style_cast); - DIAG_I(zero_as_null_pointer_constant); - signal(sig, SIG_DFL); - DIAG_POP(); - raise(sig); -} - -static -bool monitor_config(io::Spanned<XString> key, io::Spanned<ZString> value) -{ - return parse_monitor_conf(monitor_conf, key, value); -} - -static -bool monitor_confs(io::Spanned<XString> key, io::Spanned<ZString> value) -{ - if (key.data == "monitor_conf"_s) - { - return load_config_file(value.data, monitor_config); - } - key.span.error("Unknown meta-key for monitor nonserver"_s); - return false; -} -} // namespace monitor -} // namespace tmwa - -int main(int argc, char *argv[]) -{ - using namespace tmwa; - using namespace tmwa::monitor; - // These are all the signals we are likely to get - // The shell handles stop/cont - signal(SIGTERM, stop_process); - signal(SIGINT, stop_process); - signal(SIGQUIT, stop_process); - signal(SIGABRT, stop_process); - - monitor_conf.workdir = make_path(ZString(strings::really_construct_from_a_pointer, getenv("HOME"), nullptr), "tmwserver"_s); - - ZString argv0 = ZString(strings::really_construct_from_a_pointer, argv[0], nullptr); - bool loaded_config_yet = false; - bool runflag = true; - - for (int ai = 1; ai < argc; ++ai) - { - ZString argvi = ZString(strings::really_construct_from_a_pointer, argv[ai], nullptr); - if (argvi.startswith('-')) - { - if (argvi == "--help"_s) - { - PRINTF("Usage: %s [--help] [--version] [files...]\n"_fmt, - argv0); - exit(0); - } - else if (argvi == "--version"_s) - { - PRINTF("%s\n"_fmt, CURRENT_VERSION_STRING); - exit(0); - } - else - { - FPRINTF(stderr, "Unknown argument: %s\n"_fmt, argvi); - runflag = false; - } - } - else - { - loaded_config_yet = true; - runflag &= load_config_file(argvi, monitor_confs); - } - } - - if (!loaded_config_yet) - runflag &= load_config_file("conf/tmwa-monitor.conf"_s, monitor_confs); - - if (!runflag) - exit(1); - - if (chdir(monitor_conf.workdir.c_str()) < 0) - { - perror("Failed to change directory"); - exit(1); - } - - PRINTF("Starting:\n"_fmt); - PRINTF("* workdir: %s\n"_fmt, monitor_conf.workdir); - PRINTF("* login_server: %s\n"_fmt, monitor_conf.login_server); - PRINTF("* char_server: %s\n"_fmt, monitor_conf.char_server); - PRINTF("* map_server: %s\n"_fmt, monitor_conf.map_server); - { - //make sure all possible file descriptors are free for use by the servers - //if there are file descriptors higher than the max open from before the limit dropped, that's not our problem - io::FD fd = io::FD::sysconf_SC_OPEN_MAX(); - while ((fd = fd.prev()) > io::FD::stderr()) - { - if (fd.close() == 0) - FPRINTF(stderr, "close fd %d\n"_fmt, fd.uncast_dammit()); - } - fd = io::FD::open("/dev/null"_s, O_RDWR); - if (fd == io::FD()) - { - perror("open /dev/null"); - exit(1); - } - fd.dup2(io::FD::stdin()); - fd.dup2(io::FD::stdout()); - fd.close(); - } - while (1) - { - // write stuff to stderr - timestamp_seconds_buffer timestamp; - stamp_time(timestamp); - - if (!pid_login) - { - pid_login = start_process(monitor_conf.login_server); - FPRINTF(stderr, "[%s] forked login server: %lu\n"_fmt, - timestamp, static_cast<unsigned long>(pid_login)); - } - if (!pid_char) - { - pid_char = start_process(monitor_conf.char_server); - FPRINTF(stderr, "[%s] forked char server: %lu\n"_fmt, - timestamp, static_cast<unsigned long>(pid_char)); - } - if (!pid_map) - { - pid_map = start_process(monitor_conf.map_server); - FPRINTF(stderr, "[%s] forked map server: %lu\n"_fmt, - timestamp, static_cast<unsigned long>(pid_map)); - } - pid_t dead = wait(nullptr); - if (dead == -1) - { - perror("Failed to wait for child"); - exit(1); - } - if (pid_login == dead) - pid_login = 0; - if (pid_char == dead) - pid_char = 0; - if (pid_map == dead) - pid_map = 0; - } -} |