summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md31
-rw-r--r--README.md8
-rw-r--r--db/constants.conf58
-rw-r--r--db/re/item_db.conf4
-rw-r--r--doc/constants.md711
-rw-r--r--doc/script_commands.txt7
-rw-r--r--maps/pre-re/1@cata.mcachebin2382 -> 2382 bytes
-rw-r--r--maps/pre-re/1@eom.mcachebin1136 -> 1136 bytes
-rw-r--r--maps/pre-re/1@gef_in.mcachebin1274 -> 1274 bytes
-rw-r--r--maps/pre-re/1@jtb.mcachebin5189 -> 5189 bytes
-rw-r--r--maps/pre-re/1@ma_b.mcachebin784 -> 784 bytes
-rw-r--r--maps/pre-re/1@ma_c.mcachebin747 -> 747 bytes
-rw-r--r--maps/pre-re/1@sara.mcachebin3928 -> 3928 bytes
-rw-r--r--maps/pre-re/1@tnm3.mcachebin699 -> 699 bytes
-rw-r--r--maps/pre-re/5@tower.mcachebin279 -> 279 bytes
-rw-r--r--maps/pre-re/airplane.mcachebin1424 -> 1424 bytes
-rw-r--r--maps/pre-re/airplane_01.mcachebin1424 -> 1424 bytes
-rw-r--r--maps/pre-re/alb_ship.mcachebin549 -> 549 bytes
-rw-r--r--maps/pre-re/alde_alche.mcachebin683 -> 683 bytes
-rw-r--r--maps/pre-re/alde_gld.mcachebin2763 -> 2763 bytes
-rw-r--r--maps/pre-re/alde_tt02.mcachebin3302 -> 3302 bytes
-rw-r--r--maps/pre-re/alde_tt03.mcachebin3096 -> 3096 bytes
-rw-r--r--maps/pre-re/aldeba_in.mcachebin1489 -> 1489 bytes
-rw-r--r--maps/pre-re/aldeg_cas04.mcachebin1265 -> 1265 bytes
-rw-r--r--maps/pre-re/aldeg_cas05.mcachebin1288 -> 1288 bytes
-rw-r--r--maps/pre-re/arug_cas01.mcachebin3015 -> 3015 bytes
-rw-r--r--maps/pre-re/arug_cas03.mcachebin2740 -> 2740 bytes
-rw-r--r--maps/pre-re/arug_cas04.mcachebin2740 -> 2740 bytes
-rw-r--r--maps/pre-re/arug_cas05.mcachebin2740 -> 2740 bytes
-rw-r--r--maps/pre-re/auction_01.mcachebin336 -> 336 bytes
-rw-r--r--maps/pre-re/auction_02.mcachebin404 -> 404 bytes
-rw-r--r--maps/pre-re/ayo_in01.mcachebin889 -> 889 bytes
-rw-r--r--maps/pre-re/bat_b01.mcachebin1847 -> 1847 bytes
-rw-r--r--maps/pre-re/bat_b02.mcachebin1847 -> 1847 bytes
-rw-r--r--maps/pre-re/bat_c01.mcachebin234 -> 234 bytes
-rw-r--r--maps/pre-re/bat_c02.mcachebin234 -> 234 bytes
-rw-r--r--maps/pre-re/bat_c03.mcachebin234 -> 234 bytes
-rw-r--r--maps/pre-re/bat_room.mcachebin575 -> 575 bytes
-rw-r--r--maps/pre-re/bif_fild01.mcachebin4323 -> 4323 bytes
-rw-r--r--maps/pre-re/bra_in01.mcachebin1012 -> 1012 bytes
-rw-r--r--maps/pre-re/c_tower1.mcachebin5392 -> 5392 bytes
-rw-r--r--maps/pre-re/c_tower2.mcachebin2836 -> 2836 bytes
-rw-r--r--maps/pre-re/c_tower2_.mcachebin2836 -> 2836 bytes
-rw-r--r--maps/pre-re/c_tower4.mcachebin2466 -> 2466 bytes
-rw-r--r--maps/pre-re/cmd_fild06.mcachebin5540 -> 5540 bytes
-rw-r--r--maps/pre-re/dic_dun01.mcachebin1144 -> 1144 bytes
-rw-r--r--maps/pre-re/dicastes01.mcachebin4081 -> 4081 bytes
-rw-r--r--maps/pre-re/dicastes02.mcachebin1268 -> 1268 bytes
-rw-r--r--maps/pre-re/ecl_hub01.mcachebin370 -> 370 bytes
-rw-r--r--maps/pre-re/ecl_tdun01.mcachebin619 -> 619 bytes
-rw-r--r--maps/pre-re/ecl_tdun02.mcachebin455 -> 455 bytes
-rw-r--r--maps/pre-re/ecl_tdun03.mcachebin379 -> 379 bytes
-rw-r--r--maps/pre-re/ecl_tdun04.mcachebin146 -> 146 bytes
-rw-r--r--maps/pre-re/ein_fild01.mcachebin3849 -> 3849 bytes
-rw-r--r--maps/pre-re/ein_fild03.mcachebin3585 -> 3585 bytes
-rw-r--r--maps/pre-re/ein_in01.mcachebin2306 -> 2306 bytes
-rw-r--r--maps/pre-re/evt_mobroom.mcachebin793 -> 793 bytes
-rw-r--r--maps/pre-re/g_room1-1.mcachebin1622 -> 1622 bytes
-rw-r--r--maps/pre-re/g_room1-2.mcachebin1622 -> 1622 bytes
-rw-r--r--maps/pre-re/g_room1-3.mcachebin1622 -> 1622 bytes
-rw-r--r--maps/pre-re/g_room2.mcachebin1622 -> 1622 bytes
-rw-r--r--maps/pre-re/gef_fild01.mcachebin3432 -> 3432 bytes
-rw-r--r--maps/pre-re/gefenia01.mcachebin3033 -> 3033 bytes
-rw-r--r--maps/pre-re/gefenia02.mcachebin2640 -> 2640 bytes
-rw-r--r--maps/pre-re/gefg_cas04.mcachebin1298 -> 1298 bytes
-rw-r--r--maps/pre-re/gl_in01.mcachebin1607 -> 1607 bytes
-rw-r--r--maps/pre-re/gld_dun03.mcachebin2866 -> 2866 bytes
-rw-r--r--maps/pre-re/gld_dun03_2.mcachebin2866 -> 2866 bytes
-rw-r--r--maps/pre-re/guild_room.mcachebin1622 -> 1622 bytes
-rw-r--r--maps/pre-re/himinn.mcachebin186 -> 186 bytes
-rw-r--r--maps/pre-re/hu_fild06.mcachebin3245 -> 3245 bytes
-rw-r--r--maps/pre-re/hu_in01.mcachebin2569 -> 2569 bytes
-rw-r--r--maps/pre-re/ice_dun02.mcachebin3627 -> 3627 bytes
-rw-r--r--maps/pre-re/in_hunter.mcachebin342 -> 342 bytes
-rw-r--r--maps/pre-re/in_moc_16.mcachebin1125 -> 1125 bytes
-rw-r--r--maps/pre-re/itemmall.mcachebin336 -> 336 bytes
-rw-r--r--maps/pre-re/iz_ac01.mcachebin941 -> 941 bytes
-rw-r--r--maps/pre-re/iz_ac01_a.mcachebin941 -> 941 bytes
-rw-r--r--maps/pre-re/iz_ac01_b.mcachebin941 -> 941 bytes
-rw-r--r--maps/pre-re/iz_ac01_c.mcachebin941 -> 941 bytes
-rw-r--r--maps/pre-re/iz_ac01_d.mcachebin941 -> 941 bytes
-rw-r--r--maps/pre-re/iz_int.mcachebin405 -> 405 bytes
-rw-r--r--maps/pre-re/iz_int01.mcachebin405 -> 405 bytes
-rw-r--r--maps/pre-re/iz_int02.mcachebin405 -> 405 bytes
-rw-r--r--maps/pre-re/iz_int03.mcachebin405 -> 405 bytes
-rw-r--r--maps/pre-re/iz_int04.mcachebin405 -> 405 bytes
-rw-r--r--maps/pre-re/jawaii_in.mcachebin707 -> 707 bytes
-rw-r--r--maps/pre-re/job3_arch01.mcachebin74 -> 74 bytes
-rw-r--r--maps/pre-re/job3_arch03.mcachebin74 -> 74 bytes
-rw-r--r--maps/pre-re/job3_gen01.mcachebin363 -> 363 bytes
-rw-r--r--maps/pre-re/job3_guil01.mcachebin409 -> 409 bytes
-rw-r--r--maps/pre-re/job3_rang02.mcachebin878 -> 878 bytes
-rw-r--r--maps/pre-re/job3_sha01.mcachebin300 -> 300 bytes
-rw-r--r--maps/pre-re/job3_war01.mcachebin141 -> 141 bytes
-rw-r--r--maps/pre-re/job3_war02.mcachebin141 -> 141 bytes
-rw-r--r--maps/pre-re/job_ko.mcachebin722 -> 722 bytes
-rw-r--r--maps/pre-re/job_priest.mcachebin995 -> 995 bytes
-rw-r--r--maps/pre-re/job_soul.mcachebin75 -> 75 bytes
-rw-r--r--maps/pre-re/job_star.mcachebin353 -> 353 bytes
-rw-r--r--maps/pre-re/job_sword1.mcachebin2409 -> 2409 bytes
-rw-r--r--maps/pre-re/job_wizard.mcachebin482 -> 482 bytes
-rw-r--r--maps/pre-re/jupe_core.mcachebin1911 -> 1911 bytes
-rw-r--r--maps/pre-re/jupe_core2.mcachebin1911 -> 1911 bytes
-rw-r--r--maps/pre-re/jupe_ele_r.mcachebin163 -> 163 bytes
-rw-r--r--maps/pre-re/kh_dun02.mcachebin1593 -> 1593 bytes
-rw-r--r--maps/pre-re/lhz_fild02.mcachebin2517 -> 2517 bytes
-rw-r--r--maps/pre-re/lhz_in03.mcachebin1391 -> 1391 bytes
-rw-r--r--maps/pre-re/lighthalzen.mcachebin5429 -> 5429 bytes
-rw-r--r--maps/pre-re/lou_dun03.mcachebin2521 -> 2521 bytes
-rw-r--r--maps/pre-re/ma_scene01.mcachebin592 -> 592 bytes
-rw-r--r--maps/pre-re/ma_zif01.mcachebin74 -> 74 bytes
-rw-r--r--maps/pre-re/ma_zif02.mcachebin74 -> 74 bytes
-rw-r--r--maps/pre-re/ma_zif03.mcachebin74 -> 74 bytes
-rw-r--r--maps/pre-re/ma_zif04.mcachebin74 -> 74 bytes
-rw-r--r--maps/pre-re/ma_zif05.mcachebin74 -> 74 bytes
-rw-r--r--maps/pre-re/ma_zif06.mcachebin74 -> 74 bytes
-rw-r--r--maps/pre-re/ma_zif07.mcachebin74 -> 74 bytes
-rw-r--r--maps/pre-re/ma_zif08.mcachebin74 -> 74 bytes
-rw-r--r--maps/pre-re/ma_zif09.mcachebin74 -> 74 bytes
-rw-r--r--maps/pre-re/mag_dun02.mcachebin1738 -> 1738 bytes
-rw-r--r--maps/pre-re/mal_in01.mcachebin882 -> 882 bytes
-rw-r--r--maps/pre-re/man_fild03.mcachebin3147 -> 3147 bytes
-rw-r--r--maps/pre-re/man_in01.mcachebin1988 -> 1988 bytes
-rw-r--r--maps/pre-re/mjolnir_12.mcachebin4551 -> 4551 bytes
-rw-r--r--maps/pre-re/moc_fild01.mcachebin4428 -> 4428 bytes
-rw-r--r--maps/pre-re/moc_fild07.mcachebin5050 -> 5050 bytes
-rw-r--r--maps/pre-re/moc_fild08.mcachebin5411 -> 5411 bytes
-rw-r--r--maps/pre-re/moc_pryd01.mcachebin958 -> 958 bytes
-rw-r--r--maps/pre-re/moc_pryd04.mcachebin775 -> 775 bytes
-rw-r--r--maps/pre-re/morocc_in.mcachebin1209 -> 1209 bytes
-rw-r--r--maps/pre-re/mosk_dun02.mcachebin3593 -> 3593 bytes
-rw-r--r--maps/pre-re/mosk_fild02.mcachebin3761 -> 3761 bytes
-rw-r--r--maps/pre-re/nameless_in.mcachebin527 -> 527 bytes
-rw-r--r--maps/pre-re/new_1-4.mcachebin630 -> 630 bytes
-rw-r--r--maps/pre-re/new_2-4.mcachebin630 -> 630 bytes
-rw-r--r--maps/pre-re/new_3-4.mcachebin630 -> 630 bytes
-rw-r--r--maps/pre-re/new_4-4.mcachebin630 -> 630 bytes
-rw-r--r--maps/pre-re/new_5-4.mcachebin630 -> 630 bytes
-rw-r--r--maps/pre-re/new_zone04.mcachebin630 -> 630 bytes
-rw-r--r--maps/pre-re/nguild_prt.mcachebin1363 -> 1363 bytes
-rw-r--r--maps/pre-re/nif_fild02.mcachebin3744 -> 3744 bytes
-rw-r--r--maps/pre-re/nyd_dun01.mcachebin1621 -> 1621 bytes
-rw-r--r--maps/pre-re/nyd_dun02.mcachebin1569 -> 1569 bytes
-rw-r--r--maps/pre-re/orcsdun01.mcachebin1196 -> 1196 bytes
-rw-r--r--maps/pre-re/orcsdun02.mcachebin1297 -> 1297 bytes
-rw-r--r--maps/pre-re/pay_fild10.mcachebin6051 -> 6051 bytes
-rw-r--r--maps/pre-re/payon_in01.mcachebin900 -> 900 bytes
-rw-r--r--maps/pre-re/priest_1-1.mcachebin995 -> 995 bytes
-rw-r--r--maps/pre-re/priest_2-1.mcachebin995 -> 995 bytes
-rw-r--r--maps/pre-re/priest_3-1.mcachebin995 -> 995 bytes
-rw-r--r--maps/pre-re/prontera.mcachebin5013 -> 5013 bytes
-rw-r--r--maps/pre-re/prt_are_in.mcachebin626 -> 626 bytes
-rw-r--r--maps/pre-re/prt_church.mcachebin551 -> 551 bytes
-rw-r--r--maps/pre-re/prt_fild10.mcachebin4784 -> 4784 bytes
-rw-r--r--maps/pre-re/prtg_cas01.mcachebin1363 -> 1363 bytes
-rw-r--r--maps/pre-re/prtg_cas03.mcachebin1440 -> 1440 bytes
-rw-r--r--maps/pre-re/prtg_cas04.mcachebin1512 -> 1512 bytes
-rw-r--r--maps/pre-re/pvp_n_1-3.mcachebin482 -> 482 bytes
-rw-r--r--maps/pre-re/pvp_n_1-4.mcachebin995 -> 995 bytes
-rw-r--r--maps/pre-re/pvp_n_2-3.mcachebin482 -> 482 bytes
-rw-r--r--maps/pre-re/pvp_n_2-4.mcachebin995 -> 995 bytes
-rw-r--r--maps/pre-re/pvp_n_3-3.mcachebin482 -> 482 bytes
-rw-r--r--maps/pre-re/pvp_n_3-4.mcachebin995 -> 995 bytes
-rw-r--r--maps/pre-re/pvp_n_4-3.mcachebin482 -> 482 bytes
-rw-r--r--maps/pre-re/pvp_n_4-4.mcachebin995 -> 995 bytes
-rw-r--r--maps/pre-re/pvp_n_5-3.mcachebin482 -> 482 bytes
-rw-r--r--maps/pre-re/pvp_n_5-4.mcachebin995 -> 995 bytes
-rw-r--r--maps/pre-re/pvp_n_6-3.mcachebin482 -> 482 bytes
-rw-r--r--maps/pre-re/pvp_n_6-4.mcachebin995 -> 995 bytes
-rw-r--r--maps/pre-re/pvp_n_7-3.mcachebin482 -> 482 bytes
-rw-r--r--maps/pre-re/pvp_n_7-4.mcachebin995 -> 995 bytes
-rw-r--r--maps/pre-re/pvp_n_8-3.mcachebin482 -> 482 bytes
-rw-r--r--maps/pre-re/pvp_n_8-4.mcachebin995 -> 995 bytes
-rw-r--r--maps/pre-re/pvp_y_1-1.mcachebin5013 -> 5013 bytes
-rw-r--r--maps/pre-re/pvp_y_2-1.mcachebin5013 -> 5013 bytes
-rw-r--r--maps/pre-re/pvp_y_3-1.mcachebin5013 -> 5013 bytes
-rw-r--r--maps/pre-re/pvp_y_4-1.mcachebin5013 -> 5013 bytes
-rw-r--r--maps/pre-re/pvp_y_5-1.mcachebin5013 -> 5013 bytes
-rw-r--r--maps/pre-re/pvp_y_6-1.mcachebin5013 -> 5013 bytes
-rw-r--r--maps/pre-re/pvp_y_7-1.mcachebin5013 -> 5013 bytes
-rw-r--r--maps/pre-re/pvp_y_8-1.mcachebin5013 -> 5013 bytes
-rw-r--r--maps/pre-re/que_avan01.mcachebin205 -> 205 bytes
-rw-r--r--maps/pre-re/que_ba.mcachebin1103 -> 1103 bytes
-rw-r--r--maps/pre-re/que_dan01.mcachebin272 -> 272 bytes
-rw-r--r--maps/pre-re/que_moc_16.mcachebin1125 -> 1125 bytes
-rw-r--r--maps/pre-re/que_moon.mcachebin353 -> 353 bytes
-rw-r--r--maps/pre-re/que_sign02.mcachebin3744 -> 3744 bytes
-rw-r--r--maps/pre-re/que_thor.mcachebin495 -> 495 bytes
-rw-r--r--maps/pre-re/quiz_01.mcachebin1622 -> 1622 bytes
-rw-r--r--maps/pre-re/ra_fild02.mcachebin4240 -> 4240 bytes
-rw-r--r--maps/pre-re/ra_fild09.mcachebin2308 -> 2308 bytes
-rw-r--r--maps/pre-re/ra_fild10.mcachebin4094 -> 4094 bytes
-rw-r--r--maps/pre-re/ra_san01.mcachebin3060 -> 3060 bytes
-rw-r--r--maps/pre-re/ra_temple.mcachebin1295 -> 1295 bytes
-rw-r--r--maps/pre-re/siege_test.mcachebin1367 -> 1367 bytes
-rw-r--r--maps/pre-re/spl_fild03.mcachebin8302 -> 8302 bytes
-rw-r--r--maps/pre-re/spl_in01.mcachebin2361 -> 2361 bytes
-rw-r--r--maps/pre-re/sword_1-1.mcachebin2409 -> 2409 bytes
-rw-r--r--maps/pre-re/sword_2-1.mcachebin2409 -> 2409 bytes
-rw-r--r--maps/pre-re/sword_3-1.mcachebin2409 -> 2409 bytes
-rw-r--r--maps/pre-re/te_alde_gld.mcachebin2763 -> 2763 bytes
-rw-r--r--maps/pre-re/te_aldecas4.mcachebin1265 -> 1265 bytes
-rw-r--r--maps/pre-re/te_aldecas5.mcachebin1288 -> 1288 bytes
-rw-r--r--maps/pre-re/te_prtcas01.mcachebin1363 -> 1363 bytes
-rw-r--r--maps/pre-re/te_prtcas03.mcachebin1440 -> 1440 bytes
-rw-r--r--maps/pre-re/te_prtcas04.mcachebin1512 -> 1512 bytes
-rw-r--r--maps/pre-re/teg_dun01.mcachebin2866 -> 2866 bytes
-rw-r--r--maps/pre-re/tha_t01.mcachebin3145 -> 3145 bytes
-rw-r--r--maps/pre-re/tur_dun01.mcachebin2939 -> 2939 bytes
-rw-r--r--maps/pre-re/tur_dun02.mcachebin3976 -> 3976 bytes
-rw-r--r--maps/pre-re/tur_dun03.mcachebin2569 -> 2569 bytes
-rw-r--r--maps/pre-re/tur_dun06.mcachebin735 -> 735 bytes
-rw-r--r--maps/pre-re/turbo_e_16.mcachebin3302 -> 3302 bytes
-rw-r--r--maps/pre-re/turbo_e_4.mcachebin3302 -> 3302 bytes
-rw-r--r--maps/pre-re/turbo_e_8.mcachebin3302 -> 3302 bytes
-rw-r--r--maps/pre-re/turbo_n_1.mcachebin3302 -> 3302 bytes
-rw-r--r--maps/pre-re/turbo_n_16.mcachebin3302 -> 3302 bytes
-rw-r--r--maps/pre-re/turbo_n_4.mcachebin3302 -> 3302 bytes
-rw-r--r--maps/pre-re/turbo_n_8.mcachebin3302 -> 3302 bytes
-rw-r--r--maps/pre-re/turbo_room.mcachebin657 -> 657 bytes
-rw-r--r--maps/pre-re/um_fild02.mcachebin5281 -> 5281 bytes
-rw-r--r--maps/pre-re/valkyrie.mcachebin186 -> 186 bytes
-rw-r--r--maps/pre-re/ve_fild03.mcachebin3347 -> 3347 bytes
-rw-r--r--maps/pre-re/ve_fild07.mcachebin4044 -> 4044 bytes
-rw-r--r--maps/pre-re/wizard_1-1.mcachebin482 -> 482 bytes
-rw-r--r--maps/pre-re/wizard_2-1.mcachebin482 -> 482 bytes
-rw-r--r--maps/pre-re/wizard_3-1.mcachebin482 -> 482 bytes
-rw-r--r--maps/pre-re/xmas_dun02.mcachebin3329 -> 3329 bytes
-rw-r--r--maps/pre-re/yuno_fild12.mcachebin3057 -> 3057 bytes
-rw-r--r--maps/pre-re/yuno_pre.mcachebin471 -> 471 bytes
-rw-r--r--maps/re/1@cata.mcachebin2382 -> 2382 bytes
-rw-r--r--maps/re/1@gef_in.mcachebin1274 -> 1274 bytes
-rw-r--r--maps/re/1@jtb.mcachebin5189 -> 5189 bytes
-rw-r--r--maps/re/1@ma_b.mcachebin784 -> 784 bytes
-rw-r--r--maps/re/1@ma_c.mcachebin747 -> 747 bytes
-rw-r--r--maps/re/1@sara.mcachebin3928 -> 3928 bytes
-rw-r--r--maps/re/1@tnm3.mcachebin699 -> 699 bytes
-rw-r--r--maps/re/5@tower.mcachebin279 -> 279 bytes
-rw-r--r--maps/re/airplane.mcachebin1424 -> 1424 bytes
-rw-r--r--maps/re/airplane_01.mcachebin1424 -> 1424 bytes
-rw-r--r--maps/re/alb_ship.mcachebin549 -> 549 bytes
-rw-r--r--maps/re/alde_alche.mcachebin683 -> 683 bytes
-rw-r--r--maps/re/alde_gld.mcachebin2763 -> 2763 bytes
-rw-r--r--maps/re/alde_tt02.mcachebin3302 -> 3302 bytes
-rw-r--r--maps/re/alde_tt03.mcachebin3096 -> 3096 bytes
-rw-r--r--maps/re/aldeba_in.mcachebin1489 -> 1489 bytes
-rw-r--r--maps/re/aldeg_cas04.mcachebin1265 -> 1265 bytes
-rw-r--r--maps/re/aldeg_cas05.mcachebin1288 -> 1288 bytes
-rw-r--r--maps/re/arug_cas01.mcachebin3015 -> 3015 bytes
-rw-r--r--maps/re/arug_cas03.mcachebin2740 -> 2740 bytes
-rw-r--r--maps/re/arug_cas04.mcachebin2740 -> 2740 bytes
-rw-r--r--maps/re/arug_cas05.mcachebin2740 -> 2740 bytes
-rw-r--r--maps/re/auction_01.mcachebin336 -> 336 bytes
-rw-r--r--maps/re/auction_02.mcachebin404 -> 404 bytes
-rw-r--r--maps/re/ayo_in01.mcachebin889 -> 889 bytes
-rw-r--r--maps/re/bat_b01.mcachebin1847 -> 1847 bytes
-rw-r--r--maps/re/bat_b02.mcachebin1847 -> 1847 bytes
-rw-r--r--maps/re/bat_c01.mcachebin234 -> 234 bytes
-rw-r--r--maps/re/bat_c02.mcachebin234 -> 234 bytes
-rw-r--r--maps/re/bat_c03.mcachebin234 -> 234 bytes
-rw-r--r--maps/re/bat_room.mcachebin575 -> 575 bytes
-rw-r--r--maps/re/bif_fild01.mcachebin4323 -> 4323 bytes
-rw-r--r--maps/re/bra_in01.mcachebin1012 -> 1012 bytes
-rw-r--r--maps/re/c_tower1.mcachebin5392 -> 5392 bytes
-rw-r--r--maps/re/c_tower2.mcachebin2836 -> 2836 bytes
-rw-r--r--maps/re/c_tower2_.mcachebin2836 -> 2836 bytes
-rw-r--r--maps/re/c_tower4.mcachebin2466 -> 2466 bytes
-rw-r--r--maps/re/cmd_fild06.mcachebin5540 -> 5540 bytes
-rw-r--r--maps/re/dic_dun01.mcachebin1144 -> 1144 bytes
-rw-r--r--maps/re/dicastes01.mcachebin4081 -> 4081 bytes
-rw-r--r--maps/re/dicastes02.mcachebin1268 -> 1268 bytes
-rw-r--r--maps/re/ecl_hub01.mcachebin370 -> 370 bytes
-rw-r--r--maps/re/ecl_tdun01.mcachebin619 -> 619 bytes
-rw-r--r--maps/re/ecl_tdun02.mcachebin455 -> 455 bytes
-rw-r--r--maps/re/ecl_tdun03.mcachebin379 -> 379 bytes
-rw-r--r--maps/re/ecl_tdun04.mcachebin146 -> 146 bytes
-rw-r--r--maps/re/ein_fild01.mcachebin3849 -> 3849 bytes
-rw-r--r--maps/re/ein_fild03.mcachebin3585 -> 3585 bytes
-rw-r--r--maps/re/ein_in01.mcachebin2306 -> 2306 bytes
-rw-r--r--maps/re/evt_mobroom.mcachebin793 -> 793 bytes
-rw-r--r--maps/re/g_room1-1.mcachebin1622 -> 1622 bytes
-rw-r--r--maps/re/g_room1-2.mcachebin1622 -> 1622 bytes
-rw-r--r--maps/re/g_room1-3.mcachebin1622 -> 1622 bytes
-rw-r--r--maps/re/g_room2.mcachebin1622 -> 1622 bytes
-rw-r--r--maps/re/gef_fild01.mcachebin3432 -> 3432 bytes
-rw-r--r--maps/re/gefenia01.mcachebin3033 -> 3033 bytes
-rw-r--r--maps/re/gefenia02.mcachebin2640 -> 2640 bytes
-rw-r--r--maps/re/gefg_cas04.mcachebin1298 -> 1298 bytes
-rw-r--r--maps/re/gl_in01.mcachebin1607 -> 1607 bytes
-rw-r--r--maps/re/gld_dun03.mcachebin2866 -> 2866 bytes
-rw-r--r--maps/re/gld_dun03_2.mcachebin2866 -> 2866 bytes
-rw-r--r--maps/re/guild_room.mcachebin1622 -> 1622 bytes
-rw-r--r--maps/re/himinn.mcachebin186 -> 186 bytes
-rw-r--r--maps/re/hu_fild06.mcachebin3245 -> 3245 bytes
-rw-r--r--maps/re/hu_in01.mcachebin2569 -> 2569 bytes
-rw-r--r--maps/re/ice_dun02.mcachebin3627 -> 3627 bytes
-rw-r--r--maps/re/in_hunter.mcachebin342 -> 342 bytes
-rw-r--r--maps/re/in_moc_16.mcachebin1125 -> 1125 bytes
-rw-r--r--maps/re/itemmall.mcachebin336 -> 336 bytes
-rw-r--r--maps/re/iz_ac01.mcachebin941 -> 941 bytes
-rw-r--r--maps/re/iz_ac01_a.mcachebin941 -> 941 bytes
-rw-r--r--maps/re/iz_ac01_b.mcachebin941 -> 941 bytes
-rw-r--r--maps/re/iz_ac01_c.mcachebin941 -> 941 bytes
-rw-r--r--maps/re/iz_ac01_d.mcachebin941 -> 941 bytes
-rw-r--r--maps/re/jawaii_in.mcachebin707 -> 707 bytes
-rw-r--r--maps/re/job3_arch01.mcachebin74 -> 74 bytes
-rw-r--r--maps/re/job3_arch03.mcachebin74 -> 74 bytes
-rw-r--r--maps/re/job3_gen01.mcachebin363 -> 363 bytes
-rw-r--r--maps/re/job3_guil01.mcachebin409 -> 409 bytes
-rw-r--r--maps/re/job3_rang02.mcachebin878 -> 878 bytes
-rw-r--r--maps/re/job3_sha01.mcachebin300 -> 300 bytes
-rw-r--r--maps/re/job3_war01.mcachebin141 -> 141 bytes
-rw-r--r--maps/re/job3_war02.mcachebin141 -> 141 bytes
-rw-r--r--maps/re/job_ko.mcachebin722 -> 722 bytes
-rw-r--r--maps/re/job_priest.mcachebin995 -> 995 bytes
-rw-r--r--maps/re/job_soul.mcachebin75 -> 75 bytes
-rw-r--r--maps/re/job_star.mcachebin353 -> 353 bytes
-rw-r--r--maps/re/job_sword1.mcachebin2409 -> 2409 bytes
-rw-r--r--maps/re/job_wizard.mcachebin482 -> 482 bytes
-rw-r--r--maps/re/jupe_core.mcachebin1911 -> 1911 bytes
-rw-r--r--maps/re/jupe_core2.mcachebin1911 -> 1911 bytes
-rw-r--r--maps/re/jupe_ele_r.mcachebin163 -> 163 bytes
-rw-r--r--maps/re/kh_dun02.mcachebin1593 -> 1593 bytes
-rw-r--r--maps/re/lhz_dun04.mcachebin3942 -> 3942 bytes
-rw-r--r--maps/re/lhz_fild02.mcachebin2517 -> 2517 bytes
-rw-r--r--maps/re/lhz_in03.mcachebin1391 -> 1391 bytes
-rw-r--r--maps/re/lighthalzen.mcachebin5429 -> 5429 bytes
-rw-r--r--maps/re/lou_dun03.mcachebin2521 -> 2521 bytes
-rw-r--r--maps/re/ma_scene01.mcachebin592 -> 592 bytes
-rw-r--r--maps/re/ma_zif01.mcachebin74 -> 74 bytes
-rw-r--r--maps/re/ma_zif02.mcachebin74 -> 74 bytes
-rw-r--r--maps/re/ma_zif03.mcachebin74 -> 74 bytes
-rw-r--r--maps/re/ma_zif04.mcachebin74 -> 74 bytes
-rw-r--r--maps/re/ma_zif05.mcachebin74 -> 74 bytes
-rw-r--r--maps/re/ma_zif06.mcachebin74 -> 74 bytes
-rw-r--r--maps/re/ma_zif07.mcachebin74 -> 74 bytes
-rw-r--r--maps/re/ma_zif08.mcachebin74 -> 74 bytes
-rw-r--r--maps/re/ma_zif09.mcachebin74 -> 74 bytes
-rw-r--r--maps/re/mag_dun02.mcachebin1738 -> 1738 bytes
-rw-r--r--maps/re/mal_in01.mcachebin882 -> 882 bytes
-rw-r--r--maps/re/man_fild03.mcachebin3147 -> 3147 bytes
-rw-r--r--maps/re/man_in01.mcachebin1988 -> 1988 bytes
-rw-r--r--maps/re/mjolnir_12.mcachebin4551 -> 4551 bytes
-rw-r--r--maps/re/moc_fild01.mcachebin4428 -> 4428 bytes
-rw-r--r--maps/re/moc_fild07.mcachebin5050 -> 5050 bytes
-rw-r--r--maps/re/moc_fild08.mcachebin5411 -> 5411 bytes
-rw-r--r--maps/re/moc_pryd01.mcachebin958 -> 958 bytes
-rw-r--r--maps/re/moc_pryd04.mcachebin775 -> 775 bytes
-rw-r--r--maps/re/morocc_in.mcachebin1209 -> 1209 bytes
-rw-r--r--maps/re/mosk_dun02.mcachebin3593 -> 3593 bytes
-rw-r--r--maps/re/mosk_fild02.mcachebin3761 -> 3761 bytes
-rw-r--r--maps/re/nameless_in.mcachebin527 -> 527 bytes
-rw-r--r--maps/re/new_1-1.mcachebin934 -> 934 bytes
-rw-r--r--maps/re/new_1-4.mcachebin630 -> 630 bytes
-rw-r--r--maps/re/new_2-1.mcachebin934 -> 934 bytes
-rw-r--r--maps/re/new_2-4.mcachebin630 -> 630 bytes
-rw-r--r--maps/re/new_3-1.mcachebin934 -> 934 bytes
-rw-r--r--maps/re/new_3-4.mcachebin630 -> 630 bytes
-rw-r--r--maps/re/new_4-1.mcachebin934 -> 934 bytes
-rw-r--r--maps/re/new_4-4.mcachebin630 -> 630 bytes
-rw-r--r--maps/re/new_5-1.mcachebin934 -> 934 bytes
-rw-r--r--maps/re/new_5-4.mcachebin630 -> 630 bytes
-rw-r--r--maps/re/new_zone01.mcachebin934 -> 934 bytes
-rw-r--r--maps/re/new_zone04.mcachebin630 -> 630 bytes
-rw-r--r--maps/re/nguild_prt.mcachebin1363 -> 1363 bytes
-rw-r--r--maps/re/nif_fild02.mcachebin3744 -> 3744 bytes
-rw-r--r--maps/re/nyd_dun01.mcachebin1621 -> 1621 bytes
-rw-r--r--maps/re/nyd_dun02.mcachebin1569 -> 1569 bytes
-rw-r--r--maps/re/orcsdun01.mcachebin1196 -> 1196 bytes
-rw-r--r--maps/re/orcsdun02.mcachebin1297 -> 1297 bytes
-rw-r--r--maps/re/pay_fild10.mcachebin6051 -> 6051 bytes
-rw-r--r--maps/re/payon_in01.mcachebin900 -> 900 bytes
-rw-r--r--maps/re/priest_1-1.mcachebin995 -> 995 bytes
-rw-r--r--maps/re/priest_2-1.mcachebin995 -> 995 bytes
-rw-r--r--maps/re/priest_3-1.mcachebin995 -> 995 bytes
-rw-r--r--maps/re/prt_are_in.mcachebin626 -> 626 bytes
-rw-r--r--maps/re/prt_church.mcachebin583 -> 583 bytes
-rw-r--r--maps/re/prt_fild05.mcachebin7028 -> 7028 bytes
-rw-r--r--maps/re/prt_fild10.mcachebin4784 -> 4784 bytes
-rw-r--r--maps/re/prtg_cas01.mcachebin1363 -> 1363 bytes
-rw-r--r--maps/re/prtg_cas03.mcachebin1440 -> 1440 bytes
-rw-r--r--maps/re/prtg_cas04.mcachebin1512 -> 1512 bytes
-rw-r--r--maps/re/pvp_n_1-3.mcachebin482 -> 482 bytes
-rw-r--r--maps/re/pvp_n_1-4.mcachebin995 -> 995 bytes
-rw-r--r--maps/re/pvp_n_2-3.mcachebin482 -> 482 bytes
-rw-r--r--maps/re/pvp_n_2-4.mcachebin995 -> 995 bytes
-rw-r--r--maps/re/pvp_n_3-3.mcachebin482 -> 482 bytes
-rw-r--r--maps/re/pvp_n_3-4.mcachebin995 -> 995 bytes
-rw-r--r--maps/re/pvp_n_4-3.mcachebin482 -> 482 bytes
-rw-r--r--maps/re/pvp_n_4-4.mcachebin995 -> 995 bytes
-rw-r--r--maps/re/pvp_n_5-3.mcachebin482 -> 482 bytes
-rw-r--r--maps/re/pvp_n_5-4.mcachebin995 -> 995 bytes
-rw-r--r--maps/re/pvp_n_6-3.mcachebin482 -> 482 bytes
-rw-r--r--maps/re/pvp_n_6-4.mcachebin995 -> 995 bytes
-rw-r--r--maps/re/pvp_n_7-3.mcachebin482 -> 482 bytes
-rw-r--r--maps/re/pvp_n_7-4.mcachebin995 -> 995 bytes
-rw-r--r--maps/re/pvp_n_8-3.mcachebin482 -> 482 bytes
-rw-r--r--maps/re/pvp_n_8-4.mcachebin995 -> 995 bytes
-rw-r--r--maps/re/que_avan01.mcachebin205 -> 205 bytes
-rw-r--r--maps/re/que_ba.mcachebin1103 -> 1103 bytes
-rw-r--r--maps/re/que_dan01.mcachebin272 -> 272 bytes
-rw-r--r--maps/re/que_moc_16.mcachebin1125 -> 1125 bytes
-rw-r--r--maps/re/que_moon.mcachebin353 -> 353 bytes
-rw-r--r--maps/re/que_sign02.mcachebin3744 -> 3744 bytes
-rw-r--r--maps/re/que_thor.mcachebin495 -> 495 bytes
-rw-r--r--maps/re/quiz_01.mcachebin1622 -> 1622 bytes
-rw-r--r--maps/re/ra_fild02.mcachebin4240 -> 4240 bytes
-rw-r--r--maps/re/ra_fild09.mcachebin2308 -> 2308 bytes
-rw-r--r--maps/re/ra_fild10.mcachebin4094 -> 4094 bytes
-rw-r--r--maps/re/ra_san01.mcachebin3060 -> 3060 bytes
-rw-r--r--maps/re/ra_temple.mcachebin1295 -> 1295 bytes
-rw-r--r--maps/re/siege_test.mcachebin1367 -> 1367 bytes
-rw-r--r--maps/re/spl_fild03.mcachebin8302 -> 8302 bytes
-rw-r--r--maps/re/spl_in01.mcachebin2361 -> 2361 bytes
-rw-r--r--maps/re/sword_1-1.mcachebin2409 -> 2409 bytes
-rw-r--r--maps/re/sword_2-1.mcachebin2409 -> 2409 bytes
-rw-r--r--maps/re/sword_3-1.mcachebin2409 -> 2409 bytes
-rw-r--r--maps/re/te_alde_gld.mcachebin2763 -> 2763 bytes
-rw-r--r--maps/re/te_aldecas4.mcachebin1265 -> 1265 bytes
-rw-r--r--maps/re/te_aldecas5.mcachebin1288 -> 1288 bytes
-rw-r--r--maps/re/te_prtcas01.mcachebin1363 -> 1363 bytes
-rw-r--r--maps/re/te_prtcas03.mcachebin1440 -> 1440 bytes
-rw-r--r--maps/re/te_prtcas04.mcachebin1512 -> 1512 bytes
-rw-r--r--maps/re/teg_dun01.mcachebin2866 -> 2866 bytes
-rw-r--r--maps/re/tha_t01.mcachebin3145 -> 3145 bytes
-rw-r--r--maps/re/tur_dun01.mcachebin2939 -> 2939 bytes
-rw-r--r--maps/re/tur_dun02.mcachebin3976 -> 3976 bytes
-rw-r--r--maps/re/tur_dun03.mcachebin2569 -> 2569 bytes
-rw-r--r--maps/re/tur_dun06.mcachebin735 -> 735 bytes
-rw-r--r--maps/re/turbo_e_16.mcachebin3302 -> 3302 bytes
-rw-r--r--maps/re/turbo_e_4.mcachebin3302 -> 3302 bytes
-rw-r--r--maps/re/turbo_e_8.mcachebin3302 -> 3302 bytes
-rw-r--r--maps/re/turbo_n_1.mcachebin3302 -> 3302 bytes
-rw-r--r--maps/re/turbo_n_16.mcachebin3302 -> 3302 bytes
-rw-r--r--maps/re/turbo_n_4.mcachebin3302 -> 3302 bytes
-rw-r--r--maps/re/turbo_n_8.mcachebin3302 -> 3302 bytes
-rw-r--r--maps/re/turbo_room.mcachebin657 -> 657 bytes
-rw-r--r--maps/re/um_fild02.mcachebin5281 -> 5281 bytes
-rw-r--r--maps/re/valkyrie.mcachebin186 -> 186 bytes
-rw-r--r--maps/re/ve_fild03.mcachebin3347 -> 3347 bytes
-rw-r--r--maps/re/ve_fild07.mcachebin4044 -> 4044 bytes
-rw-r--r--maps/re/wizard_1-1.mcachebin482 -> 482 bytes
-rw-r--r--maps/re/wizard_2-1.mcachebin482 -> 482 bytes
-rw-r--r--maps/re/wizard_3-1.mcachebin482 -> 482 bytes
-rw-r--r--maps/re/xmas_dun02.mcachebin3329 -> 3329 bytes
-rw-r--r--maps/re/yuno_fild12.mcachebin3057 -> 3057 bytes
-rw-r--r--maps/re/yuno_pre.mcachebin471 -> 471 bytes
-rw-r--r--sql-files/item_db_re.sql2
-rw-r--r--sql-files/main.sql4
-rw-r--r--sql-files/upgrades/2018-02-26--15-57.sql6
-rw-r--r--sql-files/upgrades/index.txt1
-rw-r--r--src/char/char.c5
-rw-r--r--src/char/int_rodex.c62
-rw-r--r--src/char/mapif.c2
-rw-r--r--src/char/mapif.h2
-rw-r--r--src/char/pincode.c17
-rw-r--r--src/common/HPMDataCheck.h6
-rw-r--r--src/common/md5calc.c2
-rw-r--r--src/common/mmo.h17
-rw-r--r--src/login/login.c4
-rw-r--r--src/map/atcommand.c30
-rw-r--r--src/map/clan.c3
-rw-r--r--src/map/clif.c492
-rw-r--r--src/map/clif.h6
-rw-r--r--src/map/intif.c14
-rw-r--r--src/map/packets.h46
-rw-r--r--src/map/packets_keys_main.h35
-rw-r--r--src/map/packets_keys_zero.h29
-rw-r--r--src/map/packets_shuffle_main.h147
-rw-r--r--src/map/packets_shuffle_zero.h141
-rw-r--r--src/map/packets_struct.h111
-rw-r--r--src/map/pc.c47
-rw-r--r--src/map/pc.h3
-rw-r--r--src/map/quest.c8
-rw-r--r--src/map/rodex.c32
-rw-r--r--src/map/script.c43
-rw-r--r--src/map/unit.c17
-rw-r--r--src/plugins/HPMHooking/HPMHooking.Defs.inc14
-rw-r--r--src/plugins/HPMHooking/HPMHooking_char.Hooks.inc12
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc12
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc3
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.Hooks.inc90
-rw-r--r--src/plugins/mapcache.c106
-rw-r--r--vcproj-11/login-server.vcxproj1
-rw-r--r--vcproj-12/login-server.vcxproj1
-rw-r--r--vcproj-14/login-server.vcxproj1
486 files changed, 2147 insertions, 246 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2f29e8642..22dc9f5d6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,36 @@ and this project does not adhere to [Semantic Versioning](http://semver.org/spec
If you are reading this in a text editor, simply ignore this section
-->
+## [v2018.03.11] `March 11 2018`
+### Added
+- Added a new `mapcache` plugin to convert, update or recreate mapcache files in the new format. (part of #1552)
+- Added appveyor configuration to the repository. (part of #1552)
+- Exposed `script->sprintf()` to plugins. (#1976)
+- Added/updated packets support for clients from 2018-02-21 to 2018-03-09. (#1983)
+
+### Changed
+- Updated the mapcache to a new, git-friendly, format having one file per map. (#1552, #1981)
+ - For info on how to convert or recreate mapcache entries, see the mapcache plugin (`./map-server --load-plugin mapcache --help`)
+- Removed the display of PIN codes and passwords from the `@accinfo` GM command. Old code is kept commented out for those that may wish to re-enable it. (#1975)
+- Updated README.md with some clarifications and corrections. (#1985)
+
+### Fixed
+- Updated the VS project files with the recently added .h files, for better intellisense/search. (#1970)
+- Fixed a NULL pointer in `login->accounts`, only affecting plugins. (part of #1979)
+- Fixed a case of use after free in the `@reloadatcommand` GM command. (part of #1979)
+- Added several missing checks in various `clif_parse_*` functions. (part of #1979)
+- Fixed various PIN code related exploits. (part of #1979)
+- Fixed a case of use after free when the option `delay_battle_damage` is set to false. (part of #1979)
+- Fixed a segmentation fault in clan-related code when using the `db2sql` plugin. (#1989, issue #1984)
+- Fixed an incorrect behavior in RODEX returned messages. (part of #1987)
+- Fixed an error that made RODEX mails impossible to delete in some cases. (part of #1987)
+- Fixed a NULL pointer in RODEX when the user tried to perform actions on unloaded mails. (part of #1987, issue #1977)
+- Fixed an incorrect interaction between RODEX and NPCs. (#1936)
+- Fixed an incorrect Kafra Points / Cash Points calculation. (#1541, issue #1540)
+
+### Removed
+- Removed the old `mapcache` executable, superseded by the new plugin. (part of #1552)
+
## [v2018.02.11+1] `February 13 2018` `PATCH 1`
### Fixed
- Fixed a possible crash in `@cvcon` (and possibly other functions) when a referenced map zone doesn't exist. (#1972, issue #1971)
@@ -160,6 +190,7 @@ If you are reading this in a text editor, simply ignore this section
- New versioning scheme and project changelogs/release notes (#1853)
[Unreleased]: https://github.com/HerculesWS/Hercules/compare/stable...master
+[v2018.03.11]: https://github.com/HerculesWS/Hercules/compare/v2018.02.11+1...v2018.03.11
[v2018.02.11+1]: https://github.com/HerculesWS/Hercules/compare/v2018.02.11...v2018.02.11+1
[v2018.02.11]: https://github.com/HerculesWS/Hercules/compare/v2018.01.14...v2018.02.11
[v2018.01.14]: https://github.com/HerculesWS/Hercules/compare/v2017.12.17...v2018.01.14
diff --git a/README.md b/README.md
index 2fb56cd27..11d2df70c 100644
--- a/README.md
+++ b/README.md
@@ -37,7 +37,7 @@ Table of Contents
What is Hercules?
-----------------
Hercules is a collaborative software development project revolving around the
-creation of a robust massively multiplayer online role playing game (MMORPG)
+creation of a robust Massively Multiplayer Online Role Playing Game (MMORPG)
server package. Written in C, the program is very versatile and provides NPCs,
warps and modifications. The project is jointly managed by a group of
volunteers located around the world as well as a tremendous community providing
@@ -45,9 +45,9 @@ QA and support. Hercules is a continuation of the original Athena project.
Prerequisites
-------------
-Before installing Hercules there are certain tools and applications you will
-need. This differs between the varying operating systems available, so the
-following is broken down into Windows and Unix (incl. Linux) prerequisites.
+Before installing Hercules, you will need to install certain tools and applications.
+This differs between the varying Operating Systems available, so the
+following list is broken down into Windows and Unix (incl. Linux) prerequisites.
For a list of supported platforms, please refer to the [Supported
Platforms](https://github.com/HerculesWS/Hercules/wiki/Supported-Platforms) wiki page.
diff --git a/db/constants.conf b/db/constants.conf
index 8c3336f79..cc0fb3104 100644
--- a/db/constants.conf
+++ b/db/constants.conf
@@ -3877,4 +3877,62 @@ constants_db: {
UDT_STATADD: 54
UDT_ROBE: 55
UDT_BODY2: 56
+
+ comment__: "HatEffect Constants"
+ HAT_EF_BLOSSOM_FLUTTERING: 1
+ HAT_EF_MERMAID_LONGING: 2
+ HAT_EF_RL_BANISHING_BUSTER: 3
+ HAT_EF_LJOSALFAR: 4
+ HAT_EF_CLOCKING: 5
+ HAT_EF_SNOW: 6
+ HAT_EF_MAKEBLUR: 7
+ HAT_EF_SLEEPATTACK: 8
+ HAT_EF_GUMGANG: 9
+ HAT_EF_TALK_FROSTJOKE: 10
+ HAT_EF_DEMONSTRATION: 11
+ HAT_EF_FLUTTER_BUTTERFLY: 12
+ HAT_EF_ANGEL_FLUTTERING: 13
+ HAT_EF_BLESSING_OF_ANGELS: 14
+ HAT_EF_ELECTRIC: 15
+ HAT_EF_GREEN_FLOOR: 16
+ HAT_EF_SHRINK: 17
+ HAT_EF_VALHALLA_IDOL: 18
+ HAT_EF_ANGEL_STAIRS: 19
+ HAT_EF_GLOW_OF_NEW_YEAR: 20
+ HAT_EF_BOTTOM_FORTUNEKISS: 21
+ HAT_EF_PINKBODY: 22
+ HAT_EF_DOUBLEGUMGANG: 23
+ HAT_EF_GIANTBODY: 24
+ HAT_EF_GREEN99_6: 25
+ HAT_EF_CIRCLEPOWER: 26
+ HAT_EF_BOTTOM_BLOODYLUST: 27
+ HAT_EF_WATER_BELOW: 28
+ HAT_EF_LEVEL99_150: 29
+ HAT_EF_YELLOWFLY3: 30
+ HAT_EF_KAGEMUSYA: 31
+ HAT_EF_CHERRYBLOSSOM: 32
+ HAT_EF_STRANGELIGHTS: 33
+ HAT_EF_WL_TELEKINESIS_INTENSE: 34
+ HAT_EF_AB_OFFERTORIUM_RING: 35
+ HAT_EF_WHITEBODY2: 36
+ HAT_EF_SAKURA: 37
+ HAT_EF_CLOUD2: 38
+ HAT_EF_FEATHER_FLUTTERING: 39
+ HAT_EF_CAMELLIA_HAIR_PIN: 40
+ HAT_EF_JP_EV_EFFECT01: 41
+ HAT_EF_JP_EV_EFFECT02: 42
+ HAT_EF_JP_EV_EFFECT03: 43
+ HAT_EF_FLORAL_WALTZ: 44
+ HAT_EF_MAGICAL_FEATHER: 45
+ HAT_EF_HAT_EFFECT: 46
+ HAT_EF_BAKURETSU_HADOU: 47
+ HAT_EF_GOLD_SHOWER: 48
+ HAT_EF_WHITEBODY: 49
+ HAT_EF_WATER_BELOW2: 50
+ HAT_EF_FIREWORK: 51
+ HAT_EF_RETURN_TW_1ST_HAT: 52
+ HAT_EF_C_FLUTTERBUTTERFLY_BL: 53
+ HAT_EF_QSCARABA: 54
+ HAT_EF_FSTONE: 55
+ HAT_EF_MAGICCIRCLE: 56
}
diff --git a/db/re/item_db.conf b/db/re/item_db.conf
index 80baad89f..6c4e820e8 100644
--- a/db/re/item_db.conf
+++ b/db/re/item_db.conf
@@ -144605,8 +144605,8 @@ item_db: (
Type: "IT_ARMOR"
Loc: "EQP_COSTUME_HEAD_LOW"
ViewSprite: 1331
- OnEquipScript: <" sc_start SC_BLOSSOM_FLUTTERING, -1, 0; ">
- OnUnequipScript: <" sc_end SC_BLOSSOM_FLUTTERING; ">
+ OnEquipScript: <" hateffect(HAT_EF_BLOSSOM_FLUTTERING, true); ">
+ OnUnequipScript: <" hateffect(HAT_EF_BLOSSOM_FLUTTERING, false); ">
},
{
Id: 20286
diff --git a/doc/constants.md b/doc/constants.md
index 7a9e6ea18..978cc7ecd 100644
--- a/doc/constants.md
+++ b/doc/constants.md
@@ -1319,6 +1319,7 @@
- `SC_FRESHSHRIMP`: 651
- `SC_DAILYSENDMAILCNT`: 653
- `SC_DRESS_UP`: 652
+- `SC_CLAN_INFO`: 654
### Emotes
@@ -3626,6 +3627,7 @@
- `PC_PARTY`: 1
- `PC_GUILD`: 2
- `PC_MAP`: 3
+- `PC_CLAN`: 4
### strnpcinfo
@@ -3642,6 +3644,7 @@
- `CHAR_ID_GUILD`: 2
- `CHAR_ID_ACCOUNT`: 3
- `CHAR_ID_BG`: 4
+- `CHAR_ID_CLAN`: 5
### sc_start
@@ -3790,6 +3793,65 @@
- `UDT_ROBE`: 55
- `UDT_BODY2`: 56
+### HatEffect Constants
+
+- `HAT_EF_BLOSSOM_FLUTTERING`: 1
+- `HAT_EF_MERMAID_LONGING`: 2
+- `HAT_EF_RL_BANISHING_BUSTER`: 3
+- `HAT_EF_LJOSALFAR`: 4
+- `HAT_EF_CLOCKING`: 5
+- `HAT_EF_SNOW`: 6
+- `HAT_EF_MAKEBLUR`: 7
+- `HAT_EF_SLEEPATTACK`: 8
+- `HAT_EF_GUMGANG`: 9
+- `HAT_EF_TALK_FROSTJOKE`: 10
+- `HAT_EF_DEMONSTRATION`: 11
+- `HAT_EF_FLUTTER_BUTTERFLY`: 12
+- `HAT_EF_ANGEL_FLUTTERING`: 13
+- `HAT_EF_BLESSING_OF_ANGELS`: 14
+- `HAT_EF_ELECTRIC`: 15
+- `HAT_EF_GREEN_FLOOR`: 16
+- `HAT_EF_SHRINK`: 17
+- `HAT_EF_VALHALLA_IDOL`: 18
+- `HAT_EF_ANGEL_STAIRS`: 19
+- `HAT_EF_GLOW_OF_NEW_YEAR`: 20
+- `HAT_EF_BOTTOM_FORTUNEKISS`: 21
+- `HAT_EF_PINKBODY`: 22
+- `HAT_EF_DOUBLEGUMGANG`: 23
+- `HAT_EF_GIANTBODY`: 24
+- `HAT_EF_GREEN99_6`: 25
+- `HAT_EF_CIRCLEPOWER`: 26
+- `HAT_EF_BOTTOM_BLOODYLUST`: 27
+- `HAT_EF_WATER_BELOW`: 28
+- `HAT_EF_LEVEL99_150`: 29
+- `HAT_EF_YELLOWFLY3`: 30
+- `HAT_EF_KAGEMUSYA`: 31
+- `HAT_EF_CHERRYBLOSSOM`: 32
+- `HAT_EF_STRANGELIGHTS`: 33
+- `HAT_EF_WL_TELEKINESIS_INTENSE`: 34
+- `HAT_EF_AB_OFFERTORIUM_RING`: 35
+- `HAT_EF_WHITEBODY2`: 36
+- `HAT_EF_SAKURA`: 37
+- `HAT_EF_CLOUD2`: 38
+- `HAT_EF_FEATHER_FLUTTERING`: 39
+- `HAT_EF_CAMELLIA_HAIR_PIN`: 40
+- `HAT_EF_JP_EV_EFFECT01`: 41
+- `HAT_EF_JP_EV_EFFECT02`: 42
+- `HAT_EF_JP_EV_EFFECT03`: 43
+- `HAT_EF_FLORAL_WALTZ`: 44
+- `HAT_EF_MAGICAL_FEATHER`: 45
+- `HAT_EF_HAT_EFFECT`: 46
+- `HAT_EF_BAKURETSU_HADOU`: 47
+- `HAT_EF_GOLD_SHOWER`: 48
+- `HAT_EF_WHITEBODY`: 49
+- `HAT_EF_WATER_BELOW2`: 50
+- `HAT_EF_FIREWORK`: 51
+- `HAT_EF_RETURN_TW_1ST_HAT`: 52
+- `HAT_EF_C_FLUTTERBUTTERFLY_BL`: 53
+- `HAT_EF_QSCARABA`: 54
+- `HAT_EF_FSTONE`: 55
+- `HAT_EF_MAGICCIRCLE`: 56
+
## Hardcoded Constants (source)
@@ -4111,6 +4173,655 @@
- `RENEWAL_ASPD`: 1
+### Status Icons
+
+- `SI_BLANK`: -1
+- `SI_PROVOKE`: 0
+- `SI_ENDURE`: 1
+- `SI_TWOHANDQUICKEN`: 2
+- `SI_CONCENTRATION`: 3
+- `SI_HIDING`: 4
+- `SI_CLOAKING`: 5
+- `SI_ENCHANTPOISON`: 6
+- `SI_POISONREACT`: 7
+- `SI_QUAGMIRE`: 8
+- `SI_ANGELUS`: 9
+- `SI_BLESSING`: 10
+- `SI_CRUCIS`: 11
+- `SI_INC_AGI`: 12
+- `SI_DEC_AGI`: 13
+- `SI_SLOWPOISON`: 14
+- `SI_IMPOSITIO`: 15
+- `SI_SUFFRAGIUM`: 16
+- `SI_ASPERSIO`: 17
+- `SI_BENEDICTIO`: 18
+- `SI_KYRIE`: 19
+- `SI_MAGNIFICAT`: 20
+- `SI_GLORIA`: 21
+- `SI_LEXAETERNA`: 22
+- `SI_ADRENALINE`: 23
+- `SI_WEAPONPERFECT`: 24
+- `SI_OVERTHRUST`: 25
+- `SI_MAXIMIZE`: 26
+- `SI_RIDING`: 27
+- `SI_FALCON`: 28
+- `SI_TRICKDEAD`: 29
+- `SI_SHOUT`: 30
+- `SI_ENERGYCOAT`: 31
+- `SI_BROKENARMOR`: 32
+- `SI_BROKENWEAPON`: 33
+- `SI_ILLUSION`: 34
+- `SI_WEIGHTOVER50`: 35
+- `SI_WEIGHTOVER90`: 36
+- `SI_ATTHASTE_POTION1`: 37
+- `SI_ATTHASTE_POTION2`: 38
+- `SI_ATTHASTE_POTION3`: 39
+- `SI_ATTHASTE_INFINITY`: 40
+- `SI_MOVHASTE_POTION`: 41
+- `SI_MOVHASTE_INFINITY`: 42
+- `SI_ANKLESNARE`: 45
+- `SI_POSTDELAY`: 46
+- `SI_NOEQUIPWEAPON`: 50
+- `SI_NOEQUIPSHIELD`: 51
+- `SI_NOEQUIPARMOR`: 52
+- `SI_NOEQUIPHELM`: 53
+- `SI_PROTECTWEAPON`: 54
+- `SI_PROTECTSHIELD`: 55
+- `SI_PROTECTARMOR`: 56
+- `SI_PROTECTHELM`: 57
+- `SI_AUTOGUARD`: 58
+- `SI_REFLECTSHIELD`: 59
+- `SI_PROVIDENCE`: 61
+- `SI_DEFENDER`: 62
+- `SI_AUTOSPELL`: 65
+- `SI_SPEARQUICKEN`: 68
+- `SI_EXPLOSIONSPIRITS`: 86
+- `SI_STEELBODY`: 87
+- `SI_EXTREMITYFIST`: 88
+- `SI_PROPERTYFIRE`: 90
+- `SI_PROPERTYWATER`: 91
+- `SI_PROPERTYWIND`: 92
+- `SI_PROPERTYGROUND`: 93
+- `SI_STOP`: 95
+- `SI_PROPERTYUNDEAD`: 97
+- `SI_AURABLADE`: 103
+- `SI_PARRYING`: 104
+- `SI_LKCONCENTRATION`: 105
+- `SI_TENSIONRELAX`: 106
+- `SI_BERSERK`: 107
+- `SI_ASSUMPTIO`: 110
+- `SI_GROUNDMAGIC`: 112
+- `SI_MAGICPOWER`: 113
+- `SI_EDP`: 114
+- `SI_TRUESIGHT`: 115
+- `SI_WINDWALK`: 116
+- `SI_MELTDOWN`: 117
+- `SI_CARTBOOST`: 118
+- `SI_SWORDREJECT`: 120
+- `SI_MARIONETTE_MASTER`: 121
+- `SI_MARIONETTE`: 122
+- `SI_MOON`: 123
+- `SI_BLOODING`: 124
+- `SI_JOINTBEAT`: 125
+- `SI_PROTECTEXP`: 130
+- `SI_AUTOBERSERK`: 132
+- `SI_RUN`: 133
+- `SI_TING`: 134
+- `SI_STORMKICK_ON`: 135
+- `SI_STORMKICK_READY`: 136
+- `SI_DOWNKICK_ON`: 137
+- `SI_DOWNKICK_READY`: 138
+- `SI_TURNKICK_ON`: 139
+- `SI_TURNKICK_READY`: 140
+- `SI_COUNTER_ON`: 141
+- `SI_COUNTER_READY`: 142
+- `SI_DODGE_ON`: 143
+- `SI_DODGE_READY`: 144
+- `SI_STRUP`: 145
+- `SI_PROPERTYDARK`: 146
+- `SI_ADRENALINE2`: 147
+- `SI_PROPERTYTELEKINESIS`: 148
+- `SI_SOULLINK`: 149
+- `SI_PLUSATTACKPOWER`: 150
+- `SI_PLUSMAGICPOWER`: 151
+- `SI_DEVIL1`: 152
+- `SI_KAITE`: 153
+- `SI_KAIZEL`: 156
+- `SI_KAAHI`: 157
+- `SI_KAUPE`: 158
+- `SI_SMA_READY`: 159
+- `SI_SKE`: 160
+- `SI_ONEHANDQUICKEN`: 161
+- `SI_SG_SUN_WARM`: 165
+- `SI_SUN_COMFORT`: 169
+- `SI_MOON_COMFORT`: 170
+- `SI_STAR_COMFORT`: 171
+- `SI_PRESERVE`: 181
+- `SI_INCSTR`: 182
+- `SI_CLAIRVOYANCE`: 184
+- `SI_MOVESLOW_POTION`: 185
+- `SI_DOUBLECASTING`: 186
+- `SI_OVERTHRUSTMAX`: 188
+- `SI_TAROTCARD`: 191
+- `SI_CR_SHRINK`: 197
+- `SI_WZ_SIGHTBLASTER`: 198
+- `SI_DC_WINKCHARM`: 199
+- `SI_RG_CCONFINE_M`: 200
+- `SI_RG_CCONFINE_S`: 201
+- `SI_GS_MADNESSCANCEL`: 203
+- `SI_GS_GATLINGFEVER`: 204
+- `SI_EARTHSCROLL`: 205
+- `SI_NJ_UTSUSEMI`: 206
+- `SI_NJ_BUNSINJYUTSU`: 207
+- `SI_NJ_NEN`: 208
+- `SI_GS_ADJUSTMENT`: 209
+- `SI_GS_ACCURACY`: 210
+- `SI_NJ_SUITON`: 211
+- `SI_FOOD_STR`: 241
+- `SI_FOOD_AGI`: 242
+- `SI_FOOD_VIT`: 243
+- `SI_FOOD_DEX`: 244
+- `SI_FOOD_INT`: 245
+- `SI_FOOD_LUK`: 246
+- `SI_FOOD_BASICAVOIDANCE`: 247
+- `SI_FOOD_BASICHIT`: 248
+- `SI_FOOD_CRITICALSUCCESSVALUE`: 249
+- `SI_CASH_PLUSEXP`: 250
+- `SI_CASH_DEATHPENALTY`: 251
+- `SI_CASH_RECEIVEITEM`: 252
+- `SI_CASH_BOSS_ALARM`: 253
+- `SI_FOOD_STR_CASH`: 271
+- `SI_FOOD_AGI_CASH`: 272
+- `SI_FOOD_VIT_CASH`: 273
+- `SI_FOOD_DEX_CASH`: 274
+- `SI_FOOD_INT_CASH`: 275
+- `SI_FOOD_LUK_CASH`: 276
+- `SI_MER_FLEE`: 277
+- `SI_MER_ATK`: 278
+- `SI_MER_HP`: 279
+- `SI_MER_SP`: 280
+- `SI_MER_HIT`: 281
+- `SI_SLOWCAST`: 282
+- `SI_CRITICALWOUND`: 286
+- `SI_MOVHASTE_HORSE`: 289
+- `SI_PROTECT_DEF`: 290
+- `SI_PROTECT_MDEF`: 291
+- `SI_HEALPLUS`: 292
+- `SI_S_LIFEPOTION`: 293
+- `SI_L_LIFEPOTION`: 294
+- `SI_CRITICALPERCENT`: 295
+- `SI_PLUSAVOIDVALUE`: 296
+- `SI_ATKER_ASPD`: 297
+- `SI_TARGET_ASPD`: 298
+- `SI_ATKER_MOVESPEED`: 299
+- `SI_ATKER_BLOOD`: 300
+- `SI_TARGET_BLOOD`: 301
+- `SI_ARMOR_PROPERTY`: 302
+- `SI_HELLPOWER`: 304
+- `SI_STEAMPACK`: 305
+- `SI_INVINCIBLE`: 311
+- `SI_CASH_PLUSONLYJOBEXP`: 312
+- `SI_PARTYFLEE`: 313
+- `SI_ANGEL_PROTECT`: 314
+- `SI_ENCHANTBLADE`: 316
+- `SI_DEATHBOUND`: 317
+- `SI_REFRESH`: 318
+- `SI_GIANTGROWTH`: 319
+- `SI_STONEHARDSKIN`: 320
+- `SI_VITALITYACTIVATION`: 321
+- `SI_FIGHTINGSPIRIT`: 322
+- `SI_ABUNDANCE`: 323
+- `SI_REUSE_MILLENNIUMSHIELD`: 324
+- `SI_REUSE_CRUSHSTRIKE`: 325
+- `SI_REUSE_REFRESH`: 326
+- `SI_REUSE_STORMBLAST`: 327
+- `SI_VENOMIMPRESS`: 328
+- `SI_EPICLESIS`: 329
+- `SI_ORATIO`: 330
+- `SI_LAUDAAGNUS`: 331
+- `SI_LAUDARAMUS`: 332
+- `SI_CLOAKINGEXCEED`: 333
+- `SI_HALLUCINATIONWALK`: 334
+- `SI_HALLUCINATIONWALK_POSTDELAY`: 335
+- `SI_RENOVATIO`: 336
+- `SI_WEAPONBLOCKING`: 337
+- `SI_WEAPONBLOCKING_POSTDELAY`: 338
+- `SI_ROLLINGCUTTER`: 339
+- `SI_EXPIATIO`: 340
+- `SI_POISONINGWEAPON`: 341
+- `SI_TOXIN`: 342
+- `SI_PARALYSE`: 343
+- `SI_VENOMBLEED`: 344
+- `SI_MAGICMUSHROOM`: 345
+- `SI_DEATHHURT`: 346
+- `SI_PYREXIA`: 347
+- `SI_OBLIVIONCURSE`: 348
+- `SI_LEECHESEND`: 349
+- `SI_DUPLELIGHT`: 350
+- `SI_FROSTMISTY`: 351
+- `SI_FEARBREEZE`: 352
+- `SI_ELECTRICSHOCKER`: 353
+- `SI_MARSHOFABYSS`: 354
+- `SI_RECOGNIZEDSPELL`: 355
+- `SI_STASIS`: 356
+- `SI_WUGRIDER`: 357
+- `SI_WUGDASH`: 358
+- `SI_WUGBITE`: 359
+- `SI_CAMOUFLAGE`: 360
+- `SI_ACCELERATION`: 361
+- `SI_HOVERING`: 362
+- `SI_SPHERE_1`: 363
+- `SI_SPHERE_2`: 364
+- `SI_SPHERE_3`: 365
+- `SI_SPHERE_4`: 366
+- `SI_SPHERE_5`: 367
+- `SI_MVPCARD_TAOGUNKA`: 368
+- `SI_MVPCARD_MISTRESS`: 369
+- `SI_MVPCARD_ORCHERO`: 370
+- `SI_MVPCARD_ORCLORD`: 371
+- `SI_OVERHEAT_LIMITPOINT`: 372
+- `SI_OVERHEAT`: 373
+- `SI_SHAPESHIFT`: 374
+- `SI_INFRAREDSCAN`: 375
+- `SI_MAGNETICFIELD`: 376
+- `SI_NEUTRALBARRIER`: 377
+- `SI_NEUTRALBARRIER_MASTER`: 378
+- `SI_STEALTHFIELD`: 379
+- `SI_STEALTHFIELD_MASTER`: 380
+- `SI_MANU_ATK`: 381
+- `SI_MANU_DEF`: 382
+- `SI_SPL_ATK`: 383
+- `SI_SPL_DEF`: 384
+- `SI_REPRODUCE`: 385
+- `SI_MANU_MATK`: 386
+- `SI_SPL_MATK`: 387
+- `SI_STR_SCROLL`: 388
+- `SI_INT_SCROLL`: 389
+- `SI_LG_REFLECTDAMAGE`: 390
+- `SI_FORCEOFVANGUARD`: 391
+- `SI_BUCHEDENOEL`: 392
+- `SI_AUTOSHADOWSPELL`: 393
+- `SI_SHADOWFORM`: 394
+- `SI_RAID`: 395
+- `SI_SHIELDSPELL_DEF`: 396
+- `SI_SHIELDSPELL_MDEF`: 397
+- `SI_SHIELDSPELL_REF`: 398
+- `SI_BODYPAINT`: 399
+- `SI_EXEEDBREAK`: 400
+- `SI_ADORAMUS`: 401
+- `SI_PRESTIGE`: 402
+- `SI_INVISIBILITY`: 403
+- `SI_DEADLYINFECT`: 404
+- `SI_BANDING`: 405
+- `SI_EARTHDRIVE`: 406
+- `SI_INSPIRATION`: 407
+- `SI_ENERVATION`: 408
+- `SI_GROOMY`: 409
+- `SI_RAISINGDRAGON`: 410
+- `SI_IGNORANCE`: 411
+- `SI_LAZINESS`: 412
+- `SI_LIGHTNINGWALK`: 413
+- `SI_ACARAJE`: 414
+- `SI_UNLUCKY`: 415
+- `SI_CURSEDCIRCLE_ATKER`: 416
+- `SI_CURSEDCIRCLE_TARGET`: 417
+- `SI_WEAKNESS`: 418
+- `SI_CRESCENTELBOW`: 419
+- `SI_NOEQUIPACCESSARY`: 420
+- `SI_STRIPACCESSARY`: 421
+- `SI_MANHOLE`: 422
+- `SI_POPECOOKIE`: 423
+- `SI_FALLENEMPIRE`: 424
+- `SI_GENTLETOUCH_ENERGYGAIN`: 425
+- `SI_GENTLETOUCH_CHANGE`: 426
+- `SI_GENTLETOUCH_REVITALIZE`: 427
+- `SI_BLOODYLUST`: 428
+- `SI_SWINGDANCE`: 429
+- `SI_SYMPHONYOFLOVERS`: 430
+- `SI_PROPERTYWALK`: 431
+- `SI_SPELLFIST`: 432
+- `SI_NETHERWORLD`: 433
+- `SI_SIREN`: 434
+- `SI_DEEPSLEEP`: 435
+- `SI_SIRCLEOFNATURE`: 436
+- `SI_COLD`: 437
+- `SI_GLOOMYDAY`: 438
+- `SI_SONG_OF_MANA`: 439
+- `SI_CLOUDKILL`: 440
+- `SI_DANCEWITHWUG`: 441
+- `SI_RUSHWINDMILL`: 442
+- `SI_ECHOSONG`: 443
+- `SI_HARMONIZE`: 444
+- `SI_STRIKING`: 445
+- `SI_MOONLITSERENADE`: 447
+- `SI_SATURDAYNIGHTFEVER`: 448
+- `SI_SITDOWN_FORCE`: 449
+- `SI_ANALYZE`: 450
+- `SI_LERADSDEW`: 451
+- `SI_MELODYOFSINK`: 452
+- `SI_WARCRYOFBEYOND`: 453
+- `SI_UNLIMITEDHUMMINGVOICE`: 454
+- `SI_SPELLBOOK1`: 455
+- `SI_SPELLBOOK2`: 456
+- `SI_SPELLBOOK3`: 457
+- `SI_FREEZE_SP`: 458
+- `SI_GN_TRAINING_SWORD`: 459
+- `SI_GN_REMODELING_CART`: 460
+- `SI_CARTSBOOST`: 461
+- `SI_FIXEDCASTINGTM_REDUCE`: 462
+- `SI_THORNTRAP`: 463
+- `SI_BLOODSUCKER`: 464
+- `SI_SPORE_EXPLOSION`: 465
+- `SI_DEMONIC_FIRE`: 466
+- `SI_FIRE_EXPANSION_SMOKE_POWDER`: 467
+- `SI_FIRE_EXPANSION_TEAR_GAS`: 468
+- `SI_BLOCKING_PLAY`: 469
+- `SI_MANDRAGORA`: 470
+- `SI_ACTIVATE`: 471
+- `SI_SECRAMENT`: 472
+- `SI_ASSUMPTIO2`: 473
+- `SI_TK_SEVENWIND`: 474
+- `SI_LIMIT_ODINS_RECALL`: 475
+- `SI_STOMACHACHE`: 476
+- `SI_MYSTERIOUS_POWDER`: 477
+- `SI_MELON_BOMB`: 478
+- `SI_BANANA_BOMB_SITDOWN_POSTDELAY`: 479
+- `SI_PROMOTE_HEALTH_RESERCH`: 480
+- `SI_ENERGY_DRINK_RESERCH`: 481
+- `SI_EXTRACT_WHITE_POTION_Z`: 482
+- `SI_VITATA_500`: 483
+- `SI_EXTRACT_SALAMINE_JUICE`: 484
+- `SI_BOOST500`: 485
+- `SI_FULL_SWING_K`: 486
+- `SI_MANA_PLUS`: 487
+- `SI_MUSTLE_M`: 488
+- `SI_LIFE_FORCE_F`: 489
+- `SI_VACUUM_EXTREME`: 490
+- `SI_SAVAGE_STEAK`: 491
+- `SI_COCKTAIL_WARG_BLOOD`: 492
+- `SI_MINOR_BBQ`: 493
+- `SI_SIROMA_ICE_TEA`: 494
+- `SI_DROCERA_HERB_STEAMED`: 495
+- `SI_PUTTI_TAILS_NOODLES`: 496
+- `SI_BANANA_BOMB`: 497
+- `SI_SUMMON_AGNI`: 498
+- `SI_SPELLBOOK4`: 499
+- `SI_SPELLBOOK5`: 500
+- `SI_SPELLBOOK6`: 501
+- `SI_SPELLBOOK7`: 502
+- `SI_ELEMENTAL_AGGRESSIVE`: 503
+- `SI_RETURN_TO_ELDICASTES`: 504
+- `SI_BANDING_DEFENCE`: 505
+- `SI_SKELSCROLL`: 506
+- `SI_DISTRUCTIONSCROLL`: 507
+- `SI_ROYALSCROLL`: 508
+- `SI_IMMUNITYSCROLL`: 509
+- `SI_MYSTICSCROLL`: 510
+- `SI_BATTLESCROLL`: 511
+- `SI_ARMORSCROLL`: 512
+- `SI_FREYJASCROLL`: 513
+- `SI_SOULSCROLL`: 514
+- `SI_CIRCLE_OF_FIRE`: 515
+- `SI_CIRCLE_OF_FIRE_OPTION`: 516
+- `SI_FIRE_CLOAK`: 517
+- `SI_FIRE_CLOAK_OPTION`: 518
+- `SI_WATER_SCREEN`: 519
+- `SI_WATER_SCREEN_OPTION`: 520
+- `SI_WATER_DROP`: 521
+- `SI_WATER_DROP_OPTION`: 522
+- `SI_WIND_STEP`: 523
+- `SI_WIND_STEP_OPTION`: 524
+- `SI_WIND_CURTAIN`: 525
+- `SI_WIND_CURTAIN_OPTION`: 526
+- `SI_WATER_BARRIER`: 527
+- `SI_ZEPHYR`: 528
+- `SI_SOLID_SKIN`: 529
+- `SI_SOLID_SKIN_OPTION`: 530
+- `SI_STONE_SHIELD`: 531
+- `SI_STONE_SHIELD_OPTION`: 532
+- `SI_POWER_OF_GAIA`: 533
+- `SI_PYROTECHNIC`: 539
+- `SI_PYROTECHNIC_OPTION`: 540
+- `SI_HEATER`: 541
+- `SI_HEATER_OPTION`: 542
+- `SI_TROPIC`: 543
+- `SI_TROPIC_OPTION`: 544
+- `SI_AQUAPLAY`: 545
+- `SI_AQUAPLAY_OPTION`: 546
+- `SI_COOLER`: 547
+- `SI_COOLER_OPTION`: 548
+- `SI_CHILLY_AIR`: 549
+- `SI_CHILLY_AIR_OPTION`: 550
+- `SI_GUST`: 551
+- `SI_GUST_OPTION`: 552
+- `SI_BLAST`: 553
+- `SI_BLAST_OPTION`: 554
+- `SI_WILD_STORM`: 555
+- `SI_WILD_STORM_OPTION`: 556
+- `SI_PETROLOGY`: 557
+- `SI_PETROLOGY_OPTION`: 558
+- `SI_CURSED_SOIL`: 559
+- `SI_CURSED_SOIL_OPTION`: 560
+- `SI_UPHEAVAL`: 561
+- `SI_UPHEAVAL_OPTION`: 562
+- `SI_TIDAL_WEAPON`: 563
+- `SI_TIDAL_WEAPON_OPTION`: 564
+- `SI_ROCK_CRUSHER`: 565
+- `SI_ROCK_CRUSHER_ATK`: 566
+- `SI_FIRE_INSIGNIA`: 567
+- `SI_WATER_INSIGNIA`: 568
+- `SI_WIND_INSIGNIA`: 569
+- `SI_EARTH_INSIGNIA`: 570
+- `SI_EQUIPED_FLOOR`: 571
+- `SI_GUARDIAN_RECALL`: 572
+- `SI_MORA_BUFF`: 573
+- `SI_REUSE_LIMIT_G`: 574
+- `SI_REUSE_LIMIT_H`: 575
+- `SI_NEEDLE_OF_PARALYZE`: 576
+- `SI_PAIN_KILLER`: 577
+- `SI_G_LIFEPOTION`: 578
+- `SI_VITALIZE_POTION`: 579
+- `SI_LIGHT_OF_REGENE`: 580
+- `SI_OVERED_BOOST`: 581
+- `SI_SILENT_BREEZE`: 582
+- `SI_ODINS_POWER`: 583
+- `SI_STYLE_CHANGE`: 584
+- `SI_SONIC_CLAW_POSTDELAY`: 585
+- `SI_SILVERVEIN_RUSH_POSTDELAY`: 596
+- `SI_MIDNIGHT_FRENZY_POSTDELAY`: 597
+- `SI_GOLDENE_FERSE`: 598
+- `SI_ANGRIFFS_MODUS`: 599
+- `SI_TINDER_BREAKER`: 600
+- `SI_TINDER_BREAKER_POSTDELAY`: 601
+- `SI_CBC`: 602
+- `SI_CBC_POSTDELAY`: 603
+- `SI_EQC`: 604
+- `SI_MAGMA_FLOW`: 605
+- `SI_GRANITIC_ARMOR`: 606
+- `SI_PYROCLASTIC`: 607
+- `SI_VOLCANIC_ASH`: 608
+- `SI_SPIRITS_SAVEINFO1`: 609
+- `SI_SPIRITS_SAVEINFO2`: 610
+- `SI_MAGIC_CANDY`: 611
+- `SI_SEARCH_STORE_INFO`: 612
+- `SI_ALL_RIDING`: 613
+- `SI_ALL_RIDING_REUSE_LIMIT`: 614
+- `SI_MACRO`: 615
+- `SI_MACRO_POSTDELAY`: 616
+- `SI_BEER_BOTTLE_CAP`: 617
+- `SI_OVERLAPEXPUP`: 618
+- `SI_PC_IZ_DUN05`: 619
+- `SI_CRUSHSTRIKE`: 620
+- `SI_MONSTER_TRANSFORM`: 621
+- `SI_SIT`: 622
+- `SI_ONAIR`: 623
+- `SI_MTF_ASPD`: 624
+- `SI_MTF_RANGEATK`: 625
+- `SI_MTF_MATK`: 626
+- `SI_MTF_MLEATKED`: 627
+- `SI_MTF_CRIDAMAGE`: 628
+- `SI_REUSE_LIMIT_MTF`: 629
+- `SI_MACRO_PERMIT`: 630
+- `SI_MACRO_PLAY`: 631
+- `SI_SKF_CAST`: 632
+- `SI_SKF_ASPD`: 633
+- `SI_SKF_ATK`: 634
+- `SI_SKF_MATK`: 635
+- `SI_REWARD_PLUSONLYJOBEXP`: 636
+- `SI_HANDICAPSTATE_NORECOVER`: 637
+- `SI_SET_NUM_DEF`: 638
+- `SI_SET_NUM_MDEF`: 639
+- `SI_SET_PER_DEF`: 640
+- `SI_SET_PER_MDEF`: 641
+- `SI_PARTYBOOKING_SEARCH_DEALY`: 642
+- `SI_PARTYBOOKING_REGISTER_DEALY`: 643
+- `SI_PERIOD_TIME_CHECK_DETECT_SKILL`: 644
+- `SI_KO_JYUMONJIKIRI`: 645
+- `SI_MEIKYOUSISUI`: 646
+- `SI_ATTHASTE_CASH`: 647
+- `SI_EQUIPPED_DIVINE_ARMOR`: 648
+- `SI_EQUIPPED_HOLY_ARMOR`: 649
+- `SI_2011RWC`: 650
+- `SI_KYOUGAKU`: 651
+- `SI_IZAYOI`: 652
+- `SI_ZENKAI`: 653
+- `SI_KG_KAGEHUMI`: 654
+- `SI_KYOMU`: 655
+- `SI_KAGEMUSYA`: 656
+- `SI_ZANGETSU`: 657
+- `SI_PHI_DEMON`: 658
+- `SI_GENSOU`: 659
+- `SI_AKAITSUKI`: 660
+- `SI_TETANY`: 661
+- `SI_GM_BATTLE`: 662
+- `SI_GM_BATTLE2`: 663
+- `SI_2011RWC_SCROLL`: 664
+- `SI_ACTIVE_MONSTER_TRANSFORM`: 665
+- `SI_MYSTICPOWDER`: 666
+- `SI_ECLAGE_RECALL`: 667
+- `SI_ENTRY_QUEUE_APPLY_DELAY`: 668
+- `SI_REUSE_LIMIT_ECL`: 669
+- `SI_M_LIFEPOTION`: 670
+- `SI_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT`: 671
+- `SI_UNKNOWN_NAME`: 672
+- `SI_ON_PUSH_CART`: 673
+- `SI_HAT_EFFECT`: 674
+- `SI_FLOWER_LEAF`: 675
+- `SI_RAY_OF_PROTECTION`: 676
+- `SI_GLASTHEIM_ATK`: 677
+- `SI_GLASTHEIM_DEF`: 678
+- `SI_GLASTHEIM_HEAL`: 679
+- `SI_GLASTHEIM_HIDDEN`: 680
+- `SI_GLASTHEIM_STATE`: 681
+- `SI_GLASTHEIM_ITEMDEF`: 682
+- `SI_GLASTHEIM_HPSP`: 683
+- `SI_HOMUN_SKILL_POSTDELAY`: 684
+- `SI_ALMIGHTY`: 685
+- `SI_GVG_GIANT`: 686
+- `SI_GVG_GOLEM`: 687
+- `SI_GVG_STUN`: 688
+- `SI_GVG_STONE`: 689
+- `SI_GVG_FREEZ`: 690
+- `SI_GVG_SLEEP`: 691
+- `SI_GVG_CURSE`: 692
+- `SI_GVG_SILENCE`: 693
+- `SI_GVG_BLIND`: 694
+- `SI_CLIENT_ONLY_EQUIP_ARROW`: 695
+- `SI_CLAN_INFO`: 696
+- `SI_JP_EVENT01`: 697
+- `SI_JP_EVENT02`: 698
+- `SI_JP_EVENT03`: 699
+- `SI_JP_EVENT04`: 700
+- `SI_TELEPORT_FIXEDCASTINGDELAY`: 701
+- `SI_GEFFEN_MAGIC1`: 702
+- `SI_GEFFEN_MAGIC2`: 703
+- `SI_GEFFEN_MAGIC3`: 704
+- `SI_QUEST_BUFF1`: 705
+- `SI_QUEST_BUFF2`: 706
+- `SI_QUEST_BUFF3`: 707
+- `SI_REUSE_LIMIT_RECALL`: 708
+- `SI_SAVEPOSITION`: 709
+- `SI_HANDICAPSTATE_ICEEXPLO`: 710
+- `SI_FENRIR_CARD`: 711
+- `SI_REUSE_LIMIT_ASPD_POTION`: 712
+- `SI_MAXPAIN`: 713
+- `SI_PC_STOP`: 714
+- `SI_FRIGG_SONG`: 715
+- `SI_OFFERTORIUM`: 716
+- `SI_TELEKINESIS_INTENSE`: 717
+- `SI_MOONSTAR`: 718
+- `SI_STRANGELIGHTS`: 719
+- `SI_FULL_THROTTLE`: 720
+- `SI_REBOUND`: 721
+- `SI_UNLIMIT`: 722
+- `SI_KINGS_GRACE`: 723
+- `SI_ITEM_ATKMAX`: 724
+- `SI_ITEM_ATKMIN`: 725
+- `SI_ITEM_MATKMAX`: 726
+- `SI_ITEM_MATKMIN`: 727
+- `SI_SUPER_STAR`: 728
+- `SI_HIGH_RANKER`: 729
+- `SI_DARKCROW`: 730
+- `SI_2013_VALENTINE1`: 731
+- `SI_2013_VALENTINE2`: 732
+- `SI_2013_VALENTINE3`: 733
+- `SI_ILLUSIONDOPING`: 734
+- `SI_CHILL`: 736
+- `SI_BURNT`: 737
+- `SI_FLASHCOMBO`: 740
+- `SI_CUP_OF_BOZA`: 751
+- `SI_B_TRAP`: 752
+- `SI_E_CHAIN`: 753
+- `SI_E_QD_SHOT_READY`: 754
+- `SI_C_MARKER`: 755
+- `SI_H_MINE`: 756
+- `SI_H_MINE_SPLASH`: 757
+- `SI_P_ALTER`: 758
+- `SI_HEAT_BARREL`: 759
+- `SI_ANTI_M_BLAST`: 760
+- `SI_SLUGSHOT`: 761
+- `SI_SWORDCLAN`: 762
+- `SI_ARCWANDCLAN`: 763
+- `SI_GOLDENMACECLAN`: 764
+- `SI_CROSSBOWCLAN`: 765
+- `SI_PACKING_ENVELOPE1`: 766
+- `SI_PACKING_ENVELOPE2`: 767
+- `SI_PACKING_ENVELOPE3`: 768
+- `SI_PACKING_ENVELOPE4`: 769
+- `SI_PACKING_ENVELOPE5`: 770
+- `SI_PACKING_ENVELOPE6`: 771
+- `SI_PACKING_ENVELOPE7`: 772
+- `SI_PACKING_ENVELOPE8`: 773
+- `SI_PACKING_ENVELOPE9`: 774
+- `SI_PACKING_ENVELOPE10`: 775
+- `SI_GLASTHEIM_TRANS`: 776
+- `SI_HEAT_BARREL_AFTER`: 778
+- `SI_DECORATION_OF_MUSIC`: 779
+- `SI_MTF_MHP`: 793
+- `SI_MTF_MSP`: 794
+- `SI_MTF_PUMPKIN`: 795
+- `SI_MTF_HITFLEE`: 796
+- `SI_FLOWERSMOKE`: 822
+- `SI_FSTONE`: 823
+- `SI_LJOSALFAR`: 826
+- `SI_HAPPINESS_STAR`: 849
+- `SI_MAPLE_FALLS`: 857
+- `SI_MERMAID_LONGING`: 863
+- `SI_MAGICAL_FEATHER`: 864
+- `SI_TIME_ACCESSORY`: 872
+- `SI_SU_STOOP`: 893
+- `SI_CATNIPPOWDER`: 894
+- `SI_BLOSSOM_FLUTTERING`: 895
+- `SI_SV_ROOTTWIST`: 896
+- `SI_BITESCAR`: 917
+- `SI_ARCLOUSEDASH`: 918
+- `SI_TUNAPARTY`: 919
+- `SI_SHRIMP`: 920
+- `SI_FRESHSHRIMP`: 921
+- `SI_SUHIDE`: 933
+- `SI_SPRITEMABLE`: 937
+- `SI_MAX`: 938
+
## Parameters (source)
diff --git a/doc/script_commands.txt b/doc/script_commands.txt
index e14e80444..d69322745 100644
--- a/doc/script_commands.txt
+++ b/doc/script_commands.txt
@@ -3271,6 +3271,13 @@ produced). It's useful for when you want to check whether an item contains
cards or if it's signed.
---------------------------------------
+
+*hateffect(<Hat Effect ID>, <State>)
+
+This will set a Hat Effect onto the player. The state field allows you to
+enable (true) or disable (false) the effect on the player.
+
+---------------------------------------
//=====================================
2.1 - End of Item-Related Commands
//=====================================
diff --git a/maps/pre-re/1@cata.mcache b/maps/pre-re/1@cata.mcache
index 309993e0d..2ad1d4f08 100644
--- a/maps/pre-re/1@cata.mcache
+++ b/maps/pre-re/1@cata.mcache
Binary files differ
diff --git a/maps/pre-re/1@eom.mcache b/maps/pre-re/1@eom.mcache
index f5b0de3b7..b648f56ea 100644
--- a/maps/pre-re/1@eom.mcache
+++ b/maps/pre-re/1@eom.mcache
Binary files differ
diff --git a/maps/pre-re/1@gef_in.mcache b/maps/pre-re/1@gef_in.mcache
index 7272c019c..349794fc8 100644
--- a/maps/pre-re/1@gef_in.mcache
+++ b/maps/pre-re/1@gef_in.mcache
Binary files differ
diff --git a/maps/pre-re/1@jtb.mcache b/maps/pre-re/1@jtb.mcache
index fa27cef9f..b1b3b5724 100644
--- a/maps/pre-re/1@jtb.mcache
+++ b/maps/pre-re/1@jtb.mcache
Binary files differ
diff --git a/maps/pre-re/1@ma_b.mcache b/maps/pre-re/1@ma_b.mcache
index f98fefa8e..5d552d807 100644
--- a/maps/pre-re/1@ma_b.mcache
+++ b/maps/pre-re/1@ma_b.mcache
Binary files differ
diff --git a/maps/pre-re/1@ma_c.mcache b/maps/pre-re/1@ma_c.mcache
index 8e8f2cc84..bd08e2297 100644
--- a/maps/pre-re/1@ma_c.mcache
+++ b/maps/pre-re/1@ma_c.mcache
Binary files differ
diff --git a/maps/pre-re/1@sara.mcache b/maps/pre-re/1@sara.mcache
index 29ae23f83..1e0b29606 100644
--- a/maps/pre-re/1@sara.mcache
+++ b/maps/pre-re/1@sara.mcache
Binary files differ
diff --git a/maps/pre-re/1@tnm3.mcache b/maps/pre-re/1@tnm3.mcache
index 7d20226bb..42d8c59f2 100644
--- a/maps/pre-re/1@tnm3.mcache
+++ b/maps/pre-re/1@tnm3.mcache
Binary files differ
diff --git a/maps/pre-re/5@tower.mcache b/maps/pre-re/5@tower.mcache
index dd08a66f6..08f66c2f1 100644
--- a/maps/pre-re/5@tower.mcache
+++ b/maps/pre-re/5@tower.mcache
Binary files differ
diff --git a/maps/pre-re/airplane.mcache b/maps/pre-re/airplane.mcache
index 11f92f27c..9c0c2edce 100644
--- a/maps/pre-re/airplane.mcache
+++ b/maps/pre-re/airplane.mcache
Binary files differ
diff --git a/maps/pre-re/airplane_01.mcache b/maps/pre-re/airplane_01.mcache
index 11f92f27c..9c0c2edce 100644
--- a/maps/pre-re/airplane_01.mcache
+++ b/maps/pre-re/airplane_01.mcache
Binary files differ
diff --git a/maps/pre-re/alb_ship.mcache b/maps/pre-re/alb_ship.mcache
index a91641d83..1e2626d07 100644
--- a/maps/pre-re/alb_ship.mcache
+++ b/maps/pre-re/alb_ship.mcache
Binary files differ
diff --git a/maps/pre-re/alde_alche.mcache b/maps/pre-re/alde_alche.mcache
index 75e4cfc5a..9460e8f93 100644
--- a/maps/pre-re/alde_alche.mcache
+++ b/maps/pre-re/alde_alche.mcache
Binary files differ
diff --git a/maps/pre-re/alde_gld.mcache b/maps/pre-re/alde_gld.mcache
index 5a920975f..0b4cd694f 100644
--- a/maps/pre-re/alde_gld.mcache
+++ b/maps/pre-re/alde_gld.mcache
Binary files differ
diff --git a/maps/pre-re/alde_tt02.mcache b/maps/pre-re/alde_tt02.mcache
index 633f9df49..2dd27fb49 100644
--- a/maps/pre-re/alde_tt02.mcache
+++ b/maps/pre-re/alde_tt02.mcache
Binary files differ
diff --git a/maps/pre-re/alde_tt03.mcache b/maps/pre-re/alde_tt03.mcache
index 03ae0ca56..6921d05bd 100644
--- a/maps/pre-re/alde_tt03.mcache
+++ b/maps/pre-re/alde_tt03.mcache
Binary files differ
diff --git a/maps/pre-re/aldeba_in.mcache b/maps/pre-re/aldeba_in.mcache
index b33eefa2d..dd96c3b76 100644
--- a/maps/pre-re/aldeba_in.mcache
+++ b/maps/pre-re/aldeba_in.mcache
Binary files differ
diff --git a/maps/pre-re/aldeg_cas04.mcache b/maps/pre-re/aldeg_cas04.mcache
index 9aa8600c5..324040d79 100644
--- a/maps/pre-re/aldeg_cas04.mcache
+++ b/maps/pre-re/aldeg_cas04.mcache
Binary files differ
diff --git a/maps/pre-re/aldeg_cas05.mcache b/maps/pre-re/aldeg_cas05.mcache
index cde5d2811..8094ea0d1 100644
--- a/maps/pre-re/aldeg_cas05.mcache
+++ b/maps/pre-re/aldeg_cas05.mcache
Binary files differ
diff --git a/maps/pre-re/arug_cas01.mcache b/maps/pre-re/arug_cas01.mcache
index 241172f1d..fff355c8c 100644
--- a/maps/pre-re/arug_cas01.mcache
+++ b/maps/pre-re/arug_cas01.mcache
Binary files differ
diff --git a/maps/pre-re/arug_cas03.mcache b/maps/pre-re/arug_cas03.mcache
index ab08aa804..c15ce7baa 100644
--- a/maps/pre-re/arug_cas03.mcache
+++ b/maps/pre-re/arug_cas03.mcache
Binary files differ
diff --git a/maps/pre-re/arug_cas04.mcache b/maps/pre-re/arug_cas04.mcache
index ab08aa804..c15ce7baa 100644
--- a/maps/pre-re/arug_cas04.mcache
+++ b/maps/pre-re/arug_cas04.mcache
Binary files differ
diff --git a/maps/pre-re/arug_cas05.mcache b/maps/pre-re/arug_cas05.mcache
index ab08aa804..c15ce7baa 100644
--- a/maps/pre-re/arug_cas05.mcache
+++ b/maps/pre-re/arug_cas05.mcache
Binary files differ
diff --git a/maps/pre-re/auction_01.mcache b/maps/pre-re/auction_01.mcache
index 9d405d859..93879880f 100644
--- a/maps/pre-re/auction_01.mcache
+++ b/maps/pre-re/auction_01.mcache
Binary files differ
diff --git a/maps/pre-re/auction_02.mcache b/maps/pre-re/auction_02.mcache
index c211f1212..82823e9ce 100644
--- a/maps/pre-re/auction_02.mcache
+++ b/maps/pre-re/auction_02.mcache
Binary files differ
diff --git a/maps/pre-re/ayo_in01.mcache b/maps/pre-re/ayo_in01.mcache
index e7dbb22d5..e5f9aaccb 100644
--- a/maps/pre-re/ayo_in01.mcache
+++ b/maps/pre-re/ayo_in01.mcache
Binary files differ
diff --git a/maps/pre-re/bat_b01.mcache b/maps/pre-re/bat_b01.mcache
index 529afaf34..7025d2d99 100644
--- a/maps/pre-re/bat_b01.mcache
+++ b/maps/pre-re/bat_b01.mcache
Binary files differ
diff --git a/maps/pre-re/bat_b02.mcache b/maps/pre-re/bat_b02.mcache
index 529afaf34..7025d2d99 100644
--- a/maps/pre-re/bat_b02.mcache
+++ b/maps/pre-re/bat_b02.mcache
Binary files differ
diff --git a/maps/pre-re/bat_c01.mcache b/maps/pre-re/bat_c01.mcache
index 8da7eb4d2..5b3b9c44c 100644
--- a/maps/pre-re/bat_c01.mcache
+++ b/maps/pre-re/bat_c01.mcache
Binary files differ
diff --git a/maps/pre-re/bat_c02.mcache b/maps/pre-re/bat_c02.mcache
index 8da7eb4d2..5b3b9c44c 100644
--- a/maps/pre-re/bat_c02.mcache
+++ b/maps/pre-re/bat_c02.mcache
Binary files differ
diff --git a/maps/pre-re/bat_c03.mcache b/maps/pre-re/bat_c03.mcache
index 8da7eb4d2..5b3b9c44c 100644
--- a/maps/pre-re/bat_c03.mcache
+++ b/maps/pre-re/bat_c03.mcache
Binary files differ
diff --git a/maps/pre-re/bat_room.mcache b/maps/pre-re/bat_room.mcache
index 58d0fd452..03511b9ee 100644
--- a/maps/pre-re/bat_room.mcache
+++ b/maps/pre-re/bat_room.mcache
Binary files differ
diff --git a/maps/pre-re/bif_fild01.mcache b/maps/pre-re/bif_fild01.mcache
index 0d83800db..1c4521922 100644
--- a/maps/pre-re/bif_fild01.mcache
+++ b/maps/pre-re/bif_fild01.mcache
Binary files differ
diff --git a/maps/pre-re/bra_in01.mcache b/maps/pre-re/bra_in01.mcache
index 2f15b76db..453447803 100644
--- a/maps/pre-re/bra_in01.mcache
+++ b/maps/pre-re/bra_in01.mcache
Binary files differ
diff --git a/maps/pre-re/c_tower1.mcache b/maps/pre-re/c_tower1.mcache
index 60ba07715..369f27205 100644
--- a/maps/pre-re/c_tower1.mcache
+++ b/maps/pre-re/c_tower1.mcache
Binary files differ
diff --git a/maps/pre-re/c_tower2.mcache b/maps/pre-re/c_tower2.mcache
index e610d4907..123709fe0 100644
--- a/maps/pre-re/c_tower2.mcache
+++ b/maps/pre-re/c_tower2.mcache
Binary files differ
diff --git a/maps/pre-re/c_tower2_.mcache b/maps/pre-re/c_tower2_.mcache
index e610d4907..123709fe0 100644
--- a/maps/pre-re/c_tower2_.mcache
+++ b/maps/pre-re/c_tower2_.mcache
Binary files differ
diff --git a/maps/pre-re/c_tower4.mcache b/maps/pre-re/c_tower4.mcache
index e238b1497..f9d79d599 100644
--- a/maps/pre-re/c_tower4.mcache
+++ b/maps/pre-re/c_tower4.mcache
Binary files differ
diff --git a/maps/pre-re/cmd_fild06.mcache b/maps/pre-re/cmd_fild06.mcache
index e79d825a4..9dc5b931f 100644
--- a/maps/pre-re/cmd_fild06.mcache
+++ b/maps/pre-re/cmd_fild06.mcache
Binary files differ
diff --git a/maps/pre-re/dic_dun01.mcache b/maps/pre-re/dic_dun01.mcache
index e6983f2e7..1ae77a718 100644
--- a/maps/pre-re/dic_dun01.mcache
+++ b/maps/pre-re/dic_dun01.mcache
Binary files differ
diff --git a/maps/pre-re/dicastes01.mcache b/maps/pre-re/dicastes01.mcache
index 3c56864cb..da84af440 100644
--- a/maps/pre-re/dicastes01.mcache
+++ b/maps/pre-re/dicastes01.mcache
Binary files differ
diff --git a/maps/pre-re/dicastes02.mcache b/maps/pre-re/dicastes02.mcache
index f2d3565c5..fcfec592d 100644
--- a/maps/pre-re/dicastes02.mcache
+++ b/maps/pre-re/dicastes02.mcache
Binary files differ
diff --git a/maps/pre-re/ecl_hub01.mcache b/maps/pre-re/ecl_hub01.mcache
index 2a0fdbd64..f484f889d 100644
--- a/maps/pre-re/ecl_hub01.mcache
+++ b/maps/pre-re/ecl_hub01.mcache
Binary files differ
diff --git a/maps/pre-re/ecl_tdun01.mcache b/maps/pre-re/ecl_tdun01.mcache
index 9d1fa99e9..814786557 100644
--- a/maps/pre-re/ecl_tdun01.mcache
+++ b/maps/pre-re/ecl_tdun01.mcache
Binary files differ
diff --git a/maps/pre-re/ecl_tdun02.mcache b/maps/pre-re/ecl_tdun02.mcache
index c392661d9..bf1e078bc 100644
--- a/maps/pre-re/ecl_tdun02.mcache
+++ b/maps/pre-re/ecl_tdun02.mcache
Binary files differ
diff --git a/maps/pre-re/ecl_tdun03.mcache b/maps/pre-re/ecl_tdun03.mcache
index d07d6dd5c..d41be2bdc 100644
--- a/maps/pre-re/ecl_tdun03.mcache
+++ b/maps/pre-re/ecl_tdun03.mcache
Binary files differ
diff --git a/maps/pre-re/ecl_tdun04.mcache b/maps/pre-re/ecl_tdun04.mcache
index 806aad503..763331f2a 100644
--- a/maps/pre-re/ecl_tdun04.mcache
+++ b/maps/pre-re/ecl_tdun04.mcache
Binary files differ
diff --git a/maps/pre-re/ein_fild01.mcache b/maps/pre-re/ein_fild01.mcache
index abd5a0bd2..997794512 100644
--- a/maps/pre-re/ein_fild01.mcache
+++ b/maps/pre-re/ein_fild01.mcache
Binary files differ
diff --git a/maps/pre-re/ein_fild03.mcache b/maps/pre-re/ein_fild03.mcache
index d40e7d2c5..d73adb11e 100644
--- a/maps/pre-re/ein_fild03.mcache
+++ b/maps/pre-re/ein_fild03.mcache
Binary files differ
diff --git a/maps/pre-re/ein_in01.mcache b/maps/pre-re/ein_in01.mcache
index 9b563106d..d5218dc9c 100644
--- a/maps/pre-re/ein_in01.mcache
+++ b/maps/pre-re/ein_in01.mcache
Binary files differ
diff --git a/maps/pre-re/evt_mobroom.mcache b/maps/pre-re/evt_mobroom.mcache
index c63019965..7d3c46952 100644
--- a/maps/pre-re/evt_mobroom.mcache
+++ b/maps/pre-re/evt_mobroom.mcache
Binary files differ
diff --git a/maps/pre-re/g_room1-1.mcache b/maps/pre-re/g_room1-1.mcache
index 4a4e2bae4..205f0efd6 100644
--- a/maps/pre-re/g_room1-1.mcache
+++ b/maps/pre-re/g_room1-1.mcache
Binary files differ
diff --git a/maps/pre-re/g_room1-2.mcache b/maps/pre-re/g_room1-2.mcache
index 4a4e2bae4..205f0efd6 100644
--- a/maps/pre-re/g_room1-2.mcache
+++ b/maps/pre-re/g_room1-2.mcache
Binary files differ
diff --git a/maps/pre-re/g_room1-3.mcache b/maps/pre-re/g_room1-3.mcache
index 4a4e2bae4..205f0efd6 100644
--- a/maps/pre-re/g_room1-3.mcache
+++ b/maps/pre-re/g_room1-3.mcache
Binary files differ
diff --git a/maps/pre-re/g_room2.mcache b/maps/pre-re/g_room2.mcache
index 4a4e2bae4..205f0efd6 100644
--- a/maps/pre-re/g_room2.mcache
+++ b/maps/pre-re/g_room2.mcache
Binary files differ
diff --git a/maps/pre-re/gef_fild01.mcache b/maps/pre-re/gef_fild01.mcache
index 5cfd31c53..52042dbcc 100644
--- a/maps/pre-re/gef_fild01.mcache
+++ b/maps/pre-re/gef_fild01.mcache
Binary files differ
diff --git a/maps/pre-re/gefenia01.mcache b/maps/pre-re/gefenia01.mcache
index 29163077b..347332bab 100644
--- a/maps/pre-re/gefenia01.mcache
+++ b/maps/pre-re/gefenia01.mcache
Binary files differ
diff --git a/maps/pre-re/gefenia02.mcache b/maps/pre-re/gefenia02.mcache
index 6c4b23779..3ac05d055 100644
--- a/maps/pre-re/gefenia02.mcache
+++ b/maps/pre-re/gefenia02.mcache
Binary files differ
diff --git a/maps/pre-re/gefg_cas04.mcache b/maps/pre-re/gefg_cas04.mcache
index a70fdb9d4..644ae4732 100644
--- a/maps/pre-re/gefg_cas04.mcache
+++ b/maps/pre-re/gefg_cas04.mcache
Binary files differ
diff --git a/maps/pre-re/gl_in01.mcache b/maps/pre-re/gl_in01.mcache
index 886b975f9..a49f299d3 100644
--- a/maps/pre-re/gl_in01.mcache
+++ b/maps/pre-re/gl_in01.mcache
Binary files differ
diff --git a/maps/pre-re/gld_dun03.mcache b/maps/pre-re/gld_dun03.mcache
index ee76ceb3f..44c528bc2 100644
--- a/maps/pre-re/gld_dun03.mcache
+++ b/maps/pre-re/gld_dun03.mcache
Binary files differ
diff --git a/maps/pre-re/gld_dun03_2.mcache b/maps/pre-re/gld_dun03_2.mcache
index ee76ceb3f..44c528bc2 100644
--- a/maps/pre-re/gld_dun03_2.mcache
+++ b/maps/pre-re/gld_dun03_2.mcache
Binary files differ
diff --git a/maps/pre-re/guild_room.mcache b/maps/pre-re/guild_room.mcache
index 4a4e2bae4..205f0efd6 100644
--- a/maps/pre-re/guild_room.mcache
+++ b/maps/pre-re/guild_room.mcache
Binary files differ
diff --git a/maps/pre-re/himinn.mcache b/maps/pre-re/himinn.mcache
index f13c3627e..208d13ed9 100644
--- a/maps/pre-re/himinn.mcache
+++ b/maps/pre-re/himinn.mcache
Binary files differ
diff --git a/maps/pre-re/hu_fild06.mcache b/maps/pre-re/hu_fild06.mcache
index e570bc068..420460fdd 100644
--- a/maps/pre-re/hu_fild06.mcache
+++ b/maps/pre-re/hu_fild06.mcache
Binary files differ
diff --git a/maps/pre-re/hu_in01.mcache b/maps/pre-re/hu_in01.mcache
index 59ad3afc3..e56450467 100644
--- a/maps/pre-re/hu_in01.mcache
+++ b/maps/pre-re/hu_in01.mcache
Binary files differ
diff --git a/maps/pre-re/ice_dun02.mcache b/maps/pre-re/ice_dun02.mcache
index 8f464f5a2..5d3f7205a 100644
--- a/maps/pre-re/ice_dun02.mcache
+++ b/maps/pre-re/ice_dun02.mcache
Binary files differ
diff --git a/maps/pre-re/in_hunter.mcache b/maps/pre-re/in_hunter.mcache
index 06251d2f9..797d74456 100644
--- a/maps/pre-re/in_hunter.mcache
+++ b/maps/pre-re/in_hunter.mcache
Binary files differ
diff --git a/maps/pre-re/in_moc_16.mcache b/maps/pre-re/in_moc_16.mcache
index 74e516042..70290570b 100644
--- a/maps/pre-re/in_moc_16.mcache
+++ b/maps/pre-re/in_moc_16.mcache
Binary files differ
diff --git a/maps/pre-re/itemmall.mcache b/maps/pre-re/itemmall.mcache
index 9d405d859..93879880f 100644
--- a/maps/pre-re/itemmall.mcache
+++ b/maps/pre-re/itemmall.mcache
Binary files differ
diff --git a/maps/pre-re/iz_ac01.mcache b/maps/pre-re/iz_ac01.mcache
index a34847c5c..3cca8d8e0 100644
--- a/maps/pre-re/iz_ac01.mcache
+++ b/maps/pre-re/iz_ac01.mcache
Binary files differ
diff --git a/maps/pre-re/iz_ac01_a.mcache b/maps/pre-re/iz_ac01_a.mcache
index a34847c5c..3cca8d8e0 100644
--- a/maps/pre-re/iz_ac01_a.mcache
+++ b/maps/pre-re/iz_ac01_a.mcache
Binary files differ
diff --git a/maps/pre-re/iz_ac01_b.mcache b/maps/pre-re/iz_ac01_b.mcache
index a34847c5c..3cca8d8e0 100644
--- a/maps/pre-re/iz_ac01_b.mcache
+++ b/maps/pre-re/iz_ac01_b.mcache
Binary files differ
diff --git a/maps/pre-re/iz_ac01_c.mcache b/maps/pre-re/iz_ac01_c.mcache
index a34847c5c..3cca8d8e0 100644
--- a/maps/pre-re/iz_ac01_c.mcache
+++ b/maps/pre-re/iz_ac01_c.mcache
Binary files differ
diff --git a/maps/pre-re/iz_ac01_d.mcache b/maps/pre-re/iz_ac01_d.mcache
index a34847c5c..3cca8d8e0 100644
--- a/maps/pre-re/iz_ac01_d.mcache
+++ b/maps/pre-re/iz_ac01_d.mcache
Binary files differ
diff --git a/maps/pre-re/iz_int.mcache b/maps/pre-re/iz_int.mcache
index d6eef11fb..ccf01c2ec 100644
--- a/maps/pre-re/iz_int.mcache
+++ b/maps/pre-re/iz_int.mcache
Binary files differ
diff --git a/maps/pre-re/iz_int01.mcache b/maps/pre-re/iz_int01.mcache
index d6eef11fb..ccf01c2ec 100644
--- a/maps/pre-re/iz_int01.mcache
+++ b/maps/pre-re/iz_int01.mcache
Binary files differ
diff --git a/maps/pre-re/iz_int02.mcache b/maps/pre-re/iz_int02.mcache
index d6eef11fb..ccf01c2ec 100644
--- a/maps/pre-re/iz_int02.mcache
+++ b/maps/pre-re/iz_int02.mcache
Binary files differ
diff --git a/maps/pre-re/iz_int03.mcache b/maps/pre-re/iz_int03.mcache
index d6eef11fb..ccf01c2ec 100644
--- a/maps/pre-re/iz_int03.mcache
+++ b/maps/pre-re/iz_int03.mcache
Binary files differ
diff --git a/maps/pre-re/iz_int04.mcache b/maps/pre-re/iz_int04.mcache
index d6eef11fb..ccf01c2ec 100644
--- a/maps/pre-re/iz_int04.mcache
+++ b/maps/pre-re/iz_int04.mcache
Binary files differ
diff --git a/maps/pre-re/jawaii_in.mcache b/maps/pre-re/jawaii_in.mcache
index e17766bf3..1062ddabb 100644
--- a/maps/pre-re/jawaii_in.mcache
+++ b/maps/pre-re/jawaii_in.mcache
Binary files differ
diff --git a/maps/pre-re/job3_arch01.mcache b/maps/pre-re/job3_arch01.mcache
index 6dab866ad..ba9b44e08 100644
--- a/maps/pre-re/job3_arch01.mcache
+++ b/maps/pre-re/job3_arch01.mcache
Binary files differ
diff --git a/maps/pre-re/job3_arch03.mcache b/maps/pre-re/job3_arch03.mcache
index 6dab866ad..ba9b44e08 100644
--- a/maps/pre-re/job3_arch03.mcache
+++ b/maps/pre-re/job3_arch03.mcache
Binary files differ
diff --git a/maps/pre-re/job3_gen01.mcache b/maps/pre-re/job3_gen01.mcache
index 1a9b48b9d..63f2b8624 100644
--- a/maps/pre-re/job3_gen01.mcache
+++ b/maps/pre-re/job3_gen01.mcache
Binary files differ
diff --git a/maps/pre-re/job3_guil01.mcache b/maps/pre-re/job3_guil01.mcache
index df174ec0f..b54f4d168 100644
--- a/maps/pre-re/job3_guil01.mcache
+++ b/maps/pre-re/job3_guil01.mcache
Binary files differ
diff --git a/maps/pre-re/job3_rang02.mcache b/maps/pre-re/job3_rang02.mcache
index 1b4b807bb..613668187 100644
--- a/maps/pre-re/job3_rang02.mcache
+++ b/maps/pre-re/job3_rang02.mcache
Binary files differ
diff --git a/maps/pre-re/job3_sha01.mcache b/maps/pre-re/job3_sha01.mcache
index a11c9a554..d9e2da13b 100644
--- a/maps/pre-re/job3_sha01.mcache
+++ b/maps/pre-re/job3_sha01.mcache
Binary files differ
diff --git a/maps/pre-re/job3_war01.mcache b/maps/pre-re/job3_war01.mcache
index e5699fe49..2b8277e4a 100644
--- a/maps/pre-re/job3_war01.mcache
+++ b/maps/pre-re/job3_war01.mcache
Binary files differ
diff --git a/maps/pre-re/job3_war02.mcache b/maps/pre-re/job3_war02.mcache
index e5699fe49..2b8277e4a 100644
--- a/maps/pre-re/job3_war02.mcache
+++ b/maps/pre-re/job3_war02.mcache
Binary files differ
diff --git a/maps/pre-re/job_ko.mcache b/maps/pre-re/job_ko.mcache
index 5f088321e..24ada6df1 100644
--- a/maps/pre-re/job_ko.mcache
+++ b/maps/pre-re/job_ko.mcache
Binary files differ
diff --git a/maps/pre-re/job_priest.mcache b/maps/pre-re/job_priest.mcache
index ff1d96247..739890497 100644
--- a/maps/pre-re/job_priest.mcache
+++ b/maps/pre-re/job_priest.mcache
Binary files differ
diff --git a/maps/pre-re/job_soul.mcache b/maps/pre-re/job_soul.mcache
index eee75a253..d48f37a50 100644
--- a/maps/pre-re/job_soul.mcache
+++ b/maps/pre-re/job_soul.mcache
Binary files differ
diff --git a/maps/pre-re/job_star.mcache b/maps/pre-re/job_star.mcache
index 981a29eb8..92057f58f 100644
--- a/maps/pre-re/job_star.mcache
+++ b/maps/pre-re/job_star.mcache
Binary files differ
diff --git a/maps/pre-re/job_sword1.mcache b/maps/pre-re/job_sword1.mcache
index d2ae19b3a..695bece61 100644
--- a/maps/pre-re/job_sword1.mcache
+++ b/maps/pre-re/job_sword1.mcache
Binary files differ
diff --git a/maps/pre-re/job_wizard.mcache b/maps/pre-re/job_wizard.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/pre-re/job_wizard.mcache
+++ b/maps/pre-re/job_wizard.mcache
Binary files differ
diff --git a/maps/pre-re/jupe_core.mcache b/maps/pre-re/jupe_core.mcache
index 08daa6272..2d9cc99e4 100644
--- a/maps/pre-re/jupe_core.mcache
+++ b/maps/pre-re/jupe_core.mcache
Binary files differ
diff --git a/maps/pre-re/jupe_core2.mcache b/maps/pre-re/jupe_core2.mcache
index 08daa6272..2d9cc99e4 100644
--- a/maps/pre-re/jupe_core2.mcache
+++ b/maps/pre-re/jupe_core2.mcache
Binary files differ
diff --git a/maps/pre-re/jupe_ele_r.mcache b/maps/pre-re/jupe_ele_r.mcache
index 749dcdd0a..614aa48a0 100644
--- a/maps/pre-re/jupe_ele_r.mcache
+++ b/maps/pre-re/jupe_ele_r.mcache
Binary files differ
diff --git a/maps/pre-re/kh_dun02.mcache b/maps/pre-re/kh_dun02.mcache
index eeb2596db..033ff067e 100644
--- a/maps/pre-re/kh_dun02.mcache
+++ b/maps/pre-re/kh_dun02.mcache
Binary files differ
diff --git a/maps/pre-re/lhz_fild02.mcache b/maps/pre-re/lhz_fild02.mcache
index 4d31ae904..e2b2a173e 100644
--- a/maps/pre-re/lhz_fild02.mcache
+++ b/maps/pre-re/lhz_fild02.mcache
Binary files differ
diff --git a/maps/pre-re/lhz_in03.mcache b/maps/pre-re/lhz_in03.mcache
index be53196fc..212d47dd9 100644
--- a/maps/pre-re/lhz_in03.mcache
+++ b/maps/pre-re/lhz_in03.mcache
Binary files differ
diff --git a/maps/pre-re/lighthalzen.mcache b/maps/pre-re/lighthalzen.mcache
index 3d17a74ae..9fa7e2d55 100644
--- a/maps/pre-re/lighthalzen.mcache
+++ b/maps/pre-re/lighthalzen.mcache
Binary files differ
diff --git a/maps/pre-re/lou_dun03.mcache b/maps/pre-re/lou_dun03.mcache
index 63c47a1cf..dffe3027c 100644
--- a/maps/pre-re/lou_dun03.mcache
+++ b/maps/pre-re/lou_dun03.mcache
Binary files differ
diff --git a/maps/pre-re/ma_scene01.mcache b/maps/pre-re/ma_scene01.mcache
index b1e6e5779..5a72418c2 100644
--- a/maps/pre-re/ma_scene01.mcache
+++ b/maps/pre-re/ma_scene01.mcache
Binary files differ
diff --git a/maps/pre-re/ma_zif01.mcache b/maps/pre-re/ma_zif01.mcache
index ed6ce34ce..f92a833d1 100644
--- a/maps/pre-re/ma_zif01.mcache
+++ b/maps/pre-re/ma_zif01.mcache
Binary files differ
diff --git a/maps/pre-re/ma_zif02.mcache b/maps/pre-re/ma_zif02.mcache
index ed6ce34ce..f92a833d1 100644
--- a/maps/pre-re/ma_zif02.mcache
+++ b/maps/pre-re/ma_zif02.mcache
Binary files differ
diff --git a/maps/pre-re/ma_zif03.mcache b/maps/pre-re/ma_zif03.mcache
index ed6ce34ce..f92a833d1 100644
--- a/maps/pre-re/ma_zif03.mcache
+++ b/maps/pre-re/ma_zif03.mcache
Binary files differ
diff --git a/maps/pre-re/ma_zif04.mcache b/maps/pre-re/ma_zif04.mcache
index ed6ce34ce..f92a833d1 100644
--- a/maps/pre-re/ma_zif04.mcache
+++ b/maps/pre-re/ma_zif04.mcache
Binary files differ
diff --git a/maps/pre-re/ma_zif05.mcache b/maps/pre-re/ma_zif05.mcache
index ed6ce34ce..f92a833d1 100644
--- a/maps/pre-re/ma_zif05.mcache
+++ b/maps/pre-re/ma_zif05.mcache
Binary files differ
diff --git a/maps/pre-re/ma_zif06.mcache b/maps/pre-re/ma_zif06.mcache
index ed6ce34ce..f92a833d1 100644
--- a/maps/pre-re/ma_zif06.mcache
+++ b/maps/pre-re/ma_zif06.mcache
Binary files differ
diff --git a/maps/pre-re/ma_zif07.mcache b/maps/pre-re/ma_zif07.mcache
index ed6ce34ce..f92a833d1 100644
--- a/maps/pre-re/ma_zif07.mcache
+++ b/maps/pre-re/ma_zif07.mcache
Binary files differ
diff --git a/maps/pre-re/ma_zif08.mcache b/maps/pre-re/ma_zif08.mcache
index ed6ce34ce..f92a833d1 100644
--- a/maps/pre-re/ma_zif08.mcache
+++ b/maps/pre-re/ma_zif08.mcache
Binary files differ
diff --git a/maps/pre-re/ma_zif09.mcache b/maps/pre-re/ma_zif09.mcache
index ed6ce34ce..f92a833d1 100644
--- a/maps/pre-re/ma_zif09.mcache
+++ b/maps/pre-re/ma_zif09.mcache
Binary files differ
diff --git a/maps/pre-re/mag_dun02.mcache b/maps/pre-re/mag_dun02.mcache
index e17fdb16f..f431b1be4 100644
--- a/maps/pre-re/mag_dun02.mcache
+++ b/maps/pre-re/mag_dun02.mcache
Binary files differ
diff --git a/maps/pre-re/mal_in01.mcache b/maps/pre-re/mal_in01.mcache
index 6e8ecd830..ad09b6b31 100644
--- a/maps/pre-re/mal_in01.mcache
+++ b/maps/pre-re/mal_in01.mcache
Binary files differ
diff --git a/maps/pre-re/man_fild03.mcache b/maps/pre-re/man_fild03.mcache
index cf994ed47..59450915a 100644
--- a/maps/pre-re/man_fild03.mcache
+++ b/maps/pre-re/man_fild03.mcache
Binary files differ
diff --git a/maps/pre-re/man_in01.mcache b/maps/pre-re/man_in01.mcache
index 16301b0b2..0263fd518 100644
--- a/maps/pre-re/man_in01.mcache
+++ b/maps/pre-re/man_in01.mcache
Binary files differ
diff --git a/maps/pre-re/mjolnir_12.mcache b/maps/pre-re/mjolnir_12.mcache
index da1037044..263826474 100644
--- a/maps/pre-re/mjolnir_12.mcache
+++ b/maps/pre-re/mjolnir_12.mcache
Binary files differ
diff --git a/maps/pre-re/moc_fild01.mcache b/maps/pre-re/moc_fild01.mcache
index 5150d12d8..9d5248ede 100644
--- a/maps/pre-re/moc_fild01.mcache
+++ b/maps/pre-re/moc_fild01.mcache
Binary files differ
diff --git a/maps/pre-re/moc_fild07.mcache b/maps/pre-re/moc_fild07.mcache
index 22f98bb5e..c5b871572 100644
--- a/maps/pre-re/moc_fild07.mcache
+++ b/maps/pre-re/moc_fild07.mcache
Binary files differ
diff --git a/maps/pre-re/moc_fild08.mcache b/maps/pre-re/moc_fild08.mcache
index d46ea4ce9..90be6a00a 100644
--- a/maps/pre-re/moc_fild08.mcache
+++ b/maps/pre-re/moc_fild08.mcache
Binary files differ
diff --git a/maps/pre-re/moc_pryd01.mcache b/maps/pre-re/moc_pryd01.mcache
index b45126dd1..9f63b5199 100644
--- a/maps/pre-re/moc_pryd01.mcache
+++ b/maps/pre-re/moc_pryd01.mcache
Binary files differ
diff --git a/maps/pre-re/moc_pryd04.mcache b/maps/pre-re/moc_pryd04.mcache
index 63c5a34ff..df0b9e8b8 100644
--- a/maps/pre-re/moc_pryd04.mcache
+++ b/maps/pre-re/moc_pryd04.mcache
Binary files differ
diff --git a/maps/pre-re/morocc_in.mcache b/maps/pre-re/morocc_in.mcache
index b609a8e11..048478ec6 100644
--- a/maps/pre-re/morocc_in.mcache
+++ b/maps/pre-re/morocc_in.mcache
Binary files differ
diff --git a/maps/pre-re/mosk_dun02.mcache b/maps/pre-re/mosk_dun02.mcache
index 1aef0aa49..e506eb7f4 100644
--- a/maps/pre-re/mosk_dun02.mcache
+++ b/maps/pre-re/mosk_dun02.mcache
Binary files differ
diff --git a/maps/pre-re/mosk_fild02.mcache b/maps/pre-re/mosk_fild02.mcache
index 6afeb3567..5f41071fe 100644
--- a/maps/pre-re/mosk_fild02.mcache
+++ b/maps/pre-re/mosk_fild02.mcache
Binary files differ
diff --git a/maps/pre-re/nameless_in.mcache b/maps/pre-re/nameless_in.mcache
index 0a8e2e686..c7e3e7ade 100644
--- a/maps/pre-re/nameless_in.mcache
+++ b/maps/pre-re/nameless_in.mcache
Binary files differ
diff --git a/maps/pre-re/new_1-4.mcache b/maps/pre-re/new_1-4.mcache
index 97fee0bb1..3cfc66817 100644
--- a/maps/pre-re/new_1-4.mcache
+++ b/maps/pre-re/new_1-4.mcache
Binary files differ
diff --git a/maps/pre-re/new_2-4.mcache b/maps/pre-re/new_2-4.mcache
index 97fee0bb1..3cfc66817 100644
--- a/maps/pre-re/new_2-4.mcache
+++ b/maps/pre-re/new_2-4.mcache
Binary files differ
diff --git a/maps/pre-re/new_3-4.mcache b/maps/pre-re/new_3-4.mcache
index 97fee0bb1..3cfc66817 100644
--- a/maps/pre-re/new_3-4.mcache
+++ b/maps/pre-re/new_3-4.mcache
Binary files differ
diff --git a/maps/pre-re/new_4-4.mcache b/maps/pre-re/new_4-4.mcache
index 97fee0bb1..3cfc66817 100644
--- a/maps/pre-re/new_4-4.mcache
+++ b/maps/pre-re/new_4-4.mcache
Binary files differ
diff --git a/maps/pre-re/new_5-4.mcache b/maps/pre-re/new_5-4.mcache
index 97fee0bb1..3cfc66817 100644
--- a/maps/pre-re/new_5-4.mcache
+++ b/maps/pre-re/new_5-4.mcache
Binary files differ
diff --git a/maps/pre-re/new_zone04.mcache b/maps/pre-re/new_zone04.mcache
index 97fee0bb1..3cfc66817 100644
--- a/maps/pre-re/new_zone04.mcache
+++ b/maps/pre-re/new_zone04.mcache
Binary files differ
diff --git a/maps/pre-re/nguild_prt.mcache b/maps/pre-re/nguild_prt.mcache
index 3368e40dc..1e01f48a7 100644
--- a/maps/pre-re/nguild_prt.mcache
+++ b/maps/pre-re/nguild_prt.mcache
Binary files differ
diff --git a/maps/pre-re/nif_fild02.mcache b/maps/pre-re/nif_fild02.mcache
index d15c26ccd..7aa820023 100644
--- a/maps/pre-re/nif_fild02.mcache
+++ b/maps/pre-re/nif_fild02.mcache
Binary files differ
diff --git a/maps/pre-re/nyd_dun01.mcache b/maps/pre-re/nyd_dun01.mcache
index 9a1db44a5..c29cebe1a 100644
--- a/maps/pre-re/nyd_dun01.mcache
+++ b/maps/pre-re/nyd_dun01.mcache
Binary files differ
diff --git a/maps/pre-re/nyd_dun02.mcache b/maps/pre-re/nyd_dun02.mcache
index 0e2a19c81..a8ef4a685 100644
--- a/maps/pre-re/nyd_dun02.mcache
+++ b/maps/pre-re/nyd_dun02.mcache
Binary files differ
diff --git a/maps/pre-re/orcsdun01.mcache b/maps/pre-re/orcsdun01.mcache
index 1b021f341..3b3951498 100644
--- a/maps/pre-re/orcsdun01.mcache
+++ b/maps/pre-re/orcsdun01.mcache
Binary files differ
diff --git a/maps/pre-re/orcsdun02.mcache b/maps/pre-re/orcsdun02.mcache
index c5e85558d..004256991 100644
--- a/maps/pre-re/orcsdun02.mcache
+++ b/maps/pre-re/orcsdun02.mcache
Binary files differ
diff --git a/maps/pre-re/pay_fild10.mcache b/maps/pre-re/pay_fild10.mcache
index 0528aa68a..22e021de3 100644
--- a/maps/pre-re/pay_fild10.mcache
+++ b/maps/pre-re/pay_fild10.mcache
Binary files differ
diff --git a/maps/pre-re/payon_in01.mcache b/maps/pre-re/payon_in01.mcache
index 1feff4dc0..7615d0ba8 100644
--- a/maps/pre-re/payon_in01.mcache
+++ b/maps/pre-re/payon_in01.mcache
Binary files differ
diff --git a/maps/pre-re/priest_1-1.mcache b/maps/pre-re/priest_1-1.mcache
index ff1d96247..739890497 100644
--- a/maps/pre-re/priest_1-1.mcache
+++ b/maps/pre-re/priest_1-1.mcache
Binary files differ
diff --git a/maps/pre-re/priest_2-1.mcache b/maps/pre-re/priest_2-1.mcache
index ff1d96247..739890497 100644
--- a/maps/pre-re/priest_2-1.mcache
+++ b/maps/pre-re/priest_2-1.mcache
Binary files differ
diff --git a/maps/pre-re/priest_3-1.mcache b/maps/pre-re/priest_3-1.mcache
index ff1d96247..739890497 100644
--- a/maps/pre-re/priest_3-1.mcache
+++ b/maps/pre-re/priest_3-1.mcache
Binary files differ
diff --git a/maps/pre-re/prontera.mcache b/maps/pre-re/prontera.mcache
index d2ba088f3..c0da924b4 100644
--- a/maps/pre-re/prontera.mcache
+++ b/maps/pre-re/prontera.mcache
Binary files differ
diff --git a/maps/pre-re/prt_are_in.mcache b/maps/pre-re/prt_are_in.mcache
index d5fc112d7..03216ff8b 100644
--- a/maps/pre-re/prt_are_in.mcache
+++ b/maps/pre-re/prt_are_in.mcache
Binary files differ
diff --git a/maps/pre-re/prt_church.mcache b/maps/pre-re/prt_church.mcache
index 994a7adf4..d3f67cfd2 100644
--- a/maps/pre-re/prt_church.mcache
+++ b/maps/pre-re/prt_church.mcache
Binary files differ
diff --git a/maps/pre-re/prt_fild10.mcache b/maps/pre-re/prt_fild10.mcache
index 42ec737fd..4a75d4436 100644
--- a/maps/pre-re/prt_fild10.mcache
+++ b/maps/pre-re/prt_fild10.mcache
Binary files differ
diff --git a/maps/pre-re/prtg_cas01.mcache b/maps/pre-re/prtg_cas01.mcache
index 3368e40dc..1e01f48a7 100644
--- a/maps/pre-re/prtg_cas01.mcache
+++ b/maps/pre-re/prtg_cas01.mcache
Binary files differ
diff --git a/maps/pre-re/prtg_cas03.mcache b/maps/pre-re/prtg_cas03.mcache
index 40e1e679c..25f9fd86a 100644
--- a/maps/pre-re/prtg_cas03.mcache
+++ b/maps/pre-re/prtg_cas03.mcache
Binary files differ
diff --git a/maps/pre-re/prtg_cas04.mcache b/maps/pre-re/prtg_cas04.mcache
index 6683f5567..66f12ad53 100644
--- a/maps/pre-re/prtg_cas04.mcache
+++ b/maps/pre-re/prtg_cas04.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_n_1-3.mcache b/maps/pre-re/pvp_n_1-3.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/pre-re/pvp_n_1-3.mcache
+++ b/maps/pre-re/pvp_n_1-3.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_n_1-4.mcache b/maps/pre-re/pvp_n_1-4.mcache
index ff1d96247..739890497 100644
--- a/maps/pre-re/pvp_n_1-4.mcache
+++ b/maps/pre-re/pvp_n_1-4.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_n_2-3.mcache b/maps/pre-re/pvp_n_2-3.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/pre-re/pvp_n_2-3.mcache
+++ b/maps/pre-re/pvp_n_2-3.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_n_2-4.mcache b/maps/pre-re/pvp_n_2-4.mcache
index ff1d96247..739890497 100644
--- a/maps/pre-re/pvp_n_2-4.mcache
+++ b/maps/pre-re/pvp_n_2-4.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_n_3-3.mcache b/maps/pre-re/pvp_n_3-3.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/pre-re/pvp_n_3-3.mcache
+++ b/maps/pre-re/pvp_n_3-3.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_n_3-4.mcache b/maps/pre-re/pvp_n_3-4.mcache
index ff1d96247..739890497 100644
--- a/maps/pre-re/pvp_n_3-4.mcache
+++ b/maps/pre-re/pvp_n_3-4.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_n_4-3.mcache b/maps/pre-re/pvp_n_4-3.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/pre-re/pvp_n_4-3.mcache
+++ b/maps/pre-re/pvp_n_4-3.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_n_4-4.mcache b/maps/pre-re/pvp_n_4-4.mcache
index ff1d96247..739890497 100644
--- a/maps/pre-re/pvp_n_4-4.mcache
+++ b/maps/pre-re/pvp_n_4-4.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_n_5-3.mcache b/maps/pre-re/pvp_n_5-3.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/pre-re/pvp_n_5-3.mcache
+++ b/maps/pre-re/pvp_n_5-3.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_n_5-4.mcache b/maps/pre-re/pvp_n_5-4.mcache
index ff1d96247..739890497 100644
--- a/maps/pre-re/pvp_n_5-4.mcache
+++ b/maps/pre-re/pvp_n_5-4.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_n_6-3.mcache b/maps/pre-re/pvp_n_6-3.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/pre-re/pvp_n_6-3.mcache
+++ b/maps/pre-re/pvp_n_6-3.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_n_6-4.mcache b/maps/pre-re/pvp_n_6-4.mcache
index ff1d96247..739890497 100644
--- a/maps/pre-re/pvp_n_6-4.mcache
+++ b/maps/pre-re/pvp_n_6-4.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_n_7-3.mcache b/maps/pre-re/pvp_n_7-3.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/pre-re/pvp_n_7-3.mcache
+++ b/maps/pre-re/pvp_n_7-3.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_n_7-4.mcache b/maps/pre-re/pvp_n_7-4.mcache
index ff1d96247..739890497 100644
--- a/maps/pre-re/pvp_n_7-4.mcache
+++ b/maps/pre-re/pvp_n_7-4.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_n_8-3.mcache b/maps/pre-re/pvp_n_8-3.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/pre-re/pvp_n_8-3.mcache
+++ b/maps/pre-re/pvp_n_8-3.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_n_8-4.mcache b/maps/pre-re/pvp_n_8-4.mcache
index ff1d96247..739890497 100644
--- a/maps/pre-re/pvp_n_8-4.mcache
+++ b/maps/pre-re/pvp_n_8-4.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_y_1-1.mcache b/maps/pre-re/pvp_y_1-1.mcache
index d2ba088f3..c0da924b4 100644
--- a/maps/pre-re/pvp_y_1-1.mcache
+++ b/maps/pre-re/pvp_y_1-1.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_y_2-1.mcache b/maps/pre-re/pvp_y_2-1.mcache
index d2ba088f3..c0da924b4 100644
--- a/maps/pre-re/pvp_y_2-1.mcache
+++ b/maps/pre-re/pvp_y_2-1.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_y_3-1.mcache b/maps/pre-re/pvp_y_3-1.mcache
index d2ba088f3..c0da924b4 100644
--- a/maps/pre-re/pvp_y_3-1.mcache
+++ b/maps/pre-re/pvp_y_3-1.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_y_4-1.mcache b/maps/pre-re/pvp_y_4-1.mcache
index d2ba088f3..c0da924b4 100644
--- a/maps/pre-re/pvp_y_4-1.mcache
+++ b/maps/pre-re/pvp_y_4-1.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_y_5-1.mcache b/maps/pre-re/pvp_y_5-1.mcache
index d2ba088f3..c0da924b4 100644
--- a/maps/pre-re/pvp_y_5-1.mcache
+++ b/maps/pre-re/pvp_y_5-1.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_y_6-1.mcache b/maps/pre-re/pvp_y_6-1.mcache
index d2ba088f3..c0da924b4 100644
--- a/maps/pre-re/pvp_y_6-1.mcache
+++ b/maps/pre-re/pvp_y_6-1.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_y_7-1.mcache b/maps/pre-re/pvp_y_7-1.mcache
index d2ba088f3..c0da924b4 100644
--- a/maps/pre-re/pvp_y_7-1.mcache
+++ b/maps/pre-re/pvp_y_7-1.mcache
Binary files differ
diff --git a/maps/pre-re/pvp_y_8-1.mcache b/maps/pre-re/pvp_y_8-1.mcache
index d2ba088f3..c0da924b4 100644
--- a/maps/pre-re/pvp_y_8-1.mcache
+++ b/maps/pre-re/pvp_y_8-1.mcache
Binary files differ
diff --git a/maps/pre-re/que_avan01.mcache b/maps/pre-re/que_avan01.mcache
index 126fc2720..51cef085a 100644
--- a/maps/pre-re/que_avan01.mcache
+++ b/maps/pre-re/que_avan01.mcache
Binary files differ
diff --git a/maps/pre-re/que_ba.mcache b/maps/pre-re/que_ba.mcache
index a008c5b56..837b899e8 100644
--- a/maps/pre-re/que_ba.mcache
+++ b/maps/pre-re/que_ba.mcache
Binary files differ
diff --git a/maps/pre-re/que_dan01.mcache b/maps/pre-re/que_dan01.mcache
index e7e504d0f..b65d1e480 100644
--- a/maps/pre-re/que_dan01.mcache
+++ b/maps/pre-re/que_dan01.mcache
Binary files differ
diff --git a/maps/pre-re/que_moc_16.mcache b/maps/pre-re/que_moc_16.mcache
index 74e516042..70290570b 100644
--- a/maps/pre-re/que_moc_16.mcache
+++ b/maps/pre-re/que_moc_16.mcache
Binary files differ
diff --git a/maps/pre-re/que_moon.mcache b/maps/pre-re/que_moon.mcache
index 981a29eb8..92057f58f 100644
--- a/maps/pre-re/que_moon.mcache
+++ b/maps/pre-re/que_moon.mcache
Binary files differ
diff --git a/maps/pre-re/que_sign02.mcache b/maps/pre-re/que_sign02.mcache
index d15c26ccd..7aa820023 100644
--- a/maps/pre-re/que_sign02.mcache
+++ b/maps/pre-re/que_sign02.mcache
Binary files differ
diff --git a/maps/pre-re/que_thor.mcache b/maps/pre-re/que_thor.mcache
index b7cc76558..27d5fe8f9 100644
--- a/maps/pre-re/que_thor.mcache
+++ b/maps/pre-re/que_thor.mcache
Binary files differ
diff --git a/maps/pre-re/quiz_01.mcache b/maps/pre-re/quiz_01.mcache
index 4a4e2bae4..205f0efd6 100644
--- a/maps/pre-re/quiz_01.mcache
+++ b/maps/pre-re/quiz_01.mcache
Binary files differ
diff --git a/maps/pre-re/ra_fild02.mcache b/maps/pre-re/ra_fild02.mcache
index ed9833b48..372aca88b 100644
--- a/maps/pre-re/ra_fild02.mcache
+++ b/maps/pre-re/ra_fild02.mcache
Binary files differ
diff --git a/maps/pre-re/ra_fild09.mcache b/maps/pre-re/ra_fild09.mcache
index 7ffc09cd5..bb5c8babd 100644
--- a/maps/pre-re/ra_fild09.mcache
+++ b/maps/pre-re/ra_fild09.mcache
Binary files differ
diff --git a/maps/pre-re/ra_fild10.mcache b/maps/pre-re/ra_fild10.mcache
index 32f64e2d5..9b1342ba2 100644
--- a/maps/pre-re/ra_fild10.mcache
+++ b/maps/pre-re/ra_fild10.mcache
Binary files differ
diff --git a/maps/pre-re/ra_san01.mcache b/maps/pre-re/ra_san01.mcache
index 8cfaaefc1..de911bae5 100644
--- a/maps/pre-re/ra_san01.mcache
+++ b/maps/pre-re/ra_san01.mcache
Binary files differ
diff --git a/maps/pre-re/ra_temple.mcache b/maps/pre-re/ra_temple.mcache
index f27210d73..1463713b3 100644
--- a/maps/pre-re/ra_temple.mcache
+++ b/maps/pre-re/ra_temple.mcache
Binary files differ
diff --git a/maps/pre-re/siege_test.mcache b/maps/pre-re/siege_test.mcache
index 53811a305..8ddd58b6b 100644
--- a/maps/pre-re/siege_test.mcache
+++ b/maps/pre-re/siege_test.mcache
Binary files differ
diff --git a/maps/pre-re/spl_fild03.mcache b/maps/pre-re/spl_fild03.mcache
index b00084c52..84bd4b4cb 100644
--- a/maps/pre-re/spl_fild03.mcache
+++ b/maps/pre-re/spl_fild03.mcache
Binary files differ
diff --git a/maps/pre-re/spl_in01.mcache b/maps/pre-re/spl_in01.mcache
index f0ab26172..5bbfcf515 100644
--- a/maps/pre-re/spl_in01.mcache
+++ b/maps/pre-re/spl_in01.mcache
Binary files differ
diff --git a/maps/pre-re/sword_1-1.mcache b/maps/pre-re/sword_1-1.mcache
index d2ae19b3a..695bece61 100644
--- a/maps/pre-re/sword_1-1.mcache
+++ b/maps/pre-re/sword_1-1.mcache
Binary files differ
diff --git a/maps/pre-re/sword_2-1.mcache b/maps/pre-re/sword_2-1.mcache
index d2ae19b3a..695bece61 100644
--- a/maps/pre-re/sword_2-1.mcache
+++ b/maps/pre-re/sword_2-1.mcache
Binary files differ
diff --git a/maps/pre-re/sword_3-1.mcache b/maps/pre-re/sword_3-1.mcache
index d2ae19b3a..695bece61 100644
--- a/maps/pre-re/sword_3-1.mcache
+++ b/maps/pre-re/sword_3-1.mcache
Binary files differ
diff --git a/maps/pre-re/te_alde_gld.mcache b/maps/pre-re/te_alde_gld.mcache
index 5a920975f..0b4cd694f 100644
--- a/maps/pre-re/te_alde_gld.mcache
+++ b/maps/pre-re/te_alde_gld.mcache
Binary files differ
diff --git a/maps/pre-re/te_aldecas4.mcache b/maps/pre-re/te_aldecas4.mcache
index 9aa8600c5..324040d79 100644
--- a/maps/pre-re/te_aldecas4.mcache
+++ b/maps/pre-re/te_aldecas4.mcache
Binary files differ
diff --git a/maps/pre-re/te_aldecas5.mcache b/maps/pre-re/te_aldecas5.mcache
index cde5d2811..8094ea0d1 100644
--- a/maps/pre-re/te_aldecas5.mcache
+++ b/maps/pre-re/te_aldecas5.mcache
Binary files differ
diff --git a/maps/pre-re/te_prtcas01.mcache b/maps/pre-re/te_prtcas01.mcache
index 3368e40dc..1e01f48a7 100644
--- a/maps/pre-re/te_prtcas01.mcache
+++ b/maps/pre-re/te_prtcas01.mcache
Binary files differ
diff --git a/maps/pre-re/te_prtcas03.mcache b/maps/pre-re/te_prtcas03.mcache
index 40e1e679c..25f9fd86a 100644
--- a/maps/pre-re/te_prtcas03.mcache
+++ b/maps/pre-re/te_prtcas03.mcache
Binary files differ
diff --git a/maps/pre-re/te_prtcas04.mcache b/maps/pre-re/te_prtcas04.mcache
index 6683f5567..66f12ad53 100644
--- a/maps/pre-re/te_prtcas04.mcache
+++ b/maps/pre-re/te_prtcas04.mcache
Binary files differ
diff --git a/maps/pre-re/teg_dun01.mcache b/maps/pre-re/teg_dun01.mcache
index ee76ceb3f..44c528bc2 100644
--- a/maps/pre-re/teg_dun01.mcache
+++ b/maps/pre-re/teg_dun01.mcache
Binary files differ
diff --git a/maps/pre-re/tha_t01.mcache b/maps/pre-re/tha_t01.mcache
index eefa487d6..386d9cb5d 100644
--- a/maps/pre-re/tha_t01.mcache
+++ b/maps/pre-re/tha_t01.mcache
Binary files differ
diff --git a/maps/pre-re/tur_dun01.mcache b/maps/pre-re/tur_dun01.mcache
index e6c615f99..ede11d905 100644
--- a/maps/pre-re/tur_dun01.mcache
+++ b/maps/pre-re/tur_dun01.mcache
Binary files differ
diff --git a/maps/pre-re/tur_dun02.mcache b/maps/pre-re/tur_dun02.mcache
index b48ca6fc6..3e951e3ed 100644
--- a/maps/pre-re/tur_dun02.mcache
+++ b/maps/pre-re/tur_dun02.mcache
Binary files differ
diff --git a/maps/pre-re/tur_dun03.mcache b/maps/pre-re/tur_dun03.mcache
index 7d2d7779a..0f0c190cc 100644
--- a/maps/pre-re/tur_dun03.mcache
+++ b/maps/pre-re/tur_dun03.mcache
Binary files differ
diff --git a/maps/pre-re/tur_dun06.mcache b/maps/pre-re/tur_dun06.mcache
index b484b44b9..32ea2aa7f 100644
--- a/maps/pre-re/tur_dun06.mcache
+++ b/maps/pre-re/tur_dun06.mcache
Binary files differ
diff --git a/maps/pre-re/turbo_e_16.mcache b/maps/pre-re/turbo_e_16.mcache
index 633f9df49..2dd27fb49 100644
--- a/maps/pre-re/turbo_e_16.mcache
+++ b/maps/pre-re/turbo_e_16.mcache
Binary files differ
diff --git a/maps/pre-re/turbo_e_4.mcache b/maps/pre-re/turbo_e_4.mcache
index 633f9df49..2dd27fb49 100644
--- a/maps/pre-re/turbo_e_4.mcache
+++ b/maps/pre-re/turbo_e_4.mcache
Binary files differ
diff --git a/maps/pre-re/turbo_e_8.mcache b/maps/pre-re/turbo_e_8.mcache
index 633f9df49..2dd27fb49 100644
--- a/maps/pre-re/turbo_e_8.mcache
+++ b/maps/pre-re/turbo_e_8.mcache
Binary files differ
diff --git a/maps/pre-re/turbo_n_1.mcache b/maps/pre-re/turbo_n_1.mcache
index 633f9df49..2dd27fb49 100644
--- a/maps/pre-re/turbo_n_1.mcache
+++ b/maps/pre-re/turbo_n_1.mcache
Binary files differ
diff --git a/maps/pre-re/turbo_n_16.mcache b/maps/pre-re/turbo_n_16.mcache
index 633f9df49..2dd27fb49 100644
--- a/maps/pre-re/turbo_n_16.mcache
+++ b/maps/pre-re/turbo_n_16.mcache
Binary files differ
diff --git a/maps/pre-re/turbo_n_4.mcache b/maps/pre-re/turbo_n_4.mcache
index 633f9df49..2dd27fb49 100644
--- a/maps/pre-re/turbo_n_4.mcache
+++ b/maps/pre-re/turbo_n_4.mcache
Binary files differ
diff --git a/maps/pre-re/turbo_n_8.mcache b/maps/pre-re/turbo_n_8.mcache
index 633f9df49..2dd27fb49 100644
--- a/maps/pre-re/turbo_n_8.mcache
+++ b/maps/pre-re/turbo_n_8.mcache
Binary files differ
diff --git a/maps/pre-re/turbo_room.mcache b/maps/pre-re/turbo_room.mcache
index b251343ee..6fdd21346 100644
--- a/maps/pre-re/turbo_room.mcache
+++ b/maps/pre-re/turbo_room.mcache
Binary files differ
diff --git a/maps/pre-re/um_fild02.mcache b/maps/pre-re/um_fild02.mcache
index 6d4c33e56..59632d91f 100644
--- a/maps/pre-re/um_fild02.mcache
+++ b/maps/pre-re/um_fild02.mcache
Binary files differ
diff --git a/maps/pre-re/valkyrie.mcache b/maps/pre-re/valkyrie.mcache
index f13c3627e..208d13ed9 100644
--- a/maps/pre-re/valkyrie.mcache
+++ b/maps/pre-re/valkyrie.mcache
Binary files differ
diff --git a/maps/pre-re/ve_fild03.mcache b/maps/pre-re/ve_fild03.mcache
index 0c1c00748..52f022ff2 100644
--- a/maps/pre-re/ve_fild03.mcache
+++ b/maps/pre-re/ve_fild03.mcache
Binary files differ
diff --git a/maps/pre-re/ve_fild07.mcache b/maps/pre-re/ve_fild07.mcache
index 172a794e2..14a98e34a 100644
--- a/maps/pre-re/ve_fild07.mcache
+++ b/maps/pre-re/ve_fild07.mcache
Binary files differ
diff --git a/maps/pre-re/wizard_1-1.mcache b/maps/pre-re/wizard_1-1.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/pre-re/wizard_1-1.mcache
+++ b/maps/pre-re/wizard_1-1.mcache
Binary files differ
diff --git a/maps/pre-re/wizard_2-1.mcache b/maps/pre-re/wizard_2-1.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/pre-re/wizard_2-1.mcache
+++ b/maps/pre-re/wizard_2-1.mcache
Binary files differ
diff --git a/maps/pre-re/wizard_3-1.mcache b/maps/pre-re/wizard_3-1.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/pre-re/wizard_3-1.mcache
+++ b/maps/pre-re/wizard_3-1.mcache
Binary files differ
diff --git a/maps/pre-re/xmas_dun02.mcache b/maps/pre-re/xmas_dun02.mcache
index d527bc8ad..021f52832 100644
--- a/maps/pre-re/xmas_dun02.mcache
+++ b/maps/pre-re/xmas_dun02.mcache
Binary files differ
diff --git a/maps/pre-re/yuno_fild12.mcache b/maps/pre-re/yuno_fild12.mcache
index 586199b2b..dfa05d7a3 100644
--- a/maps/pre-re/yuno_fild12.mcache
+++ b/maps/pre-re/yuno_fild12.mcache
Binary files differ
diff --git a/maps/pre-re/yuno_pre.mcache b/maps/pre-re/yuno_pre.mcache
index 17017c2e1..2f381aa24 100644
--- a/maps/pre-re/yuno_pre.mcache
+++ b/maps/pre-re/yuno_pre.mcache
Binary files differ
diff --git a/maps/re/1@cata.mcache b/maps/re/1@cata.mcache
index 309993e0d..2ad1d4f08 100644
--- a/maps/re/1@cata.mcache
+++ b/maps/re/1@cata.mcache
Binary files differ
diff --git a/maps/re/1@gef_in.mcache b/maps/re/1@gef_in.mcache
index 7272c019c..349794fc8 100644
--- a/maps/re/1@gef_in.mcache
+++ b/maps/re/1@gef_in.mcache
Binary files differ
diff --git a/maps/re/1@jtb.mcache b/maps/re/1@jtb.mcache
index fa27cef9f..b1b3b5724 100644
--- a/maps/re/1@jtb.mcache
+++ b/maps/re/1@jtb.mcache
Binary files differ
diff --git a/maps/re/1@ma_b.mcache b/maps/re/1@ma_b.mcache
index f98fefa8e..5d552d807 100644
--- a/maps/re/1@ma_b.mcache
+++ b/maps/re/1@ma_b.mcache
Binary files differ
diff --git a/maps/re/1@ma_c.mcache b/maps/re/1@ma_c.mcache
index 8e8f2cc84..bd08e2297 100644
--- a/maps/re/1@ma_c.mcache
+++ b/maps/re/1@ma_c.mcache
Binary files differ
diff --git a/maps/re/1@sara.mcache b/maps/re/1@sara.mcache
index 29ae23f83..1e0b29606 100644
--- a/maps/re/1@sara.mcache
+++ b/maps/re/1@sara.mcache
Binary files differ
diff --git a/maps/re/1@tnm3.mcache b/maps/re/1@tnm3.mcache
index 7d20226bb..42d8c59f2 100644
--- a/maps/re/1@tnm3.mcache
+++ b/maps/re/1@tnm3.mcache
Binary files differ
diff --git a/maps/re/5@tower.mcache b/maps/re/5@tower.mcache
index dd08a66f6..08f66c2f1 100644
--- a/maps/re/5@tower.mcache
+++ b/maps/re/5@tower.mcache
Binary files differ
diff --git a/maps/re/airplane.mcache b/maps/re/airplane.mcache
index 11f92f27c..9c0c2edce 100644
--- a/maps/re/airplane.mcache
+++ b/maps/re/airplane.mcache
Binary files differ
diff --git a/maps/re/airplane_01.mcache b/maps/re/airplane_01.mcache
index 11f92f27c..9c0c2edce 100644
--- a/maps/re/airplane_01.mcache
+++ b/maps/re/airplane_01.mcache
Binary files differ
diff --git a/maps/re/alb_ship.mcache b/maps/re/alb_ship.mcache
index a91641d83..1e2626d07 100644
--- a/maps/re/alb_ship.mcache
+++ b/maps/re/alb_ship.mcache
Binary files differ
diff --git a/maps/re/alde_alche.mcache b/maps/re/alde_alche.mcache
index 75e4cfc5a..9460e8f93 100644
--- a/maps/re/alde_alche.mcache
+++ b/maps/re/alde_alche.mcache
Binary files differ
diff --git a/maps/re/alde_gld.mcache b/maps/re/alde_gld.mcache
index 5a920975f..0b4cd694f 100644
--- a/maps/re/alde_gld.mcache
+++ b/maps/re/alde_gld.mcache
Binary files differ
diff --git a/maps/re/alde_tt02.mcache b/maps/re/alde_tt02.mcache
index 633f9df49..2dd27fb49 100644
--- a/maps/re/alde_tt02.mcache
+++ b/maps/re/alde_tt02.mcache
Binary files differ
diff --git a/maps/re/alde_tt03.mcache b/maps/re/alde_tt03.mcache
index 03ae0ca56..6921d05bd 100644
--- a/maps/re/alde_tt03.mcache
+++ b/maps/re/alde_tt03.mcache
Binary files differ
diff --git a/maps/re/aldeba_in.mcache b/maps/re/aldeba_in.mcache
index b33eefa2d..dd96c3b76 100644
--- a/maps/re/aldeba_in.mcache
+++ b/maps/re/aldeba_in.mcache
Binary files differ
diff --git a/maps/re/aldeg_cas04.mcache b/maps/re/aldeg_cas04.mcache
index 9aa8600c5..324040d79 100644
--- a/maps/re/aldeg_cas04.mcache
+++ b/maps/re/aldeg_cas04.mcache
Binary files differ
diff --git a/maps/re/aldeg_cas05.mcache b/maps/re/aldeg_cas05.mcache
index cde5d2811..8094ea0d1 100644
--- a/maps/re/aldeg_cas05.mcache
+++ b/maps/re/aldeg_cas05.mcache
Binary files differ
diff --git a/maps/re/arug_cas01.mcache b/maps/re/arug_cas01.mcache
index 241172f1d..fff355c8c 100644
--- a/maps/re/arug_cas01.mcache
+++ b/maps/re/arug_cas01.mcache
Binary files differ
diff --git a/maps/re/arug_cas03.mcache b/maps/re/arug_cas03.mcache
index ab08aa804..c15ce7baa 100644
--- a/maps/re/arug_cas03.mcache
+++ b/maps/re/arug_cas03.mcache
Binary files differ
diff --git a/maps/re/arug_cas04.mcache b/maps/re/arug_cas04.mcache
index ab08aa804..c15ce7baa 100644
--- a/maps/re/arug_cas04.mcache
+++ b/maps/re/arug_cas04.mcache
Binary files differ
diff --git a/maps/re/arug_cas05.mcache b/maps/re/arug_cas05.mcache
index ab08aa804..c15ce7baa 100644
--- a/maps/re/arug_cas05.mcache
+++ b/maps/re/arug_cas05.mcache
Binary files differ
diff --git a/maps/re/auction_01.mcache b/maps/re/auction_01.mcache
index 9d405d859..93879880f 100644
--- a/maps/re/auction_01.mcache
+++ b/maps/re/auction_01.mcache
Binary files differ
diff --git a/maps/re/auction_02.mcache b/maps/re/auction_02.mcache
index c211f1212..82823e9ce 100644
--- a/maps/re/auction_02.mcache
+++ b/maps/re/auction_02.mcache
Binary files differ
diff --git a/maps/re/ayo_in01.mcache b/maps/re/ayo_in01.mcache
index e7dbb22d5..e5f9aaccb 100644
--- a/maps/re/ayo_in01.mcache
+++ b/maps/re/ayo_in01.mcache
Binary files differ
diff --git a/maps/re/bat_b01.mcache b/maps/re/bat_b01.mcache
index 529afaf34..7025d2d99 100644
--- a/maps/re/bat_b01.mcache
+++ b/maps/re/bat_b01.mcache
Binary files differ
diff --git a/maps/re/bat_b02.mcache b/maps/re/bat_b02.mcache
index 529afaf34..7025d2d99 100644
--- a/maps/re/bat_b02.mcache
+++ b/maps/re/bat_b02.mcache
Binary files differ
diff --git a/maps/re/bat_c01.mcache b/maps/re/bat_c01.mcache
index 8da7eb4d2..5b3b9c44c 100644
--- a/maps/re/bat_c01.mcache
+++ b/maps/re/bat_c01.mcache
Binary files differ
diff --git a/maps/re/bat_c02.mcache b/maps/re/bat_c02.mcache
index 8da7eb4d2..5b3b9c44c 100644
--- a/maps/re/bat_c02.mcache
+++ b/maps/re/bat_c02.mcache
Binary files differ
diff --git a/maps/re/bat_c03.mcache b/maps/re/bat_c03.mcache
index 8da7eb4d2..5b3b9c44c 100644
--- a/maps/re/bat_c03.mcache
+++ b/maps/re/bat_c03.mcache
Binary files differ
diff --git a/maps/re/bat_room.mcache b/maps/re/bat_room.mcache
index 58d0fd452..03511b9ee 100644
--- a/maps/re/bat_room.mcache
+++ b/maps/re/bat_room.mcache
Binary files differ
diff --git a/maps/re/bif_fild01.mcache b/maps/re/bif_fild01.mcache
index 0d83800db..1c4521922 100644
--- a/maps/re/bif_fild01.mcache
+++ b/maps/re/bif_fild01.mcache
Binary files differ
diff --git a/maps/re/bra_in01.mcache b/maps/re/bra_in01.mcache
index 2f15b76db..453447803 100644
--- a/maps/re/bra_in01.mcache
+++ b/maps/re/bra_in01.mcache
Binary files differ
diff --git a/maps/re/c_tower1.mcache b/maps/re/c_tower1.mcache
index 60ba07715..369f27205 100644
--- a/maps/re/c_tower1.mcache
+++ b/maps/re/c_tower1.mcache
Binary files differ
diff --git a/maps/re/c_tower2.mcache b/maps/re/c_tower2.mcache
index e610d4907..123709fe0 100644
--- a/maps/re/c_tower2.mcache
+++ b/maps/re/c_tower2.mcache
Binary files differ
diff --git a/maps/re/c_tower2_.mcache b/maps/re/c_tower2_.mcache
index e610d4907..123709fe0 100644
--- a/maps/re/c_tower2_.mcache
+++ b/maps/re/c_tower2_.mcache
Binary files differ
diff --git a/maps/re/c_tower4.mcache b/maps/re/c_tower4.mcache
index e238b1497..f9d79d599 100644
--- a/maps/re/c_tower4.mcache
+++ b/maps/re/c_tower4.mcache
Binary files differ
diff --git a/maps/re/cmd_fild06.mcache b/maps/re/cmd_fild06.mcache
index e79d825a4..9dc5b931f 100644
--- a/maps/re/cmd_fild06.mcache
+++ b/maps/re/cmd_fild06.mcache
Binary files differ
diff --git a/maps/re/dic_dun01.mcache b/maps/re/dic_dun01.mcache
index e6983f2e7..1ae77a718 100644
--- a/maps/re/dic_dun01.mcache
+++ b/maps/re/dic_dun01.mcache
Binary files differ
diff --git a/maps/re/dicastes01.mcache b/maps/re/dicastes01.mcache
index 3c56864cb..da84af440 100644
--- a/maps/re/dicastes01.mcache
+++ b/maps/re/dicastes01.mcache
Binary files differ
diff --git a/maps/re/dicastes02.mcache b/maps/re/dicastes02.mcache
index f2d3565c5..fcfec592d 100644
--- a/maps/re/dicastes02.mcache
+++ b/maps/re/dicastes02.mcache
Binary files differ
diff --git a/maps/re/ecl_hub01.mcache b/maps/re/ecl_hub01.mcache
index 2a0fdbd64..f484f889d 100644
--- a/maps/re/ecl_hub01.mcache
+++ b/maps/re/ecl_hub01.mcache
Binary files differ
diff --git a/maps/re/ecl_tdun01.mcache b/maps/re/ecl_tdun01.mcache
index 9d1fa99e9..814786557 100644
--- a/maps/re/ecl_tdun01.mcache
+++ b/maps/re/ecl_tdun01.mcache
Binary files differ
diff --git a/maps/re/ecl_tdun02.mcache b/maps/re/ecl_tdun02.mcache
index c392661d9..bf1e078bc 100644
--- a/maps/re/ecl_tdun02.mcache
+++ b/maps/re/ecl_tdun02.mcache
Binary files differ
diff --git a/maps/re/ecl_tdun03.mcache b/maps/re/ecl_tdun03.mcache
index d07d6dd5c..d41be2bdc 100644
--- a/maps/re/ecl_tdun03.mcache
+++ b/maps/re/ecl_tdun03.mcache
Binary files differ
diff --git a/maps/re/ecl_tdun04.mcache b/maps/re/ecl_tdun04.mcache
index 806aad503..763331f2a 100644
--- a/maps/re/ecl_tdun04.mcache
+++ b/maps/re/ecl_tdun04.mcache
Binary files differ
diff --git a/maps/re/ein_fild01.mcache b/maps/re/ein_fild01.mcache
index abd5a0bd2..997794512 100644
--- a/maps/re/ein_fild01.mcache
+++ b/maps/re/ein_fild01.mcache
Binary files differ
diff --git a/maps/re/ein_fild03.mcache b/maps/re/ein_fild03.mcache
index d40e7d2c5..d73adb11e 100644
--- a/maps/re/ein_fild03.mcache
+++ b/maps/re/ein_fild03.mcache
Binary files differ
diff --git a/maps/re/ein_in01.mcache b/maps/re/ein_in01.mcache
index 9b563106d..d5218dc9c 100644
--- a/maps/re/ein_in01.mcache
+++ b/maps/re/ein_in01.mcache
Binary files differ
diff --git a/maps/re/evt_mobroom.mcache b/maps/re/evt_mobroom.mcache
index c63019965..7d3c46952 100644
--- a/maps/re/evt_mobroom.mcache
+++ b/maps/re/evt_mobroom.mcache
Binary files differ
diff --git a/maps/re/g_room1-1.mcache b/maps/re/g_room1-1.mcache
index 4a4e2bae4..205f0efd6 100644
--- a/maps/re/g_room1-1.mcache
+++ b/maps/re/g_room1-1.mcache
Binary files differ
diff --git a/maps/re/g_room1-2.mcache b/maps/re/g_room1-2.mcache
index 4a4e2bae4..205f0efd6 100644
--- a/maps/re/g_room1-2.mcache
+++ b/maps/re/g_room1-2.mcache
Binary files differ
diff --git a/maps/re/g_room1-3.mcache b/maps/re/g_room1-3.mcache
index 4a4e2bae4..205f0efd6 100644
--- a/maps/re/g_room1-3.mcache
+++ b/maps/re/g_room1-3.mcache
Binary files differ
diff --git a/maps/re/g_room2.mcache b/maps/re/g_room2.mcache
index 4a4e2bae4..205f0efd6 100644
--- a/maps/re/g_room2.mcache
+++ b/maps/re/g_room2.mcache
Binary files differ
diff --git a/maps/re/gef_fild01.mcache b/maps/re/gef_fild01.mcache
index 5cfd31c53..52042dbcc 100644
--- a/maps/re/gef_fild01.mcache
+++ b/maps/re/gef_fild01.mcache
Binary files differ
diff --git a/maps/re/gefenia01.mcache b/maps/re/gefenia01.mcache
index 29163077b..347332bab 100644
--- a/maps/re/gefenia01.mcache
+++ b/maps/re/gefenia01.mcache
Binary files differ
diff --git a/maps/re/gefenia02.mcache b/maps/re/gefenia02.mcache
index 6c4b23779..3ac05d055 100644
--- a/maps/re/gefenia02.mcache
+++ b/maps/re/gefenia02.mcache
Binary files differ
diff --git a/maps/re/gefg_cas04.mcache b/maps/re/gefg_cas04.mcache
index a70fdb9d4..644ae4732 100644
--- a/maps/re/gefg_cas04.mcache
+++ b/maps/re/gefg_cas04.mcache
Binary files differ
diff --git a/maps/re/gl_in01.mcache b/maps/re/gl_in01.mcache
index 886b975f9..a49f299d3 100644
--- a/maps/re/gl_in01.mcache
+++ b/maps/re/gl_in01.mcache
Binary files differ
diff --git a/maps/re/gld_dun03.mcache b/maps/re/gld_dun03.mcache
index ee76ceb3f..44c528bc2 100644
--- a/maps/re/gld_dun03.mcache
+++ b/maps/re/gld_dun03.mcache
Binary files differ
diff --git a/maps/re/gld_dun03_2.mcache b/maps/re/gld_dun03_2.mcache
index ee76ceb3f..44c528bc2 100644
--- a/maps/re/gld_dun03_2.mcache
+++ b/maps/re/gld_dun03_2.mcache
Binary files differ
diff --git a/maps/re/guild_room.mcache b/maps/re/guild_room.mcache
index 4a4e2bae4..205f0efd6 100644
--- a/maps/re/guild_room.mcache
+++ b/maps/re/guild_room.mcache
Binary files differ
diff --git a/maps/re/himinn.mcache b/maps/re/himinn.mcache
index f13c3627e..208d13ed9 100644
--- a/maps/re/himinn.mcache
+++ b/maps/re/himinn.mcache
Binary files differ
diff --git a/maps/re/hu_fild06.mcache b/maps/re/hu_fild06.mcache
index e570bc068..420460fdd 100644
--- a/maps/re/hu_fild06.mcache
+++ b/maps/re/hu_fild06.mcache
Binary files differ
diff --git a/maps/re/hu_in01.mcache b/maps/re/hu_in01.mcache
index 59ad3afc3..e56450467 100644
--- a/maps/re/hu_in01.mcache
+++ b/maps/re/hu_in01.mcache
Binary files differ
diff --git a/maps/re/ice_dun02.mcache b/maps/re/ice_dun02.mcache
index 8f464f5a2..5d3f7205a 100644
--- a/maps/re/ice_dun02.mcache
+++ b/maps/re/ice_dun02.mcache
Binary files differ
diff --git a/maps/re/in_hunter.mcache b/maps/re/in_hunter.mcache
index 06251d2f9..797d74456 100644
--- a/maps/re/in_hunter.mcache
+++ b/maps/re/in_hunter.mcache
Binary files differ
diff --git a/maps/re/in_moc_16.mcache b/maps/re/in_moc_16.mcache
index 74e516042..70290570b 100644
--- a/maps/re/in_moc_16.mcache
+++ b/maps/re/in_moc_16.mcache
Binary files differ
diff --git a/maps/re/itemmall.mcache b/maps/re/itemmall.mcache
index 9d405d859..93879880f 100644
--- a/maps/re/itemmall.mcache
+++ b/maps/re/itemmall.mcache
Binary files differ
diff --git a/maps/re/iz_ac01.mcache b/maps/re/iz_ac01.mcache
index a34847c5c..3cca8d8e0 100644
--- a/maps/re/iz_ac01.mcache
+++ b/maps/re/iz_ac01.mcache
Binary files differ
diff --git a/maps/re/iz_ac01_a.mcache b/maps/re/iz_ac01_a.mcache
index a34847c5c..3cca8d8e0 100644
--- a/maps/re/iz_ac01_a.mcache
+++ b/maps/re/iz_ac01_a.mcache
Binary files differ
diff --git a/maps/re/iz_ac01_b.mcache b/maps/re/iz_ac01_b.mcache
index a34847c5c..3cca8d8e0 100644
--- a/maps/re/iz_ac01_b.mcache
+++ b/maps/re/iz_ac01_b.mcache
Binary files differ
diff --git a/maps/re/iz_ac01_c.mcache b/maps/re/iz_ac01_c.mcache
index a34847c5c..3cca8d8e0 100644
--- a/maps/re/iz_ac01_c.mcache
+++ b/maps/re/iz_ac01_c.mcache
Binary files differ
diff --git a/maps/re/iz_ac01_d.mcache b/maps/re/iz_ac01_d.mcache
index a34847c5c..3cca8d8e0 100644
--- a/maps/re/iz_ac01_d.mcache
+++ b/maps/re/iz_ac01_d.mcache
Binary files differ
diff --git a/maps/re/jawaii_in.mcache b/maps/re/jawaii_in.mcache
index e17766bf3..1062ddabb 100644
--- a/maps/re/jawaii_in.mcache
+++ b/maps/re/jawaii_in.mcache
Binary files differ
diff --git a/maps/re/job3_arch01.mcache b/maps/re/job3_arch01.mcache
index 6dab866ad..ba9b44e08 100644
--- a/maps/re/job3_arch01.mcache
+++ b/maps/re/job3_arch01.mcache
Binary files differ
diff --git a/maps/re/job3_arch03.mcache b/maps/re/job3_arch03.mcache
index 6dab866ad..ba9b44e08 100644
--- a/maps/re/job3_arch03.mcache
+++ b/maps/re/job3_arch03.mcache
Binary files differ
diff --git a/maps/re/job3_gen01.mcache b/maps/re/job3_gen01.mcache
index 1a9b48b9d..63f2b8624 100644
--- a/maps/re/job3_gen01.mcache
+++ b/maps/re/job3_gen01.mcache
Binary files differ
diff --git a/maps/re/job3_guil01.mcache b/maps/re/job3_guil01.mcache
index df174ec0f..b54f4d168 100644
--- a/maps/re/job3_guil01.mcache
+++ b/maps/re/job3_guil01.mcache
Binary files differ
diff --git a/maps/re/job3_rang02.mcache b/maps/re/job3_rang02.mcache
index 1b4b807bb..613668187 100644
--- a/maps/re/job3_rang02.mcache
+++ b/maps/re/job3_rang02.mcache
Binary files differ
diff --git a/maps/re/job3_sha01.mcache b/maps/re/job3_sha01.mcache
index a11c9a554..d9e2da13b 100644
--- a/maps/re/job3_sha01.mcache
+++ b/maps/re/job3_sha01.mcache
Binary files differ
diff --git a/maps/re/job3_war01.mcache b/maps/re/job3_war01.mcache
index e5699fe49..2b8277e4a 100644
--- a/maps/re/job3_war01.mcache
+++ b/maps/re/job3_war01.mcache
Binary files differ
diff --git a/maps/re/job3_war02.mcache b/maps/re/job3_war02.mcache
index e5699fe49..2b8277e4a 100644
--- a/maps/re/job3_war02.mcache
+++ b/maps/re/job3_war02.mcache
Binary files differ
diff --git a/maps/re/job_ko.mcache b/maps/re/job_ko.mcache
index 5f088321e..24ada6df1 100644
--- a/maps/re/job_ko.mcache
+++ b/maps/re/job_ko.mcache
Binary files differ
diff --git a/maps/re/job_priest.mcache b/maps/re/job_priest.mcache
index ff1d96247..739890497 100644
--- a/maps/re/job_priest.mcache
+++ b/maps/re/job_priest.mcache
Binary files differ
diff --git a/maps/re/job_soul.mcache b/maps/re/job_soul.mcache
index eee75a253..d48f37a50 100644
--- a/maps/re/job_soul.mcache
+++ b/maps/re/job_soul.mcache
Binary files differ
diff --git a/maps/re/job_star.mcache b/maps/re/job_star.mcache
index 981a29eb8..92057f58f 100644
--- a/maps/re/job_star.mcache
+++ b/maps/re/job_star.mcache
Binary files differ
diff --git a/maps/re/job_sword1.mcache b/maps/re/job_sword1.mcache
index d2ae19b3a..695bece61 100644
--- a/maps/re/job_sword1.mcache
+++ b/maps/re/job_sword1.mcache
Binary files differ
diff --git a/maps/re/job_wizard.mcache b/maps/re/job_wizard.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/re/job_wizard.mcache
+++ b/maps/re/job_wizard.mcache
Binary files differ
diff --git a/maps/re/jupe_core.mcache b/maps/re/jupe_core.mcache
index 08daa6272..2d9cc99e4 100644
--- a/maps/re/jupe_core.mcache
+++ b/maps/re/jupe_core.mcache
Binary files differ
diff --git a/maps/re/jupe_core2.mcache b/maps/re/jupe_core2.mcache
index 08daa6272..2d9cc99e4 100644
--- a/maps/re/jupe_core2.mcache
+++ b/maps/re/jupe_core2.mcache
Binary files differ
diff --git a/maps/re/jupe_ele_r.mcache b/maps/re/jupe_ele_r.mcache
index 749dcdd0a..614aa48a0 100644
--- a/maps/re/jupe_ele_r.mcache
+++ b/maps/re/jupe_ele_r.mcache
Binary files differ
diff --git a/maps/re/kh_dun02.mcache b/maps/re/kh_dun02.mcache
index eeb2596db..033ff067e 100644
--- a/maps/re/kh_dun02.mcache
+++ b/maps/re/kh_dun02.mcache
Binary files differ
diff --git a/maps/re/lhz_dun04.mcache b/maps/re/lhz_dun04.mcache
index 02a370503..390f1cfdc 100644
--- a/maps/re/lhz_dun04.mcache
+++ b/maps/re/lhz_dun04.mcache
Binary files differ
diff --git a/maps/re/lhz_fild02.mcache b/maps/re/lhz_fild02.mcache
index 4d31ae904..e2b2a173e 100644
--- a/maps/re/lhz_fild02.mcache
+++ b/maps/re/lhz_fild02.mcache
Binary files differ
diff --git a/maps/re/lhz_in03.mcache b/maps/re/lhz_in03.mcache
index be53196fc..212d47dd9 100644
--- a/maps/re/lhz_in03.mcache
+++ b/maps/re/lhz_in03.mcache
Binary files differ
diff --git a/maps/re/lighthalzen.mcache b/maps/re/lighthalzen.mcache
index 3d17a74ae..9fa7e2d55 100644
--- a/maps/re/lighthalzen.mcache
+++ b/maps/re/lighthalzen.mcache
Binary files differ
diff --git a/maps/re/lou_dun03.mcache b/maps/re/lou_dun03.mcache
index 63c47a1cf..dffe3027c 100644
--- a/maps/re/lou_dun03.mcache
+++ b/maps/re/lou_dun03.mcache
Binary files differ
diff --git a/maps/re/ma_scene01.mcache b/maps/re/ma_scene01.mcache
index b1e6e5779..5a72418c2 100644
--- a/maps/re/ma_scene01.mcache
+++ b/maps/re/ma_scene01.mcache
Binary files differ
diff --git a/maps/re/ma_zif01.mcache b/maps/re/ma_zif01.mcache
index ed6ce34ce..f92a833d1 100644
--- a/maps/re/ma_zif01.mcache
+++ b/maps/re/ma_zif01.mcache
Binary files differ
diff --git a/maps/re/ma_zif02.mcache b/maps/re/ma_zif02.mcache
index ed6ce34ce..f92a833d1 100644
--- a/maps/re/ma_zif02.mcache
+++ b/maps/re/ma_zif02.mcache
Binary files differ
diff --git a/maps/re/ma_zif03.mcache b/maps/re/ma_zif03.mcache
index ed6ce34ce..f92a833d1 100644
--- a/maps/re/ma_zif03.mcache
+++ b/maps/re/ma_zif03.mcache
Binary files differ
diff --git a/maps/re/ma_zif04.mcache b/maps/re/ma_zif04.mcache
index ed6ce34ce..f92a833d1 100644
--- a/maps/re/ma_zif04.mcache
+++ b/maps/re/ma_zif04.mcache
Binary files differ
diff --git a/maps/re/ma_zif05.mcache b/maps/re/ma_zif05.mcache
index ed6ce34ce..f92a833d1 100644
--- a/maps/re/ma_zif05.mcache
+++ b/maps/re/ma_zif05.mcache
Binary files differ
diff --git a/maps/re/ma_zif06.mcache b/maps/re/ma_zif06.mcache
index ed6ce34ce..f92a833d1 100644
--- a/maps/re/ma_zif06.mcache
+++ b/maps/re/ma_zif06.mcache
Binary files differ
diff --git a/maps/re/ma_zif07.mcache b/maps/re/ma_zif07.mcache
index ed6ce34ce..f92a833d1 100644
--- a/maps/re/ma_zif07.mcache
+++ b/maps/re/ma_zif07.mcache
Binary files differ
diff --git a/maps/re/ma_zif08.mcache b/maps/re/ma_zif08.mcache
index ed6ce34ce..f92a833d1 100644
--- a/maps/re/ma_zif08.mcache
+++ b/maps/re/ma_zif08.mcache
Binary files differ
diff --git a/maps/re/ma_zif09.mcache b/maps/re/ma_zif09.mcache
index ed6ce34ce..f92a833d1 100644
--- a/maps/re/ma_zif09.mcache
+++ b/maps/re/ma_zif09.mcache
Binary files differ
diff --git a/maps/re/mag_dun02.mcache b/maps/re/mag_dun02.mcache
index e17fdb16f..f431b1be4 100644
--- a/maps/re/mag_dun02.mcache
+++ b/maps/re/mag_dun02.mcache
Binary files differ
diff --git a/maps/re/mal_in01.mcache b/maps/re/mal_in01.mcache
index 6e8ecd830..ad09b6b31 100644
--- a/maps/re/mal_in01.mcache
+++ b/maps/re/mal_in01.mcache
Binary files differ
diff --git a/maps/re/man_fild03.mcache b/maps/re/man_fild03.mcache
index cf994ed47..59450915a 100644
--- a/maps/re/man_fild03.mcache
+++ b/maps/re/man_fild03.mcache
Binary files differ
diff --git a/maps/re/man_in01.mcache b/maps/re/man_in01.mcache
index 16301b0b2..0263fd518 100644
--- a/maps/re/man_in01.mcache
+++ b/maps/re/man_in01.mcache
Binary files differ
diff --git a/maps/re/mjolnir_12.mcache b/maps/re/mjolnir_12.mcache
index da1037044..263826474 100644
--- a/maps/re/mjolnir_12.mcache
+++ b/maps/re/mjolnir_12.mcache
Binary files differ
diff --git a/maps/re/moc_fild01.mcache b/maps/re/moc_fild01.mcache
index 5150d12d8..9d5248ede 100644
--- a/maps/re/moc_fild01.mcache
+++ b/maps/re/moc_fild01.mcache
Binary files differ
diff --git a/maps/re/moc_fild07.mcache b/maps/re/moc_fild07.mcache
index 22f98bb5e..c5b871572 100644
--- a/maps/re/moc_fild07.mcache
+++ b/maps/re/moc_fild07.mcache
Binary files differ
diff --git a/maps/re/moc_fild08.mcache b/maps/re/moc_fild08.mcache
index d46ea4ce9..90be6a00a 100644
--- a/maps/re/moc_fild08.mcache
+++ b/maps/re/moc_fild08.mcache
Binary files differ
diff --git a/maps/re/moc_pryd01.mcache b/maps/re/moc_pryd01.mcache
index b45126dd1..9f63b5199 100644
--- a/maps/re/moc_pryd01.mcache
+++ b/maps/re/moc_pryd01.mcache
Binary files differ
diff --git a/maps/re/moc_pryd04.mcache b/maps/re/moc_pryd04.mcache
index 63c5a34ff..df0b9e8b8 100644
--- a/maps/re/moc_pryd04.mcache
+++ b/maps/re/moc_pryd04.mcache
Binary files differ
diff --git a/maps/re/morocc_in.mcache b/maps/re/morocc_in.mcache
index b609a8e11..048478ec6 100644
--- a/maps/re/morocc_in.mcache
+++ b/maps/re/morocc_in.mcache
Binary files differ
diff --git a/maps/re/mosk_dun02.mcache b/maps/re/mosk_dun02.mcache
index 1aef0aa49..e506eb7f4 100644
--- a/maps/re/mosk_dun02.mcache
+++ b/maps/re/mosk_dun02.mcache
Binary files differ
diff --git a/maps/re/mosk_fild02.mcache b/maps/re/mosk_fild02.mcache
index 6afeb3567..5f41071fe 100644
--- a/maps/re/mosk_fild02.mcache
+++ b/maps/re/mosk_fild02.mcache
Binary files differ
diff --git a/maps/re/nameless_in.mcache b/maps/re/nameless_in.mcache
index 0a8e2e686..c7e3e7ade 100644
--- a/maps/re/nameless_in.mcache
+++ b/maps/re/nameless_in.mcache
Binary files differ
diff --git a/maps/re/new_1-1.mcache b/maps/re/new_1-1.mcache
index 1f53eb2b0..342ae6117 100644
--- a/maps/re/new_1-1.mcache
+++ b/maps/re/new_1-1.mcache
Binary files differ
diff --git a/maps/re/new_1-4.mcache b/maps/re/new_1-4.mcache
index 97fee0bb1..3cfc66817 100644
--- a/maps/re/new_1-4.mcache
+++ b/maps/re/new_1-4.mcache
Binary files differ
diff --git a/maps/re/new_2-1.mcache b/maps/re/new_2-1.mcache
index 1f53eb2b0..342ae6117 100644
--- a/maps/re/new_2-1.mcache
+++ b/maps/re/new_2-1.mcache
Binary files differ
diff --git a/maps/re/new_2-4.mcache b/maps/re/new_2-4.mcache
index 97fee0bb1..3cfc66817 100644
--- a/maps/re/new_2-4.mcache
+++ b/maps/re/new_2-4.mcache
Binary files differ
diff --git a/maps/re/new_3-1.mcache b/maps/re/new_3-1.mcache
index 1f53eb2b0..342ae6117 100644
--- a/maps/re/new_3-1.mcache
+++ b/maps/re/new_3-1.mcache
Binary files differ
diff --git a/maps/re/new_3-4.mcache b/maps/re/new_3-4.mcache
index 97fee0bb1..3cfc66817 100644
--- a/maps/re/new_3-4.mcache
+++ b/maps/re/new_3-4.mcache
Binary files differ
diff --git a/maps/re/new_4-1.mcache b/maps/re/new_4-1.mcache
index 1f53eb2b0..342ae6117 100644
--- a/maps/re/new_4-1.mcache
+++ b/maps/re/new_4-1.mcache
Binary files differ
diff --git a/maps/re/new_4-4.mcache b/maps/re/new_4-4.mcache
index 97fee0bb1..3cfc66817 100644
--- a/maps/re/new_4-4.mcache
+++ b/maps/re/new_4-4.mcache
Binary files differ
diff --git a/maps/re/new_5-1.mcache b/maps/re/new_5-1.mcache
index 1f53eb2b0..342ae6117 100644
--- a/maps/re/new_5-1.mcache
+++ b/maps/re/new_5-1.mcache
Binary files differ
diff --git a/maps/re/new_5-4.mcache b/maps/re/new_5-4.mcache
index 97fee0bb1..3cfc66817 100644
--- a/maps/re/new_5-4.mcache
+++ b/maps/re/new_5-4.mcache
Binary files differ
diff --git a/maps/re/new_zone01.mcache b/maps/re/new_zone01.mcache
index 1f53eb2b0..342ae6117 100644
--- a/maps/re/new_zone01.mcache
+++ b/maps/re/new_zone01.mcache
Binary files differ
diff --git a/maps/re/new_zone04.mcache b/maps/re/new_zone04.mcache
index 97fee0bb1..3cfc66817 100644
--- a/maps/re/new_zone04.mcache
+++ b/maps/re/new_zone04.mcache
Binary files differ
diff --git a/maps/re/nguild_prt.mcache b/maps/re/nguild_prt.mcache
index 3368e40dc..1e01f48a7 100644
--- a/maps/re/nguild_prt.mcache
+++ b/maps/re/nguild_prt.mcache
Binary files differ
diff --git a/maps/re/nif_fild02.mcache b/maps/re/nif_fild02.mcache
index d15c26ccd..7aa820023 100644
--- a/maps/re/nif_fild02.mcache
+++ b/maps/re/nif_fild02.mcache
Binary files differ
diff --git a/maps/re/nyd_dun01.mcache b/maps/re/nyd_dun01.mcache
index 9a1db44a5..c29cebe1a 100644
--- a/maps/re/nyd_dun01.mcache
+++ b/maps/re/nyd_dun01.mcache
Binary files differ
diff --git a/maps/re/nyd_dun02.mcache b/maps/re/nyd_dun02.mcache
index 0e2a19c81..a8ef4a685 100644
--- a/maps/re/nyd_dun02.mcache
+++ b/maps/re/nyd_dun02.mcache
Binary files differ
diff --git a/maps/re/orcsdun01.mcache b/maps/re/orcsdun01.mcache
index 1b021f341..3b3951498 100644
--- a/maps/re/orcsdun01.mcache
+++ b/maps/re/orcsdun01.mcache
Binary files differ
diff --git a/maps/re/orcsdun02.mcache b/maps/re/orcsdun02.mcache
index c5e85558d..004256991 100644
--- a/maps/re/orcsdun02.mcache
+++ b/maps/re/orcsdun02.mcache
Binary files differ
diff --git a/maps/re/pay_fild10.mcache b/maps/re/pay_fild10.mcache
index 0528aa68a..22e021de3 100644
--- a/maps/re/pay_fild10.mcache
+++ b/maps/re/pay_fild10.mcache
Binary files differ
diff --git a/maps/re/payon_in01.mcache b/maps/re/payon_in01.mcache
index 1feff4dc0..7615d0ba8 100644
--- a/maps/re/payon_in01.mcache
+++ b/maps/re/payon_in01.mcache
Binary files differ
diff --git a/maps/re/priest_1-1.mcache b/maps/re/priest_1-1.mcache
index ff1d96247..739890497 100644
--- a/maps/re/priest_1-1.mcache
+++ b/maps/re/priest_1-1.mcache
Binary files differ
diff --git a/maps/re/priest_2-1.mcache b/maps/re/priest_2-1.mcache
index ff1d96247..739890497 100644
--- a/maps/re/priest_2-1.mcache
+++ b/maps/re/priest_2-1.mcache
Binary files differ
diff --git a/maps/re/priest_3-1.mcache b/maps/re/priest_3-1.mcache
index ff1d96247..739890497 100644
--- a/maps/re/priest_3-1.mcache
+++ b/maps/re/priest_3-1.mcache
Binary files differ
diff --git a/maps/re/prt_are_in.mcache b/maps/re/prt_are_in.mcache
index d5fc112d7..03216ff8b 100644
--- a/maps/re/prt_are_in.mcache
+++ b/maps/re/prt_are_in.mcache
Binary files differ
diff --git a/maps/re/prt_church.mcache b/maps/re/prt_church.mcache
index 62e7e40ac..4b4d45b73 100644
--- a/maps/re/prt_church.mcache
+++ b/maps/re/prt_church.mcache
Binary files differ
diff --git a/maps/re/prt_fild05.mcache b/maps/re/prt_fild05.mcache
index 64a4136e6..28b96509c 100644
--- a/maps/re/prt_fild05.mcache
+++ b/maps/re/prt_fild05.mcache
Binary files differ
diff --git a/maps/re/prt_fild10.mcache b/maps/re/prt_fild10.mcache
index 42ec737fd..4a75d4436 100644
--- a/maps/re/prt_fild10.mcache
+++ b/maps/re/prt_fild10.mcache
Binary files differ
diff --git a/maps/re/prtg_cas01.mcache b/maps/re/prtg_cas01.mcache
index 3368e40dc..1e01f48a7 100644
--- a/maps/re/prtg_cas01.mcache
+++ b/maps/re/prtg_cas01.mcache
Binary files differ
diff --git a/maps/re/prtg_cas03.mcache b/maps/re/prtg_cas03.mcache
index 40e1e679c..25f9fd86a 100644
--- a/maps/re/prtg_cas03.mcache
+++ b/maps/re/prtg_cas03.mcache
Binary files differ
diff --git a/maps/re/prtg_cas04.mcache b/maps/re/prtg_cas04.mcache
index 6683f5567..66f12ad53 100644
--- a/maps/re/prtg_cas04.mcache
+++ b/maps/re/prtg_cas04.mcache
Binary files differ
diff --git a/maps/re/pvp_n_1-3.mcache b/maps/re/pvp_n_1-3.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/re/pvp_n_1-3.mcache
+++ b/maps/re/pvp_n_1-3.mcache
Binary files differ
diff --git a/maps/re/pvp_n_1-4.mcache b/maps/re/pvp_n_1-4.mcache
index ff1d96247..739890497 100644
--- a/maps/re/pvp_n_1-4.mcache
+++ b/maps/re/pvp_n_1-4.mcache
Binary files differ
diff --git a/maps/re/pvp_n_2-3.mcache b/maps/re/pvp_n_2-3.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/re/pvp_n_2-3.mcache
+++ b/maps/re/pvp_n_2-3.mcache
Binary files differ
diff --git a/maps/re/pvp_n_2-4.mcache b/maps/re/pvp_n_2-4.mcache
index ff1d96247..739890497 100644
--- a/maps/re/pvp_n_2-4.mcache
+++ b/maps/re/pvp_n_2-4.mcache
Binary files differ
diff --git a/maps/re/pvp_n_3-3.mcache b/maps/re/pvp_n_3-3.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/re/pvp_n_3-3.mcache
+++ b/maps/re/pvp_n_3-3.mcache
Binary files differ
diff --git a/maps/re/pvp_n_3-4.mcache b/maps/re/pvp_n_3-4.mcache
index ff1d96247..739890497 100644
--- a/maps/re/pvp_n_3-4.mcache
+++ b/maps/re/pvp_n_3-4.mcache
Binary files differ
diff --git a/maps/re/pvp_n_4-3.mcache b/maps/re/pvp_n_4-3.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/re/pvp_n_4-3.mcache
+++ b/maps/re/pvp_n_4-3.mcache
Binary files differ
diff --git a/maps/re/pvp_n_4-4.mcache b/maps/re/pvp_n_4-4.mcache
index ff1d96247..739890497 100644
--- a/maps/re/pvp_n_4-4.mcache
+++ b/maps/re/pvp_n_4-4.mcache
Binary files differ
diff --git a/maps/re/pvp_n_5-3.mcache b/maps/re/pvp_n_5-3.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/re/pvp_n_5-3.mcache
+++ b/maps/re/pvp_n_5-3.mcache
Binary files differ
diff --git a/maps/re/pvp_n_5-4.mcache b/maps/re/pvp_n_5-4.mcache
index ff1d96247..739890497 100644
--- a/maps/re/pvp_n_5-4.mcache
+++ b/maps/re/pvp_n_5-4.mcache
Binary files differ
diff --git a/maps/re/pvp_n_6-3.mcache b/maps/re/pvp_n_6-3.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/re/pvp_n_6-3.mcache
+++ b/maps/re/pvp_n_6-3.mcache
Binary files differ
diff --git a/maps/re/pvp_n_6-4.mcache b/maps/re/pvp_n_6-4.mcache
index ff1d96247..739890497 100644
--- a/maps/re/pvp_n_6-4.mcache
+++ b/maps/re/pvp_n_6-4.mcache
Binary files differ
diff --git a/maps/re/pvp_n_7-3.mcache b/maps/re/pvp_n_7-3.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/re/pvp_n_7-3.mcache
+++ b/maps/re/pvp_n_7-3.mcache
Binary files differ
diff --git a/maps/re/pvp_n_7-4.mcache b/maps/re/pvp_n_7-4.mcache
index ff1d96247..739890497 100644
--- a/maps/re/pvp_n_7-4.mcache
+++ b/maps/re/pvp_n_7-4.mcache
Binary files differ
diff --git a/maps/re/pvp_n_8-3.mcache b/maps/re/pvp_n_8-3.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/re/pvp_n_8-3.mcache
+++ b/maps/re/pvp_n_8-3.mcache
Binary files differ
diff --git a/maps/re/pvp_n_8-4.mcache b/maps/re/pvp_n_8-4.mcache
index ff1d96247..739890497 100644
--- a/maps/re/pvp_n_8-4.mcache
+++ b/maps/re/pvp_n_8-4.mcache
Binary files differ
diff --git a/maps/re/que_avan01.mcache b/maps/re/que_avan01.mcache
index 126fc2720..51cef085a 100644
--- a/maps/re/que_avan01.mcache
+++ b/maps/re/que_avan01.mcache
Binary files differ
diff --git a/maps/re/que_ba.mcache b/maps/re/que_ba.mcache
index a008c5b56..837b899e8 100644
--- a/maps/re/que_ba.mcache
+++ b/maps/re/que_ba.mcache
Binary files differ
diff --git a/maps/re/que_dan01.mcache b/maps/re/que_dan01.mcache
index e7e504d0f..b65d1e480 100644
--- a/maps/re/que_dan01.mcache
+++ b/maps/re/que_dan01.mcache
Binary files differ
diff --git a/maps/re/que_moc_16.mcache b/maps/re/que_moc_16.mcache
index 74e516042..70290570b 100644
--- a/maps/re/que_moc_16.mcache
+++ b/maps/re/que_moc_16.mcache
Binary files differ
diff --git a/maps/re/que_moon.mcache b/maps/re/que_moon.mcache
index 981a29eb8..92057f58f 100644
--- a/maps/re/que_moon.mcache
+++ b/maps/re/que_moon.mcache
Binary files differ
diff --git a/maps/re/que_sign02.mcache b/maps/re/que_sign02.mcache
index d15c26ccd..7aa820023 100644
--- a/maps/re/que_sign02.mcache
+++ b/maps/re/que_sign02.mcache
Binary files differ
diff --git a/maps/re/que_thor.mcache b/maps/re/que_thor.mcache
index b7cc76558..27d5fe8f9 100644
--- a/maps/re/que_thor.mcache
+++ b/maps/re/que_thor.mcache
Binary files differ
diff --git a/maps/re/quiz_01.mcache b/maps/re/quiz_01.mcache
index 4a4e2bae4..205f0efd6 100644
--- a/maps/re/quiz_01.mcache
+++ b/maps/re/quiz_01.mcache
Binary files differ
diff --git a/maps/re/ra_fild02.mcache b/maps/re/ra_fild02.mcache
index ed9833b48..372aca88b 100644
--- a/maps/re/ra_fild02.mcache
+++ b/maps/re/ra_fild02.mcache
Binary files differ
diff --git a/maps/re/ra_fild09.mcache b/maps/re/ra_fild09.mcache
index 7ffc09cd5..bb5c8babd 100644
--- a/maps/re/ra_fild09.mcache
+++ b/maps/re/ra_fild09.mcache
Binary files differ
diff --git a/maps/re/ra_fild10.mcache b/maps/re/ra_fild10.mcache
index 32f64e2d5..9b1342ba2 100644
--- a/maps/re/ra_fild10.mcache
+++ b/maps/re/ra_fild10.mcache
Binary files differ
diff --git a/maps/re/ra_san01.mcache b/maps/re/ra_san01.mcache
index 8cfaaefc1..de911bae5 100644
--- a/maps/re/ra_san01.mcache
+++ b/maps/re/ra_san01.mcache
Binary files differ
diff --git a/maps/re/ra_temple.mcache b/maps/re/ra_temple.mcache
index f27210d73..1463713b3 100644
--- a/maps/re/ra_temple.mcache
+++ b/maps/re/ra_temple.mcache
Binary files differ
diff --git a/maps/re/siege_test.mcache b/maps/re/siege_test.mcache
index 53811a305..8ddd58b6b 100644
--- a/maps/re/siege_test.mcache
+++ b/maps/re/siege_test.mcache
Binary files differ
diff --git a/maps/re/spl_fild03.mcache b/maps/re/spl_fild03.mcache
index b00084c52..84bd4b4cb 100644
--- a/maps/re/spl_fild03.mcache
+++ b/maps/re/spl_fild03.mcache
Binary files differ
diff --git a/maps/re/spl_in01.mcache b/maps/re/spl_in01.mcache
index f0ab26172..5bbfcf515 100644
--- a/maps/re/spl_in01.mcache
+++ b/maps/re/spl_in01.mcache
Binary files differ
diff --git a/maps/re/sword_1-1.mcache b/maps/re/sword_1-1.mcache
index d2ae19b3a..695bece61 100644
--- a/maps/re/sword_1-1.mcache
+++ b/maps/re/sword_1-1.mcache
Binary files differ
diff --git a/maps/re/sword_2-1.mcache b/maps/re/sword_2-1.mcache
index d2ae19b3a..695bece61 100644
--- a/maps/re/sword_2-1.mcache
+++ b/maps/re/sword_2-1.mcache
Binary files differ
diff --git a/maps/re/sword_3-1.mcache b/maps/re/sword_3-1.mcache
index d2ae19b3a..695bece61 100644
--- a/maps/re/sword_3-1.mcache
+++ b/maps/re/sword_3-1.mcache
Binary files differ
diff --git a/maps/re/te_alde_gld.mcache b/maps/re/te_alde_gld.mcache
index 5a920975f..0b4cd694f 100644
--- a/maps/re/te_alde_gld.mcache
+++ b/maps/re/te_alde_gld.mcache
Binary files differ
diff --git a/maps/re/te_aldecas4.mcache b/maps/re/te_aldecas4.mcache
index 9aa8600c5..324040d79 100644
--- a/maps/re/te_aldecas4.mcache
+++ b/maps/re/te_aldecas4.mcache
Binary files differ
diff --git a/maps/re/te_aldecas5.mcache b/maps/re/te_aldecas5.mcache
index cde5d2811..8094ea0d1 100644
--- a/maps/re/te_aldecas5.mcache
+++ b/maps/re/te_aldecas5.mcache
Binary files differ
diff --git a/maps/re/te_prtcas01.mcache b/maps/re/te_prtcas01.mcache
index 3368e40dc..1e01f48a7 100644
--- a/maps/re/te_prtcas01.mcache
+++ b/maps/re/te_prtcas01.mcache
Binary files differ
diff --git a/maps/re/te_prtcas03.mcache b/maps/re/te_prtcas03.mcache
index 40e1e679c..25f9fd86a 100644
--- a/maps/re/te_prtcas03.mcache
+++ b/maps/re/te_prtcas03.mcache
Binary files differ
diff --git a/maps/re/te_prtcas04.mcache b/maps/re/te_prtcas04.mcache
index 6683f5567..66f12ad53 100644
--- a/maps/re/te_prtcas04.mcache
+++ b/maps/re/te_prtcas04.mcache
Binary files differ
diff --git a/maps/re/teg_dun01.mcache b/maps/re/teg_dun01.mcache
index ee76ceb3f..44c528bc2 100644
--- a/maps/re/teg_dun01.mcache
+++ b/maps/re/teg_dun01.mcache
Binary files differ
diff --git a/maps/re/tha_t01.mcache b/maps/re/tha_t01.mcache
index eefa487d6..386d9cb5d 100644
--- a/maps/re/tha_t01.mcache
+++ b/maps/re/tha_t01.mcache
Binary files differ
diff --git a/maps/re/tur_dun01.mcache b/maps/re/tur_dun01.mcache
index e6c615f99..ede11d905 100644
--- a/maps/re/tur_dun01.mcache
+++ b/maps/re/tur_dun01.mcache
Binary files differ
diff --git a/maps/re/tur_dun02.mcache b/maps/re/tur_dun02.mcache
index b48ca6fc6..3e951e3ed 100644
--- a/maps/re/tur_dun02.mcache
+++ b/maps/re/tur_dun02.mcache
Binary files differ
diff --git a/maps/re/tur_dun03.mcache b/maps/re/tur_dun03.mcache
index 7d2d7779a..0f0c190cc 100644
--- a/maps/re/tur_dun03.mcache
+++ b/maps/re/tur_dun03.mcache
Binary files differ
diff --git a/maps/re/tur_dun06.mcache b/maps/re/tur_dun06.mcache
index b484b44b9..32ea2aa7f 100644
--- a/maps/re/tur_dun06.mcache
+++ b/maps/re/tur_dun06.mcache
Binary files differ
diff --git a/maps/re/turbo_e_16.mcache b/maps/re/turbo_e_16.mcache
index 633f9df49..2dd27fb49 100644
--- a/maps/re/turbo_e_16.mcache
+++ b/maps/re/turbo_e_16.mcache
Binary files differ
diff --git a/maps/re/turbo_e_4.mcache b/maps/re/turbo_e_4.mcache
index 633f9df49..2dd27fb49 100644
--- a/maps/re/turbo_e_4.mcache
+++ b/maps/re/turbo_e_4.mcache
Binary files differ
diff --git a/maps/re/turbo_e_8.mcache b/maps/re/turbo_e_8.mcache
index 633f9df49..2dd27fb49 100644
--- a/maps/re/turbo_e_8.mcache
+++ b/maps/re/turbo_e_8.mcache
Binary files differ
diff --git a/maps/re/turbo_n_1.mcache b/maps/re/turbo_n_1.mcache
index 633f9df49..2dd27fb49 100644
--- a/maps/re/turbo_n_1.mcache
+++ b/maps/re/turbo_n_1.mcache
Binary files differ
diff --git a/maps/re/turbo_n_16.mcache b/maps/re/turbo_n_16.mcache
index 633f9df49..2dd27fb49 100644
--- a/maps/re/turbo_n_16.mcache
+++ b/maps/re/turbo_n_16.mcache
Binary files differ
diff --git a/maps/re/turbo_n_4.mcache b/maps/re/turbo_n_4.mcache
index 633f9df49..2dd27fb49 100644
--- a/maps/re/turbo_n_4.mcache
+++ b/maps/re/turbo_n_4.mcache
Binary files differ
diff --git a/maps/re/turbo_n_8.mcache b/maps/re/turbo_n_8.mcache
index 633f9df49..2dd27fb49 100644
--- a/maps/re/turbo_n_8.mcache
+++ b/maps/re/turbo_n_8.mcache
Binary files differ
diff --git a/maps/re/turbo_room.mcache b/maps/re/turbo_room.mcache
index b251343ee..6fdd21346 100644
--- a/maps/re/turbo_room.mcache
+++ b/maps/re/turbo_room.mcache
Binary files differ
diff --git a/maps/re/um_fild02.mcache b/maps/re/um_fild02.mcache
index 6d4c33e56..59632d91f 100644
--- a/maps/re/um_fild02.mcache
+++ b/maps/re/um_fild02.mcache
Binary files differ
diff --git a/maps/re/valkyrie.mcache b/maps/re/valkyrie.mcache
index f13c3627e..208d13ed9 100644
--- a/maps/re/valkyrie.mcache
+++ b/maps/re/valkyrie.mcache
Binary files differ
diff --git a/maps/re/ve_fild03.mcache b/maps/re/ve_fild03.mcache
index 0c1c00748..52f022ff2 100644
--- a/maps/re/ve_fild03.mcache
+++ b/maps/re/ve_fild03.mcache
Binary files differ
diff --git a/maps/re/ve_fild07.mcache b/maps/re/ve_fild07.mcache
index 172a794e2..14a98e34a 100644
--- a/maps/re/ve_fild07.mcache
+++ b/maps/re/ve_fild07.mcache
Binary files differ
diff --git a/maps/re/wizard_1-1.mcache b/maps/re/wizard_1-1.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/re/wizard_1-1.mcache
+++ b/maps/re/wizard_1-1.mcache
Binary files differ
diff --git a/maps/re/wizard_2-1.mcache b/maps/re/wizard_2-1.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/re/wizard_2-1.mcache
+++ b/maps/re/wizard_2-1.mcache
Binary files differ
diff --git a/maps/re/wizard_3-1.mcache b/maps/re/wizard_3-1.mcache
index c1c64abb5..820e98d3e 100644
--- a/maps/re/wizard_3-1.mcache
+++ b/maps/re/wizard_3-1.mcache
Binary files differ
diff --git a/maps/re/xmas_dun02.mcache b/maps/re/xmas_dun02.mcache
index d527bc8ad..021f52832 100644
--- a/maps/re/xmas_dun02.mcache
+++ b/maps/re/xmas_dun02.mcache
Binary files differ
diff --git a/maps/re/yuno_fild12.mcache b/maps/re/yuno_fild12.mcache
index 586199b2b..dfa05d7a3 100644
--- a/maps/re/yuno_fild12.mcache
+++ b/maps/re/yuno_fild12.mcache
Binary files differ
diff --git a/maps/re/yuno_pre.mcache b/maps/re/yuno_pre.mcache
index 17017c2e1..2f381aa24 100644
--- a/maps/re/yuno_pre.mcache
+++ b/maps/re/yuno_pre.mcache
Binary files differ
diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql
index 4c762b8e8..072895142 100644
--- a/sql-files/item_db_re.sql
+++ b/sql-files/item_db_re.sql
@@ -9638,7 +9638,7 @@ REPLACE INTO `item_db` VALUES ('20281','C_Kindergarten_Hat','Costume Kindergarte
REPLACE INTO `item_db` VALUES ('20282','C_White_Student_Cap','Costume White Student Cap','5','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','1024','0','0',NULL,'1','0','877','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('20283','C_Over_Protector','Costume Over Protector','5','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','1024','0','0',NULL,'1','0','1329','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('20284','C_Cherry_Blossom_Hat','Costume Sakura Hat','5','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','1024','0','0',NULL,'1','0','1330','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('20285','C_Blossom_Fluttering','Costume Dancing Fallen Sakura','5','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','4096','0','0',NULL,'1','0','1331','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','sc_start SC_BLOSSOM_FLUTTERING, -1, 0;','sc_end SC_BLOSSOM_FLUTTERING;');
+REPLACE INTO `item_db` VALUES ('20285','C_Blossom_Fluttering','Costume Dancing Fallen Sakura','5','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','4096','0','0',NULL,'1','0','1331','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','hateffect(HAT_EF_BLOSSOM_FLUTTERING, true);','hateffect(HAT_EF_BLOSSOM_FLUTTERING, false);');
REPLACE INTO `item_db` VALUES ('20286','C_Under_Rim_Glasses_Red','Costume Under Rim Glasses Red','5','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','2048','0','0',NULL,'1','0','1332','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('20287','C_Mans_Medal_','Costume Man\'s Medal(Gold)','5','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','1024','0','0',NULL,'1','0','1333','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('20288','C_Bijou_Hat','Costume Bijou Hat','5','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','1024','0','0',NULL,'1','0','1334','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
diff --git a/sql-files/main.sql b/sql-files/main.sql
index 12607531b..5546c0271 100644
--- a/sql-files/main.sql
+++ b/sql-files/main.sql
@@ -889,6 +889,7 @@ INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1489588190); -- 2017-03-1
INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1496588640); -- 2017-06-04--15-04.sql
INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1496588700); -- 2017-06-04--15-05.sql
INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1509835214); -- 2017-11-04--10-39.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1519671456); -- 2018-02-26--15-57.sql
--
-- Table structure for table `storage`
--
@@ -959,12 +960,13 @@ CREATE TABLE IF NOT EXISTS `rodex_mail` (
`sender_id` INT(11) NOT NULL,
`receiver_name` VARCHAR(30) NOT NULL,
`receiver_id` INT(11) NOT NULL,
- `receiver_accountid` INT(11) NOT NULL,
+ `receiver_accountid` INT(11) NOT NULL,
`title` VARCHAR(50) NOT NULL,
`body` VARCHAR(510) NOT NULL,
`zeny` BIGINT(20) NOT NULL,
`type` TINYINT(8) UNSIGNED NOT NULL,
`is_read` TINYINT(8) NOT NULL,
+ `sender_read` TINYINT(2) NOT NULL,
`send_date` INT(11) NOT NULL,
`expire_date` INT(11) NOT NULL,
`weight` INT(11) NOT NULL,
diff --git a/sql-files/upgrades/2018-02-26--15-57.sql b/sql-files/upgrades/2018-02-26--15-57.sql
new file mode 100644
index 000000000..a2090bb3c
--- /dev/null
+++ b/sql-files/upgrades/2018-02-26--15-57.sql
@@ -0,0 +1,6 @@
+#1519671456
+
+ALTER TABLE `rodex_mail`
+ ADD COLUMN `sender_read` TINYINT(2) NOT NULL DEFAULT '0' AFTER `is_read`;
+
+INSERT INTO `sql_updates` (`timestamp`, `ignored`) VALUES (1519671456 , 'No');
diff --git a/sql-files/upgrades/index.txt b/sql-files/upgrades/index.txt
index 2b1409aba..a2d0c5171 100644
--- a/sql-files/upgrades/index.txt
+++ b/sql-files/upgrades/index.txt
@@ -43,3 +43,4 @@
2017-06-04--15-04.sql
2017-06-04--15-05.sql
2017-11-04--10-39.sql
+2018-02-26--15-57.sql
diff --git a/src/char/char.c b/src/char/char.c
index aef35f216..93fb1be75 100644
--- a/src/char/char.c
+++ b/src/char/char.c
@@ -3328,7 +3328,12 @@ void char_char_name_ack(int fd, int char_id)
WFIFOHEAD(fd,30);
WFIFOW(fd,0) = 0x2b09;
WFIFOL(fd,2) = char_id;
+#if PACKETVER_MAIN_NUM >= 20180307 || PACKETVER_RE_NUM >= 20180221
+ if (chr->loadName(char_id, WFIFOP(fd,6)) == 0)
+ WFIFOL(fd, 6) = 0;
+#else
chr->loadName(char_id, WFIFOP(fd,6));
+#endif
WFIFOSET(fd,30);
}
diff --git a/src/char/int_rodex.c b/src/char/int_rodex.c
index b7314e726..2001ddc43 100644
--- a/src/char/int_rodex.c
+++ b/src/char/int_rodex.c
@@ -55,7 +55,7 @@ static int inter_rodex_fromsql(int char_id, int account_id, int8 opentype, int64
case RODEX_OPENTYPE_MAIL:
if (SQL_ERROR == SQL->StmtPrepare(stmt,
"SELECT `mail_id`, `sender_name`, `sender_id`, `receiver_name`, `receiver_id`, `receiver_accountid`,"
- "`title`, `body`, `zeny`, `type`, `is_read`, `send_date`, `expire_date`, `weight`"
+ "`title`, `body`, `zeny`, `type`, `is_read`, `sender_read`, `send_date`, `expire_date`, `weight`"
"FROM `%s` WHERE `expire_date` > '%d' AND `receiver_id` = '%d' AND `mail_id` > '%"PRId64"'"
"ORDER BY `mail_id` ASC", rodex_db, (int)time(NULL), char_id, mail_id)
) {
@@ -68,7 +68,7 @@ static int inter_rodex_fromsql(int char_id, int account_id, int8 opentype, int64
case RODEX_OPENTYPE_ACCOUNT:
if (SQL_ERROR == SQL->StmtPrepare(stmt,
"SELECT `mail_id`, `sender_name`, `sender_id`, `receiver_name`, `receiver_id`, `receiver_accountid`,"
- "`title`, `body`, `zeny`, `type`, `is_read`, `send_date`, `expire_date`, `weight`"
+ "`title`, `body`, `zeny`, `type`, `is_read`, `sender_read`, `send_date`, `expire_date`, `weight`"
"FROM `%s` WHERE "
"`expire_date` > '%d' AND `receiver_accountid` = '%d' AND `mail_id` > '%"PRId64"'"
"ORDER BY `mail_id` ASC", rodex_db, (int)time(NULL), account_id, mail_id)
@@ -82,8 +82,8 @@ static int inter_rodex_fromsql(int char_id, int account_id, int8 opentype, int64
case RODEX_OPENTYPE_RETURN:
if (SQL_ERROR == SQL->StmtPrepare(stmt,
"SELECT `mail_id`, `sender_name`, `sender_id`, `receiver_name`, `receiver_id`, `receiver_accountid`,"
- "`title`, `body`, `zeny`, `type`, `is_read`, `send_date`, `expire_date`, `weight`"
- "FROM `%s` WHERE (`sender_id` = '%d' AND `expire_date` <= '%d' AND `send_date` + '%d' > '%d' AND `mail_id` > '%"PRId64"')"
+ "`title`, `body`, `zeny`, `type`, `is_read`, `sender_read`, `send_date`, `expire_date`, `weight`"
+ "FROM `%s` WHERE (`is_read` = 0 AND `sender_id` = '%d' AND `expire_date` <= '%d' AND `send_date` + '%d' > '%d' AND `mail_id` > '%"PRId64"')"
"ORDER BY `mail_id` ASC", rodex_db, char_id, (int)time(NULL), 2 * RODEX_EXPIRE, (int)time(NULL), mail_id)
) {
SqlStmt_ShowDebug(stmt);
@@ -95,9 +95,11 @@ static int inter_rodex_fromsql(int char_id, int account_id, int8 opentype, int64
case RODEX_OPENTYPE_UNSET:
if (SQL_ERROR == SQL->StmtPrepare(stmt,
"SELECT `mail_id`, `sender_name`, `sender_id`, `receiver_name`, `receiver_id`, `receiver_accountid`,"
- "`title`, `body`, `zeny`, `type`, `is_read`, `send_date`, `expire_date`, `weight`"
- "FROM `%s` WHERE `expire_date` > '%d' AND (`receiver_id` = '%d' or `receiver_accountid` = '%d') AND `mail_id` > '%"PRId64"'"
- "ORDER BY `mail_id` ASC", rodex_db, (int)time(NULL), char_id, account_id, mail_id)
+ "`title`, `body`, `zeny`, `type`, `is_read`, `sender_read`, `send_date`, `expire_date`, `weight`"
+ "FROM `%s` WHERE "
+ "((`expire_date` > '%d' AND (`receiver_id` = '%d' OR `receiver_accountid` = '%d'))"
+ "OR (`is_read` = 0 AND `sender_id` = '%d' AND `expire_date` <= '%d' AND `send_date` + '%d' > '%d'))"
+ "ORDER BY `mail_id` ASC", rodex_db, (int)time(NULL), char_id, account_id, char_id, (int)time(NULL), 2 * RODEX_EXPIRE, (int)time(NULL))
) {
SqlStmt_ShowDebug(stmt);
SQL->StmtFree(stmt);
@@ -118,9 +120,10 @@ static int inter_rodex_fromsql(int char_id, int account_id, int8 opentype, int64
|| SQL_ERROR == SQL->StmtBindColumn(stmt, 8, SQLDT_INT64, &msg.zeny, sizeof msg.zeny, NULL, NULL)
|| SQL_ERROR == SQL->StmtBindColumn(stmt, 9, SQLDT_UINT8, &msg.type, sizeof msg.type, NULL, NULL)
|| SQL_ERROR == SQL->StmtBindColumn(stmt, 10, SQLDT_BOOL, &msg.is_read, sizeof msg.is_read, NULL, NULL)
- || SQL_ERROR == SQL->StmtBindColumn(stmt, 11, SQLDT_INT, &msg.send_date, sizeof msg.send_date, NULL, NULL)
- || SQL_ERROR == SQL->StmtBindColumn(stmt, 12, SQLDT_INT, &msg.expire_date, sizeof msg.expire_date, NULL, NULL)
- || SQL_ERROR == SQL->StmtBindColumn(stmt, 13, SQLDT_INT, &msg.weight, sizeof msg.weight, NULL, NULL)
+ || SQL_ERROR == SQL->StmtBindColumn(stmt, 11, SQLDT_BOOL, &msg.sender_read, sizeof msg.sender_read, NULL, NULL)
+ || SQL_ERROR == SQL->StmtBindColumn(stmt, 12, SQLDT_INT, &msg.send_date, sizeof msg.send_date, NULL, NULL)
+ || SQL_ERROR == SQL->StmtBindColumn(stmt, 13, SQLDT_INT, &msg.expire_date, sizeof msg.expire_date, NULL, NULL)
+ || SQL_ERROR == SQL->StmtBindColumn(stmt, 14, SQLDT_INT, &msg.weight, sizeof msg.weight, NULL, NULL)
) {
SqlStmt_ShowDebug(stmt);
SQL->StmtFree(stmt);
@@ -201,10 +204,12 @@ static int inter_rodex_fromsql(int char_id, int account_id, int8 opentype, int64
#if PACKETVER >= 20170419
if (opentype == RODEX_OPENTYPE_UNSET) {
- if (msg.receiver_id != 0)
- msg.opentype = RODEX_OPENTYPE_MAIL;
- else
+ if (msg.receiver_id == 0)
msg.opentype = RODEX_OPENTYPE_ACCOUNT;
+ else if (msg.expire_date < time(NULL))
+ msg.opentype = RODEX_OPENTYPE_RETURN;
+ else
+ msg.opentype = RODEX_OPENTYPE_MAIL;
} else {
msg.opentype = opentype;
}
@@ -243,8 +248,8 @@ static bool inter_rodex_hasnew(int char_id, int account_id)
if (SQL_ERROR == SQL->Query(inter->sql_handle,
"SELECT count(*) FROM `%s` WHERE ("
"(`expire_date` > '%d' AND (`receiver_id` = '%d' OR `receiver_accountid` = '%d')) OR"
- "(`sender_id` = '%d' AND `expire_date` <= '%d' AND `send_date` + '%d' > '%d')"
- ") AND (`is_read` = 0 OR (`type` > 0 AND `type` != 8))",
+ "(`sender_id` = '%d' AND `expire_date` <= '%d' AND `send_date` + '%d' > '%d' AND `is_read` = 0)" // is_read is required in this line because of the OR in next condition
+ ") AND ((`is_read` = 0 AND `sender_read` = 0) OR (`type` > 0 AND `type` != 8))",
rodex_db, (int)time(NULL), char_id, account_id,
char_id, (int)time(NULL), 2 * RODEX_EXPIRE, (int)time(NULL))
) {
@@ -309,10 +314,10 @@ int64 inter_rodex_savemessage(struct rodex_message* msg)
SQL->EscapeStringLen(inter->sql_handle, title, msg->title, strnlen(msg->title, RODEX_TITLE_LENGTH));
if (SQL_ERROR == SQL->Query(inter->sql_handle, "INSERT INTO `%s` (`sender_name`, `sender_id`, `receiver_name`, `receiver_id`, `receiver_accountid`, `title`, `body`,"
- "`zeny`, `type`, `is_read`, `send_date`, `expire_date`, `weight`) VALUES "
- "('%s', '%d', '%s', '%d', '%d', '%s', '%s', '%"PRId64"', '%d', '%d', '%d', '%d', '%d')",
+ "`zeny`, `type`, `is_read`, `sender_read`, `send_date`, `expire_date`, `weight`) VALUES "
+ "('%s', '%d', '%s', '%d', '%d', '%s', '%s', '%"PRId64"', '%d', '%d', '%d', '%d', '%d', '%d')",
rodex_db, sender_name, msg->sender_id, receiver_name, msg->receiver_id, msg->receiver_accountid,
- title, body, msg->zeny, msg->type, msg->is_read == true ? 1 : 0, msg->send_date, msg->expire_date, msg->weight)) {
+ title, body, msg->zeny, msg->type, msg->is_read == true ? 1 : 0, msg->sender_read == true ? 1 : 0, msg->send_date, msg->expire_date, msg->weight)) {
Sql_ShowDebug(inter->sql_handle);
return 0;
}
@@ -344,22 +349,23 @@ int64 inter_rodex_savemessage(struct rodex_message* msg)
/*==========================================
* Inbox Request
*------------------------------------------*/
-void mapif_rodex_sendinbox(int fd, int char_id, int8 opentype, int8 flag, int count, struct rodex_maillist *mails)
+void mapif_rodex_sendinbox(int fd, int char_id, int8 opentype, int8 flag, int count, int64 mail_id, struct rodex_maillist *mails)
{
- int per_packet = (UINT16_MAX - 16) / sizeof(struct rodex_message);
+ int per_packet = (UINT16_MAX - 24) / sizeof(struct rodex_message);
int sent = 0;
bool is_first = true;
nullpo_retv(mails);
Assert_retv(char_id > 0);
Assert_retv(count >= 0);
+ Assert_retv(mail_id >= 0);
do {
- int i = 16, j, size, limit;
+ int i = 24, j, size, limit;
int to_send = count - sent;
bool is_last = true;
if (to_send <= per_packet) {
- size = to_send * sizeof(struct rodex_message) + 16;
+ size = to_send * sizeof(struct rodex_message) + 24;
limit = to_send;
is_last = true;
} else {
@@ -367,7 +373,7 @@ void mapif_rodex_sendinbox(int fd, int char_id, int8 opentype, int8 flag, int co
if (limit != to_send) {
is_last = false;
}
- size = limit * sizeof(struct rodex_message) + 16;
+ size = limit * sizeof(struct rodex_message) + 24;
}
WFIFOHEAD(fd, size);
@@ -379,6 +385,7 @@ void mapif_rodex_sendinbox(int fd, int char_id, int8 opentype, int8 flag, int co
WFIFOB(fd, 10) = is_last;
WFIFOB(fd, 11) = is_first;
WFIFOL(fd, 12) = limit;
+ WFIFOQ(fd, 16) = mail_id;
for (j = 0; j < limit; ++j, ++sent, i += sizeof(struct rodex_message)) {
memcpy(WFIFOP(fd, i), &VECTOR_INDEX(*mails, sent), sizeof(struct rodex_message));
}
@@ -403,7 +410,7 @@ void mapif_parse_rodex_requestinbox(int fd)
count = inter_rodex->fromsql(char_id, account_id, opentype, 0, &mails);
else
count = inter_rodex->fromsql(char_id, account_id, opentype, mail_id, &mails);
- mapif->rodex_sendinbox(fd, char_id, opentype, flag, count, &mails);
+ mapif->rodex_sendinbox(fd, char_id, opentype, flag, count, mail_id, &mails);
VECTOR_CLEAR(mails);
}
@@ -443,7 +450,7 @@ void mapif_parse_rodex_updatemail(int fd)
int8 flag = RFIFOB(fd, 10);
Assert_retv(mail_id > 0);
- Assert_retv(flag >= 0 && flag <= 3);
+ Assert_retv(flag >= 0 && flag <= 4);
switch (flag) {
case 0: // Read
@@ -469,6 +476,11 @@ void mapif_parse_rodex_updatemail(int fd)
if (SQL_ERROR == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `mail_id` = '%"PRId64"'", rodex_item_db, mail_id))
Sql_ShowDebug(inter->sql_handle);
break;
+
+ case 4: // Sender Read
+ if (SQL_ERROR == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `sender_read` = 1 WHERE `mail_id` = '%"PRId64"'", rodex_db, mail_id))
+ Sql_ShowDebug(inter->sql_handle);
+ break;
}
}
diff --git a/src/char/mapif.c b/src/char/mapif.c
index 241edc925..f80e38fe7 100644
--- a/src/char/mapif.c
+++ b/src/char/mapif.c
@@ -185,7 +185,7 @@ void mapif_send_quests(int fd, int char_id, struct quest *tmp_questlog, int num_
int mapif_parse_quest_load(int fd);
/* RoDEX */
int mapif_parse_rodex_requestinbox(int fd);
-void mapif_rodex_sendinbox(int fd, int char_id, int8 opentype, int8 flag, int count, struct rodex_maillist *mails);
+void mapif_rodex_sendinbox(int fd, int char_id, int8 opentype, int8 flag, int count, int64 mail_id, struct rodex_maillist *mails);
int mapif_parse_rodex_checkhasnew(int fd);
void mapif_rodex_sendhasnew(int fd, int char_id, bool has_new);
int mapif_parse_rodex_updatemail(int fd);
diff --git a/src/char/mapif.h b/src/char/mapif.h
index f03f1ad9a..7fc79f661 100644
--- a/src/char/mapif.h
+++ b/src/char/mapif.h
@@ -177,7 +177,7 @@ struct mapif_interface {
void (*send_quests) (int fd, int char_id, struct quest *tmp_questlog, int num_quests);
int (*parse_quest_load) (int fd);
int(*parse_rodex_requestinbox) (int fd);
- void(*rodex_sendinbox) (int fd, int char_id, int8 opentype, int8 flag, int count, struct rodex_maillist *mails);
+ void(*rodex_sendinbox) (int fd, int char_id, int8 opentype, int8 flag, int count, int64 mail_id, struct rodex_maillist *mails);
int(*parse_rodex_checkhasnew) (int fd);
void(*rodex_sendhasnew) (int fd, int char_id, bool has_new);
int(*parse_rodex_updatemail) (int fd);
diff --git a/src/char/pincode.c b/src/char/pincode.c
index fc1a4c037..bca1b4394 100644
--- a/src/char/pincode.c
+++ b/src/char/pincode.c
@@ -68,6 +68,8 @@ void pincode_check(int fd, struct char_session_data* sd) {
char pin[5] = "\0\0\0\0";
nullpo_retv(sd);
+ if (strlen(sd->pincode) != 4)
+ return;
safestrncpy(pin, RFIFOP(fd, 6), sizeof(pin));
pincode->decrypt(sd->pincode_seed, pin);
if( pincode->compare( fd, sd, pin ) ){
@@ -87,7 +89,9 @@ int pincode_compare(int fd, struct char_session_data* sd, char* pin) {
} else {
pincode->sendstate( fd, sd, PINCODE_WRONG );
if( pincode->maxtry && ++sd->pincode_try >= pincode->maxtry ){
- pincode->error( sd->account_id );
+ pincode->error(sd->account_id);
+ chr->authfail_fd(fd, 0);
+ chr->disconnect_player(sd->account_id);
}
return 0;
}
@@ -97,6 +101,8 @@ void pincode_change(int fd, struct char_session_data* sd) {
char oldpin[5] = "\0\0\0\0", newpin[5] = "\0\0\0\0";
nullpo_retv(sd);
+ if (strlen(sd->pincode) != 4)
+ return;
safestrncpy(oldpin, RFIFOP(fd,6), sizeof(oldpin));
pincode->decrypt(sd->pincode_seed,oldpin);
if( !pincode->compare( fd, sd, oldpin ) )
@@ -113,6 +119,8 @@ void pincode_setnew(int fd, struct char_session_data* sd) {
char newpin[5] = "\0\0\0\0";
nullpo_retv(sd);
+ if (strlen(sd->pincode) == 4)
+ return;
safestrncpy(newpin, RFIFOP(fd,6), sizeof(newpin));
pincode->decrypt(sd->pincode_seed,newpin);
pincode->update( sd->account_id, newpin );
@@ -172,8 +180,11 @@ void pincode_decrypt(unsigned int userSeed, char* pin) {
}
}
- for( i = 0; i < 4; i++ ){
- pin[i] = tab[pin[i] - '0'];
+ for (i = 0; i < 4; i++ ) {
+ if (pin[i] < '0' || pin[i] > '9')
+ pin[i] = '0';
+ else
+ pin[i] = tab[pin[i] - '0'];
}
sprintf(pin, "%d%d%d%d", pin[0], pin[1], pin[2], pin[3]);
diff --git a/src/common/HPMDataCheck.h b/src/common/HPMDataCheck.h
index 4bcb33e23..30cb01857 100644
--- a/src/common/HPMDataCheck.h
+++ b/src/common/HPMDataCheck.h
@@ -656,8 +656,14 @@ HPExport const struct s_HPMDataCheck HPMDataCheck[] = {
{ "packet_npc_market_result_ack", sizeof(struct packet_npc_market_result_ack), SERVER_TYPE_MAP },
{ "packet_package_item_announce", sizeof(struct packet_package_item_announce), SERVER_TYPE_MAP },
{ "packet_party_leader_changed", sizeof(struct packet_party_leader_changed), SERVER_TYPE_MAP },
+ { "packet_quest_add_header", sizeof(struct packet_quest_add_header), SERVER_TYPE_MAP },
+ { "packet_quest_hunt_info", sizeof(struct packet_quest_hunt_info), SERVER_TYPE_MAP },
+ { "packet_quest_hunt_info_sub", sizeof(struct packet_quest_hunt_info_sub), SERVER_TYPE_MAP },
+ { "packet_quest_hunt_sub", sizeof(struct packet_quest_hunt_sub), SERVER_TYPE_MAP },
{ "packet_quest_list_header", sizeof(struct packet_quest_list_header), SERVER_TYPE_MAP },
{ "packet_quest_list_info", sizeof(struct packet_quest_list_info), SERVER_TYPE_MAP },
+ { "packet_quest_update_header", sizeof(struct packet_quest_update_header), SERVER_TYPE_MAP },
+ { "packet_quest_update_hunt", sizeof(struct packet_quest_update_hunt), SERVER_TYPE_MAP },
{ "packet_roulette_close_ack", sizeof(struct packet_roulette_close_ack), SERVER_TYPE_MAP },
{ "packet_roulette_generate_ack", sizeof(struct packet_roulette_generate_ack), SERVER_TYPE_MAP },
{ "packet_roulette_info_ack", sizeof(struct packet_roulette_info_ack), SERVER_TYPE_MAP },
diff --git a/src/common/md5calc.c b/src/common/md5calc.c
index d2fc32371..d5ce8b5a8 100644
--- a/src/common/md5calc.c
+++ b/src/common/md5calc.c
@@ -202,7 +202,7 @@ static void md5_buf2binary(const uint8 *buf, const int buf_size, uint8 *output)
//1-3
copy_len = buf_size % 64; //The number of bytes which remained is computed.
- strncpy((char *)padding_message, (const char *)pbuf, copy_len); // A message is copied to an extended bit sequence.
+ memcpy((char *)padding_message, (const char *)pbuf, copy_len); // A message is copied to an extended bit sequence.
memset(padding_message+copy_len, 0, 64 - copy_len); //It buries by 0 until it becomes extended bit length.
padding_message[copy_len] |= 0x80; //The next of a message is 1.
diff --git a/src/common/mmo.h b/src/common/mmo.h
index 577901e96..4f047361e 100644
--- a/src/common/mmo.h
+++ b/src/common/mmo.h
@@ -81,6 +81,22 @@
#undef ENABLE_PACKETVER_ZERO
#endif // DISABLE_PACKETVER_ZERO
+#if !defined(PACKETVER_RE) && !defined(PACKETVER_ZERO)
+ #define PACKETVER_MAIN_NUM PACKETVER
+#else
+ #define PACKETVER_MAIN_NUM 0
+#endif
+#ifdef PACKETVER_RE
+ #define PACKETVER_RE_NUM PACKETVER
+#else
+ #define PACKETVER_RE_NUM 0
+#endif
+#ifdef PACKETVER_ZERO
+ #define PACKETVER_ZERO_NUM PACKETVER
+#else
+ #define PACKETVER_ZERO_NUM 0
+#endif
+
// Client support for experimental RagexeRE UI present in 2012-04-10 and 2012-04-18
#if defined(PACKETVER_RE) && ( PACKETVER == 20120410 || PACKETVER == 20120418 )
#define PARTY_RECRUIT
@@ -905,6 +921,7 @@ struct rodex_message {
uint8 type;
int8 opentype;
bool is_read;
+ bool sender_read;
bool is_deleted;
int send_date;
int expire_date;
diff --git a/src/login/login.c b/src/login/login.c
index 5b281c22d..9fe9de0d3 100644
--- a/src/login/login.c
+++ b/src/login/login.c
@@ -1985,7 +1985,8 @@ int do_final(void)
login->dbs->account_engine->db->destroy(login->dbs->account_engine->db);
login->dbs->account_engine->db = NULL;
}
- accounts = NULL; // destroyed in account_engine
+ login->accounts = NULL; // destroyed in account_engine
+ accounts = NULL;
login->online_db->destroy(login->online_db, NULL);
login->auth_db->destroy(login->auth_db, NULL);
@@ -2101,6 +2102,7 @@ int do_init(int argc, char** argv)
login->dbs->account_engine->constructor = account->db_sql;
login->dbs->account_engine->db = login->dbs->account_engine->constructor();
accounts = login->dbs->account_engine->db;
+ login->accounts = accounts;
if( accounts == NULL ) {
ShowFatalError("do_init: account engine 'sql' not found.\n");
exit(EXIT_FAILURE);
diff --git a/src/map/atcommand.c b/src/map/atcommand.c
index 2bcb22738..9deed0098 100644
--- a/src/map/atcommand.c
+++ b/src/map/atcommand.c
@@ -7872,7 +7872,6 @@ ACMD(cash)
{
char output[128];
int value;
- int ret=0;
if (!*message || (value = atoi(message)) == 0) {
clif->message(fd, msg_fd(fd,1322)); // Please enter an amount.
@@ -7880,38 +7879,38 @@ ACMD(cash)
}
if (!strcmpi(info->command,"cash")) {
- if( value > 0 ) {
- if( (ret=pc->getcash(sd, value, 0)) >= 0){
+ if (value > 0) {
+ if ((pc->getcash(sd, value, 0)) >= 0) {
// If this option is set, the message is already sent by pc function
- if( !battle_config.cashshop_show_points ){
- sprintf(output, msg_fd(fd,505), ret, sd->cashPoints);
+ if (!battle_config.cashshop_show_points) {
+ sprintf(output, msg_fd(fd,505), value, sd->cashPoints);
clif_disp_onlyself(sd, output);
clif->message(fd, output);
}
} else
clif->message(fd, msg_fd(fd,149)); // Unable to decrease the number/value.
} else {
- if( (ret=pc->paycash(sd, -value, 0)) >= 0){
- sprintf(output, msg_fd(fd,410), ret, sd->cashPoints);
+ if ((pc->paycash(sd, -value, 0)) >= 0) {
+ sprintf(output, msg_fd(fd,410), -value, sd->cashPoints);
clif_disp_onlyself(sd, output);
clif->message(fd, output);
} else
clif->message(fd, msg_fd(fd,41)); // Unable to decrease the number/value.
}
} else { // @points
- if( value > 0 ) {
- if( (ret=pc->getcash(sd, 0, value)) >= 0) {
+ if (value > 0) {
+ if ((pc->getcash(sd, 0, value)) >= 0) {
// If this option is set, the message is already sent by pc function
- if( !battle_config.cashshop_show_points ){
- sprintf(output, msg_fd(fd,506), ret, sd->kafraPoints);
+ if (!battle_config.cashshop_show_points) {
+ sprintf(output, msg_fd(fd,506), value, sd->kafraPoints);
clif_disp_onlyself(sd, output);
clif->message(fd, output);
}
} else
clif->message(fd, msg_fd(fd,149)); // Unable to decrease the number/value.
} else {
- if( (ret=pc->paycash(sd, -value, -value)) >= 0){
- sprintf(output, msg_fd(fd,411), ret, sd->kafraPoints);
+ if ((pc->paycash(sd, -value, -value)) >= 0) {
+ sprintf(output, msg_fd(fd,411), -value, sd->kafraPoints);
clif_disp_onlyself(sd, output);
clif->message(fd, output);
} else
@@ -10056,6 +10055,7 @@ bool atcommand_exec(const int fd, struct map_session_data *sd, const char *messa
{
char params[100], command[100];
char output[CHAT_SIZE_MAX];
+ bool logCommand;
// Reconstructed message
char atcmd_msg[CHAT_SIZE_MAX];
@@ -10199,6 +10199,7 @@ bool atcommand_exec(const int fd, struct map_session_data *sd, const char *messa
}
}
+ logCommand = info->log;
//Attempt to use the command
if ((info->func(fd, ssd, command, params,info) != true)) {
#ifdef AUTOTRADE_PERSISTENCY
@@ -10210,7 +10211,8 @@ bool atcommand_exec(const int fd, struct map_session_data *sd, const char *messa
return true;
}
- if (info->log) /* log only if this command should be logged [Ind/Hercules] */
+ // info->log cant be used here, because info can be freed [4144]
+ if (logCommand) /* log only if this command should be logged [Ind/Hercules] */
logs->atcommand(sd, is_atcommand ? atcmd_msg : message);
return true;
diff --git a/src/map/clan.c b/src/map/clan.c
index 865f5a4cd..7aa9be5d4 100644
--- a/src/map/clan.c
+++ b/src/map/clan.c
@@ -997,10 +997,11 @@ void clan_reload(void)
*/
void do_init_clan(bool minimal)
{
+ clan->db = idb_alloc(DB_OPT_RELEASE_DATA);
+
if (minimal) {
return;
}
- clan->db = idb_alloc(DB_OPT_RELEASE_DATA);
clan->config_read(false);
timer->add_func_list(clan->inactivity_kick, "clan_inactivity_kick");
}
diff --git a/src/map/clif.c b/src/map/clif.c
index f998778a2..afe8aac40 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -1539,6 +1539,7 @@ bool clif_spawn(struct block_list *bl)
clif->spiritcharm(sd);
if (sd->status.look.robe != 0)
clif->refreshlook(bl, bl->id, LOOK_ROBE, sd->status.look.robe, AREA);
+ clif->hat_effect(bl, NULL, AREA);
}
break;
case BL_MOB:
@@ -4395,6 +4396,7 @@ void clif_getareachar_unit(struct map_session_data* sd,struct block_list *bl) {
clif->sendbgemblem_single(sd->fd,tsd);
if (tsd->status.look.robe != 0)
clif->refreshlook(&sd->bl, bl->id, LOOK_ROBE, tsd->status.look.robe, SELF);
+ clif->hat_effect(bl, &sd->bl, SELF);
}
break;
case BL_MER: // Devotion Effects
@@ -6088,14 +6090,29 @@ void clif_wis_end(int fd, int flag) {
/// Returns character name requested by char_id (ZC_ACK_REQNAME_BYGID).
/// 0194 <char id>.L <name>.24B
+/// 0af7 <flag>.W <char id>.L <name>.24B
void clif_solved_charname(int fd, int charid, const char* name)
{
nullpo_retv(name);
- WFIFOHEAD(fd,packet_len(0x194));
- WFIFOW(fd,0)=0x194;
- WFIFOL(fd,2)=charid;
- safestrncpy(WFIFOP(fd,6), name, NAME_LENGTH);
- WFIFOSET(fd,packet_len(0x194));
+#if PACKETVER_MAIN_NUM >= 20180307 || PACKETVER_RE_NUM >= 20180221
+ WFIFOHEAD(fd, packet_len(0x0af7));
+ WFIFOW(fd, 0) = 0xaf7;
+ if (*name == 0) {
+ WFIFOW(fd, 2) = 2;
+ memset(WFIFOP(fd, 8), 0, NAME_LENGTH);
+ } else {
+ WFIFOW(fd, 2) = 3;
+ safestrncpy(WFIFOP(fd, 8), name, NAME_LENGTH);
+ }
+ WFIFOL(fd, 4) = charid;
+ WFIFOSET(fd, packet_len(0x0af7));
+#else
+ WFIFOHEAD(fd, packet_len(0x194));
+ WFIFOW(fd, 0) = 0x194;
+ WFIFOL(fd, 2) = charid;
+ safestrncpy(WFIFOP(fd, 6), name, NAME_LENGTH);
+ WFIFOSET(fd, packet_len(0x194));
+#endif
}
/// Presents a list of items that can be carded/composed (ZC_ITEMCOMPOSITION_LIST).
@@ -10999,13 +11016,21 @@ void clif_parse_CreateChatRoom(int fd, struct map_session_data* sd) __attribute_
void clif_parse_CreateChatRoom(int fd, struct map_session_data* sd)
{
int len = RFIFOW(fd,2)-15;
- int limit = RFIFOW(fd,4);
- bool pub = (RFIFOB(fd,6) != 0);
- const char *password = RFIFOP(fd,7); //not zero-terminated
- const char *title = RFIFOP(fd,15); // not zero-terminated
+ int limit;
+ bool pub;
+ const char *password; //not zero-terminated
+ const char *title; // not zero-terminated
char s_password[CHATROOM_PASS_SIZE];
char s_title[CHATROOM_TITLE_SIZE];
+ if (len < 1)
+ return;
+
+ limit = RFIFOW(fd, 4);
+ pub = (RFIFOB(fd, 6) != 0);
+ password = RFIFOP(fd, 7); //not zero-terminated
+ title = RFIFOP(fd, 15); // not zero-terminated
+
if (pc_ismuted(&sd->sc, MANNER_NOROOM))
return;
if(battle_config.basic_skill_check && !pc->check_basicskill(sd, 4)) {
@@ -11021,9 +11046,6 @@ void clif_parse_CreateChatRoom(int fd, struct map_session_data* sd)
return;
}
- if( len <= 0 )
- return; // invalid input
-
safestrncpy(s_password, password, CHATROOM_PASS_SIZE);
safestrncpy(s_title, title, min(len+1,CHATROOM_TITLE_SIZE)); //NOTE: assumes that safestrncpy will not access the len+1'th byte
@@ -11050,15 +11072,20 @@ void clif_parse_ChatRoomStatusChange(int fd, struct map_session_data* sd) __attr
void clif_parse_ChatRoomStatusChange(int fd, struct map_session_data* sd)
{
int len = RFIFOW(fd,2)-15;
- int limit = RFIFOW(fd,4);
- bool pub = (RFIFOB(fd,6) != 0);
- const char *password = RFIFOP(fd,7); // not zero-terminated
- const char *title = RFIFOP(fd,15); // not zero-terminated
+ int limit;
+ bool pub;
+ const char *password; // not zero-terminated
+ const char *title; // not zero-terminated
char s_password[CHATROOM_PASS_SIZE];
char s_title[CHATROOM_TITLE_SIZE];
- if( len <= 0 )
- return; // invalid input
+ if (len < 1)
+ return;
+
+ limit = RFIFOW(fd, 4);
+ pub = (RFIFOB(fd, 6) != 0);
+ password = RFIFOP(fd, 7); // not zero-terminated
+ title = RFIFOP(fd, 15); // not zero-terminated
safestrncpy(s_password, password, CHATROOM_PASS_SIZE);
safestrncpy(s_title, title, min(len+1,CHATROOM_TITLE_SIZE)); //NOTE: assumes that safestrncpy will not access the len+1'th byte
@@ -11074,7 +11101,7 @@ void clif_parse_ChangeChatOwner(int fd, struct map_session_data* sd) __attribute
/// 1 = normal
void clif_parse_ChangeChatOwner(int fd, struct map_session_data* sd)
{
- chat->change_owner(sd, RFIFOP(fd,6));
+ chat->change_owner(sd, RFIFOP(fd,6)); // non null terminated
}
void clif_parse_KickFromChat(int fd,struct map_session_data *sd) __attribute__((nonnull (2)));
@@ -11082,7 +11109,7 @@ void clif_parse_KickFromChat(int fd,struct map_session_data *sd) __attribute__((
/// 00e2 <name>.24B
void clif_parse_KickFromChat(int fd,struct map_session_data *sd)
{
- chat->kick(sd, RFIFOP(fd,2));
+ chat->kick(sd, RFIFOP(fd,2)); // non null terminated
}
void clif_parse_ChatLeave(int fd, struct map_session_data* sd) __attribute__((nonnull (2)));
@@ -11841,17 +11868,21 @@ void clif_parse_NpcStringInput(int fd, struct map_session_data* sd) __attribute_
/// 01d5 <packet len>.W <npc id>.L <string>.?B
void clif_parse_NpcStringInput(int fd, struct map_session_data* sd)
{
+ int len = RFIFOW(fd, 2);
// [4144] can't confirm exact client version. At least >= correct for 20150513
#if PACKETVER >= 20151029
- int message_len = RFIFOW(fd, 2) - 7;
+ int message_len = len - 7;
#else
- int message_len = RFIFOW(fd, 2) - 8;
+ int message_len = len - 8;
#endif
- int npcid = RFIFOL(fd,4);
- const char *message = RFIFOP(fd,8);
+ int npcid;
+ const char *message;
+
+ if (len < 9)
+ return;
- if( message_len <= 0 )
- return; // invalid input
+ npcid = RFIFOL(fd, 4);
+ message = RFIFOP(fd, 8);
safestrncpy(sd->npc_str, message, min(message_len,CHATBOX_SIZE));
npc->scriptcont(sd, npcid, false);
@@ -13005,9 +13036,15 @@ void clif_parse_PurchaseReq(int fd, struct map_session_data* sd) __attribute__((
/// 0134 <packet len>.W <account id>.L { <amount>.W <index>.W }*
void clif_parse_PurchaseReq(int fd, struct map_session_data* sd)
{
- int len = (int)RFIFOW(fd,2) - 8;
- int id = RFIFOL(fd,4);
- const uint8 *data = RFIFOP(fd,8);
+ int len = (int)RFIFOW(fd, 2) - 8;
+ int id;
+ const uint8 *data;
+
+ if (len < 1)
+ return;
+
+ id = RFIFOL(fd, 4);
+ data = RFIFOP(fd, 8);
vending->purchase(sd, id, sd->vended_id, data, len/4);
@@ -13020,10 +13057,16 @@ void clif_parse_PurchaseReq2(int fd, struct map_session_data* sd) __attribute__(
/// 0801 <packet len>.W <account id>.L <unique id>.L { <amount>.W <index>.W }*
void clif_parse_PurchaseReq2(int fd, struct map_session_data* sd)
{
- int len = (int)RFIFOW(fd,2) - 12;
- int aid = RFIFOL(fd,4);
- int uid = RFIFOL(fd,8);
- const uint8 *data = RFIFOP(fd,12);
+ int len = (int)RFIFOW(fd, 2) - 12;
+ int aid;
+ int uid;
+ const uint8 *data;
+
+ if (len < 1)
+ return;
+ aid = RFIFOL(fd, 4);
+ uid = RFIFOL(fd, 8);
+ data = RFIFOP(fd, 12);
vending->purchase(sd, aid, uid, data, len/4);
@@ -13040,9 +13083,16 @@ void clif_parse_OpenVending(int fd, struct map_session_data* sd) __attribute__((
/// 1 = open
void clif_parse_OpenVending(int fd, struct map_session_data* sd) {
short len = (short)RFIFOW(fd,2) - 85;
- const char *message = RFIFOP(fd,4);
- bool flag = (RFIFOB(fd,84) != 0) ? true : false;
- const uint8 *data = RFIFOP(fd,85);
+ const char *message;
+ bool flag;
+ const uint8 *data;
+
+ if (len < 1)
+ return;
+
+ message = RFIFOP(fd,4);
+ flag = (RFIFOB(fd,84) != 0) ? true : false;
+ data = RFIFOP(fd,85);
if( !flag )
sd->state.prevend = sd->state.workinprogress = 0;
@@ -13135,12 +13185,14 @@ void clif_parse_GuildChangePositionInfo(int fd, struct map_session_data *sd) __a
void clif_parse_GuildChangePositionInfo(int fd, struct map_session_data *sd)
{
int i;
+ int count = (RFIFOW(fd, 2) - 4) / 40;
- if(!sd->state.gmaster_flag)
+ if (!sd->state.gmaster_flag)
return;
- for(i = 4; i < RFIFOW(fd,2); i += 40 ){
- guild->change_position(sd->status.guild_id, RFIFOL(fd,i), RFIFOL(fd,i+4), RFIFOL(fd,i+12), RFIFOP(fd,i+16));
+ for (i = 0; i < count; i ++ ) {
+ int idx = i * 40 + 4;
+ guild->change_position(sd->status.guild_id, RFIFOL(fd, idx), RFIFOL(fd, idx + 4), RFIFOL(fd, idx + 12), RFIFOP(fd, idx + 16));
}
}
@@ -13151,6 +13203,7 @@ void clif_parse_GuildChangeMemberPosition(int fd, struct map_session_data *sd)
{
int i;
int len = RFIFOW(fd, 2);
+ int count = (len - 4) / 12;
if(!sd->state.gmaster_flag)
return;
@@ -13161,10 +13214,11 @@ void clif_parse_GuildChangeMemberPosition(int fd, struct map_session_data *sd)
return;
}
- for(i=4;i<RFIFOW(fd,2);i+=12){
- int position = RFIFOL(fd, i + 8);
- if (position > 0) {
- guild->change_memberposition(sd->status.guild_id, RFIFOL(fd, i), RFIFOL(fd, i + 4), position);
+ for (i = 0; i < count; i++) {
+ int idx = i * 12 + 4;
+ int position = RFIFOL(fd, idx + 8);
+ if (position > 0 && position < MAX_GUILDPOSITION) {
+ guild->change_memberposition(sd->status.guild_id, RFIFOL(fd, idx), RFIFOL(fd, idx + 4), position);
}
}
}
@@ -13548,12 +13602,15 @@ void clif_parse_GuildBreak(int fd, struct map_session_data *sd) __attribute__((n
/// key:
/// now guild name; might have been (intended) email, since the
/// field name and size is same as the one in CH_DELETE_CHAR.
-void clif_parse_GuildBreak(int fd, struct map_session_data *sd) {
+void clif_parse_GuildBreak(int fd, struct map_session_data *sd)
+{
+ char key[40];
if( map->list[sd->bl.m].flag.guildlock ) {
clif->message(fd, msg_fd(fd,228)); // Guild modification is disabled in this map.
return;
}
- guild->dobreak(sd, RFIFOP(fd,2));
+ safestrncpy(key, RFIFOP(fd, 2), 40);
+ guild->dobreak(sd, key);
}
/// Pet
@@ -14142,6 +14199,7 @@ void clif_parse_NoviceExplosionSpirits(int fd, struct map_session_data *sd)
/// Toggles a single friend online/offline [Skotlex] (ZC_FRIENDS_STATE).
/// 0206 <account id>.L <char id>.L <state>.B
+/// 0206 <account id>.L <char id>.L <state>.B <name>.24B
/// state:
/// 0 = online
/// 1 = offline
@@ -14161,7 +14219,11 @@ void clif_friendslist_toggle(struct map_session_data *sd,int account_id, int cha
WFIFOW(fd, 0) = 0x206;
WFIFOL(fd, 2) = sd->status.friends[i].account_id;
WFIFOL(fd, 6) = sd->status.friends[i].char_id;
- WFIFOB(fd,10) = !online; //Yeah, a 1 here means "logged off", go figure...
+ WFIFOB(fd, 10) = !online; //Yeah, a 1 here means "logged off", go figure...
+#if PACKETVER_MAIN_NUM >= 20180307 || PACKETVER_RE_NUM >= 20180221
+ memcpy(WFIFOP(fd, 11), sd->status.friends[i].name, NAME_LENGTH);
+#endif // PACKETVER_ZERO
+
WFIFOSET(fd, packet_len(0x206));
}
@@ -14178,22 +14240,30 @@ int clif_friendslist_toggle_sub(struct map_session_data *sd,va_list ap)
/// Sends the whole friends list (ZC_FRIENDS_LIST).
/// 0201 <packet len>.W { <account id>.L <char id>.L <name>.24B }*
+/// 0201 <packet len>.W { <account id>.L <char id>.L }*
void clif_friendslist_send(struct map_session_data *sd)
{
int i = 0, n, fd = sd->fd;
+#if PACKETVER_MAIN_NUM >= 20180307 || PACKETVER_RE_NUM >= 20180221
+ const int offset = 8;
+#else
+ const int offset = 32;
+#endif
nullpo_retv(sd);
// Send friends list
- WFIFOHEAD(fd, MAX_FRIENDS * 32 + 4);
+ WFIFOHEAD(fd, MAX_FRIENDS * offset + 4);
WFIFOW(fd, 0) = 0x201;
for(i = 0; i < MAX_FRIENDS && sd->status.friends[i].char_id; i++) {
- WFIFOL(fd, 4 + 32 * i + 0) = sd->status.friends[i].account_id;
- WFIFOL(fd, 4 + 32 * i + 4) = sd->status.friends[i].char_id;
- memcpy(WFIFOP(fd, 4 + 32 * i + 8), &sd->status.friends[i].name, NAME_LENGTH);
+ WFIFOL(fd, 4 + offset * i + 0) = sd->status.friends[i].account_id;
+ WFIFOL(fd, 4 + offset * i + 4) = sd->status.friends[i].char_id;
+#if !(PACKETVER_MAIN_NUM >= 20180307 || PACKETVER_RE_NUM >= 20180221)
+ memcpy(WFIFOP(fd, 4 + offset * i + 8), &sd->status.friends[i].name, NAME_LENGTH);
+#endif
}
if (i) {
- WFIFOW(fd,2) = 4 + 32 * i;
+ WFIFOW(fd,2) = 4 + offset * i;
WFIFOSET(fd, WFIFOW(fd,2));
}
@@ -15302,17 +15372,19 @@ void clif_parse_Mail_winopen(int fd, struct map_session_data *sd)
void clif_parse_Mail_send(int fd, struct map_session_data *sd) __attribute__((nonnull (2)));
/// Request to send mail (CZ_MAIL_SEND).
/// 0248 <packet len>.W <recipient>.24B <title>.40B <body len>.B <body>.?B
+
void clif_parse_Mail_send(int fd, struct map_session_data *sd)
{
struct mail_message msg;
int body_len;
+ int len = RFIFOW(fd, 2);
if( !chrif->isconnected() )
return;
if( sd->state.trading )
return;
- if( RFIFOW(fd,2) < 69 ) {
+ if (len < 69) {
ShowWarning("Invalid Msg Len from account %d.\n", sd->status.account_id);
return;
}
@@ -15328,6 +15400,11 @@ void clif_parse_Mail_send(int fd, struct map_session_data *sd)
if (body_len > MAIL_BODY_LENGTH)
body_len = MAIL_BODY_LENGTH;
+ if (body_len + 69 > len) {
+ ShowWarning("Invalid Msg Len from account %d.\n", sd->status.account_id);
+ return;
+ }
+
memset(&msg, 0, sizeof(msg));
if (!mail->setattachment(sd, &msg)) { // Invalid Append condition
clif->mail_send(sd->fd, true); // fail
@@ -15833,15 +15910,24 @@ void clif_parse_cashshop_buy(int fd, struct map_session_data *sd)
fail = npc->cashshop_buy(sd, nameid, amount, points);
#else
int len = RFIFOW(fd,2);
- int points = RFIFOL(fd,4);
- int count = RFIFOW(fd,8);
+ int points;
+ int count;
struct itemlist item_list = { 0 };
int i;
- if( len < 10 || len != 10 + count * 4) {
+ if (len < 10) {
+ ShowWarning("Player %d sent incorrect cash shop buy packet (len %d)!\n", sd->status.char_id, len);
+ return;
+ }
+
+ points = RFIFOL(fd, 4);
+ count = RFIFOW(fd, 8);
+
+ if (len != 10 + count * 4) {
ShowWarning("Player %d sent incorrect cash shop buy packet (len %d:%d)!\n", sd->status.char_id, len, 10 + count * 4);
return;
}
+
VECTOR_INIT(item_list);
VECTOR_ENSURE(item_list, count, 1);
for (i = 0; i < count; i++) {
@@ -16040,6 +16126,7 @@ void clif_parse_PartyTick(int fd, struct map_session_data* sd)
/// Sends list of all quest states (ZC_ALL_QUEST_LIST).
/// 02b1 <packet len>.W <num>.L { <quest id>.L <active>.B }*num
/// 097a <packet len>.W <num>.L { <quest id>.L <active>.B <remaining time>.L <time>.L <count>.W { <mob_id>.L <killed>.W <total>.W <mob name>.24B }*count }*num
+/// 09f8 <packet len>.W <num>.L { <quest id>.L <active>.B <remaining time>.L <time>.L <count>.W { <hunt identification>.L <mob type>.L <mob_id>.L <min level>.L <max level>.L <killed>.W <total>.W <mob name>.24B }*count }*num
void clif_quest_send_list(struct map_session_data *sd)
{
int i, len, real_len;
@@ -16078,8 +16165,16 @@ void clif_quest_send_list(struct map_session_data *sd)
real_len += sizeof(info->objectives[j]);
mob_data = mob->db(qi->objectives[j].mob);
-
+#if PACKETVER >= 20150513
+ info->objectives[j].huntIdent = (sd->quest_log[i].quest_id * 1000) + j;
+ info->objectives[j].mobType = 0; // Info Needed
+#endif
info->objectives[j].mob_id = qi->objectives[j].mob;
+#if PACKETVER >= 20150513
+ // Info Needed
+ info->objectives[j].levelMin = 0;
+ info->objectives[j].levelMax = 0;
+#endif
info->objectives[j].huntCount = sd->quest_log[i].count[j];
info->objectives[j].maxCount = qi->objectives[j].count;
safestrncpy(info->objectives[j].mobName, mob_data->jname, sizeof(info->objectives[j].mobName));
@@ -16127,33 +16222,53 @@ void clif_quest_send_mission(struct map_session_data *sd)
/// Notification about a new quest (ZC_ADD_QUEST).
/// 02b3 <quest id>.L <active>.B <start time>.L <expire time>.L <mobs>.W { <mob id>.L <mob count>.W <mob name>.24B }*3
+/// 09f9 <quest id>.L <active>.B <start time>.L <expire time>.L <mobs>.W { <hunt identification>.L <mob type>.L <mob id>.L <min level>.L <max level>.L <mob count>.W <mob name>.24B }*3
void clif_quest_add(struct map_session_data *sd, struct quest *qd)
{
- int fd;
- int i;
+ int i, len;
+ uint8 *buf = NULL;
+ struct packet_quest_add_header *packet = NULL;
struct quest_db *qi;
nullpo_retv(sd);
nullpo_retv(qd);
- fd = sd->fd;
+
qi = quest->db(qd->quest_id);
- WFIFOHEAD(fd, packet_len(0x2b3));
- WFIFOW(fd, 0) = 0x2b3;
- WFIFOL(fd, 2) = qd->quest_id;
- WFIFOB(fd, 6) = qd->state;
- WFIFOB(fd, 7) = qd->time - qi->time;
- WFIFOL(fd, 11) = qd->time;
- WFIFOW(fd, 15) = qi->objectives_count;
+ Assert_retv(qi->objectives_count < MAX_QUEST_OBJECTIVES);
+
+ len = sizeof(struct packet_quest_add_header)
+ + MAX_QUEST_OBJECTIVES * sizeof(struct packet_quest_hunt_sub); // >= than the actual length
+
+ buf = aCalloc(1, len);
+ packet = (struct packet_quest_add_header *)WBUFP(buf, 0);
+
+ packet->PacketType = questAddType;
+ packet->questID = qd->quest_id;
+ packet->active = qd->state;
+ packet->quest_svrTime = qd->time - qi->time;
+ packet->quest_endTime = qd->time;
+ packet->count = qi->objectives_count;
for (i = 0; i < qi->objectives_count; i++) {
struct mob_db *monster;
- WFIFOL(fd, i*30+17) = qi->objectives[i].mob;
- WFIFOW(fd, i*30+21) = qd->count[i];
+
monster = mob->db(qi->objectives[i].mob);
- memcpy(WFIFOP(fd, i*30+23), monster->jname, NAME_LENGTH);
- }
- WFIFOSET(fd, packet_len(0x2b3));
+#if PACKETVER >= 20150513
+ packet->objectives[i].huntIdent = (qd->quest_id * 1000) + i;
+ packet->objectives[i].mobType = 0; // Info Needed
+#endif
+ packet->objectives[i].mob_id = qi->objectives[i].mob;
+#if PACKETVER >= 20150513
+ // Info Needed
+ packet->objectives[i].levelMin = 0;
+ packet->objectives[i].levelMax = 0;
+#endif
+ packet->objectives[i].huntCount = qd->count[i];
+ memcpy(packet->objectives[i].mobName, monster->jname, NAME_LENGTH);
+ }
+ clif->send(buf, len, &sd->bl, SELF);
+ aFree(buf);
}
/// Notification about a quest being removed (ZC_DEL_QUEST).
@@ -16171,32 +16286,82 @@ void clif_quest_delete(struct map_session_data *sd, int quest_id) {
/// Notification of an update to the hunting mission counter (ZC_UPDATE_MISSION_HUNT).
/// 02b5 <packet len>.W <mobs>.W { <quest id>.L <mob id>.L <total count>.W <current count>.W }*3
+/// 09fa <packet len>.W <mobs>.W { <quest id>.L <hunt identification>.L <total count>.W <current count>.W }*3
void clif_quest_update_objective(struct map_session_data *sd, struct quest *qd)
{
- int fd;
- int i;
+ int i, len, real_len;
+ uint8 *buf = NULL;
+ struct packet_quest_update_header *packet = NULL;
struct quest_db *qi;
- int len;
nullpo_retv(sd);
nullpo_retv(qd);
- fd = sd->fd;
+
qi = quest->db(qd->quest_id);
- len = qi->objectives_count * 12 + 6;
+ Assert_retv(qi->objectives_count < MAX_QUEST_OBJECTIVES);
+
+ len = sizeof(struct packet_quest_update_header)
+ + MAX_QUEST_OBJECTIVES * sizeof(struct packet_quest_update_hunt); // >= than the actual length
- WFIFOHEAD(fd, len);
- WFIFOW(fd, 0) = 0x2b5;
- WFIFOW(fd, 2) = len;
- WFIFOW(fd, 4) = qi->objectives_count;
+ buf = aCalloc(1, len);
+ packet = (struct packet_quest_update_header *)WBUFP(buf, 0);
+ real_len = sizeof(*packet);
+
+ packet->PacketType = questUpdateType;
+ packet->count = qi->objectives_count;
for (i = 0; i < qi->objectives_count; i++) {
- WFIFOL(fd, i*12+6) = qd->quest_id;
- WFIFOL(fd, i*12+10) = qi->objectives[i].mob;
- WFIFOW(fd, i*12+14) = qi->objectives[i].count;
- WFIFOW(fd, i*12+16) = qd->count[i];
+ real_len += sizeof(packet->objectives[i]);
+
+ packet->objectives[i].questID = qd->quest_id;
+#if PACKETVER >= 20150513
+ packet->objectives[i].huntIdent = (qd->quest_id * 1000) + i;
+#else
+ packet->objectives[i].mob_id = qi->objectives[i].mob;
+#endif
+ packet->objectives[i].maxCount = qi->objectives[i].count;
+ packet->objectives[i].count = qd->count[i];
}
+ packet->PacketLength = real_len;
+ clif->send(buf, real_len, &sd->bl, SELF);
+ aFree(buf);
+}
- WFIFOSET(fd, len);
+/// Notification of an hunting mission counter just after quest is added (ZC_HUNTING_QUEST_INFO).
+/// 08fe <packet len>.W { <quest id>.L <mob id>.L <total count>.W <current count>.W }*3
+void clif_quest_notify_objective(struct map_session_data *sd, struct quest *qd)
+{
+ int i, len, real_len;
+ uint8 *buf = NULL;
+ struct packet_quest_hunt_info *packet = NULL;
+ struct quest_db *qi;
+
+ nullpo_retv(sd);
+ nullpo_retv(qd);
+
+ qi = quest->db(qd->quest_id);
+ Assert_retv(qi->objectives_count < MAX_QUEST_OBJECTIVES);
+
+ len = sizeof(struct packet_quest_hunt_info)
+ + MAX_QUEST_OBJECTIVES * sizeof(struct packet_quest_hunt_info_sub); // >= than the actual length
+
+ buf = aCalloc(1, len);
+ packet = (struct packet_quest_hunt_info *)WBUFP(buf, 0);
+ real_len = sizeof(*packet);
+
+ packet->PacketType = questUpdateType2;
+
+ for (i = 0; i < qi->objectives_count; i++) {
+ real_len += sizeof(packet->info[i]);
+
+ packet->info[i].questID = qd->quest_id;
+ packet->info[i].mob_id = qi->objectives[i].mob;
+ packet->info[i].maxCount = qi->objectives[i].count;
+ packet->info[i].count = qd->count[i];
+ }
+ packet->PacketLength = real_len;
+ clif->send(buf, real_len, &sd->bl, SELF);
+ aFree(buf);
}
void clif_parse_questStateAck(int fd, struct map_session_data *sd) __attribute__((nonnull (2)));
@@ -16879,7 +17044,7 @@ void clif_parse_ItemListWindowSelected(int fd, struct map_session_data *sd) __at
/// S 07e4 <length>.w <option>.l <val>.l {<index>.w <amount>.w).4b*
void clif_parse_ItemListWindowSelected(int fd, struct map_session_data *sd)
{
- int n = ((int)RFIFOW(fd,2) - 12) / 4;
+ int n = ((int)RFIFOW(fd, 2) - 12) / 4;
int type = RFIFOL(fd,4);
int flag = RFIFOL(fd,8); // Button clicked: 0 = Cancel, 1 = OK
struct itemlist item_list = { 0 };
@@ -17010,7 +17175,7 @@ void clif_parse_ReqOpenBuyingStore(int fd, struct map_session_data* sd) {
char storename[MESSAGE_SIZE];
unsigned char result;
int zenylimit;
- unsigned int count, packet_len;
+ int count, packet_len;
struct s_packet_db* info = &packet_db[RFIFOW(fd,0)];
packet_len = RFIFOW(fd,info->pos[0]);
@@ -17018,7 +17183,7 @@ void clif_parse_ReqOpenBuyingStore(int fd, struct map_session_data* sd) {
// TODO: Make this check global for all variable length packets.
if( packet_len < 89 )
{// minimum packet length
- ShowError("clif_parse_ReqOpenBuyingStore: Malformed packet (expected length=%u, length=%u, account_id=%d).\n", 89U, packet_len, sd->bl.id);
+ ShowError("clif_parse_ReqOpenBuyingStore: Malformed packet (expected length=%u, length=%d, account_id=%d).\n", 89U, packet_len, sd->bl.id);
return;
}
@@ -17030,9 +17195,12 @@ void clif_parse_ReqOpenBuyingStore(int fd, struct map_session_data* sd) {
// so that buyingstore_create knows, how many elements it has access to
packet_len-= info->pos[4];
+ if (packet_len < 0)
+ return;
+
if( packet_len%blocksize )
{
- ShowError("clif_parse_ReqOpenBuyingStore: Unexpected item list size %u (account_id=%d, block size=%u)\n", packet_len, sd->bl.id, blocksize);
+ ShowError("clif_parse_ReqOpenBuyingStore: Unexpected item list size %d (account_id=%d, block size=%u)\n", packet_len, sd->bl.id, blocksize);
return;
}
count = packet_len/blocksize;
@@ -17201,14 +17369,15 @@ void clif_parse_ReqTradeBuyingStore(int fd, struct map_session_data* sd) {
const unsigned int blocksize = 6;
const uint8 *itemlist;
int account_id;
- unsigned int count, packet_len, buyer_id;
+ unsigned int buyer_id;
+ int count, packet_len;
struct s_packet_db* info = &packet_db[RFIFOW(fd,0)];
packet_len = RFIFOW(fd,info->pos[0]);
if( packet_len < 12 )
{// minimum packet length
- ShowError("clif_parse_ReqTradeBuyingStore: Malformed packet (expected length=%u, length=%u, account_id=%d).\n", 12U, packet_len, sd->bl.id);
+ ShowError("clif_parse_ReqTradeBuyingStore: Malformed packet (expected length=%u, length=%d, account_id=%d).\n", 12U, packet_len, sd->bl.id);
return;
}
@@ -17218,10 +17387,12 @@ void clif_parse_ReqTradeBuyingStore(int fd, struct map_session_data* sd) {
// so that buyingstore_trade knows, how many elements it has access to
packet_len-= info->pos[3];
+ if (packet_len < 0)
+ return;
if( packet_len%blocksize )
{
- ShowError("clif_parse_ReqTradeBuyingStore: Unexpected item list size %u (account_id=%d, buyer_id=%d, block size=%u)\n", packet_len, sd->bl.id, account_id, blocksize);
+ ShowError("clif_parse_ReqTradeBuyingStore: Unexpected item list size %d (account_id=%d, buyer_id=%d, block size=%u)\n", packet_len, sd->bl.id, account_id, blocksize);
return;
}
count = packet_len/blocksize;
@@ -17340,14 +17511,15 @@ void clif_parse_SearchStoreInfo(int fd, struct map_session_data* sd) {
const uint8* itemlist;
const uint8* cardlist;
unsigned char type;
- unsigned int min_price, max_price, packet_len, count, item_count, card_count;
+ unsigned int min_price, max_price;
+ int packet_len, count, item_count, card_count;
struct s_packet_db* info = &packet_db[RFIFOW(fd,0)];
packet_len = RFIFOW(fd,info->pos[0]);
if( packet_len < 15 )
{// minimum packet length
- ShowError("clif_parse_SearchStoreInfo: Malformed packet (expected length=%u, length=%u, account_id=%d).\n", 15U, packet_len, sd->bl.id);
+ ShowError("clif_parse_SearchStoreInfo: Malformed packet (expected length=%u, length=%d, account_id=%d).\n", 15U, packet_len, sd->bl.id);
return;
}
@@ -17357,24 +17529,28 @@ void clif_parse_SearchStoreInfo(int fd, struct map_session_data* sd) {
item_count = RFIFOB(fd,info->pos[4]);
card_count = RFIFOB(fd,info->pos[5]);
itemlist = RFIFOP(fd,info->pos[6]);
- cardlist = RFIFOP(fd,info->pos[6]+blocksize*item_count);
// check, if there is enough data for the claimed count of items
packet_len-= info->pos[6];
+ if (packet_len < 0)
+ return;
+
if( packet_len%blocksize )
{
- ShowError("clif_parse_SearchStoreInfo: Unexpected item list size %u (account_id=%d, block size=%u)\n", packet_len, sd->bl.id, blocksize);
+ ShowError("clif_parse_SearchStoreInfo: Unexpected item list size %d (account_id=%d, block size=%u)\n", packet_len, sd->bl.id, blocksize);
return;
}
count = packet_len/blocksize;
if( count < item_count+card_count )
{
- ShowError("clif_parse_SearchStoreInfo: Malformed packet (expected count=%u, count=%u, account_id=%d).\n", item_count+card_count, count, sd->bl.id);
+ ShowError("clif_parse_SearchStoreInfo: Malformed packet (expected count=%d, count=%d, account_id=%d).\n", item_count+card_count, count, sd->bl.id);
return;
}
+ cardlist = RFIFOP(fd, info->pos[6] + blocksize * item_count);
+
searchstore->query(sd, type, min_price, max_price, (const unsigned short*)itemlist, item_count, (const unsigned short*)cardlist, card_count);
}
@@ -17994,47 +18170,67 @@ void clif_parse_CashShopSchedule(int fd, struct map_session_data *sd)
#endif
}
+/// R 0848 <len>.W <limit>.W <kafra pay>.L (<item id>.L <amount>.L <tab>.W)*
void clif_parse_CashShopBuy(int fd, struct map_session_data *sd) __attribute__((nonnull (2)));
void clif_parse_CashShopBuy(int fd, struct map_session_data *sd) {
- unsigned short limit = RFIFOW(fd, 4), i, j;
- unsigned int kafra_pay = RFIFOL(fd, 6);// [Ryuuzaki] - These are free cash points (strangely #CASH = main cash currently for us, confusing)
+ int len = RFIFOW(fd, 2);
+ unsigned short limit, i, j;
+ unsigned int kafra_pay;
+ int count;
if (map->list[sd->bl.m].flag.nocashshop) {
clif->messagecolor_self(fd, COLOR_RED, msg_fd(fd,1489)); //Cash Shop is disabled in this map
return;
}
+ if (len < 10)
+ return;
+
+ limit = RFIFOW(fd, 4);
+ kafra_pay = RFIFOL(fd, 6); // [Ryuuzaki] - These are free cash points (strangely #CASH = main cash currently for us, confusing)
+ count = (len - 10) / 10;
+ if (count != limit) {
+ ShowError("Wrong cash shop limit: %d\n", limit);
+ return;
+ }
+
for(i = 0; i < limit; i++) {
int qty = RFIFOL(fd, 14 + ( i * 10 ));
int id = RFIFOL(fd, 10 + ( i * 10 ));
short tab = RFIFOW(fd, 18 + ( i * 10 ));
enum CASH_SHOP_BUY_RESULT result = CSBR_UNKNOWN;
- if( tab < 0 || tab >= CASHSHOP_TAB_MAX )
+ if(tab < 0 || tab >= CASHSHOP_TAB_MAX)
continue;
- for( j = 0; j < clif->cs.item_count[tab]; j++ ) {
+ for(j = 0; j < clif->cs.item_count[tab]; j++) {
if( clif->cs.data[tab][j]->id == id )
break;
}
- if( j < clif->cs.item_count[tab] ) {
+ if(j < clif->cs.item_count[tab]) {
struct item_data *data;
- if( sd->kafraPoints < kafra_pay ) {
+ if(sd->kafraPoints < kafra_pay) {
result = CSBR_SHORTTAGE_CASH;
- } else if( (sd->cashPoints+kafra_pay) < (clif->cs.data[tab][j]->price * qty) ) {
+ } else if((sd->cashPoints+kafra_pay) < (clif->cs.data[tab][j]->price * qty)) {
result = CSBR_SHORTTAGE_CASH;
- } else if ( !( data = itemdb->exists(clif->cs.data[tab][j]->id) ) ) {
+ } else if (!(data = itemdb->exists(clif->cs.data[tab][j]->id))) {
result = CSBR_UNKONWN_ITEM;
} else {
struct item item_tmp;
int k, get_count;
-
+ int ret = 0;
+
get_count = qty;
if (!itemdb->isstackable2(data))
get_count = 1;
-
- pc->paycash(sd, clif->cs.data[tab][j]->price * qty, kafra_pay);// [Ryuuzaki]
+
+ ret = pc->paycash(sd, clif->cs.data[tab][j]->price * qty, kafra_pay);// [Ryuuzaki] //changed Kafrapoints calculation. [Normynator]
+ if (ret < 0) {
+ ShowError("clif_parse_CashShopBuy: The return from pc->paycash was negative which is not allowed.\n");
+ break; //This should never happen.
+ }
+ kafra_pay = ret;
for (k = 0; k < qty; k += get_count) {
if (!pet->create_egg(sd, data->nameid)) {
memset(&item_tmp, 0, sizeof(item_tmp));
@@ -19510,7 +19706,7 @@ void clif_parse_rodex_open_write_mail(int fd, struct map_session_data *sd) __att
void clif_parse_rodex_open_write_mail(int fd, struct map_session_data *sd)
{
const struct PACKET_CZ_REQ_OPEN_WRITE_MAIL *rPacket = RFIFOP(fd, 0);
- int8 result = (rodex->isenabled() == true) ? 1 : 0;
+ int8 result = (rodex->isenabled() == true && sd->npc_id == 0) ? 1 : 0;
clif->rodex_open_write_mail(fd, rPacket->receiveName, result);
}
@@ -19720,7 +19916,7 @@ void clif_rodex_send_maillist(int fd, struct map_session_data *sd, int8 open_typ
continue;
inner->MailID = msg->id;
- inner->Isread = msg->is_read == true ? 1 : 0;
+ inner->Isread = (msg->is_read == true || msg->sender_read == true) ? 1 : 0;
inner->type = msg->type;
#if PACKETVER >= 20170419
inner->openType = msg->opentype;
@@ -19752,7 +19948,7 @@ void clif_rodex_send_maillist(int fd, struct map_session_data *sd, int8 open_typ
#endif
}
-void clif_rodex_send_mails_all(int fd, struct map_session_data *sd)
+void clif_rodex_send_mails_all(int fd, struct map_session_data *sd, int64 mail_id)
{
#if PACKETVER >= 20170419
struct PACKET_ZC_MAIL_LIST *packet;
@@ -19760,18 +19956,24 @@ void clif_rodex_send_mails_all(int fd, struct map_session_data *sd)
int16 size = sizeof(*packet);
int packetMailCount = 0;
int mailListCount = 0;
- int mailsSize = VECTOR_LENGTH(sd->rodex.messages);
- int i;
+ int mailsSize, i;
+ int j = -1;
nullpo_retv(sd);
+ mailsSize = VECTOR_LENGTH(sd->rodex.messages);
+
+ if (mail_id > 0)
+ ARR_FIND(0, VECTOR_LENGTH(sd->rodex.messages), j, (VECTOR_INDEX(sd->rodex.messages, j)).id == mail_id);
+
WFIFOHEAD(fd, sizeof(*packet) + (sizeof(*inner) + RODEX_TITLE_LENGTH) * RODEX_MAIL_PER_PAGE);
packet = WFIFOP(fd, 0);
packet->PacketType = rodexmailList;
inner = WFIFOP(fd, size);
i = mailsSize - 1;
- while (i >= 0) {
+ mailsSize -= (j + 1);
+ while (i > j) {
struct rodex_message *msg = &VECTOR_INDEX(sd->rodex.messages, i);
--i;
@@ -19779,7 +19981,7 @@ void clif_rodex_send_mails_all(int fd, struct map_session_data *sd)
continue;
inner->MailID = msg->id;
- inner->Isread = msg->is_read == true ? 1 : 0;
+ inner->Isread = (msg->is_read == true || msg->sender_read == true) ? 1 : 0;
inner->type = msg->type;
inner->openType = msg->opentype;
inner->expireDateTime = msg->expire_date - (int)time(NULL);
@@ -19846,7 +20048,7 @@ void clif_rodex_send_refresh(int fd, struct map_session_data *sd, int8 open_type
continue;
inner->MailID = msg->id;
- inner->Isread = msg->is_read == true ? 1 : 0;
+ inner->Isread = (msg->is_read == true || msg->sender_read == true) ? 1 : 0;
inner->type = msg->type;
#if PACKETVER >= 20170419
inner->openType = msg->opentype;
@@ -20105,6 +20307,60 @@ void clif_skill_scale(struct block_list *bl, int src_id, int x, int y, uint16 sk
#endif
}
+/// Send hat effects to the client (ZC_HAT_EFFECT).
+/// 0A3B <Length>.W <AID>.L <Status>.B { <HatEffectId>.W }
+void clif_hat_effect(struct block_list *bl, struct block_list *tbl, enum send_target target)
+{
+#if PACKETVER >= 20150422
+ unsigned char *buf;
+ int len, i;
+ struct map_session_data *sd;
+
+ nullpo_retv(bl);
+
+ sd = BL_CAST(BL_PC, bl);
+
+ nullpo_retv(sd);
+
+ len = 9 + VECTOR_LENGTH(sd->hatEffectId) * 2;
+
+ buf = (unsigned char*)aMalloc(len);
+
+ WBUFW(buf, 0) = 0xa3b;
+ WBUFW(buf, 2) = len;
+ WBUFL(buf, 4) = bl->id;
+ WBUFB(buf, 8) = 1;
+
+ for( i = 0; i < VECTOR_LENGTH(sd->hatEffectId); i++ ){
+ WBUFW(buf, 9 + i * 2) = VECTOR_INDEX(sd->hatEffectId, i);
+ }
+
+ if (tbl != NULL) {
+ clif->send(buf, len, tbl, target);
+ } else {
+ clif->send(buf, len, bl, target);
+ }
+
+ aFree(buf);
+#endif
+}
+
+void clif_hat_effect_single(struct block_list *bl, uint16 effectId, bool enable){
+#if PACKETVER >= 20150422
+ unsigned char buf[13];
+
+ nullpo_retv(bl);
+
+ WBUFW(buf,0) = 0xa3b;
+ WBUFW(buf,2) = 13;
+ WBUFL(buf,4) = bl->id;
+ WBUFB(buf,8) = enable;
+ WBUFL(buf,9) = effectId;
+
+ clif_send(buf, 13, bl, AREA);
+#endif
+}
+
/*==========================================
* Main client packet processing function
*------------------------------------------*/
@@ -20801,6 +21057,7 @@ void clif_defaults(void) {
clif->quest_delete = clif_quest_delete;
clif->quest_update_status = clif_quest_update_status;
clif->quest_update_objective = clif_quest_update_objective;
+ clif->quest_notify_objective = clif_quest_notify_objective;
clif->quest_show_event = clif_quest_show_event;
/* mail-related */
clif->mail_window = clif_Mail_window;
@@ -21195,4 +21452,7 @@ void clif_defaults(void) {
clif->clan_leave = clif_clan_leave;
clif->clan_message = clif_clan_message;
clif->pClanMessage = clif_parse_ClanMessage;
+ // -- Hat Effect
+ clif->hat_effect = clif_hat_effect;
+ clif->hat_effect_single = clif_hat_effect_single;
}
diff --git a/src/map/clif.h b/src/map/clif.h
index 0711546df..873188f84 100644
--- a/src/map/clif.h
+++ b/src/map/clif.h
@@ -1021,6 +1021,7 @@ struct clif_interface {
void (*quest_delete) (struct map_session_data *sd, int quest_id);
void (*quest_update_status) (struct map_session_data *sd, int quest_id, bool active);
void (*quest_update_objective) (struct map_session_data *sd, struct quest *qd);
+ void (*quest_notify_objective) (struct map_session_data *sd, struct quest *qd);
void (*quest_show_event) (struct map_session_data *sd, struct block_list *bl, short state, short color);
/* mail-related */
void (*mail_window) (int fd, int flag);
@@ -1389,7 +1390,7 @@ struct clif_interface {
void (*rodex_send_mail_result) (int fd, struct map_session_data *sd, int8 result);
void (*rodex_send_maillist) (int fd, struct map_session_data *sd, int8 open_type, int64 page_start);
void (*rodex_send_refresh) (int fd, struct map_session_data *sd, int8 open_type, int count);
- void (*rodex_send_mails_all) (int fd, struct map_session_data *sd);
+ void (*rodex_send_mails_all) (int fd, struct map_session_data *sd, int64 mail_id);
void (*pRodexReadMail) (int fd, struct map_session_data *sd);
void (*rodex_read_mail) (struct map_session_data *sd, int8 opentype, struct rodex_message *msg);
void (*pRodexNextMaillist) (int fd, struct map_session_data *sd);
@@ -1413,6 +1414,9 @@ struct clif_interface {
void (*clan_leave) (struct map_session_data *sd);
void (*clan_message) (struct clan *c, const char *mes, int len);
void (*pClanMessage) (int fd, struct map_session_data* sd);
+ /* Hat Effect */
+ void (*hat_effect) (struct block_list *bl, struct block_list *tbl, enum send_target target);
+ void (*hat_effect_single) (struct block_list *bl, uint16 effectId, bool enable);
};
#ifdef HERCULES_CORE
diff --git a/src/map/intif.c b/src/map/intif.c
index 858652af2..e9bf0e96b 100644
--- a/src/map/intif.c
+++ b/src/map/intif.c
@@ -2516,6 +2516,9 @@ void intif_parse_RequestRodexOpenInbox(int fd)
int8 is_end = RFIFOB(fd, 10);
int is_first = RFIFOB(fd, 11);
int count = RFIFOL(fd, 12);
+#if PACKETVER >= 20170419
+ int64 mail_id = RFIFOQ(fd, 16);
+#endif
int i, j;
sd = map->charid2sd(RFIFOL(fd, 4));
@@ -2533,15 +2536,15 @@ void intif_parse_RequestRodexOpenInbox(int fd)
else
sd->rodex.total += count;
- if (RFIFOW(fd, 2) - 16 != count * sizeof(struct rodex_message)) {
- ShowError("intif_parse_RodexInboxOpenReceived: data size mismatch %d != %"PRIuS"\n", RFIFOW(fd, 2) - 16, count * sizeof(struct rodex_message));
+ if (RFIFOW(fd, 2) - 24 != count * sizeof(struct rodex_message)) {
+ ShowError("intif_parse_RodexInboxOpenReceived: data size mismatch %d != %"PRIuS"\n", RFIFOW(fd, 2) - 24, count * sizeof(struct rodex_message));
return;
}
if (flag == 0 && is_first)
VECTOR_CLEAR(sd->rodex.messages);
- for (i = 0, j = 16; i < count; ++i, j += sizeof(struct rodex_message)) {
+ for (i = 0, j = 24; i < count; ++i, j += sizeof(struct rodex_message)) {
struct rodex_message msg = { 0 };
VECTOR_ENSURE(sd->rodex.messages, 1, 1);
memcpy(&msg, RFIFOP(fd, j), sizeof(struct rodex_message));
@@ -2550,7 +2553,7 @@ void intif_parse_RequestRodexOpenInbox(int fd)
if (is_end == true) {
#if PACKETVER >= 20170419
- clif->rodex_send_mails_all(sd->fd, sd);
+ clif->rodex_send_mails_all(sd->fd, sd, mail_id);
#else
if (flag == 0)
clif->rodex_send_maillist(sd->fd, sd, opentype, VECTOR_LENGTH(sd->rodex.messages) - 1);
@@ -2599,10 +2602,11 @@ void intif_parse_RodexNotifications(int fd)
/// Updates a mail
/// flag:
-/// 0 - user Read
+/// 0 - receiver Read
/// 1 - user got Zeny
/// 2 - user got Items
/// 3 - delete
+/// 4 - sender Read (returned mail)
int intif_rodex_updatemail(int64 mail_id, int8 flag)
{
if (intif->CheckForCharServer())
diff --git a/src/map/packets.h b/src/map/packets.h
index 4c41a7e8f..d18abf4da 100644
--- a/src/map/packets.h
+++ b/src/map/packets.h
@@ -3995,11 +3995,15 @@ packet(0x96e,-1,clif->ackmergeitems);
packet(0x0af3,-1,clif->pDull/*,XXX*/);
packet(0x0af4,11,clif->pDull/*,XXX*/);
// changed packet sizes
- packet(0x0821,102); // AC_OTP_USER
packet(0x0ae6,10,clif->pDull/*,XXX*/);
#endif
#endif // PACKETVER_ZERO
+#if PACKETVER >= 20180131
+// changed packet sizes
+ packet(0x0821,102); // AC_OTP_USER
+#endif
+
#ifdef PACKETVER_ZERO
// 2018-02-07bRagexe_zero
#if PACKETVER >= 20180207
@@ -4022,5 +4026,45 @@ packet(0x96e,-1,clif->ackmergeitems);
#endif
#endif // PACKETVER_ZERO
+#ifdef PACKETVER_RE
+// 2018-02-21aRagexeRE
+#if PACKETVER >= 20180221
+// new packets
+// changed packet sizes
+ packet(0x0206,35); // ZC_FRIENDS_STATE
+#endif
+#endif // PACKETVER_RE
+
+#ifndef PACKETVER_ZERO
+// 2018-03-07bRagexe
+#if PACKETVER >= 20180307
+// new packets
+// changed packet sizes
+ packet(0x0206,35); // ZC_FRIENDS_STATE
+#endif
+#endif // PACKETVER_ZERO
+
+#ifndef PACKETVER_ZERO
+// 2018-03-21aRagexe, 2018-03-21aRagexeRE
+#if PACKETVER >= 20180321
+// new packets
+ packet(0x0af8,11,clif->pDull/*,XXX*/);
+// changed packet sizes
+ packet(0x0ae7,34,clif->pDull/*,XXX*/);
+#endif
+#endif // PACKETVER_ZERO
+
+#ifdef PACKETVER_ZERO
+// 2018-03-28_1aRagexe_zero
+#if PACKETVER >= 20180328
+// new packets
+ packet(0x0af8,11,clif->pDull/*,XXX*/);
+ packet(0x0af9,6,clif->pDull/*,XXX*/);
+ packet(0x0afa,54,clif->pDull/*,XXX*/);
+// changed packet sizes
+ packet(0x0206,35); // ZC_FRIENDS_STATE
+ packet(0x0ae7,38,clif->pDull/*,XXX*/);
+#endif
+#endif // PACKETVER_ZERO
#endif /* MAP_PACKETS_H */
diff --git a/src/map/packets_keys_main.h b/src/map/packets_keys_main.h
index 9aa39fad5..8d20780d4 100644
--- a/src/map/packets_keys_main.h
+++ b/src/map/packets_keys_main.h
@@ -874,11 +874,14 @@
packetKeys(0x6A596301,0x76866D0E,0x32294A45);
#endif
-// 2013-12-23aRagexeRE, 2014-05-08aRagexe, 2014-05-08aRagexeRE, 2014-06-11eRagexe, 2015-02-25hRagexe
+// 2013-12-23aRagexeRE, 2014-05-08aRagexe, 2014-05-08aRagexeRE, 2014-06-11eRagexe, 2015-02-25hRagexe, 2018-03-15aRagexe, 2018-03-21aRagexe, 2018-03-21aRagexeRE, 2018-03-28bRagexe, 2018-03-28bRagexeRE
#if PACKETVER == 20131223 || \
PACKETVER == 20140508 || \
PACKETVER == 20140611 || \
- PACKETVER == 20150225
+ PACKETVER == 20150225 || \
+ PACKETVER == 20180315 || \
+ PACKETVER == 20180321 || \
+ PACKETVER == 20180328
packetKeys(0x00000000,0x00000000,0x00000000);
#endif
@@ -1949,15 +1952,37 @@
packetKeys(0x21F477F4,0x37F437F4,0x37F437F4);
#endif
-// 2018-01-24bRagexe, 2018-01-24bRagexeRE
-#if PACKETVER == 20180124
+// 2018-01-24bRagexe, 2018-01-24bRagexeRE, 2018-01-31Ragexe
+#if PACKETVER == 20180124 || \
+ PACKETVER == 20180131
packetKeys(0x7EAA1CE0,0x415D1CFD,0x4C8F19FA);
#endif
-// 2018-02-07bRagexe, 2018-02-07bRagexeRE
+// 2018-02-07bRagexe, 2018-02-07bRagexeRE, 2018-02-07cRagexe
#if PACKETVER == 20180207
packetKeys(0x45AA1B44,0x20E716B7,0x5388105C);
#endif
+// 2018-02-13aRagexe, 2018-02-13aRagexeRE, 2018-02-13bRagexe
+#if PACKETVER == 20180213
+ packetKeys(0x189D69B2,0x43B85EAD,0x2B7A687E);
+#endif
+
+// 2018-02-21aRagexeRE, 2018-02-21bRagexe, 2018-02-21bRagexeRE
+#if PACKETVER == 20180221
+ packetKeys(0x6E2F6233,0x193B0A66,0x0D1D2CA5);
+#endif
+
+// 2018-03-07bRagexe, 2018-03-07bRagexeRE, 2018-03-09aRagexe
+#if PACKETVER == 20180307 || \
+ PACKETVER == 20180309
+ packetKeys(0x47DA10EB,0x4B922CCF,0x765C5055);
+#endif
+
+// 2018-03-14nRagexe
+#if PACKETVER == 20180314
+ packetKeys(0x2FF07149,0x00596EA3,0x2B853026);
+#endif
+
#endif /* MAP_PACKETS_MAIN_KEYS_H */
diff --git a/src/map/packets_keys_zero.h b/src/map/packets_keys_zero.h
index 101d0b973..2bd6f1604 100644
--- a/src/map/packets_keys_zero.h
+++ b/src/map/packets_keys_zero.h
@@ -29,7 +29,7 @@
/* This file is autogenerated, please do not commit manual changes */
-// 2017-10-19aRagexe_zero, 2017-10-23aRagexe_zero, 2017-10-23bRagexe_zero, 2017-10-23cRagexe_zero, 2017-10-24aRagexe_2_zero, 2017-10-24aRagexe_zero, 2017-10-25bRagexe_zero, 2017-10-27aRagexe_zero, 2017-10-27bRagexe_zero, 2017-10-30aRagexe_zero, 2017-10-31aRagexe_zero, 2017-11-09aRagexe_zero, 2017-11-13aRagexe_zero, 2017-11-13bRagexe_zero
+// 2017-10-19aRagexe_zero, 2017-10-23aRagexe_zero, 2017-10-23bRagexe_zero, 2017-10-23cRagexe_zero, 2017-10-24aRagexe_2_zero, 2017-10-24aRagexe_zero, 2017-10-25bRagexe_zero, 2017-10-27aRagexe_zero, 2017-10-27bRagexe_zero, 2017-10-30aRagexe_zero, 2017-10-31aRagexe_zero, 2017-11-09aRagexe_zero, 2017-11-13aRagexe_zero, 2017-11-13bRagexe_zero, 2018-03-15aRagexe_zero, 2018-03-21aRagexe_zero, 2018-03-21bRagexe_zero, 2018-03-28_1aRagexe_zero, 2018-03-28cRagexe_zero
#if PACKETVER == 20171019 || \
PACKETVER == 20171023 || \
PACKETVER == 20171024 || \
@@ -38,7 +38,10 @@
PACKETVER == 20171030 || \
PACKETVER == 20171031 || \
PACKETVER == 20171109 || \
- PACKETVER == 20171113
+ PACKETVER == 20171113 || \
+ PACKETVER == 20180315 || \
+ PACKETVER == 20180321 || \
+ PACKETVER == 20180328
packetKeys(0x00000000,0x00000000,0x00000000);
#endif
@@ -124,5 +127,27 @@
packetKeys(0x07CB29CB,0x69CB69CB,0x69CB69CB);
#endif
+// 2018-02-13aRagexe_zero
+#if PACKETVER == 20180213
+ packetKeys(0x0513075E,0x347075AF,0x67C56C6F);
+#endif
+
+// 2018-02-21aRagexe_zero
+#if PACKETVER == 20180221
+ packetKeys(0x28ED7635,0x76591F21,0x59383498);
+#endif
+
+// 2018-02-28bRagexe_zero, 2018-03-07aRagexe_zero, 2018-03-09aRagexe_zero
+#if PACKETVER == 20180228 || \
+ PACKETVER == 20180307 || \
+ PACKETVER == 20180309
+ packetKeys(0x56C82ABE,0x61AE2B2E,0x472E272E);
+#endif
+
+// 2018-03-14nRagexe_zero
+#if PACKETVER == 20180314
+ packetKeys(0x2FC330DD,0x01C04E1F,0x4D914DE2);
+#endif
+
#endif /* MAP_PACKETS_ZERO_KEYS_H */
diff --git a/src/map/packets_shuffle_main.h b/src/map/packets_shuffle_main.h
index 13861dd46..d1f9a2062 100644
--- a/src/map/packets_shuffle_main.h
+++ b/src/map/packets_shuffle_main.h
@@ -3178,10 +3178,13 @@
packet(0x096a,18,clif->pPartyBookingRegisterReq,2,4); // CZ_PARTY_BOOKING_REQ_REGISTER
#endif
-// 2014-05-08aRagexe, 2014-05-08aRagexeRE, 2014-06-11eRagexe, 2015-02-25hRagexe
+// 2014-05-08aRagexe, 2014-05-08aRagexeRE, 2014-06-11eRagexe, 2015-02-25hRagexe, 2018-03-15aRagexe, 2018-03-21aRagexe, 2018-03-21aRagexeRE, 2018-03-28bRagexe, 2018-03-28bRagexeRE
#if PACKETVER == 20140508 || \
PACKETVER == 20140611 || \
- PACKETVER == 20150225
+ PACKETVER == 20150225 || \
+ PACKETVER == 20180315 || \
+ PACKETVER == 20180321 || \
+ PACKETVER == 20180328
packet(0x0202,26,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS
packet(0x022d,5,clif->pHomMenu,2,4); // CZ_COMMAND_MER
packet(0x023b,36,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD
@@ -9500,8 +9503,9 @@
packet(0x096a,6,clif->pGetCharNameRequest,2); // CZ_REQNAME
#endif
-// 2018-01-24bRagexe, 2018-01-24bRagexeRE
-#if PACKETVER == 20180124
+// 2018-01-24bRagexe, 2018-01-24bRagexeRE, 2018-01-31Ragexe
+#if PACKETVER == 20180124 || \
+ PACKETVER == 20180131
packet(0x035f,6,clif->pTickSend,2); // CZ_REQUEST_TIME
packet(0x0360,6,clif->pReqClickBuyingStore,2); // CZ_REQ_CLICK_TO_BUYING_STORE
packet(0x0366,90,clif->pUseSkillToPosMoreInfo,2,4,6,8,10); // CZ_USE_SKILL_TOGROUND_WITHTALKBOX
@@ -9533,7 +9537,7 @@
packet(0x096a,6,clif->pGetCharNameRequest,2); // CZ_REQNAME
#endif
-// 2018-02-07bRagexe, 2018-02-07bRagexeRE
+// 2018-02-07bRagexe, 2018-02-07bRagexeRE, 2018-02-07cRagexe
#if PACKETVER == 20180207
packet(0x0281,-1,clif->pItemListWindowSelected,2,4,8); // CZ_ITEMLISTWIN_RES
packet(0x035f,6,clif->pReqClickBuyingStore,2); // CZ_REQ_CLICK_TO_BUYING_STORE
@@ -9566,5 +9570,138 @@
packet(0x096a,6,clif->pGetCharNameRequest,2); // CZ_REQNAME
#endif
+// 2018-02-13aRagexe, 2018-02-13aRagexeRE, 2018-02-13bRagexe
+#if PACKETVER == 20180213
+ packet(0x0369,36,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD
+ packet(0x0802,6,clif->pDropItem,2,4); // CZ_ITEM_THROW
+ packet(0x0817,90,clif->pUseSkillToPosMoreInfo,2,4,6,8,10); // CZ_USE_SKILL_TOGROUND_WITHTALKBOX
+ packet(0x085a,12,clif->pSearchStoreInfoListItemClick,2,6,10); // CZ_SSILIST_ITEM_CLICK
+ packet(0x086f,26,clif->pPartyInvite2,2); // CZ_PARTY_JOIN_REQ
+ packet(0x0874,6,clif->pTickSend,2); // CZ_REQUEST_TIME
+ packet(0x0875,8,clif->pMoveFromKafra,2,4); // CZ_MOVE_ITEM_FROM_STORE_TO_BODY
+ packet(0x0878,5,clif->pChangeDir,2,4); // CZ_CHANGE_DIRECTION
+ packet(0x087b,6,clif->pReqClickBuyingStore,2); // CZ_REQ_CLICK_TO_BUYING_STORE
+ packet(0x0882,10,clif->pUseSkillToId,2,4,6); // CZ_USE_SKILL
+ packet(0x088c,-1,clif->pSearchStoreInfo,2,4,5,9,13,14,15); // CZ_SEARCH_STORE_INFO
+ packet(0x0892,6,clif->pTakeItem,2); // CZ_ITEM_PICKUP
+ packet(0x0898,-1,clif->pReqTradeBuyingStore,2,4,8,12); // CZ_REQ_TRADE_BUYING_STORE
+ packet(0x089c,4,clif->pDull/*,XXX*/); // CZ_GANGSI_RANK
+ packet(0x08a3,19,clif->pWantToConnection,2,6,10,14,18); // CZ_ENTER
+ packet(0x08a5,-1,clif->pReqOpenBuyingStore,2,4,8,9,89); // CZ_REQ_OPEN_BUYING_STORE
+ packet(0x08a9,2,clif->pReqCloseBuyingStore,0); // CZ_REQ_CLOSE_BUYING_STORE
+ packet(0x08ad,6,clif->pSolveCharName,2); // CZ_REQNAME_BYGID
+ packet(0x0917,26,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS
+ packet(0x0922,5,clif->pWalkToXY,2); // CZ_REQUEST_MOVE
+ packet(0x0924,10,clif->pUseSkillToPos,2,4,6,8); // CZ_USE_SKILL_TOGROUND
+ packet(0x0926,8,clif->pDull/*,XXX*/); // CZ_JOIN_BATTLE_FIELD
+ packet(0x0933,7,clif->pActionRequest,2,6); // CZ_REQUEST_ACT
+ packet(0x0936,2,clif->pSearchStoreInfoNextPage,0); // CZ_SEARCH_STORE_INFO_NEXT_PAGE
+ packet(0x093c,6,clif->pGetCharNameRequest,2); // CZ_REQNAME
+ packet(0x0943,18,clif->pPartyBookingRegisterReq,2,4); // CZ_PARTY_BOOKING_REQ_REGISTER
+ packet(0x0955,8,clif->pMoveToKafra,2,4); // CZ_MOVE_ITEM_FROM_BODY_TO_STORE
+ packet(0x095a,-1,clif->pItemListWindowSelected,2,4,8); // CZ_ITEMLISTWIN_RES
+ packet(0x0962,5,clif->pHomMenu,2,4); // CZ_COMMAND_MER
+#endif
+
+// 2018-02-21aRagexeRE, 2018-02-21bRagexe, 2018-02-21bRagexeRE
+#if PACKETVER == 20180221
+ packet(0x0202,90,clif->pUseSkillToPosMoreInfo,2,4,6,8,10); // CZ_USE_SKILL_TOGROUND_WITHTALKBOX
+ packet(0x0366,8,clif->pDull/*,XXX*/); // CZ_JOIN_BATTLE_FIELD
+ packet(0x0436,26,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS
+ packet(0x0838,5,clif->pChangeDir,2,4); // CZ_CHANGE_DIRECTION
+ packet(0x0867,-1,clif->pSearchStoreInfo,2,4,5,9,13,14,15); // CZ_SEARCH_STORE_INFO
+ packet(0x086c,6,clif->pReqClickBuyingStore,2); // CZ_REQ_CLICK_TO_BUYING_STORE
+ packet(0x086f,-1,clif->pReqOpenBuyingStore,2,4,8,9,89); // CZ_REQ_OPEN_BUYING_STORE
+ packet(0x0871,6,clif->pDropItem,2,4); // CZ_ITEM_THROW
+ packet(0x0876,5,clif->pHomMenu,2,4); // CZ_COMMAND_MER
+ packet(0x0879,8,clif->pMoveToKafra,2,4); // CZ_MOVE_ITEM_FROM_BODY_TO_STORE
+ packet(0x087d,5,clif->pWalkToXY,2); // CZ_REQUEST_MOVE
+ packet(0x0880,-1,clif->pItemListWindowSelected,2,4,8); // CZ_ITEMLISTWIN_RES
+ packet(0x0881,18,clif->pPartyBookingRegisterReq,2,4); // CZ_PARTY_BOOKING_REQ_REGISTER
+ packet(0x0883,-1,clif->pReqTradeBuyingStore,2,4,8,12); // CZ_REQ_TRADE_BUYING_STORE
+ packet(0x088f,6,clif->pSolveCharName,2); // CZ_REQNAME_BYGID
+ packet(0x0891,4,clif->pDull/*,XXX*/); // CZ_GANGSI_RANK
+ packet(0x0897,19,clif->pWantToConnection,2,6,10,14,18); // CZ_ENTER
+ packet(0x0899,2,clif->pSearchStoreInfoNextPage,0); // CZ_SEARCH_STORE_INFO_NEXT_PAGE
+ packet(0x089d,6,clif->pTickSend,2); // CZ_REQUEST_TIME
+ packet(0x0917,36,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD
+ packet(0x091e,8,clif->pMoveFromKafra,2,4); // CZ_MOVE_ITEM_FROM_STORE_TO_BODY
+ packet(0x0929,2,clif->pReqCloseBuyingStore,0); // CZ_REQ_CLOSE_BUYING_STORE
+ packet(0x093d,26,clif->pPartyInvite2,2); // CZ_PARTY_JOIN_REQ
+ packet(0x094b,10,clif->pUseSkillToId,2,4,6); // CZ_USE_SKILL
+ packet(0x094d,10,clif->pUseSkillToPos,2,4,6,8); // CZ_USE_SKILL_TOGROUND
+ packet(0x094e,6,clif->pTakeItem,2); // CZ_ITEM_PICKUP
+ packet(0x0957,6,clif->pGetCharNameRequest,2); // CZ_REQNAME
+ packet(0x0964,12,clif->pSearchStoreInfoListItemClick,2,6,10); // CZ_SSILIST_ITEM_CLICK
+ packet(0x096a,7,clif->pActionRequest,2,6); // CZ_REQUEST_ACT
+#endif
+
+// 2018-03-07bRagexe, 2018-03-07bRagexeRE, 2018-03-09aRagexe
+#if PACKETVER == 20180307 || \
+ PACKETVER == 20180309
+ packet(0x0281,4,clif->pDull/*,XXX*/); // CZ_GANGSI_RANK
+ packet(0x035f,-1,clif->pReqOpenBuyingStore,2,4,8,9,89); // CZ_REQ_OPEN_BUYING_STORE
+ packet(0x0437,6,clif->pDropItem,2,4); // CZ_ITEM_THROW
+ packet(0x07e4,19,clif->pWantToConnection,2,6,10,14,18); // CZ_ENTER
+ packet(0x0861,90,clif->pUseSkillToPosMoreInfo,2,4,6,8,10); // CZ_USE_SKILL_TOGROUND_WITHTALKBOX
+ packet(0x0862,6,clif->pReqClickBuyingStore,2); // CZ_REQ_CLICK_TO_BUYING_STORE
+ packet(0x0864,-1,clif->pSearchStoreInfo,2,4,5,9,13,14,15); // CZ_SEARCH_STORE_INFO
+ packet(0x086c,6,clif->pTickSend,2); // CZ_REQUEST_TIME
+ packet(0x0870,-1,clif->pItemListWindowSelected,2,4,8); // CZ_ITEMLISTWIN_RES
+ packet(0x0872,18,clif->pPartyBookingRegisterReq,2,4); // CZ_PARTY_BOOKING_REQ_REGISTER
+ packet(0x0877,5,clif->pWalkToXY,2); // CZ_REQUEST_MOVE
+ packet(0x088d,8,clif->pMoveFromKafra,2,4); // CZ_MOVE_ITEM_FROM_STORE_TO_BODY
+ packet(0x0893,10,clif->pUseSkillToId,2,4,6); // CZ_USE_SKILL
+ packet(0x089b,12,clif->pSearchStoreInfoListItemClick,2,6,10); // CZ_SSILIST_ITEM_CLICK
+ packet(0x08a6,2,clif->pSearchStoreInfoNextPage,0); // CZ_SEARCH_STORE_INFO_NEXT_PAGE
+ packet(0x08aa,26,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS
+ packet(0x08ab,5,clif->pChangeDir,2,4); // CZ_CHANGE_DIRECTION
+ packet(0x0917,10,clif->pUseSkillToPos,2,4,6,8); // CZ_USE_SKILL_TOGROUND
+ packet(0x0920,8,clif->pMoveToKafra,2,4); // CZ_MOVE_ITEM_FROM_BODY_TO_STORE
+ packet(0x0937,-1,clif->pReqTradeBuyingStore,2,4,8,12); // CZ_REQ_TRADE_BUYING_STORE
+ packet(0x0939,36,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD
+ packet(0x093d,2,clif->pReqCloseBuyingStore,0); // CZ_REQ_CLOSE_BUYING_STORE
+ packet(0x0941,6,clif->pGetCharNameRequest,2); // CZ_REQNAME
+ packet(0x0944,5,clif->pHomMenu,2,4); // CZ_COMMAND_MER
+ packet(0x0948,26,clif->pPartyInvite2,2); // CZ_PARTY_JOIN_REQ
+ packet(0x0951,8,clif->pDull/*,XXX*/); // CZ_JOIN_BATTLE_FIELD
+ packet(0x0954,6,clif->pTakeItem,2); // CZ_ITEM_PICKUP
+ packet(0x0957,6,clif->pSolveCharName,2); // CZ_REQNAME_BYGID
+ packet(0x0969,7,clif->pActionRequest,2,6); // CZ_REQUEST_ACT
+#endif
+
+// 2018-03-14nRagexe
+#if PACKETVER == 20180314
+ packet(0x0361,12,clif->pSearchStoreInfoListItemClick,2,6,10); // CZ_SSILIST_ITEM_CLICK
+ packet(0x0366,10,clif->pUseSkillToId,2,4,6); // CZ_USE_SKILL
+ packet(0x0369,5,clif->pHomMenu,2,4); // CZ_COMMAND_MER
+ packet(0x0436,6,clif->pDropItem,2,4); // CZ_ITEM_THROW
+ packet(0x085a,6,clif->pGetCharNameRequest,2); // CZ_REQNAME
+ packet(0x0862,6,clif->pTakeItem,2); // CZ_ITEM_PICKUP
+ packet(0x0863,-1,clif->pItemListWindowSelected,2,4,8); // CZ_ITEMLISTWIN_RES
+ packet(0x0868,8,clif->pDull/*,XXX*/); // CZ_JOIN_BATTLE_FIELD
+ packet(0x086e,8,clif->pMoveFromKafra,2,4); // CZ_MOVE_ITEM_FROM_STORE_TO_BODY
+ packet(0x0874,-1,clif->pReqTradeBuyingStore,2,4,8,12); // CZ_REQ_TRADE_BUYING_STORE
+ packet(0x087a,19,clif->pWantToConnection,2,6,10,14,18); // CZ_ENTER
+ packet(0x0888,5,clif->pChangeDir,2,4); // CZ_CHANGE_DIRECTION
+ packet(0x088a,10,clif->pUseSkillToPos,2,4,6,8); // CZ_USE_SKILL_TOGROUND
+ packet(0x088d,36,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD
+ packet(0x0894,2,clif->pReqCloseBuyingStore,0); // CZ_REQ_CLOSE_BUYING_STORE
+ packet(0x089b,90,clif->pUseSkillToPosMoreInfo,2,4,6,8,10); // CZ_USE_SKILL_TOGROUND_WITHTALKBOX
+ packet(0x0921,7,clif->pActionRequest,2,6); // CZ_REQUEST_ACT
+ packet(0x0927,2,clif->pSearchStoreInfoNextPage,0); // CZ_SEARCH_STORE_INFO_NEXT_PAGE
+ packet(0x092f,5,clif->pWalkToXY,2); // CZ_REQUEST_MOVE
+ packet(0x0933,8,clif->pMoveToKafra,2,4); // CZ_MOVE_ITEM_FROM_BODY_TO_STORE
+ packet(0x0935,26,clif->pPartyInvite2,2); // CZ_PARTY_JOIN_REQ
+ packet(0x0945,18,clif->pPartyBookingRegisterReq,2,4); // CZ_PARTY_BOOKING_REQ_REGISTER
+ packet(0x094d,-1,clif->pReqOpenBuyingStore,2,4,8,9,89); // CZ_REQ_OPEN_BUYING_STORE
+ packet(0x094e,26,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS
+ packet(0x0956,4,clif->pDull/*,XXX*/); // CZ_GANGSI_RANK
+ packet(0x0959,6,clif->pReqClickBuyingStore,2); // CZ_REQ_CLICK_TO_BUYING_STORE
+ packet(0x095f,6,clif->pTickSend,2); // CZ_REQUEST_TIME
+ packet(0x0962,-1,clif->pSearchStoreInfo,2,4,5,9,13,14,15); // CZ_SEARCH_STORE_INFO
+ packet(0x0967,6,clif->pSolveCharName,2); // CZ_REQNAME_BYGID
+#endif
+
#endif /* MAP_PACKETS_SHUFFLE_MAIN_H */
diff --git a/src/map/packets_shuffle_zero.h b/src/map/packets_shuffle_zero.h
index 38c34b18e..7cd52d971 100644
--- a/src/map/packets_shuffle_zero.h
+++ b/src/map/packets_shuffle_zero.h
@@ -36,7 +36,7 @@
/* This file is autogenerated, please do not commit manual changes */
-// 2017-10-19aRagexe_zero, 2017-10-23aRagexe_zero, 2017-10-23bRagexe_zero, 2017-10-23cRagexe_zero, 2017-10-24aRagexe_2_zero, 2017-10-24aRagexe_zero, 2017-10-25bRagexe_zero, 2017-10-27aRagexe_zero, 2017-10-27bRagexe_zero, 2017-10-30aRagexe_zero, 2017-10-31aRagexe_zero, 2017-11-09aRagexe_zero, 2017-11-13aRagexe_zero, 2017-11-13bRagexe_zero
+// 2017-10-19aRagexe_zero, 2017-10-23aRagexe_zero, 2017-10-23bRagexe_zero, 2017-10-23cRagexe_zero, 2017-10-24aRagexe_2_zero, 2017-10-24aRagexe_zero, 2017-10-25bRagexe_zero, 2017-10-27aRagexe_zero, 2017-10-27bRagexe_zero, 2017-10-30aRagexe_zero, 2017-10-31aRagexe_zero, 2017-11-09aRagexe_zero, 2017-11-13aRagexe_zero, 2017-11-13bRagexe_zero, 2018-03-15aRagexe_zero, 2018-03-21aRagexe_zero, 2018-03-21bRagexe_zero, 2018-03-28_1aRagexe_zero, 2018-03-28cRagexe_zero
#if PACKETVER == 20171019 || \
PACKETVER == 20171023 || \
PACKETVER == 20171024 || \
@@ -45,7 +45,10 @@
PACKETVER == 20171030 || \
PACKETVER == 20171031 || \
PACKETVER == 20171109 || \
- PACKETVER == 20171113
+ PACKETVER == 20171113 || \
+ PACKETVER == 20180315 || \
+ PACKETVER == 20180321 || \
+ PACKETVER == 20180328
packet(0x0202,26,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS
packet(0x022d,5,clif->pHomMenu,2,4); // CZ_COMMAND_MER
packet(0x023b,36,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD
@@ -551,5 +554,139 @@
packet(0x096a,6,clif->pGetCharNameRequest,2); // CZ_REQNAME
#endif
+// 2018-02-13aRagexe_zero
+#if PACKETVER == 20180213
+ packet(0x022d,5,clif->pChangeDir,2,4); // CZ_CHANGE_DIRECTION
+ packet(0x02c4,8,clif->pMoveToKafra,2,4); // CZ_MOVE_ITEM_FROM_BODY_TO_STORE
+ packet(0x035f,6,clif->pDropItem,2,4); // CZ_ITEM_THROW
+ packet(0x0361,90,clif->pUseSkillToPosMoreInfo,2,4,6,8,10); // CZ_USE_SKILL_TOGROUND_WITHTALKBOX
+ packet(0x0802,6,clif->pTickSend,2); // CZ_REQUEST_TIME
+ packet(0x0815,10,clif->pUseSkillToId,2,4,6); // CZ_USE_SKILL
+ packet(0x0838,2,clif->pSearchStoreInfoNextPage,0); // CZ_SEARCH_STORE_INFO_NEXT_PAGE
+ packet(0x085a,-1,clif->pSearchStoreInfo,2,4,5,9,13,14,15); // CZ_SEARCH_STORE_INFO
+ packet(0x085d,5,clif->pHomMenu,2,4); // CZ_COMMAND_MER
+ packet(0x0868,18,clif->pPartyBookingRegisterReq,2,4); // CZ_PARTY_BOOKING_REQ_REGISTER
+ packet(0x087b,6,clif->pGetCharNameRequest,2); // CZ_REQNAME
+ packet(0x0882,12,clif->pSearchStoreInfoListItemClick,2,6,10); // CZ_SSILIST_ITEM_CLICK
+ packet(0x0887,-1,clif->pItemListWindowSelected,2,4,8); // CZ_ITEMLISTWIN_RES
+ packet(0x0888,6,clif->pSolveCharName,2); // CZ_REQNAME_BYGID
+ packet(0x088a,4,clif->pDull/*,XXX*/); // CZ_GANGSI_RANK
+ packet(0x088e,6,clif->pReqClickBuyingStore,2); // CZ_REQ_CLICK_TO_BUYING_STORE
+ packet(0x0899,26,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS
+ packet(0x0917,7,clif->pActionRequest,2,6); // CZ_REQUEST_ACT
+ packet(0x091d,5,clif->pWalkToXY,2); // CZ_REQUEST_MOVE
+ packet(0x0922,-1,clif->pReqOpenBuyingStore,2,4,8,9,89); // CZ_REQ_OPEN_BUYING_STORE
+ packet(0x0930,8,clif->pDull/*,XXX*/); // CZ_JOIN_BATTLE_FIELD
+ packet(0x0941,19,clif->pWantToConnection,2,6,10,14,18); // CZ_ENTER
+ packet(0x0942,8,clif->pMoveFromKafra,2,4); // CZ_MOVE_ITEM_FROM_STORE_TO_BODY
+ packet(0x0947,6,clif->pTakeItem,2); // CZ_ITEM_PICKUP
+ packet(0x094d,10,clif->pUseSkillToPos,2,4,6,8); // CZ_USE_SKILL_TOGROUND
+ packet(0x0958,26,clif->pPartyInvite2,2); // CZ_PARTY_JOIN_REQ
+ packet(0x095b,2,clif->pReqCloseBuyingStore,0); // CZ_REQ_CLOSE_BUYING_STORE
+ packet(0x095c,-1,clif->pReqTradeBuyingStore,2,4,8,12); // CZ_REQ_TRADE_BUYING_STORE
+ packet(0x0967,36,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD
+#endif
+
+// 2018-02-21aRagexe_zero
+#if PACKETVER == 20180221
+ packet(0x02c4,6,clif->pTickSend,2); // CZ_REQUEST_TIME
+ packet(0x0362,6,clif->pGetCharNameRequest,2); // CZ_REQNAME
+ packet(0x0364,5,clif->pChangeDir,2,4); // CZ_CHANGE_DIRECTION
+ packet(0x0438,-1,clif->pItemListWindowSelected,2,4,8); // CZ_ITEMLISTWIN_RES
+ packet(0x0817,-1,clif->pSearchStoreInfo,2,4,5,9,13,14,15); // CZ_SEARCH_STORE_INFO
+ packet(0x085b,10,clif->pUseSkillToPos,2,4,6,8); // CZ_USE_SKILL_TOGROUND
+ packet(0x086a,8,clif->pDull/*,XXX*/); // CZ_JOIN_BATTLE_FIELD
+ packet(0x0878,2,clif->pReqCloseBuyingStore,0); // CZ_REQ_CLOSE_BUYING_STORE
+ packet(0x0880,19,clif->pWantToConnection,2,6,10,14,18); // CZ_ENTER
+ packet(0x0884,2,clif->pSearchStoreInfoNextPage,0); // CZ_SEARCH_STORE_INFO_NEXT_PAGE
+ packet(0x088d,6,clif->pSolveCharName,2); // CZ_REQNAME_BYGID
+ packet(0x0892,6,clif->pDropItem,2,4); // CZ_ITEM_THROW
+ packet(0x0895,6,clif->pReqClickBuyingStore,2); // CZ_REQ_CLICK_TO_BUYING_STORE
+ packet(0x08a1,5,clif->pWalkToXY,2); // CZ_REQUEST_MOVE
+ packet(0x08a3,10,clif->pUseSkillToId,2,4,6); // CZ_USE_SKILL
+ packet(0x091b,90,clif->pUseSkillToPosMoreInfo,2,4,6,8,10); // CZ_USE_SKILL_TOGROUND_WITHTALKBOX
+ packet(0x0921,-1,clif->pReqOpenBuyingStore,2,4,8,9,89); // CZ_REQ_OPEN_BUYING_STORE
+ packet(0x0923,5,clif->pHomMenu,2,4); // CZ_COMMAND_MER
+ packet(0x092d,26,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS
+ packet(0x0932,-1,clif->pReqTradeBuyingStore,2,4,8,12); // CZ_REQ_TRADE_BUYING_STORE
+ packet(0x093b,12,clif->pSearchStoreInfoListItemClick,2,6,10); // CZ_SSILIST_ITEM_CLICK
+ packet(0x093d,26,clif->pPartyInvite2,2); // CZ_PARTY_JOIN_REQ
+ packet(0x093e,8,clif->pMoveFromKafra,2,4); // CZ_MOVE_ITEM_FROM_STORE_TO_BODY
+ packet(0x0942,36,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD
+ packet(0x0951,18,clif->pPartyBookingRegisterReq,2,4); // CZ_PARTY_BOOKING_REQ_REGISTER
+ packet(0x0952,4,clif->pDull/*,XXX*/); // CZ_GANGSI_RANK
+ packet(0x0958,7,clif->pActionRequest,2,6); // CZ_REQUEST_ACT
+ packet(0x0959,8,clif->pMoveToKafra,2,4); // CZ_MOVE_ITEM_FROM_BODY_TO_STORE
+ packet(0x095d,6,clif->pTakeItem,2); // CZ_ITEM_PICKUP
+#endif
+
+// 2018-02-28bRagexe_zero, 2018-03-07aRagexe_zero, 2018-03-09aRagexe_zero
+#if PACKETVER == 20180228 || \
+ PACKETVER == 20180307 || \
+ PACKETVER == 20180309
+ packet(0x0202,5,clif->pChangeDir,2,4); // CZ_CHANGE_DIRECTION
+ packet(0x022d,19,clif->pWantToConnection,2,6,10,14,18); // CZ_ENTER
+ packet(0x023b,26,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS
+ packet(0x0281,-1,clif->pItemListWindowSelected,2,4,8); // CZ_ITEMLISTWIN_RES
+ packet(0x035f,6,clif->pTickSend,2); // CZ_REQUEST_TIME
+ packet(0x0360,6,clif->pReqClickBuyingStore,2); // CZ_REQ_CLICK_TO_BUYING_STORE
+ packet(0x0361,5,clif->pHomMenu,2,4); // CZ_COMMAND_MER
+ packet(0x0362,6,clif->pDropItem,2,4); // CZ_ITEM_THROW
+ packet(0x0363,8,clif->pDull/*,XXX*/); // CZ_JOIN_BATTLE_FIELD
+ packet(0x0364,8,clif->pMoveFromKafra,2,4); // CZ_MOVE_ITEM_FROM_STORE_TO_BODY
+ packet(0x0365,18,clif->pPartyBookingRegisterReq,2,4); // CZ_PARTY_BOOKING_REQ_REGISTER
+ packet(0x0366,90,clif->pUseSkillToPosMoreInfo,2,4,6,8,10); // CZ_USE_SKILL_TOGROUND_WITHTALKBOX
+ packet(0x0368,6,clif->pSolveCharName,2); // CZ_REQNAME_BYGID
+ packet(0x0369,7,clif->pActionRequest,2,6); // CZ_REQUEST_ACT
+ packet(0x0436,4,clif->pDull/*,XXX*/); // CZ_GANGSI_RANK
+ packet(0x0437,5,clif->pWalkToXY,2); // CZ_REQUEST_MOVE
+ packet(0x0438,10,clif->pUseSkillToPos,2,4,6,8); // CZ_USE_SKILL_TOGROUND
+ packet(0x07e4,6,clif->pTakeItem,2); // CZ_ITEM_PICKUP
+ packet(0x07ec,8,clif->pMoveToKafra,2,4); // CZ_MOVE_ITEM_FROM_BODY_TO_STORE
+ packet(0x0802,26,clif->pPartyInvite2,2); // CZ_PARTY_JOIN_REQ
+ packet(0x0811,-1,clif->pReqTradeBuyingStore,2,4,8,12); // CZ_REQ_TRADE_BUYING_STORE
+ packet(0x0815,-1,clif->pReqOpenBuyingStore,2,4,8,9,89); // CZ_REQ_OPEN_BUYING_STORE
+ packet(0x0817,2,clif->pReqCloseBuyingStore,0); // CZ_REQ_CLOSE_BUYING_STORE
+ packet(0x0819,-1,clif->pSearchStoreInfo,2,4,5,9,13,14,15); // CZ_SEARCH_STORE_INFO
+ packet(0x0835,2,clif->pSearchStoreInfoNextPage,0); // CZ_SEARCH_STORE_INFO_NEXT_PAGE
+ packet(0x0838,12,clif->pSearchStoreInfoListItemClick,2,6,10); // CZ_SSILIST_ITEM_CLICK
+ packet(0x083c,10,clif->pUseSkillToId,2,4,6); // CZ_USE_SKILL
+ packet(0x0930,36,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD
+ packet(0x096a,6,clif->pGetCharNameRequest,2); // CZ_REQNAME
+#endif
+
+// 2018-03-14nRagexe_zero
+#if PACKETVER == 20180314
+ packet(0x023b,26,clif->pPartyInvite2,2); // CZ_PARTY_JOIN_REQ
+ packet(0x0438,2,clif->pSearchStoreInfoNextPage,0); // CZ_SEARCH_STORE_INFO_NEXT_PAGE
+ packet(0x07ec,19,clif->pWantToConnection,2,6,10,14,18); // CZ_ENTER
+ packet(0x0817,2,clif->pReqCloseBuyingStore,0); // CZ_REQ_CLOSE_BUYING_STORE
+ packet(0x083c,5,clif->pChangeDir,2,4); // CZ_CHANGE_DIRECTION
+ packet(0x085d,26,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS
+ packet(0x085f,-1,clif->pReqOpenBuyingStore,2,4,8,9,89); // CZ_REQ_OPEN_BUYING_STORE
+ packet(0x0866,5,clif->pHomMenu,2,4); // CZ_COMMAND_MER
+ packet(0x0878,8,clif->pDull/*,XXX*/); // CZ_JOIN_BATTLE_FIELD
+ packet(0x088d,36,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD
+ packet(0x0891,8,clif->pMoveFromKafra,2,4); // CZ_MOVE_ITEM_FROM_STORE_TO_BODY
+ packet(0x0897,6,clif->pTakeItem,2); // CZ_ITEM_PICKUP
+ packet(0x0899,8,clif->pMoveToKafra,2,4); // CZ_MOVE_ITEM_FROM_BODY_TO_STORE
+ packet(0x089e,-1,clif->pItemListWindowSelected,2,4,8); // CZ_ITEMLISTWIN_RES
+ packet(0x08a1,4,clif->pDull/*,XXX*/); // CZ_GANGSI_RANK
+ packet(0x0917,-1,clif->pSearchStoreInfo,2,4,5,9,13,14,15); // CZ_SEARCH_STORE_INFO
+ packet(0x0918,7,clif->pActionRequest,2,6); // CZ_REQUEST_ACT
+ packet(0x091f,10,clif->pUseSkillToPos,2,4,6,8); // CZ_USE_SKILL_TOGROUND
+ packet(0x0920,6,clif->pTickSend,2); // CZ_REQUEST_TIME
+ packet(0x0923,12,clif->pSearchStoreInfoListItemClick,2,6,10); // CZ_SSILIST_ITEM_CLICK
+ packet(0x0930,6,clif->pDropItem,2,4); // CZ_ITEM_THROW
+ packet(0x0931,6,clif->pReqClickBuyingStore,2); // CZ_REQ_CLICK_TO_BUYING_STORE
+ packet(0x093f,6,clif->pSolveCharName,2); // CZ_REQNAME_BYGID
+ packet(0x0946,90,clif->pUseSkillToPosMoreInfo,2,4,6,8,10); // CZ_USE_SKILL_TOGROUND_WITHTALKBOX
+ packet(0x094a,10,clif->pUseSkillToId,2,4,6); // CZ_USE_SKILL
+ packet(0x094e,5,clif->pWalkToXY,2); // CZ_REQUEST_MOVE
+ packet(0x0954,18,clif->pPartyBookingRegisterReq,2,4); // CZ_PARTY_BOOKING_REQ_REGISTER
+ packet(0x0956,6,clif->pGetCharNameRequest,2); // CZ_REQNAME
+ packet(0x0958,-1,clif->pReqTradeBuyingStore,2,4,8,12); // CZ_REQ_TRADE_BUYING_STORE
+#endif
+
#endif /* MAP_PACKETS_SHUFFLE_ZERO_H */
diff --git a/src/map/packets_struct.h b/src/map/packets_struct.h
index 2a65eb6cf..d8a2c6b31 100644
--- a/src/map/packets_struct.h
+++ b/src/map/packets_struct.h
@@ -302,7 +302,7 @@ enum packet_headers {
rouletteinfoackType = 0xa1c,
roulettgenerateackType = 0xa20,
roulettercvitemackType = 0xa22,
-#if 0 // Unknown
+#if PACKETVER >= 20150513 // [4144] 0x09f8 handling in client from 2014-10-29aRagexe and 2014-03-26cRagexeRE
questListType = 0x9f8, ///< ZC_ALL_QUEST_LIST3
#elif PACKETVER >= 20141022
questListType = 0x97a, ///< ZC_ALL_QUEST_LIST2
@@ -357,6 +357,17 @@ enum packet_headers {
clanLeave = 0x0989, ///< ZC_ACK_CLAN_LEAVE
clanMessage = 0x098E, ///< ZC_NOTIFY_CLAN_CHAT
#endif
+#if PACKETVER >= 20150513 // [4144] 0x09f9 handled in client from 2014-10-29aRagexe and 2014-03-26cRagexeRE
+ questAddType = 0x9f9,
+#else
+ questAddType = 0x2b3,
+#endif // PACKETVER < 20150513
+#if PACKETVER >= 20150513
+ questUpdateType = 0x9fa,
+#else
+ questUpdateType = 0x2b5,
+#endif // PACKETVER < 20150513
+ questUpdateType2 = 0x8fe,
};
#if !defined(sun) && (!defined(__NETBSD__) || __NetBSD_Version__ >= 600000000) // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
@@ -1248,10 +1259,19 @@ struct packet_hotkey {
} __attribute__((packed));
/**
- * MISSION_HUNT_INFO
+ * MISSION_HUNT_INFO (PACKETVER >= 20141022)
+ * MISSION_HUNT_INFO_EX (PACKETVER >= 20150513)
*/
struct packet_mission_info_sub {
- int32 mob_id;
+#if PACKETVER >= 20150513
+ uint32 huntIdent;
+ uint32 mobType;
+#endif
+ uint32 mob_id;
+#if PACKETVER >= 20150513
+ int16 levelMin;
+ int16 levelMax;
+#endif
int16 huntCount;
int16 maxCount;
char mobName[NAME_LENGTH];
@@ -1259,7 +1279,7 @@ struct packet_mission_info_sub {
/**
* PACKET_ZC_ALL_QUEST_LIST2_INFO (PACKETVER >= 20141022)
- * PACKET_ZC_ALL_QUEST_LIST3_INFO (PACKETVER Unknown) / unused
+ * PACKET_ZC_ALL_QUEST_LIST3_INFO (PACKETVER >= 20150513)
*/
struct packet_quest_list_info {
int32 questID;
@@ -1276,7 +1296,7 @@ struct packet_quest_list_info {
* Header for:
* PACKET_ZC_ALL_QUEST_LIST (PACKETVER < 20141022)
* PACKET_ZC_ALL_QUEST_LIST2 (PACKETVER >= 20141022)
- * PACKET_ZC_ALL_QUEST_LIST3 (PACKETVER Unknown) / unused
+ * PACKET_ZC_ALL_QUEST_LIST3 (PACKETVER >= 20150513)
*
* @remark
* Contains (is followed by) a variable-length array of packet_quest_list_info
@@ -1598,6 +1618,87 @@ struct PACKET_ZC_NOTIFY_CLAN_CHAT {
char Message[];
} __attribute__((packed));
+/**
+ * PACKET_ZC_MISSION_HUNT (PACKETVER < 20150513)
+ * PACKET_ZC_MISSION_HUNT_EX (PACKETVER >= 20150513)
+ */
+struct packet_quest_hunt_sub {
+#if PACKETVER >= 20150513
+ uint32 huntIdent;
+ uint32 mobType;
+#endif
+ uint32 mob_id;
+#if PACKETVER >= 20150513
+ int16 levelMin;
+ int16 levelMax;
+#endif
+ int16 huntCount;
+ char mobName[NAME_LENGTH];
+} __attribute__((packed));
+
+/**
+ * Header for:
+ * PACKET_ZC_ADD_QUEST (PACKETVER < 20150513)
+ * PACKET_ZC_ADD_QUEST_EX (PACKETVER >= 20150513)
+ */
+struct packet_quest_add_header {
+ uint16 PacketType;
+ uint32 questID;
+ uint8 active;
+ int32 quest_svrTime;
+ int32 quest_endTime;
+ int16 count;
+ struct packet_quest_hunt_sub objectives[];
+} __attribute__((packed));
+
+/**
+ * PACKET_MOB_HUNTING (PACKETVER < 20150513)
+ * PACKET_MOB_HUNTING_EX (PACKETVER >= 20150513)
+ */
+struct packet_quest_update_hunt {
+ uint32 questID;
+#if PACKETVER >= 20150513
+ uint32 huntIdent;
+#else
+ uint32 mob_id;
+#endif // PACKETVER < 20150513
+ int16 maxCount;
+ int16 count;
+} __attribute__((packed));
+
+/**
+ * Header for:
+ * PACKET_ZC_UPDATE_MISSION_HUNT (PACKETVER < 20150513)
+ * PACKET_ZC_UPDATE_MISSION_HUNT_EX (PACKETVER >= 20150513)
+ */
+struct packet_quest_update_header {
+ uint16 PacketType;
+ uint16 PacketLength;
+ int16 count;
+ struct packet_quest_update_hunt objectives[];
+} __attribute__((packed));
+
+/**
+ * Header for:
+ * PACKET_MOB_HUNTING (PACKETVER >= 20150513)
+ */
+struct packet_quest_hunt_info_sub {
+ uint32 questID;
+ uint32 mob_id;
+ int16 maxCount;
+ int16 count;
+} __attribute__((packed));
+
+/**
+ * Header for:
+ * ZC_HUNTING_QUEST_INFO (PACKETVER >= 20150513)
+ */
+struct packet_quest_hunt_info {
+ uint16 PacketType;
+ uint16 PacketLength;
+ struct packet_quest_hunt_info_sub info[];
+} __attribute__((packed));
+
#if !defined(sun) && (!defined(__NETBSD__) || __NetBSD_Version__ >= 600000000) // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
#pragma pack(pop)
#endif // not NetBSD < 6 / Solaris
diff --git a/src/map/pc.c b/src/map/pc.c
index 0b30b1221..4404101b9 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -1293,6 +1293,7 @@ bool pc_authok(struct map_session_data *sd, int login_id2, time_t expiration_tim
VECTOR_INIT(sd->script_queues);
VECTOR_INIT(sd->storage.item); // initialize storage item vector.
+ VECTOR_INIT(sd->hatEffectId);
sd->state.dialog = 0;
@@ -4448,46 +4449,54 @@ int pc_payzeny(struct map_session_data *sd,int zeny, enum e_log_pick_type type,
return 0;
}
-/*==========================================
- * Cash Shop
- *------------------------------------------*/
+/**
+ * Calculates leftover cashpoints and kafrapoints when buying an item from cashshop
+ *
+ * @param price Price of the item.
+ * @param points Provided kafra points.
+ *
+ * @return points Leftover kafra points.
+ */
+//Changed Kafrapoints calculation. [Normynator]
int pc_paycash(struct map_session_data *sd, int price, int points)
{
int cash;
- nullpo_retr(-1,sd);
+ int mempoints;
+ nullpo_retr(-1, sd);
- points = cap_value(points,-MAX_ZENY,MAX_ZENY); //prevent command UB
- if( price < 0 || points < 0 )
- {
+ points = cap_value(points, -MAX_ZENY, MAX_ZENY); //prevent command UB
+ if (price < 0 || points < 0) {
ShowError("pc_paycash: Paying negative points (price=%d, points=%d, account_id=%d, char_id=%d).\n", price, points, sd->status.account_id, sd->status.char_id);
return -2;
}
- if( points > price )
- {
+ if (points > price) {
ShowWarning("pc_paycash: More kafra points provided than needed (price=%d, points=%d, account_id=%d, char_id=%d).\n", price, points, sd->status.account_id, sd->status.char_id);
- points = price;
+ points = points - price;
+ mempoints = price;
+ cash = 0;
+ } else {
+ cash = price - points;
+ mempoints = points;
+ points = 0;
}
- cash = price-points;
-
- if( sd->cashPoints < cash || sd->kafraPoints < points )
- {
+ if (sd->cashPoints < cash || sd->kafraPoints < mempoints) {
ShowError("pc_paycash: Not enough points (cash=%d, kafra=%d) to cover the price (cash=%d, kafra=%d) (account_id=%d, char_id=%d).\n", sd->cashPoints, sd->kafraPoints, cash, points, sd->status.account_id, sd->status.char_id);
return -1;
}
- pc_setaccountreg(sd, script->add_str("#CASHPOINTS"), sd->cashPoints-cash);
- pc_setaccountreg(sd, script->add_str("#KAFRAPOINTS"), sd->kafraPoints-points);
+ pc_setaccountreg(sd, script->add_str("#CASHPOINTS"), sd->cashPoints - cash);
+ pc_setaccountreg(sd, script->add_str("#KAFRAPOINTS"), sd->kafraPoints - mempoints);
- if( battle_config.cashshop_show_points )
- {
+ if (battle_config.cashshop_show_points) {
char output[128];
sprintf(output, msg_sd(sd,504), points, cash, sd->kafraPoints, sd->cashPoints);
clif_disp_onlyself(sd, output);
}
- return cash+points;
+
+ return points;
}
int pc_getcash(struct map_session_data *sd, int cash, int points)
diff --git a/src/map/pc.h b/src/map/pc.h
index a01152df5..e699e5750 100644
--- a/src/map/pc.h
+++ b/src/map/pc.h
@@ -618,6 +618,9 @@ END_ZEROED_BLOCK;
const char* delunit_prevfile;
int delunit_prevline;
+ // HatEffect
+ VECTOR_DECL(int) hatEffectId;
+
};
#define EQP_WEAPON EQP_HAND_R
diff --git a/src/map/quest.c b/src/map/quest.c
index 4c5dcb59f..581ecf45e 100644
--- a/src/map/quest.c
+++ b/src/map/quest.c
@@ -148,7 +148,11 @@ int quest_add(struct map_session_data *sd, int quest_id, unsigned int time_limit
sd->save_quest = true;
clif->quest_add(sd, &sd->quest_log[n]);
+#if PACKETVER >= 20150513
+ clif->quest_notify_objective(sd, &sd->quest_log[n]);
+#else
clif->quest_update_objective(sd, &sd->quest_log[n]);
+#endif
if ((map->save_settings & 64) != 0)
chrif->save(sd, 0);
@@ -201,7 +205,11 @@ int quest_change(struct map_session_data *sd, int qid1, int qid2)
clif->quest_delete(sd, qid1);
clif->quest_add(sd, &sd->quest_log[i]);
+#if PACKETVER >= 20150513
+ clif->quest_notify_objective(sd, &sd->quest_log[i]);
+#else
clif->quest_update_objective(sd, &sd->quest_log[i]);
+#endif
if( map->save_settings&64 )
chrif->save(sd,0);
diff --git a/src/map/rodex.c b/src/map/rodex.c
index d5a6064cf..0e9e4ee2a 100644
--- a/src/map/rodex.c
+++ b/src/map/rodex.c
@@ -231,6 +231,11 @@ int rodex_send_mail(struct map_session_data *sd, const char *receiver_name, cons
nullpo_retr(RODEX_SEND_MAIL_FATAL_ERROR, body);
nullpo_retr(RODEX_SEND_MAIL_FATAL_ERROR, title);
+ if (!rodex->isenabled() || sd->npc_id > 0) {
+ rodex->clean(sd, 1);
+ return RODEX_SEND_MAIL_FATAL_ERROR;
+ }
+
if (zeny < 0) {
rodex->clean(sd, 1);
return RODEX_SEND_MAIL_FATAL_ERROR;
@@ -364,15 +369,24 @@ struct rodex_message *rodex_get_mail(struct map_session_data *sd, int64 mail_id)
{
int i;
struct rodex_message *msg;
+ int char_id;
nullpo_retr(NULL, sd);
- ARR_FIND(0, VECTOR_LENGTH(sd->rodex.messages), i, VECTOR_INDEX(sd->rodex.messages, i).id == mail_id && VECTOR_INDEX(sd->rodex.messages, i).is_deleted != true);
+ ARR_FIND(0, VECTOR_LENGTH(sd->rodex.messages), i, VECTOR_INDEX(sd->rodex.messages, i).id == mail_id);
if (i == VECTOR_LENGTH(sd->rodex.messages))
return NULL;
msg = &VECTOR_INDEX(sd->rodex.messages, i);
+ char_id = sd->status.char_id;
+
+ if ((msg->is_deleted == true)
+ || (msg->expire_date < time(NULL) && ((msg->receiver_accountid > 0) || (msg->receiver_id == char_id && msg->sender_id != char_id)))
+ || ((msg->send_date + 2 * RODEX_EXPIRE) < time(NULL))
+ )
+ return NULL;
+
return msg;
}
@@ -388,9 +402,16 @@ void rodex_read_mail(struct map_session_data *sd, int64 mail_id)
msg = rodex->get_mail(sd, mail_id);
nullpo_retv(msg);
- if (msg->is_read == false) {
- intif->rodex_updatemail(msg->id, 0);
- msg->is_read = true;
+ if (msg->opentype == RODEX_OPENTYPE_RETURN) {
+ if (msg->sender_read == false) {
+ intif->rodex_updatemail(msg->id, 4);
+ msg->sender_read = true;
+ }
+ } else {
+ if (msg->is_read == false) {
+ intif->rodex_updatemail(msg->id, 0);
+ msg->is_read = true;
+ }
}
clif->rodex_read_mail(sd, msg->opentype, msg);
@@ -440,6 +461,7 @@ void rodex_get_zeny(struct map_session_data *sd, int8 opentype, int64 mail_id)
return;
}
+ msg->type &= ~MAIL_TYPE_ZENY;
msg->zeny = 0;
intif->rodex_updatemail(mail_id, 1);
@@ -523,6 +545,8 @@ void rodex_get_items(struct map_session_data *sd, int8 opentype, int64 mail_id)
}
}
+ msg->type &= ~MAIL_TYPE_ITEM;
+ msg->items_count = 0;
intif->rodex_updatemail(mail_id, 2);
clif->rodex_request_items(sd, opentype, mail_id, RODEX_GET_ITEMS_SUCCESS);
diff --git a/src/map/script.c b/src/map/script.c
index d653800cc..275601dcc 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -12815,12 +12815,12 @@ enum mapinfo_info {
BUILDIN(getmapinfo)
{
enum mapinfo_info mode = script_getnum(st, 2);
- int16 m;
+ int16 m = -1;
if (script_hasdata(st, 3)) {
if (script_isstringtype(st, 3)) {
const char *str = script_getstr(st, 3);
- m = map->mapname2mapid(str);
+ m = map->mapindex2mapid(strdb_iget(mapindex->db, str));
} else {
m = script_getnum(st, 3);
}
@@ -23965,6 +23965,42 @@ BUILDIN(clan_master)
}
/**
+ * hateffect(EffectID, Enable_State)
+ */
+BUILDIN(hateffect)
+{
+#if PACKETVER >= 20150422
+ struct map_session_data *sd = script_rid2sd(st);
+ int effectId, enabled = 0;
+ int i;
+
+ if (sd == NULL)
+ return false;
+
+ effectId = script_getnum(st, 2);
+ enabled = script_getnum(st, 3);
+
+ for (i = 0; i < VECTOR_LENGTH(sd->hatEffectId); ++i) {
+ if (VECTOR_INDEX(sd->hatEffectId, i) == effectId) {
+ if (enabled == 1) { // Already Enabled
+ return true;
+ } else { // Remove
+ VECTOR_ERASE(sd->hatEffectId, i);
+ clif->hat_effect_single(&sd->bl, effectId, enabled);
+ return true;
+ }
+ }
+ }
+
+ VECTOR_ENSURE(sd->hatEffectId, 1, 1);
+ VECTOR_PUSH(sd->hatEffectId, effectId);
+
+ clif->hat_effect_single(&sd->bl, effectId, enabled);
+#endif
+ return true;
+}
+
+/**
* Adds a built-in script function.
*
* @param buildin Script function data
@@ -24679,6 +24715,9 @@ void script_parse_builtin(void) {
BUILDIN_DEF2(rodex_sendmail2, "rodex_sendmail_acc2", "isss?????????????????????????????????????????"),
BUILDIN_DEF(_,"s"),
BUILDIN_DEF2(_, "_$", "s"),
+
+ // -- HatEffect
+ BUILDIN_DEF(hateffect, "ii"),
};
int i, len = ARRAYLENGTH(BUILDIN);
RECREATE(script->buildin, char *, script->buildin_count + len); // Pre-alloc to speed up
diff --git a/src/map/unit.c b/src/map/unit.c
index 938b587f3..64bd17edc 100644
--- a/src/map/unit.c
+++ b/src/map/unit.c
@@ -2210,6 +2210,7 @@ int unit_attack_timer_sub(struct block_list* src, int tid, int64 tick)
//Non-players use the sync packet on the walk timer. [Skotlex]
if (tid == INVALID_TIMER && sd) clif->fixpos(src);
+ map->freeblock_lock();
if( DIFF_TICK(ud->attackabletime,tick) <= 0 ) {
if (battle_config.attack_direction_change && (src->type&battle_config.attack_direction_change)) {
ud->dir = map->calc_dir(src, target->x,target->y );
@@ -2219,8 +2220,10 @@ int unit_attack_timer_sub(struct block_list* src, int tid, int64 tick)
if(md) {
//First attack is always a normal attack
if(md->state.skillstate == MSS_ANGRY || md->state.skillstate == MSS_BERSERK) {
- if (mob->skill_use(md,tick,-1))
+ if (mob->skill_use(md,tick,-1)) {
+ map->freeblock_unlock();
return 1;
+ }
} else {
// Set mob's ANGRY/BERSERK states.
md->state.skillstate = md->state.aggressive?MSS_ANGRY:MSS_BERSERK;
@@ -2232,21 +2235,23 @@ int unit_attack_timer_sub(struct block_list* src, int tid, int64 tick)
map->foreachinrange(mob->linksearch, src, md->db->range2, BL_MOB, md->class_, target, tick);
}
}
- if (src->type == BL_PET && pet->attackskill(BL_UCAST(BL_PET, src), target->id))
+ if (src->type == BL_PET && pet->attackskill(BL_UCAST(BL_PET, src), target->id)) {
+ map->freeblock_unlock();
return 1;
+ }
- map->freeblock_lock();
ud->attacktarget_lv = battle->weapon_attack(src,target,tick,0);
if(sd && sd->status.pet_id > 0 && sd->pd && battle_config.pet_attack_support)
pet->target_check(sd,target,0);
- map->freeblock_unlock();
/**
* Applied when you're unable to attack (e.g. out of ammo)
* We should stop here otherwise timer keeps on and this happens endlessly
**/
- if( ud->attacktarget_lv == ATK_NONE )
+ if (ud->attacktarget_lv == ATK_NONE) {
+ map->freeblock_unlock();
return 1;
+ }
ud->attackabletime = tick + sstatus->adelay;
// You can't move if you can't attack neither.
@@ -2260,6 +2265,7 @@ int unit_attack_timer_sub(struct block_list* src, int tid, int64 tick)
pc->update_idle_time(sd, BCIDLE_ATTACK);
ud->attacktimer = timer->add(ud->attackabletime,unit->attack_timer,src->id,0);
}
+ map->freeblock_unlock();
if (sd != NULL && battle_config.prevent_logout_trigger & PLT_ATTACK)
sd->canlog_tick = timer->gettick();
@@ -2760,6 +2766,7 @@ int unit_free(struct block_list *bl, clr_type clrtype)
}
VECTOR_CLEAR(sd->script_queues);
VECTOR_CLEAR(sd->storage.item);
+ VECTOR_CLEAR(sd->hatEffectId);
sd->storage.received = false;
if( sd->quest_log != NULL ) {
aFree(sd->quest_log);
diff --git a/src/plugins/HPMHooking/HPMHooking.Defs.inc b/src/plugins/HPMHooking/HPMHooking.Defs.inc
index 9b4b88f17..da70abc12 100644
--- a/src/plugins/HPMHooking/HPMHooking.Defs.inc
+++ b/src/plugins/HPMHooking/HPMHooking.Defs.inc
@@ -1692,6 +1692,8 @@ typedef void (*HPMHOOK_pre_clif_quest_update_status) (struct map_session_data **
typedef void (*HPMHOOK_post_clif_quest_update_status) (struct map_session_data *sd, int quest_id, bool active);
typedef void (*HPMHOOK_pre_clif_quest_update_objective) (struct map_session_data **sd, struct quest **qd);
typedef void (*HPMHOOK_post_clif_quest_update_objective) (struct map_session_data *sd, struct quest *qd);
+typedef void (*HPMHOOK_pre_clif_quest_notify_objective) (struct map_session_data **sd, struct quest **qd);
+typedef void (*HPMHOOK_post_clif_quest_notify_objective) (struct map_session_data *sd, struct quest *qd);
typedef void (*HPMHOOK_pre_clif_quest_show_event) (struct map_session_data **sd, struct block_list **bl, short *state, short *color);
typedef void (*HPMHOOK_post_clif_quest_show_event) (struct map_session_data *sd, struct block_list *bl, short state, short color);
typedef void (*HPMHOOK_pre_clif_mail_window) (int *fd, int *flag);
@@ -2358,8 +2360,8 @@ typedef void (*HPMHOOK_pre_clif_rodex_send_maillist) (int *fd, struct map_sessio
typedef void (*HPMHOOK_post_clif_rodex_send_maillist) (int fd, struct map_session_data *sd, int8 open_type, int64 page_start);
typedef void (*HPMHOOK_pre_clif_rodex_send_refresh) (int *fd, struct map_session_data **sd, int8 *open_type, int *count);
typedef void (*HPMHOOK_post_clif_rodex_send_refresh) (int fd, struct map_session_data *sd, int8 open_type, int count);
-typedef void (*HPMHOOK_pre_clif_rodex_send_mails_all) (int *fd, struct map_session_data **sd);
-typedef void (*HPMHOOK_post_clif_rodex_send_mails_all) (int fd, struct map_session_data *sd);
+typedef void (*HPMHOOK_pre_clif_rodex_send_mails_all) (int *fd, struct map_session_data **sd, int64 *mail_id);
+typedef void (*HPMHOOK_post_clif_rodex_send_mails_all) (int fd, struct map_session_data *sd, int64 mail_id);
typedef void (*HPMHOOK_pre_clif_pRodexReadMail) (int *fd, struct map_session_data **sd);
typedef void (*HPMHOOK_post_clif_pRodexReadMail) (int fd, struct map_session_data *sd);
typedef void (*HPMHOOK_pre_clif_rodex_read_mail) (struct map_session_data **sd, int8 *opentype, struct rodex_message **msg);
@@ -2404,6 +2406,10 @@ typedef void (*HPMHOOK_pre_clif_clan_message) (struct clan **c, const char **mes
typedef void (*HPMHOOK_post_clif_clan_message) (struct clan *c, const char *mes, int len);
typedef void (*HPMHOOK_pre_clif_pClanMessage) (int *fd, struct map_session_data **sd);
typedef void (*HPMHOOK_post_clif_pClanMessage) (int fd, struct map_session_data *sd);
+typedef void (*HPMHOOK_pre_clif_hat_effect) (struct block_list **bl, struct block_list **tbl, enum send_target *target);
+typedef void (*HPMHOOK_post_clif_hat_effect) (struct block_list *bl, struct block_list *tbl, enum send_target target);
+typedef void (*HPMHOOK_pre_clif_hat_effect_single) (struct block_list **bl, uint16 *effectId, bool *enable);
+typedef void (*HPMHOOK_post_clif_hat_effect_single) (struct block_list *bl, uint16 effectId, bool enable);
#endif // MAP_CLIF_H
#ifdef COMMON_CORE_H /* cmdline */
typedef void (*HPMHOOK_pre_cmdline_init) (void);
@@ -4662,8 +4668,8 @@ typedef int (*HPMHOOK_pre_mapif_parse_quest_load) (int *fd);
typedef int (*HPMHOOK_post_mapif_parse_quest_load) (int retVal___, int fd);
typedef int (*HPMHOOK_pre_mapif_parse_rodex_requestinbox) (int *fd);
typedef int (*HPMHOOK_post_mapif_parse_rodex_requestinbox) (int retVal___, int fd);
-typedef void (*HPMHOOK_pre_mapif_rodex_sendinbox) (int *fd, int *char_id, int8 *opentype, int8 *flag, int *count, struct rodex_maillist **mails);
-typedef void (*HPMHOOK_post_mapif_rodex_sendinbox) (int fd, int char_id, int8 opentype, int8 flag, int count, struct rodex_maillist *mails);
+typedef void (*HPMHOOK_pre_mapif_rodex_sendinbox) (int *fd, int *char_id, int8 *opentype, int8 *flag, int *count, int64 *mail_id, struct rodex_maillist **mails);
+typedef void (*HPMHOOK_post_mapif_rodex_sendinbox) (int fd, int char_id, int8 opentype, int8 flag, int count, int64 mail_id, struct rodex_maillist *mails);
typedef int (*HPMHOOK_pre_mapif_parse_rodex_checkhasnew) (int *fd);
typedef int (*HPMHOOK_post_mapif_parse_rodex_checkhasnew) (int retVal___, int fd);
typedef void (*HPMHOOK_pre_mapif_rodex_sendhasnew) (int *fd, int *char_id, bool *has_new);
diff --git a/src/plugins/HPMHooking/HPMHooking_char.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_char.Hooks.inc
index cfd6caee1..6ea10f78f 100644
--- a/src/plugins/HPMHooking/HPMHooking_char.Hooks.inc
+++ b/src/plugins/HPMHooking/HPMHooking_char.Hooks.inc
@@ -14647,14 +14647,14 @@ int HP_mapif_parse_rodex_requestinbox(int fd) {
}
return retVal___;
}
-void HP_mapif_rodex_sendinbox(int fd, int char_id, int8 opentype, int8 flag, int count, struct rodex_maillist *mails) {
+void HP_mapif_rodex_sendinbox(int fd, int char_id, int8 opentype, int8 flag, int count, int64 mail_id, struct rodex_maillist *mails) {
int hIndex = 0;
if (HPMHooks.count.HP_mapif_rodex_sendinbox_pre > 0) {
- void (*preHookFunc) (int *fd, int *char_id, int8 *opentype, int8 *flag, int *count, struct rodex_maillist **mails);
+ void (*preHookFunc) (int *fd, int *char_id, int8 *opentype, int8 *flag, int *count, int64 *mail_id, struct rodex_maillist **mails);
*HPMforce_return = false;
for (hIndex = 0; hIndex < HPMHooks.count.HP_mapif_rodex_sendinbox_pre; hIndex++) {
preHookFunc = HPMHooks.list.HP_mapif_rodex_sendinbox_pre[hIndex].func;
- preHookFunc(&fd, &char_id, &opentype, &flag, &count, &mails);
+ preHookFunc(&fd, &char_id, &opentype, &flag, &count, &mail_id, &mails);
}
if (*HPMforce_return) {
*HPMforce_return = false;
@@ -14662,13 +14662,13 @@ void HP_mapif_rodex_sendinbox(int fd, int char_id, int8 opentype, int8 flag, int
}
}
{
- HPMHooks.source.mapif.rodex_sendinbox(fd, char_id, opentype, flag, count, mails);
+ HPMHooks.source.mapif.rodex_sendinbox(fd, char_id, opentype, flag, count, mail_id, mails);
}
if (HPMHooks.count.HP_mapif_rodex_sendinbox_post > 0) {
- void (*postHookFunc) (int fd, int char_id, int8 opentype, int8 flag, int count, struct rodex_maillist *mails);
+ void (*postHookFunc) (int fd, int char_id, int8 opentype, int8 flag, int count, int64 mail_id, struct rodex_maillist *mails);
for (hIndex = 0; hIndex < HPMHooks.count.HP_mapif_rodex_sendinbox_post; hIndex++) {
postHookFunc = HPMHooks.list.HP_mapif_rodex_sendinbox_post[hIndex].func;
- postHookFunc(fd, char_id, opentype, flag, count, mails);
+ postHookFunc(fd, char_id, opentype, flag, count, mail_id, mails);
}
}
return;
diff --git a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
index 9d531e370..d799b8693 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
@@ -1286,6 +1286,8 @@ struct {
struct HPMHookPoint *HP_clif_quest_update_status_post;
struct HPMHookPoint *HP_clif_quest_update_objective_pre;
struct HPMHookPoint *HP_clif_quest_update_objective_post;
+ struct HPMHookPoint *HP_clif_quest_notify_objective_pre;
+ struct HPMHookPoint *HP_clif_quest_notify_objective_post;
struct HPMHookPoint *HP_clif_quest_show_event_pre;
struct HPMHookPoint *HP_clif_quest_show_event_post;
struct HPMHookPoint *HP_clif_mail_window_pre;
@@ -1998,6 +2000,10 @@ struct {
struct HPMHookPoint *HP_clif_clan_message_post;
struct HPMHookPoint *HP_clif_pClanMessage_pre;
struct HPMHookPoint *HP_clif_pClanMessage_post;
+ struct HPMHookPoint *HP_clif_hat_effect_pre;
+ struct HPMHookPoint *HP_clif_hat_effect_post;
+ struct HPMHookPoint *HP_clif_hat_effect_single_pre;
+ struct HPMHookPoint *HP_clif_hat_effect_single_post;
struct HPMHookPoint *HP_cmdline_init_pre;
struct HPMHookPoint *HP_cmdline_init_post;
struct HPMHookPoint *HP_cmdline_final_pre;
@@ -7567,6 +7573,8 @@ struct {
int HP_clif_quest_update_status_post;
int HP_clif_quest_update_objective_pre;
int HP_clif_quest_update_objective_post;
+ int HP_clif_quest_notify_objective_pre;
+ int HP_clif_quest_notify_objective_post;
int HP_clif_quest_show_event_pre;
int HP_clif_quest_show_event_post;
int HP_clif_mail_window_pre;
@@ -8279,6 +8287,10 @@ struct {
int HP_clif_clan_message_post;
int HP_clif_pClanMessage_pre;
int HP_clif_pClanMessage_post;
+ int HP_clif_hat_effect_pre;
+ int HP_clif_hat_effect_post;
+ int HP_clif_hat_effect_single_pre;
+ int HP_clif_hat_effect_single_post;
int HP_cmdline_init_pre;
int HP_cmdline_init_post;
int HP_cmdline_final_pre;
diff --git a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
index 5551668d2..045c8a087 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
@@ -666,6 +666,7 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(clif->quest_delete, HP_clif_quest_delete) },
{ HP_POP(clif->quest_update_status, HP_clif_quest_update_status) },
{ HP_POP(clif->quest_update_objective, HP_clif_quest_update_objective) },
+ { HP_POP(clif->quest_notify_objective, HP_clif_quest_notify_objective) },
{ HP_POP(clif->quest_show_event, HP_clif_quest_show_event) },
{ HP_POP(clif->mail_window, HP_clif_mail_window) },
{ HP_POP(clif->mail_read, HP_clif_mail_read) },
@@ -1022,6 +1023,8 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(clif->clan_leave, HP_clif_clan_leave) },
{ HP_POP(clif->clan_message, HP_clif_clan_message) },
{ HP_POP(clif->pClanMessage, HP_clif_pClanMessage) },
+ { HP_POP(clif->hat_effect, HP_clif_hat_effect) },
+ { HP_POP(clif->hat_effect_single, HP_clif_hat_effect_single) },
/* cmdline_interface */
{ HP_POP(cmdline->init, HP_cmdline_init) },
{ HP_POP(cmdline->final, HP_cmdline_final) },
diff --git a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
index 0d10eb6fe..22129c026 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
@@ -16753,6 +16753,32 @@ void HP_clif_quest_update_objective(struct map_session_data *sd, struct quest *q
}
return;
}
+void HP_clif_quest_notify_objective(struct map_session_data *sd, struct quest *qd) {
+ int hIndex = 0;
+ if (HPMHooks.count.HP_clif_quest_notify_objective_pre > 0) {
+ void (*preHookFunc) (struct map_session_data **sd, struct quest **qd);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_quest_notify_objective_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_clif_quest_notify_objective_pre[hIndex].func;
+ preHookFunc(&sd, &qd);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.clif.quest_notify_objective(sd, qd);
+ }
+ if (HPMHooks.count.HP_clif_quest_notify_objective_post > 0) {
+ void (*postHookFunc) (struct map_session_data *sd, struct quest *qd);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_quest_notify_objective_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_clif_quest_notify_objective_post[hIndex].func;
+ postHookFunc(sd, qd);
+ }
+ }
+ return;
+}
void HP_clif_quest_show_event(struct map_session_data *sd, struct block_list *bl, short state, short color) {
int hIndex = 0;
if (HPMHooks.count.HP_clif_quest_show_event_pre > 0) {
@@ -25420,14 +25446,14 @@ void HP_clif_rodex_send_refresh(int fd, struct map_session_data *sd, int8 open_t
}
return;
}
-void HP_clif_rodex_send_mails_all(int fd, struct map_session_data *sd) {
+void HP_clif_rodex_send_mails_all(int fd, struct map_session_data *sd, int64 mail_id) {
int hIndex = 0;
if (HPMHooks.count.HP_clif_rodex_send_mails_all_pre > 0) {
- void (*preHookFunc) (int *fd, struct map_session_data **sd);
+ void (*preHookFunc) (int *fd, struct map_session_data **sd, int64 *mail_id);
*HPMforce_return = false;
for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_rodex_send_mails_all_pre; hIndex++) {
preHookFunc = HPMHooks.list.HP_clif_rodex_send_mails_all_pre[hIndex].func;
- preHookFunc(&fd, &sd);
+ preHookFunc(&fd, &sd, &mail_id);
}
if (*HPMforce_return) {
*HPMforce_return = false;
@@ -25435,13 +25461,13 @@ void HP_clif_rodex_send_mails_all(int fd, struct map_session_data *sd) {
}
}
{
- HPMHooks.source.clif.rodex_send_mails_all(fd, sd);
+ HPMHooks.source.clif.rodex_send_mails_all(fd, sd, mail_id);
}
if (HPMHooks.count.HP_clif_rodex_send_mails_all_post > 0) {
- void (*postHookFunc) (int fd, struct map_session_data *sd);
+ void (*postHookFunc) (int fd, struct map_session_data *sd, int64 mail_id);
for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_rodex_send_mails_all_post; hIndex++) {
postHookFunc = HPMHooks.list.HP_clif_rodex_send_mails_all_post[hIndex].func;
- postHookFunc(fd, sd);
+ postHookFunc(fd, sd, mail_id);
}
}
return;
@@ -26018,6 +26044,58 @@ void HP_clif_pClanMessage(int fd, struct map_session_data *sd) {
}
return;
}
+void HP_clif_hat_effect(struct block_list *bl, struct block_list *tbl, enum send_target target) {
+ int hIndex = 0;
+ if (HPMHooks.count.HP_clif_hat_effect_pre > 0) {
+ void (*preHookFunc) (struct block_list **bl, struct block_list **tbl, enum send_target *target);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_hat_effect_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_clif_hat_effect_pre[hIndex].func;
+ preHookFunc(&bl, &tbl, &target);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.clif.hat_effect(bl, tbl, target);
+ }
+ if (HPMHooks.count.HP_clif_hat_effect_post > 0) {
+ void (*postHookFunc) (struct block_list *bl, struct block_list *tbl, enum send_target target);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_hat_effect_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_clif_hat_effect_post[hIndex].func;
+ postHookFunc(bl, tbl, target);
+ }
+ }
+ return;
+}
+void HP_clif_hat_effect_single(struct block_list *bl, uint16 effectId, bool enable) {
+ int hIndex = 0;
+ if (HPMHooks.count.HP_clif_hat_effect_single_pre > 0) {
+ void (*preHookFunc) (struct block_list **bl, uint16 *effectId, bool *enable);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_hat_effect_single_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_clif_hat_effect_single_pre[hIndex].func;
+ preHookFunc(&bl, &effectId, &enable);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.clif.hat_effect_single(bl, effectId, enable);
+ }
+ if (HPMHooks.count.HP_clif_hat_effect_single_post > 0) {
+ void (*postHookFunc) (struct block_list *bl, uint16 effectId, bool enable);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_hat_effect_single_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_clif_hat_effect_single_post[hIndex].func;
+ postHookFunc(bl, effectId, enable);
+ }
+ }
+ return;
+}
/* cmdline_interface */
void HP_cmdline_init(void) {
int hIndex = 0;
diff --git a/src/plugins/mapcache.c b/src/plugins/mapcache.c
index f1dab97c1..5e44492f6 100644
--- a/src/plugins/mapcache.c
+++ b/src/plugins/mapcache.c
@@ -341,6 +341,100 @@ bool mapcache_rebuild(void)
return true;
}
+bool fix_md5_truncation_sub(FILE *fp, const char *map_name)
+{
+ unsigned int file_size;
+ struct map_cache_header mheader = { 0 };
+ uint8 *buf = NULL;
+
+ nullpo_retr(false, fp);
+ nullpo_retr(false, map_name);
+
+ fseek(fp, 0, SEEK_END);
+ file_size = (unsigned int)ftell(fp);
+ fseek(fp, 0, SEEK_SET); // Rewind file pointer before passing it to the read function.
+
+ if (file_size <= sizeof(mheader) || fread(&mheader, sizeof(mheader), 1, fp) < 1) {
+ ShowError("fix_md5_truncation: Failed to read cache header for map '%s'.\n", map_name);
+ return false;
+ }
+
+ if (mheader.len <= 0) {
+ ShowError("fix_md5_truncation: A file with negative or zero compressed length passed '%d'.\n", mheader.len);
+ return false;
+ }
+
+ if (file_size < sizeof(mheader) + mheader.len) {
+ ShowError("fix_md5_truncation: An incomplete file passed for map '%s'.\n", map_name);
+ return false;
+ }
+
+ CREATE(buf, uint8, mheader.len);
+ if (fread(buf, mheader.len, 1, fp) < 1) {
+ ShowError("fix_md5_truncation: Could not load the compressed cell data for map '%s'.\n", map_name);
+ aFree(buf);
+ return false;
+ }
+
+ md5->binary(buf, mheader.len, mheader.md5_checksum);
+ aFree(buf);
+
+ fseek(fp, 0, SEEK_SET);
+ fwrite(&mheader, sizeof(mheader), 1, fp);
+ fclose(fp);
+
+ return true;
+}
+
+bool fix_md5_truncation(void)
+{
+ int i;
+ bool retval = true;
+
+ if (mapcache_read_maplist("db/map_index.txt") == false) {
+ ShowError("mapcache_rebuild: Could not read maplist, aborting\n");
+ return false;
+ }
+
+ for (i = 0; i < VECTOR_LENGTH(maplist); ++i) {
+ const char *map_name = VECTOR_INDEX(maplist, i);
+ char file_path[255];
+ FILE *fp = NULL;
+ int16 version;
+
+ snprintf(file_path, sizeof(file_path), "%s%s%s.%s", "maps/", DBPATH, map_name, "mcache");
+
+ fp = fopen(file_path, "r+b");
+
+ if (fp == NULL) {
+ ShowWarning("fix_md5_truncation: Could not open the mapcache file for map '%s' at path '%s'.\n", map_name, file_path);
+ retval = false;
+ continue;
+ }
+
+ if (fread(&version, sizeof(version), 1, fp) < 1) {
+ ShowError("fix_md5_truncation: Could not read file version for map '%s'.\n", map_name);
+ fclose(fp);
+ retval = false;
+ continue;
+ }
+
+ if (version != 1) {
+ ShowError("fix_md5_truncation: Mapcache for map '%s' has version %d. The update is only applied to version 1.\n", map_name, version);
+ fclose(fp);
+ continue;
+ }
+
+ ShowStatus("Updating mapcache: %s'\n", map_name);
+ if (!fix_md5_truncation_sub(fp, map_name))
+ retval = false;
+
+ fclose(fp);
+ }
+
+ return retval;
+}
+
CMDLINEARG(convertmapcache)
{
map->minimal = true;
@@ -363,6 +457,12 @@ CMDLINEARG(cachemap)
return mapcache_cache_map(params);
}
+CMDLINEARG(fixmd5)
+{
+ map->minimal = true;
+ return fix_md5_truncation();
+}
+
HPExport void server_preinit(void)
{
addArg("--convert-old-mapcache", false, convertmapcache,
@@ -371,6 +471,8 @@ HPExport void server_preinit(void)
"Rebuilds the entire mapcache folder (maps/"DBPATH"), using db/map_index.txt as index.");
addArg("--map", true, cachemap,
"Rebuilds an individual map's cache into maps/"DBPATH" (usage: --map <map_name_without_extension>).");
+ addArg("--fix-md5", false, fixmd5,
+ "Updates the checksum for the files in maps/"DBPATH", using db/map_index.txt as index (see PR #1981).");
needs_grfio = false;
VECTOR_INIT(maplist);
@@ -378,6 +480,10 @@ HPExport void server_preinit(void)
HPExport void plugin_final(void)
{
+ while (VECTOR_LENGTH(maplist) > 0) {
+ char *name = VECTOR_POP(maplist);
+ aFree(name);
+ }
VECTOR_CLEAR(maplist);
if (needs_grfio)
grfio->final();
diff --git a/vcproj-11/login-server.vcxproj b/vcproj-11/login-server.vcxproj
index 9abd5dc90..7c29fb33b 100644
--- a/vcproj-11/login-server.vcxproj
+++ b/vcproj-11/login-server.vcxproj
@@ -165,7 +165,6 @@
<ClInclude Include="..\src\login\login.h" />
<ClInclude Include="..\src\login\loginlog.h" />
<ClInclude Include="..\src\common\cbasetypes.h" />
- <ClInclude Include="..\src\common\conf.h" />
<ClInclude Include="..\src\common\core.h" />
<ClInclude Include="..\src\common\console.h" />
<ClInclude Include="..\src\common\db.h" />
diff --git a/vcproj-12/login-server.vcxproj b/vcproj-12/login-server.vcxproj
index a1cd6fc0e..060460923 100644
--- a/vcproj-12/login-server.vcxproj
+++ b/vcproj-12/login-server.vcxproj
@@ -165,7 +165,6 @@
<ClInclude Include="..\src\login\login.h" />
<ClInclude Include="..\src\login\loginlog.h" />
<ClInclude Include="..\src\common\cbasetypes.h" />
- <ClInclude Include="..\src\common\conf.h" />
<ClInclude Include="..\src\common\core.h" />
<ClInclude Include="..\src\common\console.h" />
<ClInclude Include="..\src\common\db.h" />
diff --git a/vcproj-14/login-server.vcxproj b/vcproj-14/login-server.vcxproj
index 44dee52be..42f71c1a0 100644
--- a/vcproj-14/login-server.vcxproj
+++ b/vcproj-14/login-server.vcxproj
@@ -163,7 +163,6 @@
<ClInclude Include="..\src\login\login.h" />
<ClInclude Include="..\src\login\loginlog.h" />
<ClInclude Include="..\src\common\cbasetypes.h" />
- <ClInclude Include="..\src\common\conf.h" />
<ClInclude Include="..\src\common\core.h" />
<ClInclude Include="..\src\common\console.h" />
<ClInclude Include="..\src\common\db.h" />