Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 05/28/15 in all areas

  1. Viele Damageberechnungen sind in der battle.c. U.a. auch für SG: https://github.com/rathena/rathena/blob/master/src/map/battle.c#L5564
    2 points
  2. Du wirst im src nicht 1:1 die Formeln aus dem IroWiki finden. Die meisten Einstellungen/Formeln findest du in der Skill.c oder im db-Ordner: https://github.com/rathena/rathena/blob/master/src/map/skill.c https://github.com/rathena/rathena/tree/master/db
    2 points
  3. Packet Obfuscation Support As of 9d247d8, rAthena is now able to support encrypted packets making servers WPE free! Thanks to Hercules for the initial base of it. Thanks to @Napster for getting it applied to rA. Enabling support for your server: Packet Obfuscation support is enabled by default. It can be disabled in src/config/core.h by commenting out #define PACKET_OBFUSCATION. When diff'ing your client, make sure to not apply the "Disable encrypted packet" diff. A new definition has been added in db/packet_db.txt called packet_keys_use. Make sure this corresponds to the packet_ver you are using! Clients 2011-10-05 and newer will contain a new definition in db/packet_db.txt called packet_keys. These will have the three default keys for their specific client version. These keys can be changed if you use the diff to change the default key of the client. Keyworld was nice enough to provide a nice GUI to test custom keys. You can find that here. If you happen to change your keys, make sure the ones you apply in the diff match the order in the packet_keys definition. If your server supports multiple clients, make sure all clients are using the same 3 keys. Keep in mind, the maximum key value is 0x7FFFFFFF!
    1 point
  4. - script weather npc -1,{ function ChangeWeather ; function CheckMap ; function CheckBound; OnInit: //==================================== *user setup* =================================================== setarray .maps$ , "prontera","morocc"; //place the maps you want the weather to be enabled here .mapcount = getarraysize(.maps$); setarray .weathers$ , "clouds","clouds2","fireworks","fog","leaves","sakura","snow"; .weathercount = getarraysize(.weathers$); setarray .announces$ , "It's getting cloudy~~","It's getting cloudy~~","Woah! Fireworks!","That fog came out of nowhere..","Some leaves are falling.","Some pretty leaves are falling.","It's so snowy!"; .delay = 1; //will change the weather every <.delay> minutes //================================= *end of user setup*================================================ bindatcmd "weather",strnpcinfo(0)+"::OnWeather",40; initnpctimer; end; OnTimer60000: $WeatherTimer++; if ($WeatherTimer >= .delay) { $WeatherTimer = 0 ; ChangeWeather(); } //changing weather.. end; OnHour18: for (.@i = 0 ; .@i < .mapcount ; .@i++) setmapflag .maps$[.@i],mf_nightenabled; end; OnHour08: for (.@i = 0 ; .@i < .mapcount ; .@i++) removemapflag .maps$[.@i],mf_nightenabled; end; OnWeather: $WeatherTimer = 0; ChangeWeather(); end; function ChangeWeather { //change weather .@rand = rand(getvariableofnpc(.weathercount,"weather npc")); .@weather$ = getvariableofnpc(.weathers$[.@rand],"weather npc"); while (.@weather$ == getvariableofnpc(.prev_weather$,"weather npc")) .@weather$ = getvariableofnpc(.weathers$[.@rand],"weather npc"); for (.@i = 0 ; .@i < getvariableofnpc(.mapcount,"weather npc") ; .@i++) { if (getvariableofnpc(.prev_weather$,"weather npc") != "") removemapflag getvariableofnpc(.maps$[.@i],"weather npc"),getd("mf_"+getvariableofnpc(.prev_weather$,"weather npc")); setmapflag getvariableofnpc(.maps$[.@i],"weather npc"),getd("mf_"+.@weather$); } set getvariableofnpc(.prev_weather$,"weather npc") , .@weather$; //reload screen for players not selling/in chatroom .@n = query_sql ("SELECT `name` FROM `char` WHERE `online` = 1",.@players$); for (.@i = 0 ; .@i < getarraysize(.@players$) ; .@i++) { if (attachrid(getcharid(3,.@players$[.@i]))) { getmapxy .@map$,.@x,.@y,0; if (CheckMap(.@map$) && CheckBound()) warp .@map$,.@x,.@y; } } sleep 1000; for (.@i = 0 ; .@i < getvariableofnpc(.mapcount,"weather npc") ; .@i++) mapannounce getvariableofnpc(.maps$[.@i],"weather npc"),getvariableofnpc(.announces$[.@rand],"weather npc"),0,0x00ffff; return; } function CheckMap { getmapxy .@map$,.@x,.@y,0; for (.@i = 0 ; .@i < getvariableofnpc(.mapcount,"weather npc") ; .@i++) if (.@map$ == getvariableofnpc(.maps$[.@i],"weather npc")) return 1; return 0; } function CheckBound { if (checkchatting(strcharinfo(0)) || checkvending(strcharinfo(0))) return 0; return 1; } } please edit these because I'm not good at finding cool phrase xD setarray .announces$ , "It's getting cloudy~~","It's getting cloudy~~","Woah! Fireworks!","That fog came out of nowhere..","Some leaves are falling.","Some pretty leaves are falling.","It's so snowy!";
    1 point
  5. skillratio ist sozusagen der Prozentuale Wert von etwas. In diesem Fall von MATK. Der standard Wert ist 100 (bzw. 100%, bzw. 1 MATK), daher "fehlt" dort auch die 100. Siehe: https://github.com/rathena/rathena/blob/master/src/map/battle.c#L5419
    1 point
  6. the script works fine for me but I doon't have the beep.wav file ^^ atcommand "@kamic ffb9f3 "+.News$[ rand( getarraysize( .News$ ) ) ]; A player must be attached to the script.
    1 point
  7. rA Index: conf/groups.conf =================================================================== --- conf/groups.conf (revision 15658) +++ conf/groups.conf (working copy) @@ -257,6 +257,7 @@ level: 99 inherit: ( "Support", "Law Enforcement" ) commands: { + maintenance: true } log_commands: true permissions: { Index: src/char/char.c =================================================================== --- src/char/char.c (revision 15658) +++ src/char/char.c (working copy) @@ -2654,7 +2654,7 @@ break; case 0x2b02: // req char selection - if( RFIFOREST(fd) < 18 ) + if( RFIFOREST(fd) < 19 ) return 0; { struct auth_node* node; @@ -2663,9 +2663,10 @@ uint32 login_id1 = RFIFOL(fd,6); uint32 login_id2 = RFIFOL(fd,10); uint32 ip = RFIFOL(fd,14); - RFIFOSKIP(fd,18); - - if( runflag != CHARSERVER_ST_RUNNING ) + uint8 group_id = RFIFOB(fd,18); + RFIFOSKIP(fd,19); + + if( runflag != CHARSERVER_ST_RUNNING && (runflag != CHARSERVER_ST_MAINTENANCE || group_id != 99) ) { WFIFOHEAD(fd,7); WFIFOW(fd,0) = 0x2b03; @@ -2717,8 +2718,7 @@ mmo_char_fromsql(RFIFOL(fd,14), &char_dat, true); char_data = (struct mmo_charstatus*)uidb_get(char_db_,RFIFOL(fd,14)); } - - if( runflag == CHARSERVER_ST_RUNNING && + if( (runflag == CHARSERVER_ST_RUNNING || runflag == CHARSERVER_ST_MAINTENANCE) && session_isActive(map_fd) && char_data ) { //Send the map server the auth of this player. @@ -3082,7 +3082,7 @@ mmo_char_fromsql(char_id, &char_dat, true); cd = (struct mmo_charstatus*)uidb_get(char_db_,char_id); } - if( runflag == CHARSERVER_ST_RUNNING && + if( (runflag == CHARSERVER_ST_RUNNING || (runflag == CHARSERVER_ST_MAINTENANCE && node->group_id == 99)) && cd != NULL && node != NULL && node->account_id == account_id && @@ -3130,6 +3130,19 @@ RFIFOSKIP(fd,6); break; + case 0x2737: // is it maintenance? + if (RFIFOB(fd, 2) == CHARSERVER_ST_MAINTENANCE) { + //yezzz it iss + runflag = CHARSERVER_ST_MAINTENANCE; + //ShowInfo("Maintenance: On\n"); + } else { + if (runflag == CHARSERVER_ST_MAINTENANCE) { + runflag = CHARSERVER_ST_RUNNING; + //ShowInfo("Maintenance: Off\n"); + } + } RFIFOSKIP(fd, 3); + break; + default: { // inter server - packet @@ -3496,7 +3509,7 @@ WFIFOL(fd,0) = account_id; WFIFOSET(fd,4); - if( runflag != CHARSERVER_ST_RUNNING ) + if( runflag != CHARSERVER_ST_RUNNING && runflag != CHARSERVER_ST_MAINTENANCE ) { WFIFOHEAD(fd,3); WFIFOW(fd,0) = 0x6c; @@ -3519,6 +3532,27 @@ else {// authentication not found (coming from login server) if (login_fd > 0) { // don't send request if no login-server + if (runflag == CHARSERVER_ST_MAINTENANCE) { + if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `group_id` FROM `login` WHERE `account_id` = %d", account_id) ) { + Sql_ShowDebug(sql_handle); + break; + } else if( SQL_SUCCESS == Sql_NextRow(sql_handle) ) { + char* data; + Sql_GetData(sql_handle, 0, &data, NULL); + Sql_FreeResult(sql_handle); + if (atoi(data) != 99) { + //Kick everyone except Admin(99) + WFIFOHEAD(fd,3); + WFIFOW(fd,0) = 0x6c; + WFIFOB(fd,2) = 0; + WFIFOSET(fd,3); + break; + } + } else { + Sql_FreeResult(sql_handle); + break; + } + } WFIFOHEAD(login_fd,23); WFIFOW(login_fd,0) = 0x2712; // ask login-server to authentify an account WFIFOL(login_fd,2) = sd->account_id; Index: src/char/char.h =================================================================== --- src/char/char.h (revision 15658) +++ src/char/char.h (working copy) @@ -10,7 +10,8 @@ { CHARSERVER_ST_RUNNING = CORE_ST_LAST, CHARSERVER_ST_SHUTDOWN, - CHARSERVER_ST_LAST + CHARSERVER_ST_LAST, + CHARSERVER_ST_MAINTENANCE }; struct mmo_charstatus; Index: src/map/atcommand.c =================================================================== --- src/map/atcommand.c (revision 15658) +++ src/map/atcommand.c (working copy) @@ -8337,6 +8337,54 @@ return 0; } +/*========================================== + * @maintenance commands [FE] + *------------------------------------------*/ +ACMD_FUNC(maintenance) { + nullpo_retr(-1, sd); + + if (message && *message) { + if(strcmpi(message, "on") == 0) { + if(runflag == MAPSERVER_ST_MAINTENANCE) { + clif_displaymessage(fd, "Server already in maintenance"); + } else { + struct map_session_data* pl_sd; + struct s_mapiterator* iter; + + iter = mapit_getallusers(); + for (pl_sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); pl_sd = (TBL_PC*)mapit_next(iter)) { + if (pc_get_group_level(pl_sd) != 99) { // Only Admin(99) that will stay in maintenance + clif_GM_kick(NULL, pl_sd); + } + } + mapit_free(iter); + + runflag = MAPSERVER_ST_MAINTENANCE; //Activate maintenance, disable all player except Admin to login + chrif_maintenis(MAPSERVER_ST_MAINTENANCE); + //ShowInfo("Maintenance: On\n"); + clif_displaymessage(fd, "Maintenance: On"); + } + } else if(strcmpi(message, "off") == 0) { + if(runflag == MAPSERVER_ST_MAINTENANCE) { + runflag = MAPSERVER_ST_RUNNING; //Deactivate maintenance + chrif_maintenis(MAPSERVER_ST_RUNNING); + //ShowInfo("Maintenance: Off\n"); + clif_displaymessage(fd, "Maintenance: Off"); + } else { + clif_displaymessage(fd, "Server is not in maintenance"); + } + } else { + clif_displaymessage(fd, "Usage: @maintenance <on|off>"); + return -1; + } + } else { + clif_displaymessage(fd, "Usage: @maintenance <on|off>"); + return -1; + } + + return 0; +} + /** * Fills the reference of available commands in atcommand DBMap **/ @@ -8584,6 +8632,7 @@ * For Testing Purposes, not going to be here after we're done. **/ ACMD_DEF2("newmount", new_mount), + ACMD_DEF(maintenance), }; AtCommandInfo* atcommand; int i; Index: src/map/chrif.c =================================================================== --- src/map/chrif.c (revision 15658) +++ src/map/chrif.c (working copy) @@ -571,6 +571,17 @@ chrif_sd_to_auth(sd, ST_LOGIN); } +//Tell char-server that map-server is in maintenance +void chrif_maintenis(int flag) +{ + if (!chrif_isconnected()) + return; + WFIFOHEAD(char_fd, 3); + WFIFOW(char_fd, 0) = 0x2737; + WFIFOB(char_fd, 2) = flag; + WFIFOSET(char_fd, 3); +} + /*========================================== * Auth confirmation ack *------------------------------------------*/ @@ -624,11 +635,11 @@ } sd = node->sd; - if( runflag == MAPSERVER_ST_RUNNING && + if( (runflag == MAPSERVER_ST_RUNNING || runflag == MAPSERVER_ST_MAINTENANCE) && node->char_dat == NULL && node->account_id == account_id && node->char_id == char_id && - node->login_id1 == login_id1 ) + node->login_id1 == login_id1) { //Auth Ok if (pc_authok(sd, login_id2, expiration_time, group_id, status, changing_mapservers)) return; @@ -711,13 +722,14 @@ return -1; chrif_check(-1); - WFIFOHEAD(char_fd,18); + WFIFOHEAD(char_fd,19); WFIFOW(char_fd, 0) = 0x2b02; WFIFOL(char_fd, 2) = sd->bl.id; WFIFOL(char_fd, 6) = sd->login_id1; WFIFOL(char_fd,10) = sd->login_id2; WFIFOL(char_fd,14) = htonl(s_ip); - WFIFOSET(char_fd,18); + WFIFOB(char_fd,18) = sd->group_id; + WFIFOSET(char_fd,19); return 0; } Index: src/map/chrif.h =================================================================== --- src/map/chrif.h (revision 15658) +++ src/map/chrif.h (working copy) @@ -57,6 +57,7 @@ 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); +void chrif_maintenis(int flag); //[FE] /** * rAthena **/ Index: src/map/clif.c =================================================================== --- src/map/clif.c (revision 15658) +++ src/map/clif.c (working copy) @@ -8903,7 +8903,7 @@ return; } - if( runflag != MAPSERVER_ST_RUNNING ) + if( runflag != MAPSERVER_ST_RUNNING && runflag != MAPSERVER_ST_MAINTENANCE ) {// not allowed clif_authfail_fd(fd,1);// server closed return; Index: src/map/map.h =================================================================== --- src/map/map.h (revision 15658) +++ src/map/map.h (working copy) @@ -24,7 +24,8 @@ { MAPSERVER_ST_RUNNING = CORE_ST_LAST, MAPSERVER_ST_SHUTDOWN, - MAPSERVER_ST_LAST + MAPSERVER_ST_LAST, + MAPSERVER_ST_MAINTENANCE }; eA Index: conf/atcommand_athena.conf =================================================================== --- conf/atcommand_athena.conf (revision 15077) +++ conf/atcommand_athena.conf (working copy) @@ -802,6 +802,9 @@ // Stop all weather effects clearweather: 99,99 +// Maintenance command[FE] +maintenance: 99,99 + //--------------------------------------------------------------- // 100: Disabled commands Index: src/char_sql/char.c =================================================================== --- src/char_sql/char.c (revision 15077) +++ src/char_sql/char.c (working copy) @@ -2650,7 +2650,7 @@ break; case 0x2b02: // req char selection - if( RFIFOREST(fd) < 18 ) + if( RFIFOREST(fd) < 19 ) return 0; { struct auth_node* node; @@ -2659,9 +2659,11 @@ uint32 login_id1 = RFIFOL(fd,6); uint32 login_id2 = RFIFOL(fd,10); uint32 ip = RFIFOL(fd,14); - RFIFOSKIP(fd,18); + uint8 gm_level = RFIFOB(fd,18); + RFIFOSKIP(fd,19); - if( runflag != CHARSERVER_ST_RUNNING ) + if( runflag != CHARSERVER_ST_RUNNING && + ( runflag != CHARSERVER_ST_MAINTENANCE || gm_level < 99) ) // Player with GM Level below 99 can not enter a server in maintenance { WFIFOHEAD(fd,7); WFIFOW(fd,0) = 0x2b03; @@ -2715,7 +2717,7 @@ char_data = (struct mmo_charstatus*)uidb_get(char_db_,RFIFOL(fd,14)); } - if( runflag == CHARSERVER_ST_RUNNING && + if( (runflag == CHARSERVER_ST_RUNNING || runflag == CHARSERVER_ST_MAINTENANCE) && session_isActive(map_fd) && char_data ) { //Send the map server the auth of this player. @@ -3061,7 +3063,7 @@ mmo_char_fromsql(char_id, &char_dat, true); cd = (struct mmo_charstatus*)uidb_get(char_db_,char_id); } - if( runflag == CHARSERVER_ST_RUNNING && + if( (runflag == CHARSERVER_ST_RUNNING || (runflag == CHARSERVER_ST_MAINTENANCE && node->gmlevel >= 99)) && //Equal/Above 99 can login cd != NULL && node != NULL && node->account_id == account_id && @@ -3108,6 +3110,19 @@ RFIFOSKIP(fd,6); break; + case 0x2737: // is it maintenance? + if (RFIFOB(fd, 2) == CHARSERVER_ST_MAINTENANCE) { + //yezzz it iss + runflag = CHARSERVER_ST_MAINTENANCE; + //ShowInfo("Maintenance: On\n"); + } else { + if (runflag == CHARSERVER_ST_MAINTENANCE) { + runflag = CHARSERVER_ST_RUNNING; + //ShowInfo("Maintenance: Off\n"); + } + } RFIFOSKIP(fd, 3); + break; + default: { // inter server - packet @@ -3474,7 +3489,7 @@ WFIFOL(fd,0) = account_id; WFIFOSET(fd,4); - if( runflag != CHARSERVER_ST_RUNNING ) + if( runflag != CHARSERVER_ST_RUNNING && runflag != CHARSERVER_ST_MAINTENANCE ) { WFIFOHEAD(fd,3); WFIFOW(fd,0) = 0x6c; @@ -3497,6 +3512,27 @@ else {// authentication not found (coming from login server) if (login_fd > 0) { // don't send request if no login-server + if (runflag == CHARSERVER_ST_MAINTENANCE) { + if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `level` FROM `login` WHERE `account_id` = %d", account_id) ) { + Sql_ShowDebug(sql_handle); + break; + } else if( SQL_SUCCESS == Sql_NextRow(sql_handle) ) { + char* data; + Sql_GetData(sql_handle, 0, &data, NULL); + Sql_FreeResult(sql_handle); + if (atoi(data) < 99) { + //Kick everyone with level below Admin(99) + WFIFOHEAD(fd,3); + WFIFOW(fd,0) = 0x6c; + WFIFOB(fd,2) = 0; + WFIFOSET(fd,3); + break; + } + } else { + Sql_FreeResult(sql_handle); + break; + } + } WFIFOHEAD(login_fd,23); WFIFOW(login_fd,0) = 0x2712; // ask login-server to authentify an account WFIFOL(login_fd,2) = sd->account_id; Index: src/char_sql/char.h =================================================================== --- src/char_sql/char.h (revision 15077) +++ src/char_sql/char.h (working copy) @@ -11,7 +11,8 @@ { CHARSERVER_ST_RUNNING = CORE_ST_LAST, CHARSERVER_ST_SHUTDOWN, - CHARSERVER_ST_LAST + CHARSERVER_ST_LAST, + CHARSERVER_ST_MAINTENANCE }; #endif Index: src/map/atcommand.c =================================================================== --- src/map/atcommand.c (revision 15077) +++ src/map/atcommand.c (working copy) @@ -8562,7 +8562,52 @@ return 0; } +/*========================================== + * @maintenance commands [FE] + *------------------------------------------*/ +ACMD_FUNC(maintenance) { + nullpo_retr(-1, sd); + if (message && *message) { + if (strcmpi(message, "on") == 0) { + if (runflag == MAPSERVER_ST_MAINTENANCE) { + clif_displaymessage(fd, "Server already in maintenance"); + } else { + struct map_session_data* pl_sd; + struct s_mapiterator* iter; + + iter = mapit_getallusers(); + for (pl_sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); pl_sd = (TBL_PC*)mapit_next(iter)) { + if (pc_isGM(pl_sd) < 99) { // Kick anyone with level below Admin(99) + clif_GM_kick(NULL, pl_sd); + } + } + mapit_free(iter); + + runflag = MAPSERVER_ST_MAINTENANCE; //Activate maintenance, disable all player except Admin to login + chrif_maintenis(MAPSERVER_ST_MAINTENANCE); + clif_displaymessage(fd, "Maintenance: On"); + } + } else if (strcmpi(message, "off") == 0) { + if(runflag == MAPSERVER_ST_MAINTENANCE) { + runflag = MAPSERVER_ST_RUNNING; //Deactivate maintenance + chrif_maintenis(MAPSERVER_ST_RUNNING); + clif_displaymessage(fd, "Maintenance: Off"); + } else { + clif_displaymessage(fd, "Server is not in maintenance"); + } + } else { + clif_displaymessage(fd, "Usage: @maintenance <on|off>"); + return -1; + } + } else { + clif_displaymessage(fd, "Usage: @maintenance <on|off>"); + return -1; + } + + return 0; +} + /*========================================== * atcommand_info[] structure definition *------------------------------------------*/ @@ -8865,6 +8910,7 @@ { "delitem", 60,60, atcommand_delitem }, { "charcommands", 1,1, atcommand_commands }, { "font", 1,1, atcommand_font }, + { "maintenance", 99,99, atcommand_maintenance }, }; Index: src/map/chrif.c =================================================================== --- src/map/chrif.c (revision 15077) +++ src/map/chrif.c (working copy) @@ -574,6 +574,17 @@ chrif_sd_to_auth(sd, ST_LOGIN); } +//Tell char-server that map-server is in maintenance +void chrif_maintenis(int flag) +{ + if (!chrif_isconnected()) + return; + WFIFOHEAD(char_fd, 3); + WFIFOW(char_fd, 0) = 0x2737; + WFIFOB(char_fd, 2) = flag; + WFIFOSET(char_fd, 3); +} + /*========================================== * Auth confirmation ack *------------------------------------------*/ @@ -627,7 +638,7 @@ } sd = node->sd; - if( runflag == MAPSERVER_ST_RUNNING && + if( (runflag == MAPSERVER_ST_RUNNING || runflag == MAPSERVER_ST_MAINTENANCE) && node->char_dat == NULL && node->account_id == account_id && node->char_id == char_id && @@ -715,13 +726,14 @@ return -1; chrif_check(-1); - WFIFOHEAD(char_fd,18); + WFIFOHEAD(char_fd,19); WFIFOW(char_fd, 0) = 0x2b02; WFIFOL(char_fd, 2) = sd->bl.id; WFIFOL(char_fd, 6) = sd->login_id1; WFIFOL(char_fd,10) = sd->login_id2; WFIFOL(char_fd,14) = htonl(s_ip); - WFIFOSET(char_fd,18); + WFIFOB(char_fd,18) = sd->gmlevel; + WFIFOSET(char_fd,19); return 0; } Index: src/map/chrif.h =================================================================== --- src/map/chrif.h (revision 15077) +++ src/map/chrif.h (working copy) @@ -57,6 +57,7 @@ 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); +void chrif_maintenis(int flag); int do_final_chrif(void); int do_init_chrif(void); Index: src/map/clif.c =================================================================== --- src/map/clif.c (revision 15077) +++ src/map/clif.c (working copy) @@ -8847,7 +8847,7 @@ return; } - if( runflag != MAPSERVER_ST_RUNNING ) + if( runflag != MAPSERVER_ST_RUNNING && runflag != MAPSERVER_ST_MAINTENANCE ) {// not allowed clif_authfail_fd(fd,1);// server closed return; Index: src/map/map.h =================================================================== --- src/map/map.h (revision 15077) +++ src/map/map.h (working copy) @@ -19,7 +19,8 @@ { MAPSERVER_ST_RUNNING = CORE_ST_LAST, MAPSERVER_ST_SHUTDOWN, - MAPSERVER_ST_LAST + MAPSERVER_ST_LAST, + MAPSERVER_ST_MAINTENANCE }; //Uncomment to enable the Cell Stack Limit mod.
    1 point
  8. I'm not promoting it... this is BEST place you can get that updated files goo.gl/HC3pu1
    1 point
  9. GRF doesn't really have any encoding, it just checks strings byte by byte (with case insensitivity for alphabetic characters). Gravity uses strings encoded with EUC-KR. The garbled strings you see in data folders are the direct representation of these EUC-KR encoded strings in ASCII or similar. Repacking with the garbled names works because it's binary equivalent. If you convert the Korean names to unicode when extracting you must convert back to get the expected file names in the GRF. For names limited to latin characters it doesn't actually matter since that's the same in literally every character encoding.
    1 point
  10. try this. https://rathena.org/board/topic/89848-official-vip-system/
    1 point
×
×
  • Create New...