diff options
48 files changed, 2252 insertions, 1071 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..2b1745233 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,40 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project does not adhere to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## [Unreleased] +<!-- +If you are reading this in a text editor, simply ignore this section +--> + +## [v2017.10.22-1] `October 22 2017` `PATCH 1` +### Fixed +- Fixed a wrong null pointer check in `logmes()`, which caused the command to never log and instead print debug information. + +## [v2017.10.22] `October 22 2017` +### Added +- Added the script command `getmapinfo()`, which allows to obtain misc information about a map. (#1852) +- Added an option to restrict party leader changes to characters on the same map. Controlled by the setting `party_change_leader_same_map` (defaults to true). (#1812) +- Added initial support (shuffle packets, obfuscation keys) for clients 2017-09-27, 2017-10-02, 2017-10-11, 2017-10-18. (#1859) +- Added the `noautoloot` mapflag, allowing to disable the `@autoloot` functionality on a map by map basis. (#1833) + +### Changed +- Extended the script command `logmes()` with an option to log to the `atcommandlog` table. (#1843) +- Updated RoDEX, with support for packetver `20170419` and newer. (#1859) +- Updated Exp-related packets and handling functions to support values larger than 2 billions (as seen in packetver `20170830` and newer). (#1859) +- Changed the diagnostic message in `skill_init_unit_layout()` to report the skill ID instead of its index. (#1854) + +### Fixed +- Corrected the Kafra dialog in case a Doram without the Summoner's Basic Skill attempts to open the Storage. (#1864) +- Changed the cell stack counting algorithm to ignore invisible NPCs, improving the Dancer Quest experience as well as other cases of hidden NPCs blocking off certain cells. (#1827) +- Improved the handling of the `cardfix` value to make it more resistant to overflows, especially in renewal mode. Simplified the related renewal/pre-renewal conditional code. (#1825) +- Fixed some compilation warnings occurring in VS2017. (#1870) + +### Other +- New versioning scheme and project changelogs/release notes (#1853) + +[Unreleased]: https://github.com/HerculesWS/Hercules/compare/stable...master +[v2017.10.22-1]: https://github.com/HerculesWS/Hercules/compare/v2017.10.22...v2017.10.22-1 +[v2017.10.22]: https://github.com/HerculesWS/Hercules/compare/6b1fe2d...v2017.10.22 diff --git a/conf/login/login-server.conf b/conf/login/login-server.conf index 71928e3d0..4ad02deb2 100644 --- a/conf/login/login-server.conf +++ b/conf/login/login-server.conf @@ -54,6 +54,22 @@ login_configuration: { date_format: "%Y-%m-%d %H:%M:%S" } + // for packet version >= 20170726 + users_count: { + // if false, dont show any colored strings. + // if true, show special users count numbers for coloring char servers. + send_user_count_description: true + + // users counts for use different colors. + // below 'low' show green text + // below 'medium' show oragne text + // below 'high' show red text + // higher 'high' show purple text + low: 200 + medium: 500 + high: 1000 + } + // Account engine configuration account: { // Can you use _M/_F to make new accounts on the server? diff --git a/conf/map/battle/party.conf b/conf/map/battle/party.conf index 07a0bdaea..a38321806 100644 --- a/conf/map/battle/party.conf +++ b/conf/map/battle/party.conf @@ -41,6 +41,12 @@ party_update_interval: 1000 // 1: Athena - bar is updated with the party map dots (up to 1 second delay) party_hp_mode: 0 +// When changing party leader, should the new leader be in the same map +// as the current leader. (Note 1) +// true: Aegis - They must be in the same map +// false: Athena - They can be in different maps +party_change_leader_same_map: true + // When 'Party Share' item sharing is enabled in a party, // announce in the party which party-member received the item and what's he received? (Note 1) show_party_share_picker: true diff --git a/conf/messages.conf b/conf/messages.conf index 155cfd881..78f0c6aa9 100644 --- a/conf/messages.conf +++ b/conf/messages.conf @@ -607,7 +607,10 @@ 668: Shadow Chaser T 669: Summoner -//670-855 FREE (please start using from the top if you need, leave the 670+ range for new jobs) +//670-853 FREE (please start using from the top if you need, leave the 670+ range for new jobs) + +// Mapflag to disable Autoloot Commands +854: Auto loot item are disabled on this map. // MVP exp message issue clients 2013-12-23cRagexe and newer. 855: Congratulations! You are the MVP! Your reward EXP Points are %u !! @@ -856,7 +859,7 @@ 1060: NoWarp | 1061: NoWarpTo | 1062: NoReturn | -//1063 FREE +1063: NoAutoloot | 1064: NoMemo | 1065: No Exp Penalty: %s | No Zeny Penalty: %s 1066: On diff --git a/db/constants.conf b/db/constants.conf index bc06eed72..0015646dd 100644 --- a/db/constants.conf +++ b/db/constants.conf @@ -426,7 +426,8 @@ constants_db: { mf_reset: 52 mf_notomb: 53 mf_nocashshop: 54 - mf_noviewid: 55 + mf_noautoloot: 55 + mf_noviewid: 56 comment__: "Cell Properties" cell_walkable: 0 diff --git a/doc/constants.md b/doc/constants.md index 60ba6908d..98c22bb3e 100644 --- a/doc/constants.md +++ b/doc/constants.md @@ -358,7 +358,8 @@ - `mf_reset`: 52 - `mf_notomb`: 53 - `mf_nocashshop`: 54 -- `mf_noviewid`: 55 +- `mf_noautoloot`: 55 +- `mf_noviewid`: 56 ### Cell Properties @@ -4004,6 +4005,11 @@ - `DATATYPE_VAR`: 4096 - `DATATYPE_LABEL`: 8192 +### Logmes types + +- `LOGMES_NPC`: 0 +- `LOGMES_ATCOMMAND`: 1 + ### Item Subtypes (Weapon types) - `W_FIST`: 0 @@ -4059,6 +4065,14 @@ - `DRESSROOM_OPEN`: 1 - `DRESSROOM_CLOSE`: 0 +### getmapinfo options + +- `MAPINFO_NAME`: 0 +- `MAPINFO_ID`: 1 +- `MAPINFO_SIZE_X`: 2 +- `MAPINFO_SIZE_Y`: 3 +- `MAPINFO_ZONE`: 4 + ### Renewal - `RENEWAL`: 1 diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 43616fddd..b5718a55e 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -3306,6 +3306,27 @@ Notice that NPC objects disabled with disablenpc() will still be located. --------------------------------------- +*getmapinfo(<info>{, "<map name>"}) +*getmapinfo(<info>{, <map id>}) + +This command returns various information about a specific map. If the second +argument is omitted, it will try to use the map of the attached NPC, or the +map of the attached player if the NPC can't be found. + +Valid <info> are: + MAPINFO_NAME name of the map + MAPINFO_ID numeric ID of the map + MAPINFO_ZONE name of the zone used by the map + MAPINFO_SIZE_X width of the map (cells on the x axis) + MAPINFO_SIZE_Y height of the map (cells on the y axis) + +Examples: + getmapinfo(MAPINFO_ID, "map name"); // ID from name + getmapinfo(MAPINFO_NAME, 3); // name from ID + getmapinfo(MAPINFO_ZONE); // zone, ie Normal, PvP, Jail, ... + +--------------------------------------- + *getunits(<type>, <variable>, <limit>, "<map>"{, <x1>, <y1>, <x2>, <y2>}) This function searches a whole map or area for units and adds their GID to @@ -7507,13 +7528,21 @@ window). It will not be displayed anywhere else. debugmes("\033[38D\033[K ==Message== \n"); // enable colour code. --------------------------------------- -*logmes("<message>") +*logmes("<message>"{, <log type>}) + +This command will write the message given to the map server log files, as +specified in 'conf/map/logs.conf'. If SQL logging is enabled, the message will +go to the specified log table. If logs are not enabled, nothing will happen. + +Log types are: -This command will write the message given to the map server NPC log file, -as specified in 'conf/map/logs.conf'. If SQL logging is enabled, the message -will go to the 'npclog' table. +LOGMES_NPC - log to the 'npclog' table (Default) +LOGMES_ATCOMMAND - log to the 'atcommandlog' table + +Example: -If logs are not enabled for NPCs, nothing will happen. + logmes("foobar"); + logmes("foobar", LOGMES_ATCOMMAND); --------------------------------------- diff --git a/npc/kafras/functions_kafras.txt b/npc/kafras/functions_kafras.txt index e1e547174..90334cc6e 100644 --- a/npc/kafras/functions_kafras.txt +++ b/npc/kafras/functions_kafras.txt @@ -216,14 +216,23 @@ function script F_KafStor { // Niflheim Specific Message if (getarg(2) == 1) { mes "^666666S-s-ssoooorry,"; - mes "y-you're a-a-aaaa"; - mes "Nooviiice... N-neeeds"; - mes "B-basic sssskill l-level 6...^000000"; + if (Class == Job_Summoner) { + mes "y-you n-neeed"; + mes "N-new b-basic sssskill...^000000"; + } else { + mes "y-you're a-a-aaaa"; + mes "Nooviiice... N-neeeds"; + mes "B-basic sssskill l-level 6...^000000"; + } return; } mes "I'm sorry, but you"; - mes "need the Novice's"; - mes "Basic Skill Level 6 to"; + if (Class == Job_Summoner) { + mes "need the New Basic Skill to"; + } else { + mes "need the Novice's"; + mes "Basic Skill Level 6 to"; + } mes "use the Storage Service."; return; } diff --git a/npc/re/instances/ghost_palace.txt b/npc/re/instances/ghost_palace.txt index 6e77db2f8..e4ca12f99 100644 --- a/npc/re/instances/ghost_palace.txt +++ b/npc/re/instances/ghost_palace.txt @@ -35,7 +35,7 @@ dali02,44,129,5 script Unpleasent Royal Guard 4_M_SAKRAYROYAL,{ if (BaseLevel < 120) { mes("[Unpleasent Royal Guard]"); mes("Althought I need help with a task, you are not strong enough to assist me, noob~!"); - next; + next(); mes("[Unpleasent Royal Guard]"); mes("Come back after when you have done some training and are at least level 120!"); close(); @@ -50,7 +50,7 @@ dali02,44,129,5 script Unpleasent Royal Guard 4_M_SAKRAYROYAL,{ mes("[Unpleasent Royal Guard]"); mes("Did the gate close?\r" "Please enter the gate as soon as you can next time."); - erasequest 1260; + erasequest(1260); close(); } mes("[Unpleasent Royal Guard]"); @@ -64,7 +64,7 @@ dali02,44,129,5 script Unpleasent Royal Guard 4_M_SAKRAYROYAL,{ mes("This is a solo instance. Please form a solo party before continuing."); close(); } - if (getcharid(CHAR_ID_CHAR) != getpartyleader(.@party_id,2)) { + if (getcharid(CHAR_ID_CHAR) != getpartyleader(.@party_id, 2)) { mes("[Unpleasent Royal Guard]"); mes("I'm looking for adventurers to help me!\r" "I want to talk to the team leader, can I?"); @@ -72,25 +72,25 @@ dali02,44,129,5 script Unpleasent Royal Guard 4_M_SAKRAYROYAL,{ } mes("[Unpleasent Royal Guard]"); mes("I need some help, even from the likes of you."); - next; + next(); mes("[Unpleasent Royal Guard]"); mes("In the middle of the battle the princess disappeared while I was guarding the palace."); - next; + next(); mes("[Unpleasent Royal Guard]"); mes("You run ahead and i will catch up.\r" "We must save her."); - next; + next(); if (select("I will help.", "This is not a good time.") == 2) { mes("[Unpleasent Royal Guard]"); mes("Even now all the royal guards are fighting and dying to the monsters."); - next; + next(); mes("[Unpleasent Royal Guard]"); mes("We must save the princess no matter how much fear grips our hearts!"); close(); } - .@instance = instance_create("Ghost Palace", .@party_id); + .@instance = instance_create(_("Ghost Palace"), .@party_id); .@p_name$ = getpartyname(.@party_id); - .@md_name$ = "Ghost Palace"; + .@md_name$ = _("Ghost Palace"); if (.@instance < 0) { mesf("Party Name: %s", .@p_name$); mesf("Party Leader: %s", strcharinfo(PC_NAME)); @@ -100,7 +100,8 @@ dali02,44,129,5 script Unpleasent Royal Guard 4_M_SAKRAYROYAL,{ if (instance_attachmap("1@spa", .@instance) != "") { instance_set_timeout(3600, 300, .@instance); instance_init(.@instance); - if (!questprogress(1260)) setquest 1260; + if (!questprogress(1260)) + setquest(1260); mes("[Unpleasent Royal Guard]"); mes("Thank You..\r" "I will open the secret passage to ^0000FFGhost Palace.^000000\r" @@ -117,23 +118,23 @@ dali02,41,134,0 script Interdimensional Device::gpportal PORTAL,{ if (BaseLevel < 120) { mes("[Unpleasent Royal Guard]"); mes("Althought I need help with a task, you are not strong enough to assist me, noob~!"); - next; + next(); mes("[Unpleasent Royal Guard]"); mes("Come back after when you have done some training and are at least level 120!"); close(); } if (questprogress(1261)) { if (questprogress(1261, PLAYTIME) == 2) { - erasequest 1261; + erasequest(1261); if (questprogress(1260)) - erasequest 1260; + erasequest(1260); end; } mes("[Unpleasent Royal Guard]"); mes("The monsters that attacked the palace are wandering around the secret entrance. It would be very bad if they spotted us... Please wait until the time limit for re-entrance passed."); close(); } - if (getcharid(CHAR_ID_CHAR) == getpartyleader(.@party_id,2) && !questprogress(1260)) { + if (getcharid(CHAR_ID_CHAR) == getpartyleader(.@party_id, 2) && !questprogress(1260)) { mes("[Unpleasent Royal Guard]"); mes("I'm looking for adventurers to help me!\r" "I want to talk to the team leader, can I?"); @@ -141,11 +142,11 @@ dali02,41,134,0 script Interdimensional Device::gpportal PORTAL,{ } mes("[Unpleasent Royal Guard]"); mes("I can see the secret passage into the Palace... Are you ready to save the princess?!"); - next; + next(); if (select("Enter", "Stop") == 2) { mes("[Unpleasent Royal Guard]"); mes("Even now all the royal guards are fighting and dying to the monsters."); - next; + next(); mes("[Unpleasent Royal Guard]"); mes("We must save the princess no matter how much fear grips our hearts!"); close(); @@ -155,8 +156,9 @@ dali02,41,134,0 script Interdimensional Device::gpportal PORTAL,{ close(); } mapannounce("dali", sprintf(_$("%s of the party, %s, is entering the Ghost Palace."), strcharinfo(PC_NAME), getpartyname(getcharid(CHAR_ID_PARTY))), bc_map, C_SPRINGGREEN); - if (!questprogress(1260)) setquest 1260; - setquest 1261; + if (!questprogress(1260)) + setquest(1260); + setquest(1261); warp("1@spa", 198, 188); close(); } @@ -165,35 +167,35 @@ dali02,41,134,0 script Interdimensional Device::gpportal PORTAL,{ mes("[King]"); mes("You are hereby appointed as the personal guard to Princess Tiara. I trust your loyalty above all else."); npctalk(_("You are hereby appointed as the personal guard to Princess Tiara. I trust your loyalty above all else."), instance_npcname("King#gp1")); - next; + next(); mes("[Lurid Royal Guard]"); mes("I will protect the Princess with my life."); npctalk(_("I will protect the Princess with my life."), instance_npcname("Lurid Royal Guard#gp1")); - next; + next(); mes("[King]"); mes("The marriage arrangements are going as planned. The prince is here to meet the princess."); npctalk(_("The marriage arrangements are going as planned. The prince is here to meet the princess."), instance_npcname("King#gp1")); - next; + next(); mes("[Lurid Royal Guard]"); mes("...Yes, your majesty."); npctalk(_("...Yes, your majesty."), instance_npcname("Lurid Royal Guard#gp1")); - next; + next(); mes("[King]"); mes("My gods, there are monsters in the castle! Get rid of them now!"); npctalk(_("My gods, there are monsters in the castle! Get rid of them now!"), instance_npcname("King#gp1")); close2(); - donpcevent instance_npcname("#gp1control")+"::OnStart"; + donpcevent(instance_npcname("#gp1control")+"::OnStart"); end; } 1@spa,1,1,1 script #gp1control HIDDEN_NPC,{ end; OnStart: - hideonnpc instance_npcname("Lurid Royal Guard#gp1"); - hideonnpc instance_npcname("King#gp1"); - sleep 1000; + hideonnpc(instance_npcname("Lurid Royal Guard#gp1")); + hideonnpc(instance_npcname("King#gp1")); + sleep(1000); OnSummon: - sleep 2000; + sleep(2000); .@map$ = instance_mapname("1@spa"); areamonster(.@map$, 182, 190, 214, 214, _("Cursed Sentinel"), CURSED_SENTINEL, 2, instance_npcname("#gp1control")+"::OnMyMobDead"); areamonster(.@map$, 182, 190, 214, 214, _("Cursed Solider"), CURSED_SOLDIER, 2, instance_npcname("#gp1control")+"::OnMyMobDead"); @@ -203,16 +205,16 @@ OnMyMobDead: end; if ('gp1 < 2) { ++'gp1; - donpcevent instance_npcname("#gp1control")+"::OnSummon"; + donpcevent(instance_npcname("#gp1control")+"::OnSummon"); end; } mapannounce(instance_mapname("1@spa"), _("The passage on 2nd floor in the palace of the ghost is open."), bc_map, C_YELLOW); - enablenpc instance_npcname("#gp1warp"); - disablenpc instance_npcname("#gp1control"); + enablenpc(instance_npcname("#gp1warp")); + disablenpc(instance_npcname("#gp1control")); end; OnInstanceInit: 'gp1 = 0; - disablenpc instance_npcname("#gp1warp"); + disablenpc(instance_npcname("#gp1warp")); end; } @@ -221,53 +223,53 @@ OnInstanceInit: mes("[Lurid Royal Guard]"); mes("Your Highness, the King has invited a prince from a neighboring country to be your betrothed. Be ready to meet him..."); npctalk(_("Your Highness, the King has invited a prince from a neighboring country to be your betrothed. Be ready to meet him..."), instance_npcname("Lurid Royal Guard#gp2")); - next; + next(); mes("[Princess Tiara]"); mes("If...if a marriage is arranged what should I do ?"); npctalk(_("If...if a marriage is arranged what should I do ?"), instance_npcname("Tiara Princess#gp2")); - next; + next(); mes("[Lurid Royal Guard]"); mes("The only thing I can do is protect you from physical harm."); npctalk(_("The only thing I can do is protect you from physical harm."), instance_npcname("Lurid Royal Guard#gp2")); - next; + next(); mes("[Princess Tiara]"); mes("Then, what can I do?"); npctalk(_("Then, what can I do?"), instance_npcname("Tiara Princess#gp2")); - next; + next(); mes("[Lurid Royal Guard]"); mes("......"); mes("You must decide that for yourself your highness..."); npctalk(_("You must decide that for yourself your highness..."), instance_npcname("Lurid Royal Guard#gp2")); - next; + next(); mes("[Princess Tiara]"); mes("Would it be easier for you if I were married and sent off to another country?"); npctalk(_("Would it be easier for you if I were married and sent off to another country?"), instance_npcname("Tiara Princess#gp2")); - next; + next(); cutin("", 255); mes("[Lurid Royal Guard]"); mes("I will alway stand by you and protect you forever."); npctalk(_("I will alway stand by you and protect you forever."), instance_npcname("Lurid Royal Guard#gp2")); - next; + next(); mes("[Princess Tiara]"); mes("Monsters in the castle? Protect me!"); npctalk(_("Monsters in the castle? Protect me!"), instance_npcname("Tiara Princess#gp2")); - next; + next(); mes("[Lurid Royal Guard]"); mes("Step back, Let's go!"); npctalk(_("Step back, Let's go!"), instance_npcname("Lurid Royal Guard#gp2")); close2(); - donpcevent instance_npcname("#gp2control")+"::OnStart"; + donpcevent(instance_npcname("#gp2control")+"::OnStart"); end; } 1@spa,1,1,1 script #gp2control HIDDEN_NPC,{ end; OnStart: - hideonnpc instance_npcname("Lurid Royal Guard#gp2"); - hideonnpc instance_npcname("Tiara Princess#gp2"); - sleep 1000; + hideonnpc(instance_npcname("Lurid Royal Guard#gp2")); + hideonnpc(instance_npcname("Tiara Princess#gp2")); + sleep(1000); OnSummon: - sleep 2000; + sleep(2000); .@map$ = instance_mapname("1@spa"); areamonster(.@map$, 143, 96, 94, 143, _("Broken Mind"), BROKEN_MIND, 3, instance_npcname("#gp2control")+"::OnMyMobDead"); areamonster(.@map$, 143, 96, 94, 143, _("Floating Word"), FLOATING_WORD, 4, instance_npcname("#gp2control")+"::OnMyMobDead"); @@ -277,11 +279,11 @@ OnMyMobDead: if (mobcount(instance_mapname("1@spa"), instance_npcname("#gp2control")+"::OnMyMobDead")) end; mapannounce(instance_mapname("1@spa"), _("The passage on the 3rd floor of the palace is open."), bc_map, C_YELLOW); - enablenpc instance_npcname("#gp2warp"); - disablenpc instance_npcname("#gp2control"); + enablenpc(instance_npcname("#gp2warp")); + disablenpc(instance_npcname("#gp2control")); end; OnInstanceInit: - disablenpc instance_npcname("#gp2warp"); + disablenpc(instance_npcname("#gp2warp")); end; } @@ -289,29 +291,29 @@ OnInstanceInit: mes("[King]"); mes("It was you who brought the monsters here, you want to get rid of me and have the princess for yourself?"); npctalk(_("It was you who brought the monsters here, you want to get rid of me and have the princess for yourself?"), instance_npcname("King#gp3")); - next; + next(); mes("[Lurid Royal Guard]"); mes("It's a trap, you should trust me, your majesty!"); npctalk(_("It's a trap, you should trust me, your majesty!"), instance_npcname("Lurid Royal Guard#gp3")); - next; + next(); mes("[King]"); mes("Shut up! You're betrayed me ! I trusted you... you must pay for your disgrace."); npctalk(_("Shut up! You're betrayed me ! I trusted you... you must pay for your disgrace."), instance_npcname("King#gp3")); - next; + next(); mes("[King]"); mes("You will suffer for the rest of your life."); npctalk(_("You will suffer for the rest of your life."), instance_npcname("King#gp3")); close2(); - donpcevent instance_npcname("#gp3control")+"::OnStart"; + donpcevent(instance_npcname("#gp3control")+"::OnStart"); end; } 1@spa,54,28,0 script #gp3warp WARPNPC,1,1,{ - if (!'gp5) + if (!'gp5) { warp("1@spa", 218, 186); - else { + } else { if (questprogress(40024)) - completequest 40024; + completequest(40024); mes("It is time to leave Palace of the ghost.\r" "Everything is completed.\r" "Everything will be vanished..."); @@ -332,7 +334,7 @@ OnInstanceInit: 1@spa,35,56,1 script Ominous Voice#gp3 4_TRACE,{ end; OnStart: - initnpctimer; + initnpctimer(); end; OnTimer3000: npctalk(_("Oh, faithful royal guard, you are trapped.")); @@ -356,32 +358,32 @@ OnTimer21000: npctalk(_("Kukuku... What do you want boy?")); end; OnTimer24000: - stopnpctimer; - hideonnpc instance_npcname("Ominous Voice#gp3"); - hideonnpc instance_npcname("Lurid Royal Guard#gp3"); - donpcevent instance_npcname("#gp3control")+"::OnSummon"; + stopnpctimer(); + hideonnpc(instance_npcname("Ominous Voice#gp3")); + hideonnpc(instance_npcname("Lurid Royal Guard#gp3")); + donpcevent(instance_npcname("#gp3control")+"::OnSummon"); end; } 1@spa,1,1,1 script #gp3control HIDDEN_NPC,{ end; OnStart: - hideonnpc instance_npcname("King#gp3"); - hideonnpc instance_npcname("Soldier#gp3_1"); - hideonnpc instance_npcname("Soldier#gp3_2"); - hideonnpc instance_npcname("Soldier#gp3_3"); - hideonnpc instance_npcname("Captain of the Guard#gp3"); - donpcevent instance_npcname("Ominous Voice#gp3")+"::OnStart"; + hideonnpc(instance_npcname("King#gp3")); + hideonnpc(instance_npcname("Soldier#gp3_1")); + hideonnpc(instance_npcname("Soldier#gp3_2")); + hideonnpc(instance_npcname("Soldier#gp3_3")); + hideonnpc(instance_npcname("Captain of the Guard#gp3")); + donpcevent(instance_npcname("Ominous Voice#gp3")+"::OnStart"); end; OnSummon: - initnpctimer; + initnpctimer(); .@map$ = instance_mapname("1@spa"); 'talkid[0] = areamonster(.@map$, 61, 63, 24, 24, _("Cursed Memory"), CURSED_MEMORY, 2 + 'gp3, instance_npcname("#gp3control")+"::OnMyMobDead"); 'talkid[1] = areamonster(.@map$, 61, 63, 24, 24, _("Colorless Vow"), COLORLESS_VOW, 3 + 'gp3, instance_npcname("#gp3control")+"::OnMyMobDead"); 'talkid[2] = areamonster(.@map$, 61, 63, 24, 24, _("Old Friendship"), OLD_FRIENDSHIP, 2 + 'gp3, instance_npcname("#gp3control")+"::OnMyMobDead"); end; OnTimer2000: - stopnpctimer; + stopnpctimer(); unittalk('talkid[0], _("Faithful Guards")); unittalk('talkid[1], _("Run!")); unittalk('talkid[2], _("Being framed...")); @@ -390,21 +392,21 @@ OnMyMobDead: if (mobcount(instance_mapname("1@spa"), instance_npcname("#gp3control")+"::OnMyMobDead")) end; if (!'gp3) { - mapannounce instance_mapname("1@spa"), "The passage on the 4rd floor of the palace is open.", bc_map, C_YELLOW; - enablenpc instance_npcname("#gp3warp"); - donpcevent instance_npcname("#gp4control")+"::OnSummon"; - disablenpc instance_npcname("#gp1warp"); + mapannounce(instance_mapname("1@spa"), _("The passage on the 4rd floor of the palace is open."), bc_map, C_YELLOW); + enablenpc(instance_npcname("#gp3warp")); + donpcevent(instance_npcname("#gp4control")+"::OnSummon"); + disablenpc(instance_npcname("#gp1warp")); } ++'gp3; - if ('gp3 < 5) - donpcevent instance_npcname("#gp3control")+"::OnSummon"; - else { - stopnpctimer; - disablenpc instance_npcname("#gp3control"); + if ('gp3 < 5) { + donpcevent(instance_npcname("#gp3control")+"::OnSummon"); + } else { + stopnpctimer(); + disablenpc(instance_npcname("#gp3control")); } end; OnInstanceInit: - disablenpc instance_npcname("#gp3warp"); + disablenpc(instance_npcname("#gp3warp")); 'gp3 = 0; end; } @@ -413,26 +415,26 @@ OnInstanceInit: mes("[Lurid Royal Guard]"); mes("Where is Princess Tiara?"); npctalk(_("Where is Princess Tiara?"), instance_npcname("Lurid Royal Guard#gp4")); - next; + next(); mes("[Visiting Prince]"); mes("You are too late... but you brought what I was looking for. Thanks for your help."); npctalk(_("You are too late... but you brought what I was looking for. Thanks for your help."), instance_npcname("Visiting Prince#gp4")); - next; + next(); mes("[Visiting Prince]"); mes("Cursed Thanatos Magic Trace! Are you ready to have a new master?"); npctalk(_("Cursed Thanatos Magic Trace! Are you ready to have a new master?"), instance_npcname("Visiting Prince#gp4")); - next; + next(); cutin("tartanos", 3); mes("[Thanatos Magic Trace]"); mes("How dare you!"); npctalk(_("How dare you!"), instance_npcname("Thanatos Magic Trace#gp4")); - next; + next(); mes("[Visiting Prince]"); mes("Aah, aah!!!"); npctalk(_("Aah, aah!!!"), instance_npcname("Visiting Prince#gp4")); close2(); cutin("", 255); - donpcevent instance_npcname("#gp4control")+"::OnBoss"; + donpcevent(instance_npcname("#gp4control")+"::OnBoss"); end; } @@ -442,56 +444,56 @@ OnStart: end; OnSummon: .@map$ = instance_mapname("1@spa"); - areamonster(.@map$, 182, 217, 214, 188, _("Cursed Sentinel"), CURSED_SENTINEL, rand(2,3), instance_npcname("#gp4control")+"::OnMyMobDead"); - areamonster(.@map$, 182, 217, 214, 188, _("Sweet Slaughter"), SWEET_SLAUGHTER, rand(2,3), instance_npcname("#gp4control")+"::OnMyMobDead"); + areamonster(.@map$, 182, 217, 214, 188, _("Cursed Sentinel"), CURSED_SENTINEL, rand(2, 3), instance_npcname("#gp4control")+"::OnMyMobDead"); + areamonster(.@map$, 182, 217, 214, 188, _("Sweet Slaughter"), SWEET_SLAUGHTER, rand(2, 3), instance_npcname("#gp4control")+"::OnMyMobDead"); end; OnMyMobDead: if (mobcount(instance_mapname("1@spa"), instance_npcname("#gp4control")+"::OnMyMobDead")) end; ++'gp4; if ('gp4 > 3) - donpcevent instance_npcname("#gp4control")+"::OnStory"; + donpcevent(instance_npcname("#gp4control")+"::OnStory"); else - donpcevent instance_npcname("#gp4control")+"::OnSummon"; + donpcevent(instance_npcname("#gp4control")+"::OnSummon"); end; OnStory: for(.@i = 1; .@i <= 4; ++.@i) - enablenpc instance_npcname("Soldier's Corpse#gp4_"+.@i); - enablenpc instance_npcname("Captain's Corpse#gp4"); - enablenpc instance_npcname("King's Corpse#gp4"); - enablenpc instance_npcname("Lurid Royal Guard#gp4"); - enablenpc instance_npcname("Thanatos Magic Trace#gp4"); - enablenpc instance_npcname("Visiting Prince#gp4"); + enablenpc(instance_npcname("Soldier's Corpse#gp4_"+.@i)); + enablenpc(instance_npcname("Captain's Corpse#gp4")); + enablenpc(instance_npcname("King's Corpse#gp4")); + enablenpc(instance_npcname("Lurid Royal Guard#gp4")); + enablenpc(instance_npcname("Thanatos Magic Trace#gp4")); + enablenpc(instance_npcname("Visiting Prince#gp4")); end; OnBoss: for(.@i = 1; .@i <= 4; ++.@i) - hideonnpc instance_npcname("Soldier's Corpse#gp4_"+.@i); - hideonnpc instance_npcname("Captain's Corpse#gp4"); - hideonnpc instance_npcname("King's Corpse#gp4"); - hideonnpc instance_npcname("Lurid Royal Guard#gp4"); - hideonnpc instance_npcname("Thanatos Magic Trace#gp4"); - hideonnpc instance_npcname("Visiting Prince#gp4"); - sleep 1000; + hideonnpc(instance_npcname("Soldier's Corpse#gp4_"+.@i)); + hideonnpc(instance_npcname("Captain's Corpse#gp4")); + hideonnpc(instance_npcname("King's Corpse#gp4")); + hideonnpc(instance_npcname("Lurid Royal Guard#gp4")); + hideonnpc(instance_npcname("Thanatos Magic Trace#gp4")); + hideonnpc(instance_npcname("Visiting Prince#gp4")); + sleep(1000); monster(instance_mapname("1@spa"), 197, 218, _("Torturous Redeemer"), TORTUROUS_REDEEMER, 1, instance_npcname("#gp4control")+"::OnBossDead"); end; OnBossDead: monster(instance_mapname("1@spa"), 197, 180, _("Sweet Slaughter"), SWEET_SLAUGHTER, 1, instance_npcname("#gp4control")+"::OnMobDead"); end; OnMobDead: - mapannounce instance_mapname("1@spa"), "The passage on the 5th floor of the palace is open.", bc_map, C_YELLOW; - enablenpc instance_npcname("#gp4warp"); - donpcevent instance_npcname("#gp5control")+"::OnStart"; - disablenpc instance_npcname("#gp4control"); + mapannounce(instance_mapname("1@spa"), _("The passage on the 5th floor of the palace is open."), bc_map, C_YELLOW); + enablenpc(instance_npcname("#gp4warp")); + donpcevent(instance_npcname("#gp5control")+"::OnStart"); + disablenpc(instance_npcname("#gp4control")); end; OnInstanceInit: - disablenpc instance_npcname("#gp4warp"); + disablenpc(instance_npcname("#gp4warp")); for(.@i = 1; .@i <= 4; ++.@i) - disablenpc instance_npcname("Soldier's Corpse#gp4_"+.@i); - disablenpc instance_npcname("Captain's Corpse#gp4"); - disablenpc instance_npcname("King's Corpse#gp4"); - disablenpc instance_npcname("Lurid Royal Guard#gp4"); - disablenpc instance_npcname("Thanatos Magic Trace#gp4"); - disablenpc instance_npcname("Visiting Prince#gp4"); + disablenpc(instance_npcname("Soldier's Corpse#gp4_"+.@i)); + disablenpc(instance_npcname("Captain's Corpse#gp4")); + disablenpc(instance_npcname("King's Corpse#gp4")); + disablenpc(instance_npcname("Lurid Royal Guard#gp4")); + disablenpc(instance_npcname("Thanatos Magic Trace#gp4")); + disablenpc(instance_npcname("Visiting Prince#gp4")); 'gp4 = 0; end; } @@ -500,35 +502,35 @@ OnInstanceInit: mes("[Princess Tiara]"); mes("You kept your promise."); npctalk(_("You kept your promise."), instance_npcname("Tiara Princess#gp5")); - next; + next(); mes("[Lurid Royal Guard]"); mes("princess!"); npctalk(_("princess"), instance_npcname("Lurid Royal Guard#gp5")); - next; + next(); cutin("npc-tiara", 3); mes("[Princess Tiara]"); mes("Thank you..now I can rest at beside you..."); npctalk(_("Thank you..now I can rest at beside you..."), instance_npcname("Tiara Princess#gp5")); - next; + next(); mes("[Lurid Royal Guard]"); mes("No..NO!!!!!!"); npctalk(_("No..NO!!!!!!"), instance_npcname("Lurid Royal Guard#gp5")); - next; + next(); mes("[The Voice of Princess Tiara]"); mes("I want to be with you forever in peace...forever..."); npctalk(_("I want to be with you forever in peace...forever..."), instance_npcname("Tiara Princess#gp5")); - next; + next(); cutin("b-tiara", 3); mes("[Lurid Royal Guard]"); mes("no.....Ahh ahh ahh!!!~!"); npctalk(_("no.....Ahh ahh ahh!!!~!"), instance_npcname("Lurid Royal Guard#gp5")); - next; + next(); mes("[The Voice of Princess Tiara]"); mes("I love you..."); npctalk(_("I love you..."), instance_npcname("Tiara Princess#gp5")); close2(); cutin("", 255); - donpcevent instance_npcname("#gp5control")+"::OnStart2"; + donpcevent(instance_npcname("#gp5control")+"::OnStart2"); end; } @@ -537,63 +539,63 @@ OnInstanceInit: mes("[Lurid Royal Guard]"); mes("Are you satisfied..? Thanatos Magic Trace?"); npctalk(_("Are you satisfied..? Thanatos Magic Trace?"), instance_npcname("Sakray#gp5")); - next; + next(); mes("[Thanatos Magic Trace]"); mes("I need more blood..Sakray, offer me his blood."); npctalk(_("I need more blood..Sakray, offer me his blood."), instance_npcname("Thanatos Magic Trace#gp5")); - next; + next(); mes("[Sakray]"); mes("Okay, that is good. A traveler.\r" "Did you see?"); npctalk(_("Okay, that is good. A traveler. Did you see?"), instance_npcname("Sakray#gp5")); - next; + next(); mesf("[%s]", strcharinfo(PC_NAME)); mes("Sakray, What do you want sympathy? Or is it a trap?"); unittalk(getcharid(CHAR_ID_ACCOUNT), _("Sakray, What do you want sympathy? Or is it a trap?")); - next; + next(); mes("[Sakray]"); mes("Non...I did not need to make an effort to catch a novice."); npctalk(_("Non...I did not need to make an effort to catch a novice."), instance_npcname("Sakray#gp5")); - next; + next(); mesf("[%s]", strcharinfo(PC_NAME)); mes("If so... then why...?"); unittalk(getcharid(CHAR_ID_ACCOUNT), _("If so... then why...?")); - next; + next(); cutin("cry-b", 3); mes("[Sakray]"); mes("I wanted to get rid of a piece of humanity inside of me through you."); npctalk(_("I wanted to get rid of a piece of humanity inside of me through you."), instance_npcname("Sakray#gp5")); - next; + next(); mes("[Sakray]"); mes("I am quite satisfied with the result."); - next; + next(); mes("[Thanatos Magic Trace]"); mes("Sakray, offer the blood to me now!"); npctalk(_("Sakray, offer the blood to me now!"), instance_npcname("Thanatos Magic Trace#gp5")); - next; + next(); mes("[Sakray]"); mes("If you were me, what would you do?"); - next; + next(); mes("[Sakray]"); mes("Can you set yourself free from this curse?"); - next; + next(); mesf("[%s]", strcharinfo(PC_NAME)); mes("..."); unittalk(getcharid(CHAR_ID_ACCOUNT), _("...")); - next; + next(); mes("[Sakray]"); mes("Heh heh... I will keep watching you until the day you grow up enough."); - next; + next(); mes("[Sakray]"); mes("I am willing to hunt you later for Thanatos."); - next; + next(); cutin("", 255); mes("[Sakray]"); mes("Farewell then."); close2(); - donpcevent instance_npcname("#gp5control")+"::OnEnd"; - hideonnpc instance_npcname("Sakray#gp5"); - hideonnpc instance_npcname("Thanatos Magic Trace#gp5"); + donpcevent(instance_npcname("#gp5control")+"::OnEnd"); + hideonnpc(instance_npcname("Sakray#gp5")); + hideonnpc(instance_npcname("Thanatos Magic Trace#gp5")); end; } @@ -601,25 +603,25 @@ OnInstanceInit: end; OnStart: stopnpctimer instance_npcname("#gp3control"); - disablenpc instance_npcname("#gp3control"); - killmonster instance_mapname("1@spa"), "All"; - disablenpc instance_npcname("#gp3warp"); - enablenpc instance_npcname("Lurid Royal Guard#gp5"); - enablenpc instance_npcname("Tiara Princess#gp5"); + disablenpc(instance_npcname("#gp3control")); + killmonster(instance_mapname("1@spa"), "All"); + disablenpc(instance_npcname("#gp3warp")); + enablenpc(instance_npcname("Lurid Royal Guard#gp5")); + enablenpc(instance_npcname("Tiara Princess#gp5")); end; OnStart2: - hideonnpc instance_npcname("Lurid Royal Guard#gp5"); - hideonnpc instance_npcname("Tiara Princess#gp5"); - sleep 2000; + hideonnpc(instance_npcname("Lurid Royal Guard#gp5")); + hideonnpc(instance_npcname("Tiara Princess#gp5")); + sleep(2000); OnSummon: - initnpctimer; + initnpctimer(); .@map$ = instance_mapname("1@spa"); - 'talkid[0] = areamonster(.@map$, 61, 63, 24, 24, _("Forgotten Name"), FORGOTTEN_NAME, rand(1,2), instance_npcname("#gp5control")+"::OnMyMobDead"); + 'talkid[0] = areamonster(.@map$, 61, 63, 24, 24, _("Forgotten Name"), FORGOTTEN_NAME, rand(1, 2), instance_npcname("#gp5control")+"::OnMyMobDead"); 'talkid[1] = areamonster(.@map$, 61, 63, 24, 24, _("Colorless Vow"), COLORLESS_VOW, 2, instance_npcname("#gp5control")+"::OnMyMobDead"); - 'talkid[2] = areamonster(.@map$, 61, 63, 24, 24, _("Sweet Slaughter"), SWEET_SLAUGHTER, rand(1,2), instance_npcname("#gp5control")+"::OnMyMobDead"); + 'talkid[2] = areamonster(.@map$, 61, 63, 24, 24, _("Sweet Slaughter"), SWEET_SLAUGHTER, rand(1, 2), instance_npcname("#gp5control")+"::OnMyMobDead"); end; OnTimer2000: - stopnpctimer; + stopnpctimer(); unittalk('talkid[0], _("What is this..??")); unittalk('talkid[1], _("Wake up! look at us... We are monsters?")); unittalk('talkid[2], _("Sakray killed the princess!")); @@ -629,51 +631,51 @@ OnMyMobDead: end; ++'gp5; if ('gp5 > 2) - donpcevent instance_npcname("#gp5control")+"::OnStory"; + donpcevent(instance_npcname("#gp5control")+"::OnStory"); else - donpcevent instance_npcname("#gp5control")+"::OnSummon"; + donpcevent(instance_npcname("#gp5control")+"::OnSummon"); end; OnBossDead: - enablenpc instance_npcname("Sakray#gp5"); - enablenpc instance_npcname("Thanatos Magic Trace#gp5"); + enablenpc(instance_npcname("Sakray#gp5")); + enablenpc(instance_npcname("Thanatos Magic Trace#gp5")); end; OnStory: - stopnpctimer; + stopnpctimer(); 'BossID = monster(instance_mapname("1@spa"), 44, 47, _("Torturous Redeemer"), E_TORTUROUS_REDEEMER, 1, instance_npcname("#gp5control")+"::OnBossDead"); unittalk('BossID, _("Thanatos Magic Trace! I will destroy you if I can't have you... Oh no! How could this be?")); - sleep 3000; - unitkill 'BossID; + sleep(3000); + unitkill('BossID); end; OnEnd: - hideoffnpc instance_npcname("Voice of Princess Tiara"); - hideoffnpc instance_npcname("Voice of Sakray"); - hideoffnpc instance_npcname("Thanatos Magic Trace"); + hideoffnpc(instance_npcname("Voice of Princess Tiara")); + hideoffnpc(instance_npcname("Voice of Sakray")); + hideoffnpc(instance_npcname("Thanatos Magic Trace")); npctalk(_("What can I do for you?"), instance_npcname("Voice of Princess Tiara")); - sleep 3000; + sleep(3000); npctalk(_("I will always stand by you. Please reset beside me."), instance_npcname("Voice of Sakray")); - sleep 3000; + sleep(3000); npctalk(_("Your soul is mine until you find the blood that satisfies me.."), instance_npcname("Thanatos Magic Trace")); - sleep 3000; + sleep(3000); npctalk(_("Reset in the shadow with me."), instance_npcname("Voice of Sakray")); - sleep 3000; + sleep(3000); npctalk(_("In the dark forever..."), instance_npcname("Voice of Sakray")); - sleep 3000; + sleep(3000); mapannounce(instance_mapname("1@spa"), _("It is time to leave the Ghost Palace."), bc_map, C_YELLOW); - enablenpc instance_npcname("King#gpend"); - enablenpc instance_npcname("#gp3warp"); - hideonnpc instance_npcname("Voice of Princess Tiara"); - hideonnpc instance_npcname("Voice of Sakray"); - hideonnpc instance_npcname("Thanatos Magic Trace"); + enablenpc(instance_npcname("King#gpend")); + enablenpc(instance_npcname("#gp3warp")); + hideonnpc(instance_npcname("Voice of Princess Tiara")); + hideonnpc(instance_npcname("Voice of Sakray")); + hideonnpc(instance_npcname("Thanatos Magic Trace")); end; OnInstanceInit: - disablenpc instance_npcname("Lurid Royal Guard#gp5"); - disablenpc instance_npcname("Tiara Princess#gp5"); - disablenpc instance_npcname("Thanatos Magic Trace#gp5"); - disablenpc instance_npcname("Sakray#gp5"); - disablenpc instance_npcname("King#gpend"); - hideonnpc instance_npcname("Voice of Princess Tiara"); - hideonnpc instance_npcname("Voice of Sakray"); - hideonnpc instance_npcname("Thanatos Magic Trace"); + disablenpc(instance_npcname("Lurid Royal Guard#gp5")); + disablenpc(instance_npcname("Tiara Princess#gp5")); + disablenpc(instance_npcname("Thanatos Magic Trace#gp5")); + disablenpc(instance_npcname("Sakray#gp5")); + disablenpc(instance_npcname("King#gpend")); + hideonnpc(instance_npcname("Voice of Princess Tiara")); + hideonnpc(instance_npcname("Voice of Sakray")); + hideonnpc(instance_npcname("Thanatos Magic Trace")); 'gp5 = 0; end; } @@ -682,34 +684,34 @@ OnInstanceInit: mes("[King]"); mes("Hey there, are you alive?\r" "I did not expect to meet someone alive"); - next; + next(); mes("[King]"); mes("Do you possibly have ^009900Gray Piece^000000?\r" "Can you give it to me?\r" "The old memory of faithful royal guard,\r" "the memory of everyone he loved becomes broken pieces and are contained inside of them."); - next; + next(); mes("[King]"); mes("Will you give ^009900Gray Piece^000000 to me?\r" "The guilt is eating my soul.\r" "My soul is stuck in ghost palace."); - next; + next(); mes("[King]"); mes("I am collecting Sakray's abandoned memories from these shards."); - next; + next(); mes("[King]"); mes("If you give any Gray Shards to me, I can make equipment for you."); - next; + next(); mes("[King]"); mes("The cursed knight...\r" "Please help me save the soul of Sakray."); - next; + next(); setarray(.@items_list, - Thanos_Sword, Thanos_Great_Sword, Thanos_Spear, Thanos_Long_Spear, Thanos_Staff, Thanos_Rod, Thanos_Bow, - Thanos_Dagger, Thanos_Katar, Thanos_Knuckle, Thanos_Hammer, Thanos_Axe, Thanos_Violin, Thanos_Whip, Shield_Of_Gray, - Armor_Of_Gray, Gray_Robe, Cloak_Of_Gray, Boots_Of_Gray, Gray_Helmet); + Thanos_Sword, Thanos_Great_Sword, Thanos_Spear, Thanos_Long_Spear, Thanos_Staff, Thanos_Rod, Thanos_Bow, + Thanos_Dagger, Thanos_Katar, Thanos_Knuckle, Thanos_Hammer, Thanos_Axe, Thanos_Violin, Thanos_Whip, Shield_Of_Gray, + Armor_Of_Gray, Gray_Robe, Cloak_Of_Gray, Boots_Of_Gray, Gray_Helmet); - setarray .@cost, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 100, 100, 100, 100, 100, 100; + setarray(.@cost, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 100, 100, 100, 100, 100, 100); .@menulist$ = ""; for (.@i = 0; .@i < getarraysize(.@items_list); ++.@i) .@menulist$ += getitemname(.@items_list[.@i])+":"; @@ -721,19 +723,19 @@ OnInstanceInit: "I believe collecting Gray Shards is the only method to save him."); close(); } - next; + next(); mes("[King]"); mesf("to make a ^FF0000%s^000000 \r" "I need %d ^009900Gray Shard^000000", getitemname(.@items_list[.@choice]), .@cost[.@choice]); - switch (select("Cancel", "hand over "+.@cost[.@choice]+" Gray Shard.")) { + switch (select("Cancel", sprintf(_$("hand over %d Gray Shard."), .@cost[.@choice]))) { case 1: - next; + next(); mes("[King]"); mes("Someday, Sakray will get out of curse for sure. I believe"); - next; + next(); break; case 2: - next; + next(); if (countitem(Gray_Shard) < .@cost[.@choice]) { mes("[King]"); mes("You don't have enough Gray Shards."); @@ -743,20 +745,20 @@ OnInstanceInit: mes("[King]"); mesf("I will make a ^FF0000%s^000000 \r" "with %d ^009900Gray Shard^000000", getitemname(.@items_list[.@choice]), .@cost[.@choice]); - next; + next(); mes("[King]"); mes("You see a light through the folded hands of the king and it gradually takes on a shape."); - next; + next(); mes("[King]"); mesf("All right, it is done.\r" "Take this ^FF0000%s.^000000\r" "Use it to confront Sakray and Thanatos.", getitemname(.@items_list[.@choice])); - next; + next(); mes("[King]"); mes("The power requires a sacrifice.\r" "Please be careful..."); delitem(Gray_Shard, .@cost[.@choice]); - getitem .@items_list[.@choice], 1; + getitem(.@items_list[.@choice], 1); close(); } } @@ -766,27 +768,33 @@ OnInstanceInit: 1@spa,198,201,1 script Lurid Royal Guard#gp1 4_M_SAKRAYROYAL,{ end; } + 1@spa,197,217,0 warp #gp1warp 1,1,1@spa,114,120 // 2nd floor npc's 1@spa,135,125,3 script Tiara Princess#gp2 4_F_MAYSEL,{ end; } + 1@spa,117,137,0 warp #gp2warp 1,1,1@spa,60,43 // 3rd floor npc's 1@spa,30,58,5 script Lurid Royal Guard#gp3 4_M_SAKRAY_TIED,{ end; } + 1@spa,28,52,0 script Captain of the Guard#gp3 4_M_KY_KNT,{ end; } + 1@spa,30,52,0 script Soldier#gp3_1 4_M_KY_SOLD,{ end; } + 1@spa,34,53,1 script Soldier#gp3_2 4_M_CRU_SOLD,{ end; } + 1@spa,25,53,0 script Soldier#gp3_3 4_M_CRU_SOLD,{ end; } @@ -795,43 +803,54 @@ OnInstanceInit: 1@spa,201,198,1 script Soldier's Corpse#gp4_1 4_M_DIEMAN,{ end; } + 1@spa,191,207,0 script Soldier's Corpse#gp4_2 4_M_DIEMAN,{ end; } + 1@spa,206,209,0 script Soldier's Corpse#gp4_3 4_M_DIEMAN,{ end; } + 1@spa,189,193,0 script Soldier's Corpse#gp4_4 4_M_DIEMAN,{ end; } + 1@spa,211,194,4 script Captain's Corpse#gp4 4_M_LIEMAN,{ end; } + 1@spa,194,214,5 script King's Corpse#gp4 4_M_TRISTAN,{ end; } + 1@spa,197,218,5 script Visiting Prince#gp4 4_M_KNIGHT_SILVER,{ end; } + 1@spa,197,218,0 script Thanatos Magic Trace#gp4 HIDDEN_WARP_NPC,{ end; } + 1@spa,178,186,0 warp #gp4warp 1,1,1@spa,30,57 // 5th floor npc's 1@spa,60,43,3 script Tiara Princess#gp5 4_F_MAYSEL,{ end; } + 1@spa,40,44,0 script Thanatos Magic Trace#gp5 HIDDEN_WARP_NPC,{ end; } + 1@spa,40,46,0 script Voice of Princess Tiara CLEAR_NPC,{ end; } + 1@spa,42,43,0 script Voice of Sakray CLEAR_NPC,{ end; } + 1@spa,40,41,0 script Thanatos Magic Trace CLEAR_NPC,{ end; } - diff --git a/npc/re/instances/octopus_cave.txt b/npc/re/instances/octopus_cave.txt index b134742c9..e4d8d4357 100644 --- a/npc/re/instances/octopus_cave.txt +++ b/npc/re/instances/octopus_cave.txt @@ -37,51 +37,52 @@ mal_dun01,151,235,5 script Starfish 4_ASTER,{ .@party_id = getcharid(CHAR_ID_PARTY); - .@md_name$ = "Octopus Cave"; + .@md_name$ = _("Octopus Cave"); if (!.@party_id) { mes("[Starfish]"); mes("You alone is powerless, hehe! Better get someone to help you out. Make a party, and come back later."); - close; + close(); } if (getcharid(CHAR_ID_CHAR) != getpartyleader(.@party_id, 2)) { mes("[Starfish]"); mes("Where is your leader, hehe. I don't talk to some random people. Bring your boss to me."); - close; + close(); } mes("[Starfish]"); mes("I am guarding here, hehe! It is just roughly blocked for now. But someday this cave must be sealed forever, hehe!"); - next; - while(1) { + next(); + while (true) { switch (select("Ask what's going on.", "Ask to open the gate.", "Go to other location.")) { case 1: mes("[Starfish]"); mes("Lately, our Starfish lady is suffering with some issues, ooh ooh. Something bad happen in this peaceful place, hehe!"); - next; + next(); mes("[Starfish]"); mes("Weird looking limbs came out from the hole there, tried to kidnap our lady Starfish. Ooh Ooh."); - next; + next(); mes("[Starfish]"); mes("It seems those limbs belong to that ugly octopus. That monster should be taken care of,\r" "but it's hard for ourselves only to make it happen, hehe."); - next; + next(); mes("[Starfish]"); mes("I want to find someone special, and ask to punish this ugly octopus.\r" "I hope this octopus won't ever harass our lady, hehe."); - next; + next(); mes("[Starfish]"); mes("Go catch that octopus and stick it to this pick. If you bring back the pick,\r" "I will open this gate for a while. You should challenge if you are interested, hehe."); - next; + next(); break; case 2: .@playtime = questprogress(4197, PLAYTIME); if (.@playtime == 1) { mes("[Starfish]"); mes("Octopus is not around now, hehe. Please come back later."); - close; + close(); } - if (.@playtime == 2) erasequest 4197; + if (.@playtime == 2) + erasequest(4197); if (countitem(Octopus_Hunt_Stick)) { .@instance = instance_create(.@md_name$, .@party_id); if (.@instance < 0) { @@ -90,12 +91,12 @@ mal_dun01,151,235,5 script Starfish 4_ASTER,{ mesf("Party leader is... %s.", strcharinfo(PC_NAME)); mesf("^0000FF%s^000000, I cannot open now, hehe.", .@md_name$); mes("Now is not the time, please wait."); - close; + close(); } if (instance_attachmap("1@cash", .@instance) == "") { mesf("^0000FF%s^000000 - Reservation Failed!", .@md_name$); instance_destroy(.@instance); - close; + close(); } instance_set_timeout(3600, 300, .@instance); instance_init(.@instance); @@ -103,23 +104,23 @@ mal_dun01,151,235,5 script Starfish 4_ASTER,{ mes("[Starfish]"); mesf("I will open the gate for a while to ^0000FF%s^000000.", .@md_name$); mes("Please catch that pervert octopus, and come back with it sticked to the pick, hehe."); - close; + close(); } mes("[Starfish]"); mes("Prepare a pick first, so you can thread that octopus with that pick.\r" "Then, I will let you in for a while, hehe."); - close; + close(); case 3: mes("[Starfish]"); mes("This is not a good location, check someplace else."); - close; + close(); } } } mal_dun01,153,237,5 script Weird Entrance CLEAR_NPC,{ mes("There is a strange entrance blocked roughly with some boards."); - next; + next(); switch (select("Go in.", "Stop.")) { case 1: if (countitem(Octopus_Hunt_Stick)) { @@ -127,25 +128,26 @@ mal_dun01,153,237,5 script Weird Entrance CLEAR_NPC,{ if (questprogress(4197, PLAYTIME) == 1) { mes("[Starfish]"); mes("Ah, now is not the time... Would you come back later? Hehe."); - close; + close(); } mes("[Starfish]"); mes("Shhh... Weird aura is coming from that entrance. Big trouble is waiting, if you go in now."); - close; + close(); } mapannounce("mal_dun01", sprintf(_$("%s party's %s member started to hunt the Octopus!"), getpartyname(getcharid(CHAR_ID_PARTY)), strcharinfo(PC_NAME)), bc_map, C_SPRINGGREEN); - if (!questprogress(4197)) setquest 4197; - warp "1@cash", 199, 99; + if (!questprogress(4197)) + setquest(4197); + warp("1@cash", 199, 99); end; } mes("[Starfish]"); mes("You should definitely prepare hunting stick if you want to punish the Octopus. Or I will not let you in! Hehe."); - close; + close(); case 2: mes("[Starfish]"); mes("Yes Yes, you better quit."); - close; + close(); } } @@ -153,25 +155,25 @@ mal_dun01,153,237,5 script Weird Entrance CLEAR_NPC,{ 1@cash,199,99,0 script oct_enter HIDDEN_WARP_NPC,4,4,{ end; OnTouch: - donpcevent instance_npcname("oct_enter_broad")+"::OnEnable"; - specialeffect EF_BASH; - disablenpc instance_npcname("oct_enter"); + donpcevent(instance_npcname("oct_enter_broad")+"::OnEnable"); + specialeffect(EF_BASH); + disablenpc(instance_npcname("oct_enter")); end; } 1@cash,1,1,0 script oct_enter_broad FAKE_NPC,{ end; OnInstanceInit: - donpcevent instance_npcname("oct_enter_broad")+"::OnDisable"; + donpcevent(instance_npcname("oct_enter_broad")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("oct_enter_broad"); - donpcevent instance_npcname("oct_foot_4")+"::OnEnable"; - donpcevent instance_npcname("oct_mob_con")+"::OnEnable"; - initnpctimer; + enablenpc(instance_npcname("oct_enter_broad")); + donpcevent(instance_npcname("oct_foot_4")+"::OnEnable"); + donpcevent(instance_npcname("oct_mob_con")+"::OnEnable"); + initnpctimer(); end; OnDisable: - disablenpc instance_npcname("oct_enter_broad"); + disablenpc(instance_npcname("oct_enter_broad")); end; OnTimer1000: mapannounce(instance_mapname("1@cash"), _("Pervert Octopus : How dare you to come inside of my place!"), bc_map, C_YELLOW); @@ -181,22 +183,22 @@ OnTimer4000: end; OnTimer7000: mapannounce(instance_mapname("1@cash"), _("Pervert Octopus : My juniors~ There is your toy! Play with it~ kakaka"), bc_map, C_YELLOW); - stopnpctimer; - donpcevent instance_npcname("oct_enter_broad")+"::OnDisable"; + stopnpctimer(); + donpcevent(instance_npcname("oct_enter_broad")+"::OnDisable"); end; } 1@cash,3,3,0 script oct_foot_4 FAKE_NPC,{ end; OnInstanceInit: - donpcevent instance_npcname("oct_foot_4")+"::OnDisable"; + donpcevent(instance_npcname("oct_foot_4")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("oct_foot_4"); - donpcevent instance_npcname("oct_foot1")+"::OnEnable"; - donpcevent instance_npcname("oct_foot2")+"::OnEnable"; - donpcevent instance_npcname("oct_foot3")+"::OnEnable"; - donpcevent instance_npcname("oct_foot4")+"::OnEnable"; + enablenpc(instance_npcname("oct_foot_4")); + donpcevent(instance_npcname("oct_foot1")+"::OnEnable"); + donpcevent(instance_npcname("oct_foot2")+"::OnEnable"); + donpcevent(instance_npcname("oct_foot3")+"::OnEnable"); + donpcevent(instance_npcname("oct_foot4")+"::OnEnable"); .@map$ = instance_mapname("1@cash"); monster(.@map$, 20, 114, _("Octopus Leg#1"), MD_OCTOPUS_LEG, 1, instance_npcname("oct_foot_4")+"::OnMyMobDead"); monster(.@map$, 88, 190, _("Octopus Leg#2"), MD_OCTOPUS_LEG, 1, instance_npcname("oct_foot_4")+"::OnMyMobDead"); @@ -204,15 +206,15 @@ OnEnable: monster(.@map$, 372, 131, _("Octopus Leg#4"), MD_OCTOPUS_LEG, 1, instance_npcname("oct_foot_4")+"::OnMyMobDead"); end; OnDisable: - disablenpc instance_npcname("oct_foot_4"); + disablenpc(instance_npcname("oct_foot_4")); end; OnMyMobDead: .@map$ = instance_mapname("1@cash"); - if (mobcount(.@map$,instance_npcname("oct_foot_4")+"::OnMyMobDead") < 1) { - donpcevent instance_npcname("oct_boss_con")+"::OnEnable"; + if (mobcount(.@map$, instance_npcname("oct_foot_4")+"::OnMyMobDead") < 1) { + donpcevent(instance_npcname("oct_boss_con")+"::OnEnable"); mapannounce(.@map$, _("Hey you!! I'll personally take care of you all! Let's bring it on!"), bc_map, C_SPRINGGREEN); - enablenpc instance_npcname("oct_boss_warp"); - instance_warpall .@map$, 199, 99; + enablenpc(instance_npcname("oct_boss_warp")); + instance_warpall(.@map$, 199, 99); end; } mapannounce(.@map$, _("Arrgg!! That hurts!!! I need another strategy..."), bc_map, C_SPRINGGREEN); @@ -222,12 +224,12 @@ OnMyMobDead: 1@cash,20,114,0 script oct_foot1 HIDDEN_WARP_NPC,6,6,{ end; OnInstanceInit: - donpcevent instance_npcname(strnpcinfo(NPC_NAME))+"::OnDisable"; + donpcevent(instance_npcname(strnpcinfo(NPC_NAME))+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname(strnpcinfo(NPC_NAME)); + enablenpc(instance_npcname(strnpcinfo(NPC_NAME))); .@label$ = instance_npcname(strnpcinfo(NPC_NAME))+"::OnMyMobDead"; - .@i = atoi(charat(strnpcinfo(NPC_NAME),8)); + .@i = atoi(charat(strnpcinfo(NPC_NAME), 8)); .@map$ = instance_mapname("1@cash"); switch (.@i) { case 1: @@ -249,7 +251,7 @@ OnEnable: areamonster(.@map$, 123, 93, 127, 97, _("Octopus's Henchman"), MD_OCTOPUS, 3, .@label$); areamonster(.@map$, 113, 90, 115, 92, _("Octopus's Henchman"), MD_OCTOPUS, 2, .@label$); areamonster(.@map$, 103, 89, 105, 91, _("Octopus's Henchman"), MD_OCTOPUS, 2, .@label$); - areamonster(.@map$, 89, 90, 91,92, _("Octopus's Henchman"), MD_OCTOPUS, 2, .@label$); + areamonster(.@map$, 89, 90, 91, 92, _("Octopus's Henchman"), MD_OCTOPUS, 2, .@label$); areamonster(.@map$, 74, 104, 76, 106, _("Octopus's Henchman"), MD_OCTOPUS, 2, .@label$); areamonster(.@map$, 74, 120, 76, 122, _("Octopus's Henchman"), MD_OCTOPUS, 2, .@label$); areamonster(.@map$, 83, 131, 87, 135, _("Octopus's Henchman"), MD_OCTOPUS, 3, .@label$); @@ -285,56 +287,57 @@ OnEnable: } end; OnDisable: - killmonster instance_mapname("1@cash"), instance_npcname(strnpcinfo(NPC_NAME))+"::OnMyMobDead"; // Not in official script. - disablenpc instance_npcname(strnpcinfo(NPC_NAME)); + killmonster(instance_mapname("1@cash"), instance_npcname(strnpcinfo(NPC_NAME))+"::OnMyMobDead"); // Not in official script. + disablenpc(instance_npcname(strnpcinfo(NPC_NAME))); end; OnTouch: - if (getd("."+strnpcinfo(NPC_NAME)+instance_id())) end; - setd "."+strnpcinfo(NPC_NAME)+instance_id(),1; - hideonnpc instance_npcname(strnpcinfo(NPC_NAME)); + if (getd("."+strnpcinfo(NPC_NAME)+instance_id())) + end; + setd("."+strnpcinfo(NPC_NAME)+instance_id(), 1); + hideonnpc(instance_npcname(strnpcinfo(NPC_NAME))); mapannounce(instance_mapname("1@cash"), _("Come out all my babies and help me out!"), bc_map, C_YELLOW); - initnpctimer; + initnpctimer(); end; OnTimer5000: .@map$ = instance_mapname("1@cash"); mapannounce(.@map$, _("Let's give them a lesson!"), bc_map, C_YELLOW); .@label$ = instance_npcname(strnpcinfo(NPC_NAME))+"::OnMyMobDead"; - .@i = atoi(charat(strnpcinfo(NPC_NAME),8)); + .@i = atoi(charat(strnpcinfo(NPC_NAME), 8)); switch (.@i) { case 1: - areamonster(.@map$, 18, 112, 22,116, _("Octopus's Henchman"), MD_OCTOPUS, 3, .@label$); - areamonster(.@map$, 18, 112, 22,116, _("Octopus's Henchman"), MD_OCTOPUS, 3, .@label$); + areamonster(.@map$, 18, 112, 22, 116, _("Octopus's Henchman"), MD_OCTOPUS, 3, .@label$); + areamonster(.@map$, 18, 112, 22, 116, _("Octopus's Henchman"), MD_OCTOPUS, 3, .@label$); break; case 2: - areamonster(.@map$, 86, 188, 90,192, _("Octopus's Henchman"), MD_OCTOPUS, 3, .@label$); - areamonster(.@map$, 96, 98, 100,102, _("Octopus's Henchman"), MD_OCTOPUS, 3, .@label$); + areamonster(.@map$, 86, 188, 90, 192, _("Octopus's Henchman"), MD_OCTOPUS, 3, .@label$); + areamonster(.@map$, 96, 98, 100, 102, _("Octopus's Henchman"), MD_OCTOPUS, 3, .@label$); break; case 3: - areamonster(.@map$, 305, 213, 309,217, _("Octopus's Henchman"), MD_OCTOPUS, 3, .@label$); - areamonster(.@map$, 305, 213, 309,217, _("Octopus's Henchman"), MD_OCTOPUS, 3, .@label$); + areamonster(.@map$, 305, 213, 309, 217, _("Octopus's Henchman"), MD_OCTOPUS, 3, .@label$); + areamonster(.@map$, 305, 213, 309, 217, _("Octopus's Henchman"), MD_OCTOPUS, 3, .@label$); break; case 4: - areamonster(.@map$, 370, 129, 374,133, _("Octopus's Henchman"), MD_OCTOPUS, 3, .@label$); - areamonster(.@map$, 370, 129, 374,133, _("Octopus's Henchman"), MD_OCTOPUS, 3, .@label$); + areamonster(.@map$, 370, 129, 374, 133, _("Octopus's Henchman"), MD_OCTOPUS, 3, .@label$); + areamonster(.@map$, 370, 129, 374, 133, _("Octopus's Henchman"), MD_OCTOPUS, 3, .@label$); break; } end; OnTimer30000: - setd "."+strnpcinfo(NPC_NAME)+instance_id(),0; - stopnpctimer; - .@i = atoi(charat(strnpcinfo(NPC_NAME),8)); - donpcevent instance_npcname("oct_foot_exit"+.@i)+"::OnEnable"; - donpcevent instance_npcname(strnpcinfo(NPC_NAME))+"::OnDisable"; + setd("."+strnpcinfo(NPC_NAME)+instance_id(), 0); + stopnpctimer(); + .@i = atoi(charat(strnpcinfo(NPC_NAME), 8)); + donpcevent(instance_npcname("oct_foot_exit"+.@i)+"::OnEnable"); + donpcevent(instance_npcname(strnpcinfo(NPC_NAME))+"::OnDisable"); end; OnMyMobDead: .@map$ = instance_mapname("1@cash"); - if (mobcount(.@map$,instance_npcname(strnpcinfo(NPC_NAME))+"::OnMyMobDead") < 1) { + if (mobcount(.@map$, instance_npcname(strnpcinfo(NPC_NAME))+"::OnMyMobDead") < 1) { mapannounce(.@map$, _("You hurt my babies!!? You'll have to pay for this!!!"), bc_map, C_SPRINGGREEN); - setd "."+strnpcinfo(NPC_NAME)+instance_id(),0; - stopnpctimer; - .@i = atoi(charat(strnpcinfo(NPC_NAME),8)); - donpcevent instance_npcname("oct_foot_exit"+.@i)+"::OnEnable"; - donpcevent instance_npcname(strnpcinfo(NPC_NAME))+"::OnDisable"; + setd("."+strnpcinfo(NPC_NAME)+instance_id(), 0); + stopnpctimer(); + .@i = atoi(charat(strnpcinfo(NPC_NAME), 8)); + donpcevent(instance_npcname("oct_foot_exit"+.@i)+"::OnEnable"); + donpcevent(instance_npcname(strnpcinfo(NPC_NAME))+"::OnDisable"); end; } end; @@ -346,13 +349,13 @@ OnMyMobDead: 1@cash,16,117,0 script oct_foot_exit1 WARPNPC,2,2,{ end; OnInstanceInit: - disablenpc instance_npcname(strnpcinfo(NPC_NAME)); + disablenpc(instance_npcname(strnpcinfo(NPC_NAME))); end; OnEnable: - enablenpc instance_npcname(strnpcinfo(NPC_NAME)); + enablenpc(instance_npcname(strnpcinfo(NPC_NAME))); end; OnTouch: - warp instance_mapname("1@cash"), 198, 99; + warp(instance_mapname("1@cash"), 198, 99); end; } 1@cash,77,193,0 duplicate(oct_foot_exit1) oct_foot_exit2 WARPNPC,2,2 @@ -362,11 +365,11 @@ OnTouch: 1@cash,15,15,0 script oct_mob_con FAKE_NPC,{ end; OnInstanceInit: - donpcevent instance_npcname("oct_mob_con")+"::OnDisable"; + donpcevent(instance_npcname("oct_mob_con")+"::OnDisable"); end; OnEnable: .@map$ = instance_mapname("1@cash"); - enablenpc instance_npcname("oct_mob_con"); + enablenpc(instance_npcname("oct_mob_con")); monster(.@map$, 32, 94, _("Hydra"), HYDRA, 1); monster(.@map$, 41, 101, _("Hydra"), HYDRA, 1); monster(.@map$, 35, 78, _("Hydra"), HYDRA, 1); @@ -410,21 +413,21 @@ OnEnable: areamonster(.@map$, 292, 97, 312, 117, _("Stapo"), STAPO, 1); areamonster(.@map$, 355, 64, 375, 84, _("Stapo"), STAPO, 1); areamonster(.@map$, 317, 17, 337, 37, _("Stapo"), STAPO, 1); - donpcevent instance_npcname("oct_backattack1")+"::OnEnable"; - donpcevent instance_npcname("oct_backattack2")+"::OnEnable"; - donpcevent instance_npcname("oct_backattack3")+"::OnEnable"; - donpcevent instance_npcname("oct_backattack4")+"::OnEnable"; - donpcevent instance_npcname("oct_mob_con")+"::OnDisable"; + donpcevent(instance_npcname("oct_backattack1")+"::OnEnable"); + donpcevent(instance_npcname("oct_backattack2")+"::OnEnable"); + donpcevent(instance_npcname("oct_backattack3")+"::OnEnable"); + donpcevent(instance_npcname("oct_backattack4")+"::OnEnable"); + donpcevent(instance_npcname("oct_mob_con")+"::OnDisable"); end; OnDisable: - disablenpc instance_npcname("oct_mob_con"); + disablenpc(instance_npcname("oct_mob_con")); end; } 1@cash,45,53,0 script oct_backattack1 HIDDEN_WARP_NPC,3,3,{ end; OnInstanceInit: - disablenpc instance_npcname("oct_backattack1"); + disablenpc(instance_npcname("oct_backattack1")); end; OnTouch: .@map$ = instance_mapname("1@cash"); @@ -436,27 +439,28 @@ OnTouch: monster(.@map$, 49, 50, _("Hydra"), HYDRA, 1); monster(.@map$, 41, 53, _("Octopus's Henchman"), MD_OCTOPUS, 1); mapannounce(.@map$, _("Don't let them break through, stop them!!!"), bc_map, C_SPRINGGREEN); - specialeffect EF_BASH; - disablenpc instance_npcname("oct_backattack1"); + specialeffect(EF_BASH); + disablenpc(instance_npcname("oct_backattack1")); end; OnEnable: - enablenpc instance_npcname("oct_backattack1"); + enablenpc(instance_npcname("oct_backattack1")); end; } 1@cash,78,99,0 script oct_backattack2 HIDDEN_WARP_NPC,3,3,{ end; OnInstanceInit: - disablenpc instance_npcname("oct_backattack2"); + disablenpc(instance_npcname("oct_backattack2")); end; OnTouch: - if (getd("."+instance_id())) end; - setd "."+instance_id(),1; - initnpctimer; + if (getd("."+instance_id())) + end; + setd("."+instance_id(), 1); + initnpctimer(); .@map$ = instance_mapname("1@cash"); monster(.@map$, 71, 105, _("Octopus's Henchman"), MD_OCTOPUS, 1); mapannounce(.@map$, _("Headquarters are empty, GO!!!"), bc_map, C_SPRINGGREEN); - hideonnpc instance_npcname("oct_backattack2"); + hideonnpc(instance_npcname("oct_backattack2")); end; OnTimer2000: .@map$ = instance_mapname("1@cash"); @@ -477,21 +481,22 @@ OnTimer8000: .@map$ = instance_mapname("1@cash"); monster(.@map$, 71, 105, _("Octopus's Henchman"), MD_OCTOPUS, 1); mapannounce(.@map$, _("There is no time to lose, hurry up!!!"), bc_map, C_SPRINGGREEN); - stopnpctimer; + stopnpctimer(); end; OnEnable: - enablenpc instance_npcname("oct_backattack2"); + enablenpc(instance_npcname("oct_backattack2")); end; } 1@cash,299,144,0 script oct_backattack3 HIDDEN_WARP_NPC,3,3,{ end; OnInstanceInit: - disablenpc instance_npcname("oct_backattack3"); + disablenpc(instance_npcname("oct_backattack3")); end; OnTouch: - if (getd("."+instance_id())) end; - setd "."+instance_id(),1; + if (getd("."+instance_id())) + end; + setd("."+instance_id(), 1); .@map$ = instance_mapname("1@cash"); monster(.@map$, 293, 153, _("Octopus's Henchman"), MD_OCTOPUS, 1); monster(.@map$, 294, 152, _("Octopus's Henchman"), MD_OCTOPUS, 1); @@ -499,26 +504,27 @@ OnTouch: monster(.@map$, 293, 151, _("Octopus's Henchman"), MD_OCTOPUS, 1); monster(.@map$, 293, 152, _("Octopus's Henchman ?"), MD_MARSE, 1); mapannounce(.@map$, _("Kakaka! Suprised??!!"), bc_map, C_SPRINGGREEN); - initnpctimer; - hideonnpc instance_npcname("oct_backattack3"); + initnpctimer(); + hideonnpc(instance_npcname("oct_backattack3")); end; OnTimer5000: mapannounce(instance_mapname("1@cash"), _("... Looks like we have a spy among us."), bc_map, C_SPRINGGREEN); - stopnpctimer; + stopnpctimer(); end; OnEnable: - enablenpc instance_npcname("oct_backattack3"); + enablenpc(instance_npcname("oct_backattack3")); end; } 1@cash,336,36,0 script oct_backattack4 HIDDEN_WARP_NPC,3,3,{ end; OnInstanceInit: - disablenpc instance_npcname("oct_backattack4"); + disablenpc(instance_npcname("oct_backattack4")); end; OnTouch: - if (getd("."+instance_id())) end; - setd "."+instance_id(),1; + if (getd("."+instance_id())) + end; + setd("."+instance_id(), 1); .@map$ = instance_mapname("1@cash"); monster(.@map$, 332, 37, _("Octopus's Henchman"), MD_OCTOPUS, 1); monster(.@map$, 332, 36, _("Octopus's Henchman"), MD_OCTOPUS, 1); @@ -534,34 +540,34 @@ OnTouch: monster(.@map$, 259, 40, _("Mercenary Squid"), MD_MARSE, 1); monster(.@map$, 261, 40, _("Mercenary Squid"), MD_MARSE, 1); mapannounce(.@map$, _("What a successful pincer tactic! The enemy is strong! Let's not lose yourselves! Anyway, where are all the mercenaries??"), bc_map, C_SPRINGGREEN); - initnpctimer; - hideonnpc instance_npcname("oct_backattack4"); + initnpctimer(); + hideonnpc(instance_npcname("oct_backattack4")); end; OnTimer5000: mapannounce(instance_mapname("1@cash"), _("Mercenary Squid : eh...eh... wrong direction. No enemies are shown in this direction."), bc_map, C_SPRINGGREEN); end; OnTimer7000: mapannounce(instance_mapname("1@cash"), _("Pervert Octopus : Fools! Can't you read the map??!! Useless!!"), bc_map, C_SPRINGGREEN); - stopnpctimer; + stopnpctimer(); end; OnEnable: - enablenpc instance_npcname("oct_backattack4"); + enablenpc(instance_npcname("oct_backattack4")); end; } 1@cash,2,2,0 script oct_boss_con FAKE_NPC,{ end; OnInstanceInit: - donpcevent instance_npcname("oct_boss_con")+"::OnDisable"; + donpcevent(instance_npcname("oct_boss_con")+"::OnDisable"); end; OnDisable: - disablenpc instance_npcname("oct_boss_con"); + disablenpc(instance_npcname("oct_boss_con")); end; OnEnable: - enablenpc instance_npcname("oct_boss_con"); - donpcevent instance_npcname("oct_boss_foot")+"::OnEnable"; + enablenpc(instance_npcname("oct_boss_con")); + donpcevent(instance_npcname("oct_boss_foot")+"::OnEnable"); monster(instance_mapname("1@cash"), 199, 188, _("Disgusting Octopus"), MD_GIANT_OCTOPUS, 1, instance_npcname("oct_boss_con")+"::OnMyMobDead"); - initnpctimer; + initnpctimer(); end; OnTimer7000: callsub OnAnnounce, @@ -604,21 +610,21 @@ OnTimer49000: "errrrrrrrrrrrrrrrrrrrrrrrr... Cough! Cough!", "Disgusting Octopus : Violence cannot be justified in any case.", "This is my place!!!"; - stopnpctimer; - initnpctimer; + stopnpctimer(); + initnpctimer(); end; OnAnnounce: mapannounce(instance_mapname("1@cash"), sprintf(_$("Disgusting Octopus : %s"), getarg(rand(3))), bc_map, C_YELLOW); return; OnMyMobDead: .@map$ = instance_mapname("1@cash"); - if (mobcount(.@map$,instance_npcname("oct_boss_con")+"::OnMyMobDead") < 1) { + if (mobcount(.@map$, instance_npcname("oct_boss_con")+"::OnMyMobDead") < 1) { mapannounce(.@map$, _("Disgusting Octopus : That's it for the today! Next time, I will play with you badly!"), bc_map, C_YELLOW); - enablenpc instance_npcname("oct_exit_1"); - enablenpc instance_npcname("oct_exit_2"); - donpcevent instance_npcname("oct_boss_foot")+"::OnDisable"; - stopnpctimer; - donpcevent instance_npcname("oct_boss_con")+"::OnDisable"; + enablenpc(instance_npcname("oct_exit_1")); + enablenpc(instance_npcname("oct_exit_2")); + donpcevent(instance_npcname("oct_boss_foot")+"::OnDisable"); + stopnpctimer(); + donpcevent(instance_npcname("oct_boss_con")+"::OnDisable"); end; } end; @@ -627,16 +633,16 @@ OnMyMobDead: 1@cash,4,4,0 script oct_boss_foot FAKE_NPC,{ end; OnInstanceInit: - donpcevent instance_npcname("oct_boss_foot")+"::OnDisable"; + donpcevent(instance_npcname("oct_boss_foot")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("oct_boss_foot"); - initnpctimer; + enablenpc(instance_npcname("oct_boss_foot")); + initnpctimer(); end; OnCall: .@map$ = instance_mapname("1@cash"); - if (mobcount(.@map$,instance_npcname("oct_boss_foot")+"::OnMyMobDead") < 100) { - switch(rand(2)) { + if (mobcount(.@map$, instance_npcname("oct_boss_foot")+"::OnMyMobDead") < 100) { + switch (rand(2)) { case 0: mapannounce(.@map$, _("Disgusting Octopus : Do you know how many legs octopus have? It doesn't matter, I have unlimited legs!!"), bc_map, C_YELLOW); areamonster(.@map$, 192, 181, 206, 195, _("Octopus Leg"), MD_OCTOPUS_LEG, 1, instance_npcname("oct_boss_foot")+"::OnMyMobDead"); @@ -647,16 +653,16 @@ OnCall: break; } } - initnpctimer; + initnpctimer(); end; OnTimer10000: - stopnpctimer; - donpcevent instance_npcname("oct_boss_foot")+"::OnCall"; + stopnpctimer(); + donpcevent(instance_npcname("oct_boss_foot")+"::OnCall"); end; OnDisable: - stopnpctimer; - killmonster instance_mapname("1@cash"), instance_npcname("oct_boss_foot")+"::OnMyMobDead"; // Not in official script. - disablenpc instance_npcname("oct_boss_foot"); + stopnpctimer(); + killmonster(instance_mapname("1@cash"), instance_npcname("oct_boss_foot")+"::OnMyMobDead"); // Not in official script. + disablenpc(instance_npcname("oct_boss_foot")); end; OnMyMobDead: end; @@ -665,24 +671,24 @@ OnMyMobDead: 1@cash,198,116,0 script oct_boss_warp WARPNPC,2,2,{ end; OnInstanceInit: - disablenpc instance_npcname("oct_boss_warp"); + disablenpc(instance_npcname("oct_boss_warp")); end; OnTouch: - warp instance_mapname("1@cash"), 210, 172; + warp(instance_mapname("1@cash"), 210, 172); end; } 1@cash,190,208,0 script oct_exit_1 WARPNPC,2,2,{ end; OnInstanceInit: - disablenpc instance_npcname(strnpcinfo(NPC_NAME)); + disablenpc(instance_npcname(strnpcinfo(NPC_NAME))); end; OnTouch: mes("Do you want to go out from the octopus dungeon?"); - next; + next(); if (select("No!", "Yes!") == 2) - warp "mal_dun01", 153, 233; - close; + warp("mal_dun01", 153, 233); + close(); } 1@cash,198,82,0 duplicate(oct_exit_1) oct_exit_2 WARPNPC,2,2 // This is never enabled in the official script. diff --git a/npc/re/instances/saras_memory.txt b/npc/re/instances/saras_memory.txt index 38b598d5b..c9a47534b 100644 --- a/npc/re/instances/saras_memory.txt +++ b/npc/re/instances/saras_memory.txt @@ -41,113 +41,113 @@ dali,130,107,5 script Leon the Adventurer#Sara 4_M_DST_GRAND,{ // instance CD check only at the Dimensional Device mes("[Leon the Adventurer]"); if (BaseLevel < 99) { - mes("You know... this place doesn't seem to be safe for you. Please returnto me once you have achieved LV. 99"); - close; + mes("You know... this place doesn't seem to be safe for you. Please return to me once you have achieved LV. 99"); + close(); } if (!questprogress(15003)) { if (!sarainstance) { // doing the instance for the 1st time mes("Wow! I thought I was the only one who knew about this place."); - next; + next(); mes("[Leon the Adventurer]"); mes("Excuse my rudeness! I am Pon de Leon, the famous adventurer!"); - next; + next(); mes("[Leon the Adventurer]"); mes("My friend calls me Leon the Lion! For my tough appearance and attitude. Plus I have quite a bite!"); - next; + next(); mes("[Leon the Adventurer]"); mes("You know, this is such a strange location..."); - next; + next(); mes("[Leon the Adventurer]"); mes("As you explore it you start to see cracks in space and time. Each one covered by a dimensional device."); - next; + next(); mes("[Leon the Adventurer]"); mes("For example, I think I have caught glimpses of Payon through the dimensional device closest to us.\r" "But it doesn't seem right. Almost like it is a little bit older then it should be."); - next; + next(); mes("[Leon the Adventurer]"); mes("I want to explore it, but with my old age and my knees I don't seem to be quite up to the task."); - next; + next(); mes("[Leon the Adventurer]"); mes("So, I would like to ask something of you."); - next; + next(); mes("[Leon the Adventurer]"); mes("Please venture through the dimensional device and report to me what you find within."); - next; + next(); mes("[Leon the Adventurer]"); mes("Though, I should warn you. It might be unstable. Make sure you enter the first chance you get."); - close2; - setquest 15003; + close2(); + setquest(15003); end; } else { mes("You wish to relive the past again?"); - next; - if (select("Yes","No") == 2) - close; + next(); + if (select("Yes", "No") == 2) + close(); mes("[Leon the Adventurer]"); mes("Please venture through the dimensional device and report to me what you find within."); - next; + next(); mes("[Leon the Adventurer]"); mes("Though, I should warn you. It might be unstable. Make sure you enter the first chance you get."); - setquest 15003; - close; + setquest(15003); + close(); } } if (questprogress(15003) == 1) { mes("I am not sure you have fully explored the crack in space and time yet. Perhaps you should look a bit further into it."); - next; + next(); if (!sarainstance) - close; + close(); switch (select("Okay", "Give up")) { case 1: mes("[Leon the Adventurer]"); mes("I am glad to hear that! Maybe someday you can be as brave as old Leon the Lion!"); - close; + close(); case 2: mes("[Leon the Adventurer]"); mes("Well.. I can't force you. Buf if you ever find your courage pelase talk to me again."); - erasequest 15003; - close; + erasequest(15003); + close(); } } if (questprogress(15003) == 2) { if (!sarainstance) { // 1st time reward and text mes("What did you see in there?!"); - next; + next(); mes("[Leon the Adventurer]"); mes("Hrumpf, Sara Irene?! She's one of the 12 Valkyries. I didn't know her story was that tragic...."); - next; + next(); mes("[Leon the Adventurer]"); mes("It seems that you caused a huge misunderstanding between her and her father."); - next; + next(); mes("[Leon the Adventurer]"); - mes("I would not blame yourself for what occured. Or all the blood that was spilled. It seems that the\r" + mes("I would not blame yourself for what occured. Or all the blood that was spilled. It seems that the\r" "events that day were fated to happen no matter who was there."); - next; + next(); mes("[Leon the Adventurer]"); mes("Please don't tell anyone about your time traveling adventure. We can't have anyone thinking you more\r" "important then old Leon. Plus they wouldn't believe such a story anyways."); - next; + next(); mes("[Leon the Adventurer]"); mes("I think that in about 20 hours after you last entered the rift will stable enough for you to transverse it again."); sarainstance = 1; - getexp 770000, 1000000; // reward first time + getexp(770000, 1000000); // reward first time } else { // 2nd time text mes("What did you see in there?! Was there anything new?"); - next; + next(); select("Nothing has changed from the last time."); mes("[Leon the Adventurer]"); mes("I am sorry to hear that... If..."); - next; + next(); mes("[Leon the Adventurer]"); mes("If you want to try again. I think that in about 20 hours after you last entered the rift will be stable enough\r" "for you to transverse it again."); - next; + next(); mes("[Leon the Adventurer]"); mes("You should rest up. Travelling Through time would make even Leon tired!"); - getexp 550000, 550000; // reward 2nd and following + getexp(550000, 550000); // reward 2nd and following } - erasequest 15003; - close; + erasequest(15003); + close(); } } @@ -155,29 +155,29 @@ dali,138,118,0 script Dimensional Device#dimen PORTAL,{ if (!questprogress(15003)) { mes("[Leon the Adventurer]"); mes("Before you go playing around with that. Why don't you come over here and talk to me?"); - close; + close(); } .@sara_time = questprogress(15002, PLAYTIME); if (.@sara_time == 1) { mes("[Leon the Adventurer]"); mes("I think that in about 20 hours after you last entered the rift will stable enough for you to\r" "transverse it again."); - close; + close(); } else if (.@sara_time == 2) { - erasequest 15002; + erasequest(15002); end; } else if (!.@sara_time) { .@party_id = getcharid(CHAR_ID_PARTY); .@p_name$ = getpartyname(.@party_id); - .@md_name$ = "Sara's Memory"; + .@md_name$ = _("Sara's Memory"); if (!instance_check_party(.@party_id)) { mes("[Leon the Adventurer]"); mes("Before you enter you need to organize a party! Don't know how? Type /organize PARTYNAMEHERE. You\r" "can use quotes to put spaces in a party name."); - close; + close(); } if (getcharid(CHAR_ID_CHAR) == getpartyleader(.@party_id, 2)) - .@menu1$ = "Boot up the dimensional device"; + .@menu1$ = _("Boot up the dimensional device"); else .@menu1$ = ""; switch (select(.@menu1$, "Use the dimensional device", "Cancel")) { @@ -189,30 +189,30 @@ dali,138,118,0 script Dimensional Device#dimen PORTAL,{ mesf("Party Name: %s", .@p_name$); mesf("Party Leader: %s", strcharinfo(PC_NAME)); mesf("^0000FF%s^000000 - Reservation Failed!", .@md_name$); - close; + close(); } if (instance_attachmap("1@sara", .@instance) == "") { mesf("^0000FF%s^000000 - Reservation Failed!", .@md_name$); instance_destroy(.@instance); - close; + close(); } instance_set_timeout(3600, 300, .@instance); instance_init(.@instance); mes("^FF0000The dimensional boots up cleanly. Use the device to enter the crack in space and time.^000000"); - close; + close(); case 2: if (has_instance("1@sara") == "") { mesf("The memorial dungeon ^0000FF%s^000000 does not exist.\r" "The party leader did not generate the dungeon yet.", .@md_name$); - close; + close(); } mapannounce("dali", sprintf(_$("%s, member of the party %s entered the instance %s."), strcharinfo(PC_NAME), .@p_name$, .@md_name$), bc_map, C_SPRINGGREEN); - setquest 15002; - warp "1@sara", 250, 155; + setquest(15002); + warp("1@sara", 250, 155); end; break; case 3: - close; + close(); } } } @@ -223,469 +223,468 @@ dali,138,118,0 script Dimensional Device#dimen PORTAL,{ mesf("[%s]", strcharinfo(PC_NAME)); mes("Where am I?"); unittalk(getcharid(CHAR_ID_ACCOUNT), _("Where am I?")); - next; - cutin "sara_9sara1.bmp", 2; + next(); + cutin("sara_9sara1.bmp", 2); mes("[A girl]"); mes("Hello! This is the village of Payon. You don't seem to be from around here..."); npctalk(_("A girl : Hello! This is the village of Payon. You don't seem to be from around here...")); - next; + next(); mesf("[%s]", strcharinfo(PC_NAME)); mes("Are you from here? You don't seem to quite match the locals either."); unittalk(getcharid(CHAR_ID_ACCOUNT), _("Are you from here? You don't seem to quite match to locals either.")); - next; + next(); mes("[A girl]"); mes("Yes! I was born here! My name is Sara. Sara Irene!"); npctalk(_("A girl : Yes! I was born here! My name is Sara. Sara Irene!")); - next; + next(); mes("[Sara Irene]"); mes("My father is doyen of this village! I just take after my mother."); npctalk(_("My father is doyen of this village! I just take after my mother."), instance_npcname("Sara Irene#saratalk")); - next; + next(); mesf("[%s]", strcharinfo(PC_NAME)); mes("Oh! I am sorry! Uh... Why are you standing out here all alone?"); unittalk(getcharid(CHAR_ID_ACCOUNT), _("Oh! I am sorry! Uh... Why are you standing out here all alone?")); - next; + next(); mes("[Sara Irene]"); mes("I am waiting for my father. He said that he will be here soon."); npctalk(_("I am waiting for my father. He said that he will be here soon."), instance_npcname("Sara Irene#saratalk")); - next; + next(); mes("^FF0000An older man exits the house. Sara's face brightens at the sight of him.^000000"); - donpcevent instance_npcname("Doyen Irene#sarains")+"::OnEnable"; - next; + donpcevent(instance_npcname("Doyen Irene#sarains")+"::OnEnable"); + next(); mes("[Sara Irene]"); mes("Hi daddy!"); npctalk(_("Hi daddy!"), instance_npcname("Sara Irene#saratalk")); - next; - cutin "sara_elder_irine1.bmp", 2; + next(); + cutin("sara_elder_irine1.bmp", 2); mes("[Doyen Irene]"); mes("Sweetheart you look so happy."); npctalk(_("Sweetheart you look so happy."), instance_npcname("Doyen Irene#sarains")); - next; - cutin "sara_9sara1.bmp", 2; + next(); + cutin("sara_9sara1.bmp", 2); mes("[Sara Irene]"); mes("You said you would come back soon! I waited for you and you lied!"); npctalk(_("You said you would come back soon! I waited for you and you lied!"), instance_npcname("Sara Irene#saratalk")); - next; - cutin "sara_elder_irine1.bmp", 2; + next(); + cutin("sara_elder_irine1.bmp", 2); mes("[Doyen Irene]"); mes("Sweetheart, I am sorry I made you wait so long. The meeting with the village elders took longer than expected."); npctalk(_("Sweetheart, I am sorry I made you wait so long. The meeting with the village elders took longer than expected."), instance_npcname("Doyen Irene#sarains")); - next; - cutin "sara_9sara1.bmp", 2; + next(); + cutin("sara_9sara1.bmp", 2); mes("[Sara Irene]"); mes("I hate those old fogeys."); npctalk(_("I hate those old fogeys."), instance_npcname("Sara Irene#saratalk")); - next; - cutin "sara_elder_irine1.bmp", 2; + next(); + cutin("sara_elder_irine1.bmp", 2); mes("[Doyen Irene]"); mes("Don't say that sweetheart... Who is this with you?"); npctalk(_("Don't say that sweetheart... Who is this with you?"), instance_npcname("Doyen Irene#sarains")); - next; + next(); mes("^FF0000Doyen Irene stares at you with fire in this eyes.^000000"); dispbottom(_("Doyen Irene stares at you with fire in this eyes.")); - next; + next(); mes("^FF0000Sara starts humming and singing softly to herself. She picks some wild flowers near by and presents\r" "them to the Doyen.^000000"); dispbottom(_("Sara starts humming and singing softly to herself. She picks some wild flowers near by and presents them to the Doyen.")); - next; - cutin "sara_9sara1.bmp", 2; + next(); + cutin("sara_9sara1.bmp", 2); mes("[Sara Irene]"); mes("Here you go daddy!"); npctalk(_("Here you go daddy!"), instance_npcname("Sara Irene#saratalk")); - next; - cutin "sara_elder_irine1.bmp", 2; + next(); + cutin("sara_elder_irine1.bmp", 2); mes("[Doyen Irene]"); mes("Oh Sara, should I have them?"); npctalk(_("Oh Sara, should I have them?"), instance_npcname("Doyen Irene#sarains")); - next; - cutin "sara_9sara1.bmp", 2; + next(); + cutin("sara_9sara1.bmp", 2); mes("[Sara Irene]"); mes("Of course silly daddy!"); npctalk(_("Of course silly daddy!"), instance_npcname("Sara Irene#saratalk")); - next; + next(); mes("^FF0000After being given the flowers the Doyen's mood seems to greatly improve.^000000"); dispbottom(_("After being given the flowers the Doyen's mood seems to greatly improve.")); - next; - cutin "sara_elder_irine1.bmp", 2; + next(); + cutin("sara_elder_irine1.bmp", 2); mes("[Doyen Irene]"); mes("Alright my princess, where should we go now?"); npctalk(_("Alright my princess, where should we go now?"), instance_npcname("Doyen Irene#sarains")); - next; - cutin "sara_9sara1.bmp", 2; + next(); + cutin("sara_9sara1.bmp", 2); mes("[Sara Irene]"); mes("Oh daddy! Let's go to the top of that hill over there!"); npctalk(_("Oh daddy! Let's go to the top of that hill over there!"), instance_npcname("Sara Irene#saratalk")); - next; - cutin "sara_elder_irine1.bmp", 2; + next(); + cutin("sara_elder_irine1.bmp", 2); mes("[Doyen Irene]"); mes("Hah! Hold onto me tight!"); npctalk(_("Hah! Hold onto me tight!"), instance_npcname("Doyen Irene#sarains")); - next; - cutin "sara_elder_irine1.bmp", 255; + next(); + cutin("sara_elder_irine1.bmp", 255); mes("^FF0000As they wander off you hear strange voices from around the corner...^000000"); - donpcevent instance_npcname("Doyen Irene#sarains")+"::OnDisable"; - donpcevent instance_npcname("A girl#sarains")+"::OnDisable"; - dispbottom(_("As they wander off you hear strange voices from around the corner...")),""; - disablenpc instance_npcname("Sara Irene#saratalk"); - next; + donpcevent(instance_npcname("Doyen Irene#sarains")+"::OnDisable"); + donpcevent(instance_npcname("A girl#sarains")+"::OnDisable"); + dispbottom(_("As they wander off you hear strange voices from around the corner..."), ""); + disablenpc(instance_npcname("Sara Irene#saratalk")); + next(); mes("[Strange Old Man A]"); mes("I can feel Sara's power growing. We cannot just stand by and let her achieve her full potential!"); npctalk(_("I can feel Sara's power growing. We cannot just stand by and let her achieve her full potential!"), instance_npcname("Strange Old Man A#stalk")); - next; + next(); mes("[Strange Old Man B]"); mes("She was born under a bad sign and her mother isn't even one of us!"); npctalk(_("She was born under a bad sign and her mother isn't even one of us!"), instance_npcname("Strange Old Man B#stalk")); - next; + next(); mes("[Strange Old Man B]"); mes("Someday she will cause blood to flow in our streets."); npctalk(_("Someday she will cause blood to flow in our streets."), instance_npcname("Strange Old Man B#stalk")); - next; + next(); mes("[Strange Old Man A]"); mes("We have to do something before the Holy creatures select her. I asked HIM to take care of it."); npctalk(_("We have to do something before the Holy creatures select her. I asked HIM to take care of it."), instance_npcname("Strange Old Man A#stalk")); - next; + next(); mes("[Strange Old Man B]"); mes("We will see... I look forward to hearing the bad news that has befallen her..."); npctalk(_("We will see... I look forward to hearing the bad news that has befallen her..."), instance_npcname("Strange Old Man B#stalk")); - next; + next(); mes("^FF0000The old man wander off it seems Sara might be in danger. We have to do something!^000000"); dispbottom(_("The old man wander off it seems Sara might be in danger. We have to do something!")); - close2; - donpcevent instance_npcname("Strange Old Man A#stalk")+"::OnDisable"; - donpcevent instance_npcname("Strange Old Man B#stalk")+"::OnDisable"; - donpcevent instance_npcname("Sara Irene#sarains1")+"::OnEnable"; - donpcevent instance_npcname("#sarawarp1")+"::OnEnable"; - viewpoint 1, 240, 145, 1, C_GREEN; - specialeffect EF_BASH; + close2(); + donpcevent(instance_npcname("Strange Old Man A#stalk")+"::OnDisable"); + donpcevent(instance_npcname("Strange Old Man B#stalk")+"::OnDisable"); + donpcevent(instance_npcname("Sara Irene#sarains1")+"::OnEnable"); + donpcevent(instance_npcname("#sarawarp1")+"::OnEnable"); + viewpoint(1, 240, 145, 1, C_GREEN); + specialeffect(EF_BASH); end; OnInstanceInit: - donpcevent instance_npcname("A girl#sarains")+"::OnEnable"; + donpcevent(instance_npcname("A girl#sarains")+"::OnEnable"); end; OnEnable: - hideoffnpc instance_npcname("A girl#sarains"); + hideoffnpc(instance_npcname("A girl#sarains")); end; OnDisable: - hideonnpc instance_npcname("A girl#sarains"); + hideonnpc(instance_npcname("A girl#sarains")); end; } 1@sara,268,158,3 script Doyen Irene#sarains 4_M_CHIEF_IRIN,{ end; OnInstanceInit: - donpcevent instance_npcname("Doyen Irene#sarains")+"::OnDisable"; + donpcevent(instance_npcname("Doyen Irene#sarains")+"::OnDisable"); end; OnEnable: - hideoffnpc instance_npcname("Doyen Irene#sarains"); + hideoffnpc(instance_npcname("Doyen Irene#sarains")); end; OnDisable: - hideonnpc instance_npcname("Doyen Irene#sarains"); + hideonnpc(instance_npcname("Doyen Irene#sarains")); end; } 1@sara,260,156,0 script Sara Irene#saratalk HIDDEN_NPC,{ end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#saratalk")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#saratalk")+"::OnDisable"); end; OnEnable: - hideoffnpc instance_npcname("Sara Irene#saratalk"); + hideoffnpc(instance_npcname("Sara Irene#saratalk")); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#saratalk"); + hideonnpc(instance_npcname("Sara Irene#saratalk")); end; } - 1@sara,260,156,0 script Strange Old Man A#stalk FAKE_NPC,{ end; OnInstanceInit: - donpcevent instance_npcname("Strange Old Man A#stalk")+"::OnDisable"; + donpcevent(instance_npcname("Strange Old Man A#stalk")+"::OnDisable"); end; OnEnable: - hideoffnpc instance_npcname("Strange Old Man A#stalk"); + hideoffnpc(instance_npcname("Strange Old Man A#stalk")); end; OnDisable: - hideonnpc instance_npcname("Strange Old Man A#stalk"); + hideonnpc(instance_npcname("Strange Old Man A#stalk")); end; } 1@sara,260,156,0 script Strange Old Man B#stalk FAKE_NPC,{ end; OnInstanceInit: - donpcevent instance_npcname("Strange Old Man B#stalk")+"::OnDisable"; + donpcevent(instance_npcname("Strange Old Man B#stalk")+"::OnDisable"); end; OnEnable: - hideoffnpc instance_npcname("Strange Old Man B#stalk"); + hideoffnpc(instance_npcname("Strange Old Man B#stalk")); end; OnDisable: - hideonnpc instance_npcname("Strange Old Man B#stalk"); + hideonnpc(instance_npcname("Strange Old Man B#stalk")); end; } 1@sara,240,145,0 script #sarawarp1 WARPNPC,1,2,{ end; OnInstanceInit: - donpcevent instance_npcname("#sarawarp1")+"::OnDisable"; + donpcevent(instance_npcname("#sarawarp1")+"::OnDisable"); end; OnDisable: - disablenpc instance_npcname("#sarawarp1"); + disablenpc(instance_npcname("#sarawarp1")); end; OnEnable: - enablenpc instance_npcname("#sarawarp1"); + enablenpc(instance_npcname("#sarawarp1")); end; OnTouch: .@map$ = instance_mapname("1@sara"); - warp .@map$, 94, 320; + warp(.@map$, 94, 320); end; } 1@sara,209,250,0 script #sarawarp2 WARPNPC,1,2,{ end; OnInstanceInit: - donpcevent instance_npcname("#sarawarp2")+"::OnDisable"; + donpcevent(instance_npcname("#sarawarp2")+"::OnDisable"); end; OnDisable: - disablenpc instance_npcname("#sarawarp2"); + disablenpc(instance_npcname("#sarawarp2")); end; OnEnable: - enablenpc instance_npcname("#sarawarp2"); + enablenpc(instance_npcname("#sarawarp2")); end; OnTouch: .@map$ = instance_mapname("1@sara"); - warp .@map$, 230, 316; + warp(.@map$, 230, 316); end; } 1@sara,226,190,0 script #sarawarp3 WARPNPC,1,2,{ end; OnInstanceInit: - donpcevent instance_npcname("#sarawarp3")+"::OnDisable"; + donpcevent(instance_npcname("#sarawarp3")+"::OnDisable"); end; OnDisable: - disablenpc instance_npcname("#sarawarp3"); + disablenpc(instance_npcname("#sarawarp3")); end; OnEnable: - enablenpc instance_npcname("#sarawarp3"); + enablenpc(instance_npcname("#sarawarp3")); end; OnTouch: .@map$ = instance_mapname("1@sara"); - warp .@map$, 263, 94; + warp(.@map$, 263, 94); end; } 1@sara,166,67,0 script #sarawarp4 WARPNPC,1,2,{ end; OnInstanceInit: - donpcevent instance_npcname("#sarawarp4")+"::OnDisable"; + donpcevent(instance_npcname("#sarawarp4")+"::OnDisable"); end; OnDisable: - disablenpc instance_npcname("#sarawarp4"); + disablenpc(instance_npcname("#sarawarp4")); end; OnEnable: - enablenpc instance_npcname("#sarawarp4"); + enablenpc(instance_npcname("#sarawarp4")); end; OnTouch: .@map$ = instance_mapname("1@sara"); - warp .@map$, 164, 81; + warp(.@map$, 164, 81); end; } 1@sara,155,180,0 script #sarawarp5 WARPNPC,1,2,{ end; OnInstanceInit: - donpcevent instance_npcname("#sarawarp5")+"::OnDisable"; + donpcevent(instance_npcname("#sarawarp5")+"::OnDisable"); end; OnDisable: - disablenpc instance_npcname("#sarawarp5"); + disablenpc(instance_npcname("#sarawarp5")); end; OnEnable: - enablenpc instance_npcname("#sarawarp5"); + enablenpc(instance_npcname("#sarawarp5")); end; OnTouch: .@map$ = instance_mapname("1@sara"); - warp .@map$, 155, 196; + warp(.@map$, 155, 196); end; } 1@sara,88,188,0 script #sarawarp6 WARPNPC,1,2,{ end; OnInstanceInit: - donpcevent instance_npcname("#sarawarp6")+"::OnDisable"; + donpcevent(instance_npcname("#sarawarp6")+"::OnDisable"); end; OnDisable: - disablenpc instance_npcname("#sarawarp6"); + disablenpc(instance_npcname("#sarawarp6")); end; OnEnable: - enablenpc instance_npcname("#sarawarp6"); + enablenpc(instance_npcname("#sarawarp6")); end; OnTouch: .@map$ = instance_mapname("1@sara"); - warp .@map$, 89, 175; - if (getcharid(CHAR_ID_CHAR) == getpartyleader(getcharid(CHAR_ID_PARTY),2)) - viewpoint 1, 39, 142, 1, C_GREEN; + warp(.@map$, 89, 175); + if (getcharid(CHAR_ID_CHAR) == getpartyleader(getcharid(CHAR_ID_PARTY), 2)) + viewpoint(1, 39, 142, 1, C_GREEN); end; } 1@sara,19,143,0 script #sarawarp7 WARPNPC,1,2,{ end; OnInstanceInit: - donpcevent instance_npcname("#sarawarp7")+"::OnDisable"; + donpcevent(instance_npcname("#sarawarp7")+"::OnDisable"); end; OnDisable: - disablenpc instance_npcname("#sarawarp7"); + disablenpc(instance_npcname("#sarawarp7")); end; OnEnable: - enablenpc instance_npcname("#sarawarp7"); + enablenpc(instance_npcname("#sarawarp7")); end; OnTouch: - completequest 15003; - warp "dali", 134, 111; + completequest(15003); + warp("dali", 134, 111); end; } 1@sara,107,325,5 script Sara Irene#sarains1 4_F_SARAH_BABY,{ if (getcharid(CHAR_ID_CHAR) != getpartyleader(getcharid(CHAR_ID_PARTY), 2)) end; - cutin "sara_9sara1.bmp", 2; + cutin("sara_9sara1.bmp", 2); mes("[Sara Irene]"); mes("Oh! Hello again! I remember you, what's up?"); npctalk(_("Oh! Hello again! I remember you, what's up?")); - next; + next(); mes("[Sara Irene]"); mes("I am here to give flowers to my mommy!"); npctalk(_("I am here to give flowers to my mommy!")); - next; + next(); mes("^FF0000Sara leaps forward to open the door, flowers at the ready.^000000"); dispbottom(_("Sara leaps forward to open the door, flowers at the ready.")); - next; + next(); mes("[Sara Irene]"); mes("Mom! Dad! Look what I found!"); npctalk(_("Mom! Dad! Look what I found!")); - next; - cutin "sara_9sara1.bmp", 255; - cutin "sara_momdie.bmp", 4; + next(); + cutin("sara_9sara1.bmp", 255); + cutin("sara_momdie.bmp", 4); mes("^FF0000The door opens to reveal a woman laying dead on the floor and the\r" "Doyen standing over the woman with a bloody sword.^000000"); dispbottom(_("The door opens to reveal a woman laying dead on the floor and the Doyen standing over the woman with a bloody sword.")); - next; + next(); mes("[Sara Irene]"); mes("..."); npctalk("..."); - next; + next(); mes("[Sara Irene]"); mes("..."); npctalk("..."); - next; + next(); mes("[Sara Irene]"); mes("..."); npctalk("..."); mapannounce(instance_mapname("1@sara"), _("[Sara's Mother] : Sara...Ru-..away..."), bc_map, C_YELLOW); - next; + next(); mes("[Sara Irene]"); mes("..."); npctalk("..."); - next; + next(); mes("^FF0000A gem rolls from the womans hand and comes to a rest in front of\r" "Sara. Unconsciously Sara reaches down and picks up the gem.^000000"); dispbottom(_("A gem rolls from the womans hand and comes to a rest in front of Sara. Unconsciously Sara reaches down and picks up the gem.")); - next; + next(); mes("^FF0000The Doyen turns around and notices Sara.^000000"); dispbottom(_("The Doyen turns around and notices Sara.")); - next; - cutin "sara_momdie.bmp", 255; - cutin "sara_elder_irine4.bmp", 2; + next(); + cutin("sara_momdie.bmp", 255); + cutin("sara_elder_irine4.bmp", 2); mes("[Doyen Irene]"); mes("Ahh Sara! I was just looking for you..."); npctalk(_("Ahh Sara! I was just looking for you..."), instance_npcname("Doyen Irene#sarains1")); - next; - cutin "sara_9sara2.bmp", 2; + next(); + cutin("sara_9sara2.bmp", 2); mes("[Sara Irene]"); mes("..."); npctalk("..."); - next; + next(); select("Escape with Sara."); mes("[Sara Irene]"); mes("..."); npctalk("..."); - next; - cutin "sara_elder_irine3.bmp", 2; + next(); + cutin("sara_elder_irine3.bmp", 2); mes("[Doyen Irene]"); mes("Guards! GUARDS! There is a murderer here! Catch him!"); npctalk(_("Guards! GUARDS! There is a murderer here! Catch him!"), instance_npcname("Doyen Irene#sarains1")); - next; + next(); mes("^FF0000The sound of many pairs of boots can be heard running outside!^000000"); dispbottom(_("The sound of many pairs of boots can be heard running outside!")); - next; - cutin "sara_9sara3.bmp", 2; + next(); + cutin("sara_9sara3.bmp", 2); mes("[Sara Irene]"); mes("Mommy no!!!!!!!!!!!!!!!"); npctalk(_("Mommy no!!!!!!!!!!!!!!!")); - next; - cutin "sara_9sara3.bmp", 255; + next(); + cutin("sara_9sara3.bmp", 255); mes("^FF0000Sara runs aways and the sound of the guards is getting closer...^000000"); dispbottom(_("Sara runs aways and the sound of the guards is getting closer...")); - close2; - donpcevent instance_npcname("Sara Irene#sarains1")+"::OnDisable"; - donpcevent instance_npcname("Sara Irene#sarains4")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains5")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains6")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains7")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains8")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains9")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains10")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains11")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains12")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains13")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains14")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains15")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains16")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains17")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains18")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains19")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains20")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains21")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains22")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains23")+"::OnEnable"; - donpcevent instance_npcname("#controlsara")+"::OnEnable"; + close2(); + donpcevent(instance_npcname("Sara Irene#sarains1")+"::OnDisable"); + donpcevent(instance_npcname("Sara Irene#sarains4")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains5")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains6")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains7")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains8")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains9")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains10")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains11")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains12")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains13")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains14")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains15")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains16")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains17")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains18")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains19")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains20")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains21")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains22")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains23")+"::OnEnable"); + donpcevent(instance_npcname("#controlsara")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains1")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains1")+"::OnDisable"); end; OnEnable: - hideoffnpc instance_npcname("Sara Irene#sarains1"); + hideoffnpc(instance_npcname("Sara Irene#sarains1")); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains1"); + hideonnpc(instance_npcname("Sara Irene#sarains1")); end; } 1@sara,107,325,0 script Doyen Irene#sarains1 FAKE_NPC,{ end; OnInstanceInit: - donpcevent instance_npcname("Doyen Irene#sarains1")+"::OnDisable"; + donpcevent(instance_npcname("Doyen Irene#sarains1")+"::OnDisable"); end; OnEnable: - hideoffnpc instance_npcname("Doyen Irene#sarains1"); + hideoffnpc(instance_npcname("Doyen Irene#sarains1")); end; OnDisable: - hideonnpc instance_npcname("Doyen Irene#sarains1"); + hideonnpc(instance_npcname("Doyen Irene#sarains1")); end; } 1@sara,107,327,0 script #controlsara CLEAR_NPC,{ end; OnInstanceInit: - donpcevent instance_npcname("#controlsara")+"::OnDisable"; + donpcevent(instance_npcname("#controlsara")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("#controlsara"); - hideonnpc instance_npcname("#controlsara"); - initnpctimer; + enablenpc(instance_npcname("#controlsara")); + hideonnpc(instance_npcname("#controlsara")); + initnpctimer(); end; OnDisable: - disablenpc instance_npcname("#controlsara"); + disablenpc(instance_npcname("#controlsara")); end; OnTimer2000: mapannounce(instance_mapname("1@sara"), _("<SYSTEM> The guards must be defeated to gain access to the next area."), bc_map, C_YELLOW); @@ -694,12 +693,12 @@ OnTimer4000: mapannounce(instance_mapname("1@sara"), _("<SYSTEM> The guards have formed groups of their own to fight you!"), bc_map, C_YELLOW); end; OnTimer5000: - donpcevent instance_npcname("#controlsara")+"::OnRespawn"; - stopnpctimer; + donpcevent(instance_npcname("#controlsara")+"::OnRespawn"); + stopnpctimer(); end; OnRespawn: .@map$ = instance_mapname("1@sara"); - + monster(.@map$, .@x, .@y, _("Maggot"), MG_ARCLOUSE, .@mobs, instance_npcname(strnpcinfo(NPC_NAME))+"::OnMyMobDead"); monster(.@map$, 107, 325, _("Payon Town Guard"), PAYONSOLDIER, 1, instance_npcname(strnpcinfo(NPC_NAME))+"::OnMyMobDead"); monster(.@map$, 115, 325, _("Payon Town Guard"), PAYONSOLDIER, 1, instance_npcname(strnpcinfo(NPC_NAME))+"::OnMyMobDead"); @@ -773,11 +772,11 @@ OnMyMobDead: .@a_mob_num = mobcount(.@map$, instance_npcname(strnpcinfo(NPC_NAME))+"::OnMyMobDead"); .@mob_dead_num = .@callnum - .@a_mob_num; if (.@mob_dead_num > 57) { - viewpoint 1, 209, 250, 1, C_GREEN; + viewpoint(1, 209, 250, 1, C_GREEN); mapannounce(instance_mapname("1@sara"), _("<SYSTEM> Sara ran away again! You think she went in the 2 O'clock direction!"), bc_map, C_YELLOW); - donpcevent instance_npcname("#controlsara")+"::OnDisable"; - donpcevent instance_npcname("#controlsara1")+"::OnEnable"; - donpcevent instance_npcname("#sarawarp2")+"::OnEnable"; + donpcevent(instance_npcname("#controlsara")+"::OnDisable"); + donpcevent(instance_npcname("#controlsara1")+"::OnEnable"); + donpcevent(instance_npcname("#sarawarp2")+"::OnEnable"); } end; } @@ -785,15 +784,15 @@ OnMyMobDead: 1@sara,230,316,0 script #controlsara1 CLEAR_NPC,{ end; OnInstanceInit: - donpcevent instance_npcname("#controlsara1")+"::OnDisable"; + donpcevent(instance_npcname("#controlsara1")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("#controlsara1"); - hideonnpc instance_npcname("#controlsara1"); - donpcevent instance_npcname("#controlsara1")+"::OnRespawn"; + enablenpc(instance_npcname("#controlsara1")); + hideonnpc(instance_npcname("#controlsara1")); + donpcevent(instance_npcname("#controlsara1")+"::OnRespawn"); end; OnDisable: - disablenpc instance_npcname("#controlsara1"); + disablenpc(instance_npcname("#controlsara1")); end; OnRespawn: .@map$ = instance_mapname("1@sara"); @@ -825,11 +824,11 @@ OnMyMobDead: .@b_mob_num = mobcount(.@map$, instance_npcname(strnpcinfo(NPC_NAME))+"::OnMyMobDead"); .@mob_dead_num = .@callnum - .@b_mob_num; if (.@mob_dead_num > 15) { - viewpoint 1, 226, 190, 1, C_GREEN; + viewpoint(1, 226, 190, 1, C_GREEN); mapannounce(instance_mapname("1@sara"), _("<SYSTEM> Sara ran away yet again! You think she went in the 5 O'clock direction!"), bc_map, C_YELLOW); - donpcevent instance_npcname("#controlsara1")+"::OnDisable"; - donpcevent instance_npcname("#controlsara2")+"::OnEnable"; - donpcevent instance_npcname("#sarawarp3")+"::OnEnable"; + donpcevent(instance_npcname("#controlsara1")+"::OnDisable"); + donpcevent(instance_npcname("#controlsara2")+"::OnEnable"); + donpcevent(instance_npcname("#sarawarp3")+"::OnEnable"); } end; } @@ -837,15 +836,15 @@ OnMyMobDead: 1@sara,263,94,0 script #controlsara2 CLEAR_NPC,{ end; OnInstanceInit: - donpcevent instance_npcname("#controlsara2")+"::OnDisable"; + donpcevent(instance_npcname("#controlsara2")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("#controlsara2"); - hideonnpc instance_npcname("#controlsara2"); - donpcevent instance_npcname("#controlsara2")+"::OnRespawn"; + enablenpc(instance_npcname("#controlsara2")); + hideonnpc(instance_npcname("#controlsara2")); + donpcevent(instance_npcname("#controlsara2")+"::OnRespawn"); end; OnDisable: - disablenpc instance_npcname("#controlsara2"); + disablenpc(instance_npcname("#controlsara2")); end; OnRespawn: .@map$ = instance_mapname("1@sara"); @@ -909,11 +908,11 @@ OnMyMobDead: .@c_mob_num = mobcount(.@map$, instance_npcname(strnpcinfo(NPC_NAME))+"::OnMyMobDead"); .@mob_dead_num = .@callnum - .@c_mob_num; if (.@mob_dead_num > 44) { - viewpoint 1, 166, 67, 1, C_GREEN; + viewpoint(1, 166, 67, 1, C_GREEN); mapannounce(instance_mapname("1@sara"), _("<SYSTEM> Sara ran away yet again! *sigh* You think she went in the 6 O'clock direction!"), bc_map, C_YELLOW); - donpcevent instance_npcname("#controlsara2")+"::OnDisable"; - donpcevent instance_npcname("#controlsara3")+"::OnEnable"; - donpcevent instance_npcname("#sarawarp4")+"::OnEnable"; + donpcevent(instance_npcname("#controlsara2")+"::OnDisable"); + donpcevent(instance_npcname("#controlsara3")+"::OnEnable"); + donpcevent(instance_npcname("#sarawarp4")+"::OnEnable"); } end; } @@ -921,15 +920,15 @@ OnMyMobDead: 1@sara,164,81,0 script #controlsara3 CLEAR_NPC,{ end; OnInstanceInit: - donpcevent instance_npcname("#controlsara3")+"::OnDisable"; + donpcevent(instance_npcname("#controlsara3")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("#controlsara3"); - hideonnpc instance_npcname("#controlsara3"); - donpcevent instance_npcname("#controlsara3")+"::OnRespawn"; + enablenpc(instance_npcname("#controlsara3")); + hideonnpc(instance_npcname("#controlsara3")); + donpcevent(instance_npcname("#controlsara3")+"::OnRespawn"); end; OnDisable: - disablenpc instance_npcname("#controlsara3"); + disablenpc(instance_npcname("#controlsara3")); end; OnRespawn: .@map$ = instance_mapname("1@sara"); @@ -975,7 +974,7 @@ OnRespawn: monster(.@map$, 155, 180, _("Payon Town Guard"), PAYONSOLDIER2, 1, instance_npcname(strnpcinfo(NPC_NAME))+"::OnMyMobDead"); monster(.@map$, 157, 180, _("Payon Town Guard"), PAYONSOLDIER2, 1, instance_npcname(strnpcinfo(NPC_NAME))+"::OnMyMobDead"); monster(.@map$, 159, 180, _("Payon Town Guard"), PAYONSOLDIER2, 1, instance_npcname(strnpcinfo(NPC_NAME))+"::OnMyMobDead"); - + monster(.@map$, 173, 139, _("Payon Town Guard"), PAYONSOLDIER, 1, instance_npcname(strnpcinfo(NPC_NAME))+"::OnMyMobDead"); monster(.@map$, 170, 139, _("Payon Town Guard"), PAYONSOLDIER, 1, instance_npcname(strnpcinfo(NPC_NAME))+"::OnMyMobDead"); monster(.@map$, 167, 139, _("Payon Town Guard"), PAYONSOLDIER, 1, instance_npcname(strnpcinfo(NPC_NAME))+"::OnMyMobDead"); @@ -992,15 +991,15 @@ OnMyMobDead: .@d_mob_num = mobcount(.@map$, instance_npcname(strnpcinfo(NPC_NAME))+"::OnMyMobDead"); .@mob_dead_num = .@callnum - .@d_mob_num; if (.@mob_dead_num > 42) { - viewpoint 1, 155, 180, 1, C_GREEN; + viewpoint(1, 155, 180, 1, C_GREEN); mapannounce(instance_mapname("1@sara"), _("<SYSTEM> Sara ran away yet again! You think she went in the 12 O'clock direction!"), bc_map, C_YELLOW); - for (.@i=4; .@i<=23; .@i++) { - donpcevent instance_npcname("Sara Irene#sarains" + .@i)+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains" + .@i)+"::OnDisable"; + for (.@i = 4; .@i <= 23; .@i++) { + donpcevent(instance_npcname("Sara Irene#sarains" + .@i)+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains" + .@i)+"::OnDisable"); } - donpcevent instance_npcname("#controlsara3")+"::OnDisable"; - donpcevent instance_npcname("#sarawarp5")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains2")+"::OnEnable"; + donpcevent(instance_npcname("#controlsara3")+"::OnDisable"); + donpcevent(instance_npcname("#sarawarp5")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains2")+"::OnEnable"); } end; } @@ -1008,84 +1007,84 @@ OnMyMobDead: 1@sara,152,233,5 script Sara Irene#sarains2 4_F_SARAH_BABY,{ if (getcharid(CHAR_ID_CHAR) != getpartyleader(getcharid(CHAR_ID_PARTY), 2)) end; - cutin "sara_9sara2.bmp", 2; + cutin("sara_9sara2.bmp", 2); mes("[Sara Irene]"); mes("Mommy!"); npctalk(_("Mommy!")); - next; - cutin "sara_elder_irine4.bmp", 2; + next(); + cutin("sara_elder_irine4.bmp", 2); mes("[Doyen Irene]"); mes("Sara..."); npctalk(_("Sara..."), instance_npcname("Doyen Irene#sarains2")); - next; - cutin "sara_9sara2.bmp", 2; + next(); + cutin("sara_9sara2.bmp", 2); mes("[Sara Irene]"); mes("No!"); npctalk(_("No!")); - next; - cutin "sara_elder_irine4.bmp", 2; + next(); + cutin("sara_elder_irine4.bmp", 2); mes("[Doyen Irene]"); mes("I have been looking for you Sara. Please come with daddy it is very dangerous here!"); npctalk(_("I have been looking for you Sara. Please come with daddy it is very dangerous here!"), instance_npcname("Doyen Irene#sarains2")); - next; + next(); mesf("[%s]", strcharinfo(PC_NAME)); mes("I won't let you take Sara!"); unittalk(getcharid(CHAR_ID_ACCOUNT), _("I won't let you take Sara!")); - next; - cutin "sara_elder_irine3.bmp", 2; + next(); + cutin("sara_elder_irine3.bmp", 2); mes("[Doyen Irene]"); mes("The murderer is here! Guards! We will finish him once and for all!"); npctalk(_("The murderer is here! Guards! We will finish him once and for all!"), instance_npcname("Doyen Irene#sarains2")); - next; + next(); mesf("[%s]", strcharinfo(PC_NAME)); mes("Sara... run! Save yourself!"); unittalk(getcharid(CHAR_ID_ACCOUNT), _("Sara... run! Save yourself!")); - next; - cutin "sara_9sara2.bmp", 2; + next(); + cutin("sara_9sara2.bmp", 2); mes("[Sara Irene]"); mes("...okay."); npctalk(_("...okay.")); - close2; - cutin "sara_9sara2.bmp", 255; - donpcevent instance_npcname("Sara Irene#sarains2")+"::OnDisable"; - donpcevent instance_npcname("#controlsara4")+"::OnEnable"; + close2(); + cutin("sara_9sara2.bmp", 255); + donpcevent(instance_npcname("Sara Irene#sarains2")+"::OnDisable"); + donpcevent(instance_npcname("#controlsara4")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains2")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains2")+"::OnDisable"); end; OnEnable: - hideoffnpc instance_npcname("Sara Irene#sarains2"); + hideoffnpc(instance_npcname("Sara Irene#sarains2")); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains2"); + hideonnpc(instance_npcname("Sara Irene#sarains2")); end; } 1@sara,152,233,5,0 script Doyen Irene#sarains2 FAKE_NPC,{ end; OnInstanceInit: - donpcevent instance_npcname("Doyen Irene#sarains2")+"::OnDisable"; + donpcevent(instance_npcname("Doyen Irene#sarains2")+"::OnDisable"); end; OnEnable: - hideoffnpc instance_npcname("Doyen Irene#sarains2"); + hideoffnpc(instance_npcname("Doyen Irene#sarains2")); end; OnDisable: - hideonnpc instance_npcname("Doyen Irene#sarains2"); + hideonnpc(instance_npcname("Doyen Irene#sarains2")); end; } 1@sara,152,233,0 script #controlsara4 FAKE_NPC,{ end; OnInstanceInit: - donpcevent instance_npcname("#controlsara4")+"::OnDisable"; + donpcevent(instance_npcname("#controlsara4")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("#controlsara4"); - donpcevent instance_npcname("#controlsara4")+"::OnRespawn"; + enablenpc(instance_npcname("#controlsara4")); + donpcevent(instance_npcname("#controlsara4")+"::OnRespawn"); end; OnDisable: - disablenpc instance_npcname("#controlsara4"); + disablenpc(instance_npcname("#controlsara4")); end; OnRespawn: .@map$ = instance_mapname("1@sara"); @@ -1112,9 +1111,9 @@ OnMyMobDead: .@f_mob_num = mobcount(.@map$, instance_npcname(strnpcinfo(NPC_NAME))+"::OnMyMobDead"); .@mob_dead_num = .@callnum - .@f_mob_num; if (.@mob_dead_num > 7) { - mapannounce(instance_mapname("1@sara"),_("<SYSTEM> Doyen Irene draws his blade!"), bc_map, C_YELLOW); - donpcevent instance_npcname("#controlsara4")+"::OnDisable"; - donpcevent instance_npcname("#controlsara5")+"::OnEnable"; + mapannounce(instance_mapname("1@sara"), _("<SYSTEM> Doyen Irene draws his blade!"), bc_map, C_YELLOW); + donpcevent(instance_npcname("#controlsara4")+"::OnDisable"); + donpcevent(instance_npcname("#controlsara5")+"::OnEnable"); } end; } @@ -1122,14 +1121,14 @@ OnMyMobDead: 1@sara,155,226,0 script #controlsara5 FAKE_NPC,{ end; OnInstanceInit: - donpcevent instance_npcname("#controlsara5")+"::OnDisable"; + donpcevent(instance_npcname("#controlsara5")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("#controlsara5"); - donpcevent instance_npcname("#controlsara5")+"::OnRespawn"; + enablenpc(instance_npcname("#controlsara5")); + donpcevent(instance_npcname("#controlsara5")+"::OnRespawn"); end; OnDisable: - disablenpc instance_npcname("#controlsara5"); + disablenpc(instance_npcname("#controlsara5")); end; OnRespawn: .@map$ = instance_mapname("1@sara"); @@ -1143,8 +1142,8 @@ OnMyMobDead: .@mob_dead_num = .@callnum - .@g_mob_num; if (.@mob_dead_num > 0) { mapannounce(instance_mapname("1@sara"), _("<SYSTEM> Doyen Irene has fallen."), bc_map, C_YELLOW); - donpcevent instance_npcname("#controlsara5")+"::OnDisable"; - donpcevent instance_npcname("Doyen Irene#sarains3")+"::OnEnable"; + donpcevent(instance_npcname("#controlsara5")+"::OnDisable"); + donpcevent(instance_npcname("Doyen Irene#sarains3")+"::OnEnable"); } end; } @@ -1152,82 +1151,82 @@ OnMyMobDead: 1@sara,156,236,3 script Doyen Irene#sarains3 4_M_CHIEF_IRIN,{ if (getcharid(CHAR_ID_CHAR) != getpartyleader(getcharid(CHAR_ID_PARTY), 2)) end; - cutin "sara_elder_irine4.bmp", 2; + cutin("sara_elder_irine4.bmp", 2); mes("[Doyen Irene]"); mes("You... were too strong for me."); npctalk(_("You... were too strong for me.")); - next; + next(); mes("[Doyen Irene]"); mes("Why.. *hack* are you trying to kill my wife and daughter?"); npctalk(_("Why.. *hack* are you trying to kill my wife and daughter?")); - next; + next(); mesf("[%s]", strcharinfo(PC_NAME)); mes("What are you talking about? We saw you standing over Sara's mother with your sword COVERED in blood!"); unittalk(getcharid(CHAR_ID_ACCOUNT), _("What are you talking about? We saw you standing over Sara's mother with your sword COVERED in blood!")); - next; + next(); mes("[Doyen Irene]"); mes("You.. think I killed Sara's mother?"); npctalk(_("You.. think I killed Sara's mother?")); - next; + next(); mes("[Doyen Irene]"); mes("She *cough* had already been killed by an assassin. I slew him that *hack* is why my blade was covered in blood..."); npctalk(_("She *cough* had already been killed by an assassin. I slew him that *hack* is why my blade was covered in blood...")); - next; - cutin "sara_elder_irine4.bmp", 255; - cutin "sara_momdie.bmp", 4; + next(); + cutin("sara_elder_irine4.bmp", 255); + cutin("sara_momdie.bmp", 4); mes("^FF0000Thinking back you seem to recall another body laying in the left\r" "corner of the room. Maybe that was the assassin the Doyen is talking about.^000000"); dispbottom(_("Thinking back you seem to recall another body laying in the left corner of the room. Maybe that was the assassin the Doyen is talking about.")); - next; - cutin "sara_momdie.bmp", 255; - cutin "sara_elder_irine4.bmp", 2; + next(); + cutin("sara_momdie.bmp", 255); + cutin("sara_elder_irine4.bmp", 2); mes("[Doyen Irene]"); mes("If.. you are not the assassin sent to kill my wife and daughter, who are you?"); npctalk(_("If.. you are not the assassin sent to kill my wife and daughter, who are you?")); - next; + next(); mesf("[%s]", strcharinfo(PC_NAME)); mes("I am just an adventurer who was passing through. I heard some men plotting their deaths and needed to intervene."); unittalk(getcharid(CHAR_ID_ACCOUNT), _("I am just an adventurer who was passing through. I heard some men plotting their deaths and needed to intervene.")); - next; + next(); mes("[Doyen Irene]"); mes("If.. you are telling the truth...\r" "forgive me. I though you were one of them."); npctalk(_("If.. you are telling the truth... forgive me. I though you were one of them.")); - next; + next(); mes("[Doyen Irene]"); mes("Strange men... I bet they were some of the village elders. Ugh..."); npctalk(_("Strange men... I bet they were some of the village elders. Ugh...")); - next; + next(); mesf("[%s]", strcharinfo(PC_NAME)); mes("There might be more assassins so we have to find Sara as fast as we can."); unittalk(getcharid(CHAR_ID_ACCOUNT), _("There might be more assassins so we have to find Sara as fast as we can.")); - next; + next(); mesf("[%s]", strcharinfo(PC_NAME)); mes("Sara believes that you killed her mother. We need to tell her the truth."); unittalk(getcharid(CHAR_ID_ACCOUNT), _("Sara believes that you killed her mother. We need to tell her the truth.")); - next; + next(); mes("[Doyen Irene]"); mes("We must do our best to find her. Let's split up and search for her.\r" "Please help me find my daughter and explain everything to her."); npctalk(_("We must do our best to find her. Let's split up and search for her. Please help me find my daughter and explain everything to her.")); - close2; - cutin "sara_elder_irine4.bmp", 255; - viewpoint 1, 88, 188, 1, C_GREEN; + close2(); + cutin("sara_elder_irine4.bmp", 255); + viewpoint(1, 88, 188, 1, C_GREEN); mapannounce(instance_mapname("1@sara"), _("<SYSTEM> We must find Sara. You seem remember her running in the 8 O'clock direction."), bc_map, C_YELLOW); - donpcevent instance_npcname("Doyen Irene#sarains3")+"::OnDisable"; - donpcevent instance_npcname("#sarawarp6")+"::OnEnable"; - donpcevent instance_npcname("????-#saratalk")+"::OnEnable"; - donpcevent instance_npcname("Sara Irene#sarains3")+"::OnEnable"; + donpcevent(instance_npcname("Doyen Irene#sarains3")+"::OnDisable"); + donpcevent(instance_npcname("#sarawarp6")+"::OnEnable"); + donpcevent(instance_npcname("????-#saratalk")+"::OnEnable"); + donpcevent(instance_npcname("Sara Irene#sarains3")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Doyen Irene#sarains3")+"::OnDisable"; + donpcevent(instance_npcname("Doyen Irene#sarains3")+"::OnDisable"); end; OnEnable: - hideoffnpc instance_npcname("Doyen Irene#sarains3"); + hideoffnpc(instance_npcname("Doyen Irene#sarains3")); end; OnDisable: - hideonnpc instance_npcname("Doyen Irene#sarains3"); + hideonnpc(instance_npcname("Doyen Irene#sarains3")); end; } @@ -1236,69 +1235,69 @@ OnDisable: end; mes("^FF0000As you are about to call out to Sara a sudden blow knocks you down from behind.^000000"); dispbottom(_("As you are about to call out to Sara a sudden blow knocks you down from behind.")); - next; - cutin "sara_beholder.bmp", 2; + next(); + cutin("sara_beholder.bmp", 2); mes("[?????]"); mes("The time travellers cannot interfere any longer. You cannot stop us from meeting Sara."); npctalk(_("The time travellers cannot interfere any longer. You cannot stop us from meeting Sara."), instance_npcname("????-#saratalk")); - next; + next(); mes("[?????]"); mes("You should go back to the time where you belong."); npctalk(_("You should go back to the time where you belong."), instance_npcname("????-#saratalk")); - next; + next(); mes("^FF0000As you fall to the ground two dark figures approach Sara.^000000"); dispbottom(_("As you fall to the ground two dark figures approach Sara.")); - next; + next(); mes("[?????]"); mes("A girl full of betrayal, despair, and hate. We will guide you to your ultimate fate."); npctalk(_("A girl full of betrayal, despair, and hate. We will guide you to your ultimate fate."), instance_npcname("????-#saratalk")); - next; - cutin "sara_9sara2.bmp", 2; + next(); + cutin("sara_9sara2.bmp", 2); mes("[Sara Irene]"); mes("..."); npctalk("..."); - next; - cutin "sara_beholder.bmp", 2; + next(); + cutin("sara_beholder.bmp", 2); mes("[?????]"); mes("Sara Irene, he will make your dreams come true."); npctalk(_("Sara Irene, he will make your dreams come true."), instance_npcname("????-#saratalk")); - next; - cutin "sara_beholder.bmp", 255; + next(); + cutin("sara_beholder.bmp", 255); mes("^FF0000One of the cloaked strangers covers Sara with their cloak and all three figures disappear.^000000"); dispbottom(_("One of the cloaked strangers covers Sara with their cloak and all three figures disappear.")); - donpcevent instance_npcname("Sara Irene#sarains3")+"::OnDisable"; - next; + donpcevent(instance_npcname("Sara Irene#sarains3")+"::OnDisable"); + next(); mes("^FF0000At the same time as Sara disappearing this place begin to become unstable, just like what Leon said before.^000000"); dispbottom(_("At the same time as Sara disappearing this place begin to become unstable, just like what Leon said before.")); - next; + next(); mes("^FF0000We need to get out from this place quickly to the left. And when we at the outside let's talk to him.^000000"); dispbottom(_("We need to get out from this place quickly to the left. And when we at the outside let's talk to him.")); - close2; - donpcevent instance_npcname("????-#saratalk")+"::OnDisable"; - donpcevent instance_npcname("#sarawarp7")+"::OnEnable"; + close2(); + donpcevent(instance_npcname("????-#saratalk")+"::OnDisable"); + donpcevent(instance_npcname("#sarawarp7")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains3")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains3")+"::OnDisable"); end; OnEnable: - hideoffnpc instance_npcname("Sara Irene#sarains3"); + hideoffnpc(instance_npcname("Sara Irene#sarains3")); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains3"); + hideonnpc(instance_npcname("Sara Irene#sarains3")); end; } 1@sara,152,233,0 script ????-#saratalk FAKE_NPC,{ end; OnInstanceInit: - donpcevent instance_npcname("????-#saratalk")+"::OnDisable"; + donpcevent(instance_npcname("????-#saratalk")+"::OnDisable"); end; OnEnable: - hideoffnpc instance_npcname("????-#saratalk"); + hideoffnpc(instance_npcname("????-#saratalk")); end; OnDisable: - hideonnpc instance_npcname("????-#saratalk"); + hideonnpc(instance_npcname("????-#saratalk")); end; } @@ -1306,23 +1305,23 @@ OnDisable: end; OnTouch: npctalk(_("Why daddy?")); - initnpctimer; - donpcevent instance_npcname("Sara Irene#sarains4")+"::OnDisable"; + initnpctimer(); + donpcevent(instance_npcname("Sara Irene#sarains4")+"::OnDisable"); end; OnTimer60000: - donpcevent instance_npcname("Sara Irene#sarains4")+"::OnEnable"; + donpcevent(instance_npcname("Sara Irene#sarains4")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains4")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains4")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("Sara Irene#sarains4"); - hideoffnpc instance_npcname("Sara Irene#sarains4"); - stopnpctimer; + enablenpc(instance_npcname("Sara Irene#sarains4")); + hideoffnpc(instance_npcname("Sara Irene#sarains4")); + stopnpctimer(); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains4"); - disablenpc instance_npcname("Sara Irene#sarains4"); + hideonnpc(instance_npcname("Sara Irene#sarains4")); + disablenpc(instance_npcname("Sara Irene#sarains4")); end; } @@ -1330,23 +1329,23 @@ OnDisable: end; OnTouch: npctalk(_("Not mommy!")); - initnpctimer; - donpcevent instance_npcname("Sara Irene#sarains5")+"::OnDisable"; + initnpctimer(); + donpcevent(instance_npcname("Sara Irene#sarains5")+"::OnDisable"); end; OnTimer60000: - donpcevent instance_npcname("Sara Irene#sarains5")+"::OnEnable"; + donpcevent(instance_npcname("Sara Irene#sarains5")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains5")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains5")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("Sara Irene#sarains5"); - hideoffnpc instance_npcname("Sara Irene#sarains5"); - stopnpctimer; + enablenpc(instance_npcname("Sara Irene#sarains5")); + hideoffnpc(instance_npcname("Sara Irene#sarains5")); + stopnpctimer(); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains5"); - disablenpc instance_npcname("Sara Irene#sarains5"); + hideonnpc(instance_npcname("Sara Irene#sarains5")); + disablenpc(instance_npcname("Sara Irene#sarains5")); end; } @@ -1354,23 +1353,23 @@ OnDisable: end; OnTouch: npctalk(_("Why did he do it?!")); - initnpctimer; - donpcevent instance_npcname("Sara Irene#sarains6")+"::OnDisable"; + initnpctimer(); + donpcevent(instance_npcname("Sara Irene#sarains6")+"::OnDisable"); end; OnTimer60000: - donpcevent instance_npcname("Sara Irene#sarains6")+"::OnEnable"; + donpcevent(instance_npcname("Sara Irene#sarains6")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains6")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains6")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("Sara Irene#sarains6"); - hideoffnpc instance_npcname("Sara Irene#sarains6"); - stopnpctimer; + enablenpc(instance_npcname("Sara Irene#sarains6")); + hideoffnpc(instance_npcname("Sara Irene#sarains6")); + stopnpctimer(); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains6"); - disablenpc instance_npcname("Sara Irene#sarains6"); + hideonnpc(instance_npcname("Sara Irene#sarains6")); + disablenpc(instance_npcname("Sara Irene#sarains6")); end; } @@ -1378,23 +1377,23 @@ OnDisable: end; OnTouch: npctalk(_("Why.. why?!")); - initnpctimer; - donpcevent instance_npcname("Sara Irene#sarains7")+"::OnDisable"; + initnpctimer(); + donpcevent(instance_npcname("Sara Irene#sarains7")+"::OnDisable"); end; OnTimer60000: - donpcevent instance_npcname("Sara Irene#sarains7")+"::OnEnable"; + donpcevent(instance_npcname("Sara Irene#sarains7")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains7")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains7")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("Sara Irene#sarains7"); - hideoffnpc instance_npcname("Sara Irene#sarains7"); - stopnpctimer; + enablenpc(instance_npcname("Sara Irene#sarains7")); + hideoffnpc(instance_npcname("Sara Irene#sarains7")); + stopnpctimer(); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains7"); - disablenpc instance_npcname("Sara Irene#sarains7"); + hideonnpc(instance_npcname("Sara Irene#sarains7")); + disablenpc(instance_npcname("Sara Irene#sarains7")); end; } @@ -1402,23 +1401,23 @@ OnDisable: end; OnTouch: npctalk(_("Noooo...")); - initnpctimer; - donpcevent instance_npcname("Sara Irene#sarains8")+"::OnDisable"; + initnpctimer(); + donpcevent(instance_npcname("Sara Irene#sarains8")+"::OnDisable"); end; OnTimer60000: - donpcevent instance_npcname("Sara Irene#sarains8")+"::OnEnable"; + donpcevent(instance_npcname("Sara Irene#sarains8")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains8")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains8")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("Sara Irene#sarains8"); - hideoffnpc instance_npcname("Sara Irene#sarains8"); - stopnpctimer; + enablenpc(instance_npcname("Sara Irene#sarains8")); + hideoffnpc(instance_npcname("Sara Irene#sarains8")); + stopnpctimer(); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains8"); - disablenpc instance_npcname("Sara Irene#sarains8"); + hideonnpc(instance_npcname("Sara Irene#sarains8")); + disablenpc(instance_npcname("Sara Irene#sarains8")); end; } @@ -1426,23 +1425,23 @@ OnDisable: end; OnTouch: npctalk("..."); - initnpctimer; - donpcevent instance_npcname("Sara Irene#sarains9")+"::OnDisable"; + initnpctimer(); + donpcevent(instance_npcname("Sara Irene#sarains9")+"::OnDisable"); end; OnTimer60000: - donpcevent instance_npcname("Sara Irene#sarains9")+"::OnEnable"; + donpcevent(instance_npcname("Sara Irene#sarains9")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains9")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains9")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("Sara Irene#sarains9"); - hideoffnpc instance_npcname("Sara Irene#sarains9"); - stopnpctimer; + enablenpc(instance_npcname("Sara Irene#sarains9")); + hideoffnpc(instance_npcname("Sara Irene#sarains9")); + stopnpctimer(); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains9"); - disablenpc instance_npcname("Sara Irene#sarains9"); + hideonnpc(instance_npcname("Sara Irene#sarains9")); + disablenpc(instance_npcname("Sara Irene#sarains9")); end; } @@ -1450,23 +1449,23 @@ OnDisable: end; OnTouch: npctalk(_("Why does it hurt so much?")); - initnpctimer; - donpcevent instance_npcname("Sara Irene#sarains10")+"::OnDisable"; + initnpctimer(); + donpcevent(instance_npcname("Sara Irene#sarains10")+"::OnDisable"); end; OnTimer60000: - donpcevent instance_npcname("Sara Irene#sarains10")+"::OnEnable"; + donpcevent(instance_npcname("Sara Irene#sarains10")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains10")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains10")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("Sara Irene#sarains10"); - hideoffnpc instance_npcname("Sara Irene#sarains10"); - stopnpctimer; + enablenpc(instance_npcname("Sara Irene#sarains10")); + hideoffnpc(instance_npcname("Sara Irene#sarains10")); + stopnpctimer(); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains10"); - disablenpc instance_npcname("Sara Irene#sarains10"); + hideonnpc(instance_npcname("Sara Irene#sarains10")); + disablenpc(instance_npcname("Sara Irene#sarains10")); end; } @@ -1474,23 +1473,23 @@ OnDisable: end; OnTouch: npctalk(_("........")); - initnpctimer; - donpcevent instance_npcname("Sara Irene#sarains11")+"::OnDisable"; + initnpctimer(); + donpcevent(instance_npcname("Sara Irene#sarains11")+"::OnDisable"); end; OnTimer60000: - donpcevent instance_npcname("Sara Irene#sarains11")+"::OnEnable"; + donpcevent(instance_npcname("Sara Irene#sarains11")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains11")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains11")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("Sara Irene#sarains11"); - hideoffnpc instance_npcname("Sara Irene#sarains11"); - stopnpctimer; + enablenpc(instance_npcname("Sara Irene#sarains11")); + hideoffnpc(instance_npcname("Sara Irene#sarains11")); + stopnpctimer(); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains11"); - disablenpc instance_npcname("Sara Irene#sarains11"); + hideonnpc(instance_npcname("Sara Irene#sarains11")); + disablenpc(instance_npcname("Sara Irene#sarains11")); end; } @@ -1498,23 +1497,23 @@ OnDisable: end; OnTouch: npctalk(_("...Mommy")); - initnpctimer; - donpcevent instance_npcname("Sara Irene#sarains12")+"::OnDisable"; + initnpctimer(); + donpcevent(instance_npcname("Sara Irene#sarains12")+"::OnDisable"); end; OnTimer60000: - donpcevent instance_npcname("Sara Irene#sarains12")+"::OnEnable"; + donpcevent(instance_npcname("Sara Irene#sarains12")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains12")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains12")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("Sara Irene#sarains12"); - hideoffnpc instance_npcname("Sara Irene#sarains12"); - stopnpctimer; + enablenpc(instance_npcname("Sara Irene#sarains12")); + hideoffnpc(instance_npcname("Sara Irene#sarains12")); + stopnpctimer(); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains12"); - disablenpc instance_npcname("Sara Irene#sarains12"); + hideonnpc(instance_npcname("Sara Irene#sarains12")); + disablenpc(instance_npcname("Sara Irene#sarains12")); end; } @@ -1522,23 +1521,23 @@ OnDisable: end; OnTouch: npctalk(_("What happened to you daddy?")); - initnpctimer; - donpcevent instance_npcname("Sara Irene#sarains13")+"::OnDisable"; + initnpctimer(); + donpcevent(instance_npcname("Sara Irene#sarains13")+"::OnDisable"); end; OnTimer60000: - donpcevent instance_npcname("Sara Irene#sarains13")+"::OnEnable"; + donpcevent(instance_npcname("Sara Irene#sarains13")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains13")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains13")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("Sara Irene#sarains13"); - hideoffnpc instance_npcname("Sara Irene#sarains13"); - stopnpctimer; + enablenpc(instance_npcname("Sara Irene#sarains13")); + hideoffnpc(instance_npcname("Sara Irene#sarains13")); + stopnpctimer(); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains13"); - disablenpc instance_npcname("Sara Irene#sarains13"); + hideonnpc(instance_npcname("Sara Irene#sarains13")); + disablenpc(instance_npcname("Sara Irene#sarains13")); end; } @@ -1546,23 +1545,23 @@ OnDisable: end; OnTouch: npctalk(_("All that blood...")); - initnpctimer; - donpcevent instance_npcname("Sara Irene#sarains14")+"::OnDisable"; + initnpctimer(); + donpcevent(instance_npcname("Sara Irene#sarains14")+"::OnDisable"); end; OnTimer60000: - donpcevent instance_npcname("Sara Irene#sarains14")+"::OnEnable"; + donpcevent(instance_npcname("Sara Irene#sarains14")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains14")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains14")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("Sara Irene#sarains14"); - hideoffnpc instance_npcname("Sara Irene#sarains14"); - stopnpctimer; + enablenpc(instance_npcname("Sara Irene#sarains14")); + hideoffnpc(instance_npcname("Sara Irene#sarains14")); + stopnpctimer(); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains14"); - disablenpc instance_npcname("Sara Irene#sarains14"); + hideonnpc(instance_npcname("Sara Irene#sarains14")); + disablenpc(instance_npcname("Sara Irene#sarains14")); end; } @@ -1570,23 +1569,23 @@ OnDisable: end; OnTouch: npctalk(_("Who are you?!")); - initnpctimer; - donpcevent instance_npcname("Sara Irene#sarains15")+"::OnDisable"; + initnpctimer(); + donpcevent(instance_npcname("Sara Irene#sarains15")+"::OnDisable"); end; OnTimer60000: - donpcevent instance_npcname("Sara Irene#sarains15")+"::OnEnable"; + donpcevent(instance_npcname("Sara Irene#sarains15")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains15")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains15")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("Sara Irene#sarains15"); - hideoffnpc instance_npcname("Sara Irene#sarains15"); - stopnpctimer; + enablenpc(instance_npcname("Sara Irene#sarains15")); + hideoffnpc(instance_npcname("Sara Irene#sarains15")); + stopnpctimer(); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains15"); - disablenpc instance_npcname("Sara Irene#sarains15"); + hideonnpc(instance_npcname("Sara Irene#sarains15")); + disablenpc(instance_npcname("Sara Irene#sarains15")); end; } @@ -1594,23 +1593,23 @@ OnDisable: end; OnTouch: npctalk(_("I want my mommy!")); - initnpctimer; - donpcevent instance_npcname("Sara Irene#sarains16")+"::OnDisable"; + initnpctimer(); + donpcevent(instance_npcname("Sara Irene#sarains16")+"::OnDisable"); end; OnTimer60000: - donpcevent instance_npcname("Sara Irene#sarains16")+"::OnEnable"; + donpcevent(instance_npcname("Sara Irene#sarains16")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains16")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains16")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("Sara Irene#sarains16"); - hideoffnpc instance_npcname("Sara Irene#sarains16"); - stopnpctimer; + enablenpc(instance_npcname("Sara Irene#sarains16")); + hideoffnpc(instance_npcname("Sara Irene#sarains16")); + stopnpctimer(); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains16"); - disablenpc instance_npcname("Sara Irene#sarains16"); + hideonnpc(instance_npcname("Sara Irene#sarains16")); + disablenpc(instance_npcname("Sara Irene#sarains16")); end; } @@ -1618,23 +1617,23 @@ OnDisable: end; OnTouch: npctalk(_("........")); - initnpctimer; - donpcevent instance_npcname("Sara Irene#sarains17")+"::OnDisable"; + initnpctimer(); + donpcevent(instance_npcname("Sara Irene#sarains17")+"::OnDisable"); end; OnTimer60000: - donpcevent instance_npcname("Sara Irene#sarains17")+"::OnEnable"; + donpcevent(instance_npcname("Sara Irene#sarains17")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains17")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains17")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("Sara Irene#sarains17"); - hideoffnpc instance_npcname("Sara Irene#sarains17"); - stopnpctimer; + enablenpc(instance_npcname("Sara Irene#sarains17")); + hideoffnpc(instance_npcname("Sara Irene#sarains17")); + stopnpctimer(); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains17"); - disablenpc instance_npcname("Sara Irene#sarains17"); + hideonnpc(instance_npcname("Sara Irene#sarains17")); + disablenpc(instance_npcname("Sara Irene#sarains17")); end; } @@ -1642,23 +1641,23 @@ OnDisable: end; OnTouch: npctalk(_("Nooooo...")); - initnpctimer; - donpcevent instance_npcname("Sara Irene#sarains18")+"::OnDisable"; + initnpctimer(); + donpcevent(instance_npcname("Sara Irene#sarains18")+"::OnDisable"); end; OnTimer60000: - donpcevent instance_npcname("Sara Irene#sarains18")+"::OnEnable"; + donpcevent(instance_npcname("Sara Irene#sarains18")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains18")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains18")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("Sara Irene#sarains18"); - hideoffnpc instance_npcname("Sara Irene#sarains18"); - stopnpctimer; + enablenpc(instance_npcname("Sara Irene#sarains18")); + hideoffnpc(instance_npcname("Sara Irene#sarains18")); + stopnpctimer(); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains18"); - disablenpc instance_npcname("Sara Irene#sarains18"); + hideonnpc(instance_npcname("Sara Irene#sarains18")); + disablenpc(instance_npcname("Sara Irene#sarains18")); end; } @@ -1666,23 +1665,23 @@ OnDisable: end; OnTouch: npctalk(_("Mommy!")); - initnpctimer; - donpcevent instance_npcname("Sara Irene#sarains19")+"::OnDisable"; + initnpctimer(); + donpcevent(instance_npcname("Sara Irene#sarains19")+"::OnDisable"); end; OnTimer60000: - donpcevent instance_npcname("Sara Irene#sarains19")+"::OnEnable"; + donpcevent(instance_npcname("Sara Irene#sarains19")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains19")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains19")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("Sara Irene#sarains19"); - hideoffnpc instance_npcname("Sara Irene#sarains19"); - stopnpctimer; + enablenpc(instance_npcname("Sara Irene#sarains19")); + hideoffnpc(instance_npcname("Sara Irene#sarains19")); + stopnpctimer(); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains19"); - disablenpc instance_npcname("Sara Irene#sarains19"); + hideonnpc(instance_npcname("Sara Irene#sarains19")); + disablenpc(instance_npcname("Sara Irene#sarains19")); end; } @@ -1690,23 +1689,23 @@ OnDisable: end; OnTouch: npctalk("........"); - initnpctimer; - donpcevent instance_npcname("Sara Irene#sarains20")+"::OnDisable"; + initnpctimer(); + donpcevent(instance_npcname("Sara Irene#sarains20")+"::OnDisable"); end; OnTimer60000: - donpcevent instance_npcname("Sara Irene#sarains20")+"::OnEnable"; + donpcevent(instance_npcname("Sara Irene#sarains20")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains20")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains20")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("Sara Irene#sarains20"); - hideoffnpc instance_npcname("Sara Irene#sarains20"); - stopnpctimer; + enablenpc(instance_npcname("Sara Irene#sarains20")); + hideoffnpc(instance_npcname("Sara Irene#sarains20")); + stopnpctimer(); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains20"); - disablenpc instance_npcname("Sara Irene#sarains20"); + hideonnpc(instance_npcname("Sara Irene#sarains20")); + disablenpc(instance_npcname("Sara Irene#sarains20")); end; } @@ -1714,23 +1713,23 @@ OnDisable: end; OnTouch: npctalk(_("Daddy!")); - initnpctimer; - donpcevent instance_npcname("Sara Irene#sarains21")+"::OnDisable"; + initnpctimer(); + donpcevent(instance_npcname("Sara Irene#sarains21")+"::OnDisable"); end; OnTimer60000: - donpcevent instance_npcname("Sara Irene#sarains21")+"::OnEnable"; + donpcevent(instance_npcname("Sara Irene#sarains21")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains21")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains21")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("Sara Irene#sarains21"); - hideoffnpc instance_npcname("Sara Irene#sarains21"); - stopnpctimer; + enablenpc(instance_npcname("Sara Irene#sarains21")); + hideoffnpc(instance_npcname("Sara Irene#sarains21")); + stopnpctimer(); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains21"); - disablenpc instance_npcname("Sara Irene#sarains21"); + hideonnpc(instance_npcname("Sara Irene#sarains21")); + disablenpc(instance_npcname("Sara Irene#sarains21")); end; } @@ -1738,23 +1737,23 @@ OnDisable: end; OnTouch: npctalk("........"); - initnpctimer; - donpcevent instance_npcname("Sara Irene#sarains22")+"::OnDisable"; + initnpctimer(); + donpcevent(instance_npcname("Sara Irene#sarains22")+"::OnDisable"); end; OnTimer60000: - donpcevent instance_npcname("Sara Irene#sarains22")+"::OnEnable"; + donpcevent(instance_npcname("Sara Irene#sarains22")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains22")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains22")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("Sara Irene#sarains22"); - hideoffnpc instance_npcname("Sara Irene#sarains22"); - stopnpctimer; + enablenpc(instance_npcname("Sara Irene#sarains22")); + hideoffnpc(instance_npcname("Sara Irene#sarains22")); + stopnpctimer(); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains22"); - disablenpc instance_npcname("Sara Irene#sarains22"); + hideonnpc(instance_npcname("Sara Irene#sarains22")); + disablenpc(instance_npcname("Sara Irene#sarains22")); end; } @@ -1762,22 +1761,22 @@ OnDisable: end; OnTouch: npctalk(_("Why?")); - initnpctimer; - donpcevent instance_npcname("Sara Irene#sarains23")+"::OnDisable"; + initnpctimer(); + donpcevent(instance_npcname("Sara Irene#sarains23")+"::OnDisable"); end; OnTimer60000: - donpcevent instance_npcname("Sara Irene#sarains23")+"::OnEnable"; + donpcevent(instance_npcname("Sara Irene#sarains23")+"::OnEnable"); end; OnInstanceInit: - donpcevent instance_npcname("Sara Irene#sarains23")+"::OnDisable"; + donpcevent(instance_npcname("Sara Irene#sarains23")+"::OnDisable"); end; OnEnable: - enablenpc instance_npcname("Sara Irene#sarains23"); - hideoffnpc instance_npcname("Sara Irene#sarains23"); - stopnpctimer; + enablenpc(instance_npcname("Sara Irene#sarains23")); + hideoffnpc(instance_npcname("Sara Irene#sarains23")); + stopnpctimer(); end; OnDisable: - hideonnpc instance_npcname("Sara Irene#sarains23"); - disablenpc instance_npcname("Sara Irene#sarains23"); + hideonnpc(instance_npcname("Sara Irene#sarains23")); + disablenpc(instance_npcname("Sara Irene#sarains23")); end; } diff --git a/src/char/int_rodex.c b/src/char/int_rodex.c index c45c88eb0..994e8110e 100644 --- a/src/char/int_rodex.c +++ b/src/char/int_rodex.c @@ -92,6 +92,19 @@ static int inter_rodex_fromsql(int char_id, int account_id, int8 opentype, int64 return -1; } break; + + 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) + ) { + SqlStmt_ShowDebug(stmt); + SQL->StmtFree(stmt); + return -1; + } + break; } if (SQL_ERROR == SQL->StmtExecute(stmt) @@ -173,7 +186,18 @@ static int inter_rodex_fromsql(int char_id, int account_id, int8 opentype, int64 msg.type &= ~MAIL_TYPE_ZENY; } +#if PACKETVER >= 20170419 + if (opentype == RODEX_OPENTYPE_UNSET) { + if (msg.receiver_id != 0) + msg.opentype = RODEX_OPENTYPE_MAIL; + else + msg.opentype = RODEX_OPENTYPE_ACCOUNT; + } else { + msg.opentype = opentype; + } +#else msg.opentype = opentype; +#endif #if PACKETVER < 20160601 // NPC Message Type isn't supported in old clients msg.type &= ~MAIL_TYPE_NPC; diff --git a/src/common/mmo.h b/src/common/mmo.h index fe67d6efb..52f68b719 100644 --- a/src/common/mmo.h +++ b/src/common/mmo.h @@ -276,7 +276,11 @@ STATIC_ASSERT(MAX_ITEM_OPTIONS <= 5, "This value is limited by the client and da #define RODEX_BODY_LENGTH (500 + 1) #define RODEX_MAX_ITEM (5) #define RODEX_EXPIRE (1 * 15 * 24 * 60 * 60) +#if PACKETVER >= 20170419 +#define RODEX_MAIL_PER_PAGE 32 +#else #define RODEX_MAIL_PER_PAGE 7 +#endif // The following system marks a different job ID system used by the map server, // which makes a lot more sense than the normal one. [Skotlex] @@ -418,7 +422,7 @@ enum e_item_bound_type { #endif }; -enum { +enum e_option { OPTION_NOTHING = 0x00000000, OPTION_SIGHT = 0x00000001, OPTION_HIDE = 0x00000002, @@ -851,6 +855,7 @@ enum rodex_opentype { RODEX_OPENTYPE_MAIL = 0, RODEX_OPENTYPE_ACCOUNT = 1, RODEX_OPENTYPE_RETURN = 2, + RODEX_OPENTYPE_UNSET = 3, }; enum MAIL_TYPE { @@ -917,7 +922,7 @@ enum { }; //These mark the ID of the jobs, as expected by the client. [Skotlex] -enum { +enum e_class { JOB_NOVICE, JOB_SWORDMAN, JOB_MAGE, diff --git a/src/login/lclif.c b/src/login/lclif.c index f32538610..47b2526c4 100644 --- a/src/login/lclif.c +++ b/src/login/lclif.c @@ -284,7 +284,7 @@ bool lclif_send_server_list(struct login_session_data *sd) packet->server_list[n].ip = htonl((subnet_char_ip) ? subnet_char_ip : server[i].ip); packet->server_list[n].port = sockt->ntows(htons(server[i].port)); // [!] LE byte order here [!] safestrncpy(packet->server_list[n].name, server[i].name, 20); - packet->server_list[n].usercount = server[i].users; + packet->server_list[n].usercount = login->convert_users_to_colors(server[i].users); if (server[i].type == CST_PAYING && sd->expiration_time > time(NULL)) packet->server_list[n].property = CST_NORMAL; diff --git a/src/login/login.c b/src/login/login.c index ae584206f..3db9558b8 100644 --- a/src/login/login.c +++ b/src/login/login.c @@ -1604,7 +1604,7 @@ bool login_config_read_account(const char *filename, struct config_t *config, bo /** * Frees login->config->client_hash_nodes **/ -void clear_client_hash_nodes(void) +void login_clear_client_hash_nodes(void) { struct client_hash_node *node = login->config->client_hash_nodes; @@ -1618,7 +1618,7 @@ void clear_client_hash_nodes(void) } /** - * Reads information from login_configuration.permission.hash.md5_hashes. + * Reads information from login_configuration.permission.hash.md5_hashes (unused function) * * @param setting The setting to read from. */ @@ -1627,7 +1627,7 @@ void login_config_set_md5hash(struct config_setting_t *setting) int i; int count = libconfig->setting_length(setting); - clear_client_hash_nodes(); + login->clear_client_hash_nodes(); // There's no need to parse if it's disabled or if there's no list if (count <= 0 || !login->config->client_hash_check) @@ -1702,7 +1702,7 @@ bool login_config_read_permission_hash(const char *filename, struct config_t *co libconfig->setting_lookup_bool_real(setting, "enabled", &login->config->client_hash_check); if ((setting = libconfig->lookup(config, "login_configuration/permission/hash/MD5_hashes")) != NULL) - login_config_set_md5hash(setting); + login->config_set_md5hash(setting); return true; } @@ -1710,7 +1710,7 @@ bool login_config_read_permission_hash(const char *filename, struct config_t *co /** * Clears login->config->dnsbl_servers, freeing any allocated memory. */ -void clear_dnsbl_servers(void) +void login_clear_dnsbl_servers(void) { while (VECTOR_LENGTH(login->config->dnsbl_servers) > 0) { aFree(&VECTOR_POP(login->config->dnsbl_servers)); @@ -1728,7 +1728,7 @@ void login_config_set_dnsbl_servers(struct config_setting_t *setting) int i; int count = libconfig->setting_length(setting); - clear_dnsbl_servers(); + login->clear_dnsbl_servers(); // There's no need to parse if it's disabled if (count <= 0 || !login->config->use_dnsbl) @@ -1772,7 +1772,7 @@ bool login_config_read_permission_blacklist(const char *filename, struct config_ libconfig->setting_lookup_bool_real(setting, "enabled", &login->config->use_dnsbl); if ((setting = libconfig->lookup(config, "login_configuration/permission/DNS_blacklist/dnsbl_servers")) != NULL) - login_config_set_dnsbl_servers(setting); + login->config_set_dnsbl_servers(setting); return true; } @@ -1806,15 +1806,47 @@ bool login_config_read_permission(const char *filename, struct config_t *config, libconfig->setting_lookup_bool_real(setting, "check_client_version", &login->config->check_client_version); libconfig->setting_lookup_uint32(setting, "client_version_to_connect", &login->config->client_version_to_connect); - if (!login_config_read_permission_hash(filename, config, imported)) + if (!login->config_read_permission_hash(filename, config, imported)) retval = false; - if (!login_config_read_permission_blacklist(filename, config, imported)) + if (!login->config_read_permission_blacklist(filename, config, imported)) retval = false; return retval; } /** + * Reads 'login_configuration.users_count' and initializes required variables. + * + * @param filename Path to configuration file (used in error and warning messages). + * @param config The current config being parsed. + * @param imported Whether the current config is imported from another file. + * + * @retval false in case of error. + */ +bool login_config_read_users(const char *filename, struct config_t *config, bool imported) +{ + struct config_setting_t *setting = NULL; + bool retval = true; + + nullpo_retr(false, filename); + nullpo_retr(false, config); + + if ((setting = libconfig->lookup(config, "login_configuration/users_count")) == NULL) { + if (imported) + return true; + ShowError("login_config_read: login_configuration/users_count was not found in %s!\n", filename); + return false; + } + + libconfig->setting_lookup_bool_real(setting, "send_user_count_description", &login->config->send_user_count_description); + libconfig->setting_lookup_uint32(setting, "low", &login->config->users_low); + libconfig->setting_lookup_uint32(setting, "medium", &login->config->users_medium); + libconfig->setting_lookup_uint32(setting, "high", &login->config->users_high); + + return retval; +} + +/** * Reads the 'login-config' configuration file and initializes required variables. * * @param filename Path to configuration file. @@ -1833,15 +1865,17 @@ bool login_config_read(const char *filename, bool imported) if (!libconfig->load_file(&config, filename)) return false; // Error message is already shown by libconfig->load_file - if (!login_config_read_inter(filename, &config, imported)) + if (!login->config_read_inter(filename, &config, imported)) retval = false; - if (!login_config_read_console(filename, &config, imported)) + if (!login->config_read_console(filename, &config, imported)) retval = false; - if (!login_config_read_log(filename, &config, imported)) + if (!login->config_read_log(filename, &config, imported)) retval = false; - if (!login_config_read_account(filename, &config, imported)) + if (!login->config_read_account(filename, &config, imported)) retval = false; - if (!login_config_read_permission(filename, &config, imported)) + if (!login->config_read_permission(filename, &config, imported)) + retval = false; + if (!login->config_read_users(filename, &config, imported)) retval = false; if (!loginlog_config_read("conf/common/inter-server.conf", imported)) // Only inter-server @@ -1866,6 +1900,30 @@ bool login_config_read(const char *filename, bool imported) return retval; } +/** + * Convert users count to colors. + * + * @param users Actual users count. + * + * @retval users count or color id. + **/ +uint16 login_convert_users_to_colors(uint16 users) +{ +#if PACKETVER >= 20170726 + if (!login->config->send_user_count_description) + return 4; + if (users <= login->config->users_low) + return 0; + else if (users <= login->config->users_medium) + return 1; + else if (users <= login->config->users_high) + return 2; + return 3; +#else + return users; +#endif +} + //-------------------------------------- // Function called at exit of the server //-------------------------------------- @@ -1877,8 +1935,8 @@ int do_final(void) HPM->event(HPET_FINAL); - clear_client_hash_nodes(); - clear_dnsbl_servers(); + login->clear_client_hash_nodes(); + login->clear_dnsbl_servers(); login_log(0, "login server", 100, "login server shutdown"); @@ -2168,6 +2226,20 @@ void login_defaults(void) { login->config_set_defaults = login_config_set_defaults; login->config_read = login_config_read; + login->config_read_inter = login_config_read_inter; + login->config_read_console = login_config_read_console; + login->config_read_log = login_config_read_log; + login->config_read_account = login_config_read_account; + login->config_read_permission = login_config_read_permission; + login->config_read_permission_hash = login_config_read_permission_hash; + login->config_read_permission_blacklist = login_config_read_permission_blacklist; + login->config_read_users = login_config_read_users; + login->config_set_dnsbl_servers = login_config_set_dnsbl_servers; + + login->clear_dnsbl_servers = login_clear_dnsbl_servers; + login->clear_client_hash_nodes = login_clear_client_hash_nodes; + login->config_set_md5hash = login_config_set_md5hash; + login->convert_users_to_colors = login_convert_users_to_colors; login->LOGIN_CONF_NAME = NULL; login->NET_CONF_NAME = NULL; } diff --git a/src/login/login.h b/src/login/login.h index 5632e6529..d5c9972c0 100644 --- a/src/login/login.h +++ b/src/login/login.h @@ -32,6 +32,8 @@ struct mmo_account; struct AccountDB; +struct config_t; +struct config_setting_t; enum E_LOGINSERVER_ST { @@ -119,6 +121,11 @@ struct Login_Config { bool use_dnsbl; ///< dns blacklist blocking ? VECTOR_DECL(char *) dnsbl_servers; ///< dnsbl servers + bool send_user_count_description; + uint32 users_low; + uint32 users_medium; + uint32 users_high; + bool client_hash_check; ///< flags for checking client md5 // TODO: VECTOR candidate struct client_hash_node *client_hash_nodes; ///< linked list containg md5 hash for each gm group @@ -209,6 +216,19 @@ struct login_interface { void (*parse_request_connection) (int fd, struct login_session_data* sd, const char *ip, uint32 ipl); void (*config_set_defaults) (void); bool (*config_read) (const char *filename, bool included); + bool (*config_read_inter) (const char *filename, struct config_t *config, bool imported); + bool (*config_read_console) (const char *filename, struct config_t *config, bool imported); + bool (*config_read_log) (const char *filename, struct config_t *config, bool imported); + bool (*config_read_account) (const char *filename, struct config_t *config, bool imported); + bool (*config_read_permission) (const char *filename, struct config_t *config, bool imported); + bool (*config_read_permission_hash) (const char *filename, struct config_t *config, bool imported); + bool (*config_read_permission_blacklist) (const char *filename, struct config_t *config, bool imported); + bool (*config_read_users) (const char *filename, struct config_t *config, bool imported); + void (*clear_dnsbl_servers) (void); + void (*config_set_dnsbl_servers) (struct config_setting_t *setting); + void (*clear_client_hash_nodes) (void); + void (*config_set_md5hash) (struct config_setting_t *setting); + uint16 (*convert_users_to_colors) (uint16 users); char *LOGIN_CONF_NAME; char *NET_CONF_NAME; ///< Network configuration filename }; diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 7b2c0f8b2..d9f4810ee 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -3908,6 +3908,8 @@ ACMD(mapinfo) strcat(atcmd_output, msg_fd(fd,1096)); // PartyLock | if (map->list[m_id].flag.guildlock) strcat(atcmd_output, msg_fd(fd,1097)); // GuildLock | + if (map->list[m_id].flag.noautoloot) + strcat(atcmd_output, msg_fd(fd, 1063)); // NoAutoloot | if (map->list[m_id].flag.noviewid != EQP_NONE) strcat(atcmd_output, msg_fd(fd,1079)); // NoViewID | clif->message(fd, atcmd_output); @@ -4866,21 +4868,19 @@ ACMD(undisguiseguild) *------------------------------------------*/ ACMD(exp) { - char output[CHAT_SIZE_MAX]; - double nextb, nextj; - - memset(output, '\0', sizeof(output)); + double percentb = 0.0, percentj = 0.0; + uint64 nextb, nextj; nextb = pc->nextbaseexp(sd); - if (nextb) - nextb = sd->status.base_exp*100.0/nextb; + if (nextb != 0) + percentb = sd->status.base_exp * 100.0 / nextb; nextj = pc->nextjobexp(sd); - if (nextj) - nextj = sd->status.job_exp*100.0/nextj; + if (nextj != 0) + percentj = sd->status.job_exp * 100.0 / nextj; - sprintf(output, msg_fd(fd,1148), sd->status.base_level, nextb, sd->status.job_level, nextj); // Base Level: %d (%.3f%%) | Job Level: %d (%.3f%%) - clif->message(fd, output); + sprintf(atcmd_output, msg_fd(fd,1148), sd->status.base_level, percentb, sd->status.job_level, percentj); // Base Level: %d (%.3f%%) | Job Level: %d (%.3f%%) + clif->message(fd, atcmd_output); return true; } diff --git a/src/map/battle.c b/src/map/battle.c index 2861599b8..8983e93c9 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -993,11 +993,7 @@ int64 battle_calc_cardfix2(struct block_list *src, struct block_list *bl, int64 // FIXME: wflag is undocumented int64 battle_calc_cardfix(int attack_type, struct block_list *src, struct block_list *target, int nk, int s_ele, int s_ele_, int64 damage, int cflag, int wflag){ struct map_session_data *sd, *tsd; -#ifdef RENEWAL - short cardfix = 100; -#else - short cardfix = 1000; -#endif + int cardfix = 1000; short t_class, s_class, s_race2, t_race2; struct status_data *sstatus, *tstatus; int i; @@ -1073,24 +1069,14 @@ int64 battle_calc_cardfix(int attack_type, struct block_list *src, struct block_ if( tsd->sc.data[SC_PROTECT_MDEF] ) cardfix = cardfix * ( 100 - tsd->sc.data[SC_PROTECT_MDEF]->val1 ) / 100; } -#ifdef RENEWAL - if ( cardfix != 100 ) - damage += damage * (cardfix - 100) / 100; -#else if ( cardfix != 1000 ) damage = damage * cardfix / 1000; -#endif break; case BF_WEAPON: t_race2 = status->get_race2(target); if( cflag&2 ){ if( sd && !(nk&NK_NO_CARDFIX_ATK) ){ - short cardfix_ = -#ifdef RENEWAL - 100; -#else - 1000; -#endif + int cardfix_ = 1000; if( sd->state.arrow_atk ){ cardfix = cardfix * (100 + sd->right_weapon.addrace[tstatus->race] + sd->arrow_addrace[tstatus->race]) / 100; if( !(nk&NK_NO_ELEFIX) ){ @@ -1190,16 +1176,11 @@ int64 battle_calc_cardfix(int attack_type, struct block_list *src, struct block_ #ifndef RENEWAL if( wflag&BF_LONG ) cardfix = cardfix * (100 + sd->bonus.long_attack_atk_rate) / 100; +#endif if( (cflag&1) && cardfix_ != 1000 ) damage = damage * cardfix_ / 1000; else if( cardfix != 1000 ) damage = damage * cardfix / 1000; -#else - if ((cflag & 1) && cardfix_ != 100) - damage += damage * (cardfix_ - 100) / 100; - else if (cardfix != 100) - damage += damage * (cardfix - 100) / 100; -#endif } }else{ // Target side @@ -1249,13 +1230,8 @@ int64 battle_calc_cardfix(int attack_type, struct block_list *src, struct block_ #endif if( tsd->sc.data[SC_PROTECT_DEF] ) cardfix = cardfix * (100 - tsd->sc.data[SC_PROTECT_DEF]->val1) / 100; -#ifdef RENEWAL - if ( cardfix != 100 ) - damage += damage * (cardfix - 100) / 100; -#else if( cardfix != 1000 ) damage = damage * cardfix / 1000; -#endif } } break; @@ -1287,13 +1263,8 @@ int64 battle_calc_cardfix(int attack_type, struct block_list *src, struct block_ cardfix = cardfix*(100 - tsd->subsize[sstatus->size]) / 100; cardfix = cardfix*(100 - tsd->subrace2[s_race2]) / 100; cardfix = cardfix * (100 - tsd->bonus.misc_def_rate) / 100; -#ifdef RENEWAL - if ( cardfix != 100 ) - damage += damage * (cardfix - 100) / 100; -#else if ( cardfix != 1000 ) damage = damage * cardfix / 1000; -#endif } break; } @@ -7096,6 +7067,7 @@ static const struct battle_data { { "vending_over_max", &battle_config.vending_over_max, 1, 0, 1, }, { "show_steal_in_same_party", &battle_config.show_steal_in_same_party, 0, 0, 1, }, { "party_hp_mode", &battle_config.party_hp_mode, 0, 0, 1, }, + { "party_change_leader_same_map", &battle_config.party_change_leader_same_map, 0, 0, 1, }, { "show_party_share_picker", &battle_config.party_show_share_picker, 1, 0, 1, }, { "show_picker_item_type", &battle_config.show_picker_item_type, 112, 0, INT_MAX, }, { "party_update_interval", &battle_config.party_update_interval, 1000, 100, INT_MAX, }, diff --git a/src/map/battle.h b/src/map/battle.h index e6129ca7c..4a63887c4 100644 --- a/src/map/battle.h +++ b/src/map/battle.h @@ -298,6 +298,7 @@ struct Battle_Config { int show_steal_in_same_party; int party_share_type; int party_hp_mode; + int party_change_leader_same_map; int party_show_share_picker; int show_picker_item_type; int attack_attr_none; @@ -545,7 +546,7 @@ struct Battle_Config { int player_warp_keep_direction; int atcommand_levelup_events; // Enable atcommands trigger level up events for NPCs - + int bow_unequip_arrow; int max_summoner_parameter; // Summoner Max Stats diff --git a/src/map/clif.c b/src/map/clif.c index de0f0573f..088c92ea8 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -3033,27 +3033,50 @@ void clif_updatestatus(struct map_session_data *sd,int type) WFIFOL(fd,4)=sd->status.zeny; len = packet_len(0xb1); break; +// [4144] unconfirment exact version can be from 20170405 to 20170913 +#if PACKETVER >= 20170830 case SP_BASEEXP: - WFIFOW(fd,0)=0xb1; - WFIFOL(fd,4)=(uint32)(sd->status.base_exp); + WFIFOW(fd, 0) = 0xacb; + WFIFOQ(fd, 4) = sd->status.base_exp; + len = packet_len(0xacb); + break; + case SP_JOBEXP: + WFIFOW(fd, 0) = 0xacb; + WFIFOQ(fd, 4) = sd->status.job_exp; + len = packet_len(0xacb); + break; + case SP_NEXTBASEEXP: + WFIFOW(fd, 0) = 0xacb; + WFIFOQ(fd, 4) = pc->nextbaseexp(sd); + len = packet_len(0xacb); + break; + case SP_NEXTJOBEXP: + WFIFOW(fd, 0) = 0xacb; + WFIFOQ(fd, 4) = pc->nextjobexp(sd); + len = packet_len(0xacb); + break; +#else + case SP_BASEEXP: + WFIFOW(fd, 0) = 0xb1; + WFIFOL(fd, 4) = (uint32)(sd->status.base_exp); len = packet_len(0xb1); break; case SP_JOBEXP: - WFIFOW(fd,0)=0xb1; - WFIFOL(fd,4)=(uint32)(sd->status.job_exp); + WFIFOW(fd, 0) = 0xb1; + WFIFOL(fd, 4) = (uint32)(sd->status.job_exp); len = packet_len(0xb1); break; case SP_NEXTBASEEXP: - WFIFOW(fd,0)=0xb1; - WFIFOL(fd,4)=pc->nextbaseexp(sd); + WFIFOW(fd, 0) = 0xb1; + WFIFOL(fd, 4) = (uint32)pc->nextbaseexp(sd); len = packet_len(0xb1); break; case SP_NEXTJOBEXP: - WFIFOW(fd,0)=0xb1; - WFIFOL(fd,4)=pc->nextjobexp(sd); + WFIFOW(fd, 0) = 0xb1; + WFIFOL(fd, 4) = (uint32)pc->nextjobexp(sd); len = packet_len(0xb1); break; - +#endif /** * SP_U<STAT> are used to update the amount of points necessary to increase that stat **/ @@ -14027,7 +14050,7 @@ void clif_parse_NoviceExplosionSpirits(int fd, struct map_session_data *sd) /* it sends the request when the criteria doesn't match (and of course we let it fail) */ /* so restoring the old parse_globalmes method. */ if ((sd->job & MAPID_UPPERMASK) == MAPID_SUPER_NOVICE) { - unsigned int next = pc->nextbaseexp(sd); + uint64 next = pc->nextbaseexp(sd); if( next == 0 ) next = pc->thisbaseexp(sd); if( next ) { int percent = (int)( ( (float)sd->status.base_exp/(float)next )*1000. ); @@ -16697,20 +16720,34 @@ void clif_party_show_picker(struct map_session_data * sd, struct item * item_dat /// exp type: /// 0 = normal exp gain/loss /// 1 = quest exp gain/loss -void clif_displayexp(struct map_session_data *sd, unsigned int exp, char type, bool is_quest) { +void clif_displayexp(struct map_session_data *sd, uint64 exp, char type, bool is_quest) +{ int fd; +// [4144] unconfirment exact version can be from 20170405 to 20170913 +#if PACKETVER >= 20170830 + const int cmd = 0xacc; +#else + const int cmd = 0x7f6; +#endif nullpo_retv(sd); fd = sd->fd; - WFIFOHEAD(fd, packet_len(0x7f6)); - WFIFOW(fd,0) = 0x7f6; - WFIFOL(fd,2) = sd->bl.id; - WFIFOL(fd,6) = exp; - WFIFOW(fd,10) = type; - WFIFOW(fd,12) = is_quest?1:0;// Normal exp is shown in yellow, quest exp is shown in purple. - WFIFOSET(fd,packet_len(0x7f6)); + WFIFOHEAD(fd, packet_len(cmd)); + WFIFOW(fd, 0) = cmd; + WFIFOL(fd, 2) = sd->bl.id; +// [4144] unconfirment exact version can be from 20170405 to 20170913 +#if PACKETVER >= 20170830 + WFIFOQ(fd, 6) = exp; + WFIFOW(fd, 14) = type; + WFIFOW(fd, 16) = is_quest ? 1 : 0; // Normal exp is shown in yellow, quest exp is shown in purple. +#else + WFIFOL(fd, 6) = (uint32)exp; + WFIFOW(fd, 10) = type; + WFIFOW(fd, 12) = is_quest ? 1 : 0; // Normal exp is shown in yellow, quest exp is shown in purple. +#endif + WFIFOSET(fd, packet_len(cmd)); } /// Displays digital clock digits on top of the screen (ZC_SHOWDIGIT). @@ -19433,8 +19470,9 @@ void clif_rodex_send_maillist(int fd, struct map_session_data *sd, int8 open_typ WFIFOHEAD(fd, sizeof(*packet) + (sizeof(*inner) + RODEX_TITLE_LENGTH) * RODEX_MAIL_PER_PAGE); packet = WFIFOP(fd, 0); packet->PacketType = ((page_start == (VECTOR_LENGTH(sd->rodex.messages) - 1)) ? rodexmailList : rodexnextpage); +#if PACKETVER < 20170419 packet->opentype = open_type; - +#endif inner = WFIFOP(fd, size); while (page_start >= 0 && count < RODEX_MAIL_PER_PAGE) { @@ -19447,7 +19485,11 @@ void clif_rodex_send_maillist(int fd, struct map_session_data *sd, int8 open_typ inner->MailID = msg->id; inner->Isread = msg->is_read == true ? 1 : 0; inner->type = msg->type; +#if PACKETVER >= 20170419 + inner->openType = msg->opentype; +#else inner->regDateTime = (int)time(NULL) - msg->send_date; +#endif inner->expireDateTime = msg->expire_date - (int)time(NULL); if (open_type == RODEX_OPENTYPE_RETURN) { inner->expireDateTime += RODEX_EXPIRE; @@ -19465,12 +19507,80 @@ void clif_rodex_send_maillist(int fd, struct map_session_data *sd, int8 open_typ } packet->PacketLength = size; +#if PACKETVER < 20170419 packet->cnt = count; +#endif packet->IsEnd = page_start > 0 ? 0 : 1; WFIFOSET(fd, size); #endif } +void clif_rodex_send_mails_all(int fd, struct map_session_data *sd) +{ +#if PACKETVER >= 20170419 + struct PACKET_ZC_MAIL_LIST *packet; + struct maillistinfo *inner; + int16 size = sizeof(*packet); + int packetMailCount = 0; + int mailListCount = 0; + int mailsSize = VECTOR_LENGTH(sd->rodex.messages); + int i; + + nullpo_retv(sd); + + 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) { + struct rodex_message *msg = &VECTOR_INDEX(sd->rodex.messages, i); + --i; + + if (msg->is_deleted) + continue; + + inner->MailID = msg->id; + inner->Isread = msg->is_read == true ? 1 : 0; + inner->type = msg->type; + inner->openType = msg->opentype; + inner->expireDateTime = msg->expire_date - (int)time(NULL); + if (msg->opentype == RODEX_OPENTYPE_RETURN) { + inner->expireDateTime += RODEX_EXPIRE; + } + inner->Titlelength = (int16)strlen(msg->title) + 1; + if (msg->opentype != RODEX_OPENTYPE_RETURN) { + strncpy(inner->SenderName, msg->sender_name, sizeof(msg->sender_name)); + } else { + strncpy(inner->SenderName, msg->receiver_name, sizeof(msg->receiver_name)); + } + strncpy(inner->title, msg->title, inner->Titlelength); + size += sizeof(*inner) + inner->Titlelength; + inner = WFIFOP(fd, size); + packetMailCount ++; + mailListCount ++; + if (packetMailCount == RODEX_MAIL_PER_PAGE) { + packet->PacketLength = size; + packet->IsEnd = mailListCount > mailsSize ? 1 : 0; + WFIFOSET(fd, size); + WFIFOHEAD(fd, sizeof(*packet) + (sizeof(*inner) + RODEX_TITLE_LENGTH) * RODEX_MAIL_PER_PAGE); + packet = WFIFOP(fd, 0); + packet->PacketType = rodexmailList; + size = sizeof(*packet); + inner = WFIFOP(fd, size); + packetMailCount = 0; + } + } + + if (packetMailCount > 0 || mailListCount == 0) { + packet->PacketLength = size; + packet->IsEnd = 1; + WFIFOSET(fd, size); + } +#endif +} + void clif_rodex_send_refresh(int fd, struct map_session_data *sd, int8 open_type, int count) { #if PACKETVER >= 20131218 @@ -19484,8 +19594,9 @@ void clif_rodex_send_refresh(int fd, struct map_session_data *sd, int8 open_type WFIFOHEAD(fd, sizeof(*packet) + (sizeof(*inner) + RODEX_TITLE_LENGTH) * RODEX_MAIL_PER_PAGE); packet = WFIFOP(fd, 0); packet->PacketType = rodexmailList; +#if PACKETVER < 20170419 packet->opentype = open_type; - +#endif inner = WFIFOP(fd, size); i = VECTOR_LENGTH(sd->rodex.messages) - 1; @@ -19500,7 +19611,11 @@ void clif_rodex_send_refresh(int fd, struct map_session_data *sd, int8 open_type inner->MailID = msg->id; inner->Isread = msg->is_read == true ? 1 : 0; inner->type = msg->type; +#if PACKETVER >= 20170419 + inner->openType = msg->opentype; +#else inner->regDateTime = (int)time(NULL) - msg->send_date; +#endif inner->expireDateTime = msg->expire_date - (int)time(NULL); if (open_type == RODEX_OPENTYPE_RETURN) { inner->expireDateTime += RODEX_EXPIRE; @@ -19518,7 +19633,9 @@ void clif_rodex_send_refresh(int fd, struct map_session_data *sd, int8 open_type } packet->PacketLength = size; +#if PACKETVER < 20170419 packet->cnt = count; +#endif packet->IsEnd = 1; WFIFOSET(fd, size); #endif @@ -19693,14 +19810,22 @@ void clif_parse_rodex_refresh_maillist(int fd, struct map_session_data *sd) __at void clif_parse_rodex_refresh_maillist(int fd, struct map_session_data *sd) { const struct PACKET_CZ_REQ_REFRESH_MAIL_LIST *packet = RFIFOP(fd, 0); +#if PACKETVER >= 20170419 + rodex->refresh(sd, RODEX_OPENTYPE_UNSET, packet->Upper_MailID); +#else rodex->refresh(sd, packet->opentype, packet->Upper_MailID); +#endif } void clif_parse_rodex_open_mailbox(int fd, struct map_session_data *sd) __attribute__((nonnull(2))); void clif_parse_rodex_open_mailbox(int fd, struct map_session_data *sd) { const struct PACKET_CZ_REQ_OPEN_MAIL *packet = RFIFOP(fd, 0); - rodex->open(sd, packet->opentype); +#if PACKETVER >= 20170419 + rodex->open(sd, RODEX_OPENTYPE_UNSET, packet->Upper_MailID); +#else + rodex->open(sd, packet->opentype, packet->Upper_MailID); +#endif rodex->clean(sd, 1); } @@ -20785,4 +20910,5 @@ void clif_defaults(void) { clif->pRodexRequestItems = clif_parse_rodex_request_items; clif->rodex_request_items = clif_rodex_request_items; clif->rodex_icon = clif_rodex_icon; + clif->rodex_send_mails_all = clif_rodex_send_mails_all; } diff --git a/src/map/clif.h b/src/map/clif.h index ac8cc8d35..851c823ea 100644 --- a/src/map/clif.h +++ b/src/map/clif.h @@ -385,6 +385,7 @@ enum clif_messages { MSG_SECONDS_UNTIL_USE = 0x746, ///< %d seconds left until you can use MSG_NPC_WORK_IN_PROGRESS = 0x783, // FIXME[Haru]: This seems to be 0x784 in the msgstringtable files I found. MSG_REINS_CANT_USE_MOUNTED = 0x78b, // FIXME[Haru]: This seems to be 0x785 in the msgstringtalbe files I found. + MSG_PARTY_LEADER_SAMEMAP = 0x82e, //< It is only possible to change the party leader while on the same map. }; /** @@ -783,7 +784,7 @@ struct clif_interface { void (*equiptickack) (struct map_session_data* sd, int flag); void (*viewequip_ack) (struct map_session_data* sd, struct map_session_data* tsd); void (*equpcheckbox) (struct map_session_data* sd); - void (*displayexp) (struct map_session_data *sd, unsigned int exp, char type, bool is_quest); + void (*displayexp) (struct map_session_data *sd, uint64 exp, char type, bool is_quest); void (*font) (struct map_session_data *sd); void (*progressbar) (struct map_session_data * sd, unsigned int color, unsigned int second); void (*progressbar_abort) (struct map_session_data * sd); @@ -1377,6 +1378,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 (*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); diff --git a/src/map/guild.c b/src/map/guild.c index 092e066c3..bb0484477 100644 --- a/src/map/guild.c +++ b/src/map/guild.c @@ -1282,7 +1282,8 @@ struct DBData create_expcache(union DBKey key, va_list args) /*==================================================== * Return taxed experience from player sd to guild *---------------------------------------------------*/ -unsigned int guild_payexp(struct map_session_data *sd,unsigned int exp) { +uint64 guild_payexp(struct map_session_data *sd, uint64 exp) +{ struct guild *g; struct guild_expcache *c; int per; diff --git a/src/map/guild.h b/src/map/guild.h index 71e989870..9296f9ec0 100644 --- a/src/map/guild.h +++ b/src/map/guild.h @@ -100,7 +100,7 @@ struct guild_interface { struct map_session_data *(*getavailablesd) (struct guild *g); int (*getindex) (const struct guild *g, int account_id, int char_id); int (*getposition) (struct guild *g, struct map_session_data *sd); - unsigned int (*payexp) (struct map_session_data *sd,unsigned int exp); + uint64 (*payexp) (struct map_session_data *sd, uint64 exp); int (*getexp) (struct map_session_data *sd,int exp); // [Celest] /* */ int (*create) (struct map_session_data *sd, const char *name); diff --git a/src/map/intif.c b/src/map/intif.c index 1458fc710..60edc8d8b 100644 --- a/src/map/intif.c +++ b/src/map/intif.c @@ -2433,7 +2433,9 @@ int intif_rodex_requestinbox(int char_id, int account_id, int8 flag, int8 openty void intif_parse_RequestRodexOpenInbox(int fd) { struct map_session_data *sd; +#if PACKETVER < 20170419 int8 opentype = RFIFOB(fd, 8); +#endif int8 flag = RFIFOB(fd, 9); int8 is_end = RFIFOB(fd, 10); int count = RFIFOL(fd, 11); @@ -2461,10 +2463,14 @@ void intif_parse_RequestRodexOpenInbox(int fd) } if (is_end == true) { +#if PACKETVER >= 20170419 + clif->rodex_send_mails_all(sd->fd, sd); +#else if (flag == 0) clif->rodex_send_maillist(sd->fd, sd, opentype, VECTOR_LENGTH(sd->rodex.messages) - 1); else clif->rodex_send_refresh(sd->fd, sd, opentype, count); +#endif } } diff --git a/src/map/map.c b/src/map/map.c index f8aebcfa6..ff5c2aafd 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -447,6 +447,11 @@ int map_count_oncell(int16 m, int16 x, int16 y, int type, int flag) { struct status_change *sc = status->get_sc(bl); if (sc && (sc->option&OPTION_INVISIBLE)) continue; + if (bl->type == BL_NPC) { + const struct npc_data *nd = BL_UCCAST(BL_NPC, bl); + if (nd->class_ == FAKE_NPC || nd->class_ == HIDDEN_WARP_CLASS) + continue; + } } if (flag&0x1) { struct unit_data *ud = unit->bl2ud(bl); diff --git a/src/map/map.h b/src/map/map.h index d4284b3f7..3221c73cd 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -852,6 +852,7 @@ struct map_data { unsigned noknockback : 1; unsigned notomb : 1; unsigned nocashshop : 1; + unsigned noautoloot : 1; uint32 noviewid; ///< noviewid (bitmask - @see enum equip_pos) } flag; struct point save; diff --git a/src/map/mob.c b/src/map/mob.c index 98f8865a9..822b84bf4 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -1354,7 +1354,7 @@ int mob_unlocktarget(struct mob_data *md, int64 tick) { md->ud.target_to = 0; unit->set_target(&md->ud, 0); } - if(battle_config.official_cell_stack_limit && map->count_oncell(md->bl.m, md->bl.x, md->bl.y, BL_CHAR|BL_NPC, 1) > battle_config.official_cell_stack_limit) { + if(battle_config.official_cell_stack_limit && map->count_oncell(md->bl.m, md->bl.x, md->bl.y, BL_CHAR|BL_NPC, 0x1 | 0x2) > battle_config.official_cell_stack_limit) { unit->walktoxy(&md->bl, md->bl.x, md->bl.y, 8); } @@ -1904,6 +1904,7 @@ void mob_item_drop(struct mob_data *md, struct item_drop_list *dlist, struct ite if( sd && (drop_rate <= sd->state.autoloot || pc->isautolooting(sd, ditem->item_data.nameid)) + && (!map->list[sd->bl.m].flag.noautoloot) && (battle_config.idle_no_autoloot == 0 || DIFF_TICK(sockt->last_tick, sd->idletime) < battle_config.idle_no_autoloot) && (battle_config.homunculus_autoloot?1:!flag) #ifdef AUTOLOOT_DISTANCE diff --git a/src/map/npc.c b/src/map/npc.c index 6beff2b77..ecf7f878f 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -4300,6 +4300,8 @@ const char *npc_parse_mapflag(const char *w1, const char *w2, const char *w3, co map->list[m].flag.reset=state; else if (!strcmpi(w3,"notomb")) map->list[m].flag.notomb=state; + else if (!strcmpi(w3, "noautoloot")) + map->list[m].flag.noautoloot = state; else if (!strcmpi(w3,"adjust_unit_duration")) { int skill_id, k; char skill_name[MAP_ZONE_MAPFLAG_LENGTH], modifier[MAP_ZONE_MAPFLAG_LENGTH]; diff --git a/src/map/packets.h b/src/map/packets.h index afa986346..e9d895440 100644 --- a/src/map/packets.h +++ b/src/map/packets.h @@ -9476,8 +9476,8 @@ packet(0x96e,-1,clif->ackmergeitems); // 2017-02-28aRagexeRE #if PACKETVER >= 20170228 // new packets - packet(0x0ac0,26); - packet(0x0ac1,26); + packet(0x0ac0,26,clif->pRodexOpenMailbox); // CZ_OPEN_RODEXBOX + packet(0x0ac1,26,clif->pRodexRefreshMaillist); // CZ_REQ_REFRESH_RODEX packet(0x0ac2,-1); packet(0x0ac3,2); packet(0x0ac4,-1); @@ -10527,4 +10527,146 @@ packet(0x96e,-1,clif->ackmergeitems); packet(0x0adf,58); #endif +// 2017-09-27bRagexeRE +#if PACKETVER == 20170927 +// shuffle packets + packet(0x02c4,5,clif->pHomMenu,2,4); // CZ_COMMAND_MER + packet(0x035f,6,clif->pGetCharNameRequest,2); // CZ_REQNAME + packet(0x0361,4,clif->pDull/*,XXX*/); // CZ_GANGSI_RANK + packet(0x0362,-1,clif->pReqOpenBuyingStore,2,4,8,9,89); // CZ_REQ_OPEN_BUYING_STORE + packet(0x0366,19,clif->pWantToConnection,2,6,10,14,18); // CZ_ENTER + packet(0x085c,10,clif->pUseSkillToId,2,4,6); // CZ_USE_SKILL + packet(0x0873,6,clif->pSolveCharName,2); // CZ_REQNAME_BYGID + packet(0x0875,12,clif->pSearchStoreInfoListItemClick,2,6,10); // CZ_SSILIST_ITEM_CLICK + packet(0x087d,-1,clif->pReqTradeBuyingStore,2,4,8,12); // CZ_REQ_TRADE_BUYING_STORE + packet(0x087e,5,clif->pChangeDir,2,4); // CZ_CHANGE_DIRECTION + packet(0x088b,2,clif->pSearchStoreInfoNextPage,0); // CZ_SEARCH_STORE_INFO_NEXT_PAGE + packet(0x0899,7,clif->pActionRequest,2,6); // CZ_REQUEST_ACT + packet(0x089a,36,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD + packet(0x089b,8,clif->pMoveFromKafra,2,4); // CZ_MOVE_ITEM_FROM_STORE_TO_BODY + packet(0x08a3,2,clif->pReqCloseBuyingStore,0); // CZ_REQ_CLOSE_BUYING_STORE + packet(0x08a5,-1,clif->pItemListWindowSelected,2,4,8); // CZ_ITEMLISTWIN_RES + packet(0x08a6,8,clif->pDull/*,XXX*/); // CZ_JOIN_BATTLE_FIELD + packet(0x08ad,-1,clif->pSearchStoreInfo,2,4,5,9,13,14,15); // CZ_SEARCH_STORE_INFO + packet(0x091e,6,clif->pReqClickBuyingStore,2); // CZ_REQ_CLICK_TO_BUYING_STORE + packet(0x0922,26,clif->pPartyInvite2,2); // CZ_PARTY_JOIN_REQ + packet(0x0923,6,clif->pDropItem,2,4); // CZ_ITEM_THROW + packet(0x0927,5,clif->pWalkToXY,2); // CZ_REQUEST_MOVE + packet(0x093b,90,clif->pUseSkillToPosMoreInfo,2,4,6,8,10); // CZ_USE_SKILL_TOGROUND_WITHTALKBOX + packet(0x0942,18,clif->pPartyBookingRegisterReq,2,4); // CZ_PARTY_BOOKING_REQ_REGISTER + packet(0x0945,6,clif->pTickSend,2); // CZ_REQUEST_TIME + packet(0x094b,26,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS + packet(0x094d,6,clif->pTakeItem,2); // CZ_ITEM_PICKUP + packet(0x0959,8,clif->pMoveToKafra,2,4); // CZ_MOVE_ITEM_FROM_BODY_TO_STORE + packet(0x095a,10,clif->pUseSkillToPos,2,4,6,8); // CZ_USE_SKILL_TOGROUND +#endif + +#if PACKETVER >= 20170927 +// new packets + packet(0x0ae0,30); +// changed packet sizes +#endif + +// 2017-10-02cRagexeRE +#if PACKETVER == 20171002 +// shuffle packets + packet(0x022d,6,clif->pDropItem,2,4); // CZ_ITEM_THROW + packet(0x035f,6,clif->pTickSend,2); // CZ_REQUEST_TIME + packet(0x0360,6,clif->pReqClickBuyingStore,2); // CZ_REQ_CLICK_TO_BUYING_STORE + packet(0x0363,10,clif->pUseSkillToPos,2,4,6,8); // CZ_USE_SKILL_TOGROUND + 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(0x0437,5,clif->pWalkToXY,2); // CZ_REQUEST_MOVE + packet(0x0438,5,clif->pHomMenu,2,4); // CZ_COMMAND_MER + 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(0x0885,8,clif->pMoveToKafra,2,4); // CZ_MOVE_ITEM_FROM_BODY_TO_STORE + packet(0x0897,5,clif->pChangeDir,2,4); // CZ_CHANGE_DIRECTION + packet(0x0899,26,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS + packet(0x089d,19,clif->pWantToConnection,2,6,10,14,18); // CZ_ENTER + packet(0x0928,-1,clif->pItemListWindowSelected,2,4,8); // CZ_ITEMLISTWIN_RES + packet(0x092d,18,clif->pPartyBookingRegisterReq,2,4); // CZ_PARTY_BOOKING_REQ_REGISTER + packet(0x0934,36,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD + packet(0x093b,8,clif->pMoveFromKafra,2,4); // CZ_MOVE_ITEM_FROM_STORE_TO_BODY + packet(0x093d,6,clif->pTakeItem,2); // CZ_ITEM_PICKUP + packet(0x093e,8,clif->pDull/*,XXX*/); // CZ_JOIN_BATTLE_FIELD + packet(0x0943,26,clif->pPartyInvite2,2); // CZ_PARTY_JOIN_REQ + packet(0x095f,4,clif->pDull/*,XXX*/); // CZ_GANGSI_RANK + packet(0x096a,6,clif->pGetCharNameRequest,2); // CZ_REQNAME +#endif + +// 2017-10-11bRagexeRE +#if PACKETVER == 20171011 +// shuffle packets + packet(0x023b,5,clif->pWalkToXY,2); // CZ_REQUEST_MOVE + 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(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,36,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD + 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(0x087b,26,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS + packet(0x0882,5,clif->pHomMenu,2,4); // CZ_COMMAND_MER + packet(0x0950,19,clif->pWantToConnection,2,6,10,14,18); // CZ_ENTER + packet(0x0954,5,clif->pChangeDir,2,4); // CZ_CHANGE_DIRECTION + packet(0x096a,6,clif->pGetCharNameRequest,2); // CZ_REQNAME +#endif + +// 2017-10-18aRagexeRE +#if PACKETVER == 20171018 +// shuffle packets + packet(0x035f,6,clif->pTickSend,2); // CZ_REQUEST_TIME + packet(0x0360,6,clif->pReqClickBuyingStore,2); // CZ_REQ_CLICK_TO_BUYING_STORE + packet(0x0363,19,clif->pWantToConnection,2,6,10,14,18); // CZ_ENTER + packet(0x0364,8,clif->pMoveToKafra,2,4); // CZ_MOVE_ITEM_FROM_BODY_TO_STORE + 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,6,clif->pTakeItem,2); // CZ_ITEM_PICKUP + packet(0x0437,5,clif->pWalkToXY,2); // CZ_REQUEST_MOVE + packet(0x0438,10,clif->pUseSkillToPos,2,4,6,8); // CZ_USE_SKILL_TOGROUND + 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(0x086a,4,clif->pDull/*,XXX*/); // CZ_GANGSI_RANK + packet(0x087a,8,clif->pDull/*,XXX*/); // CZ_JOIN_BATTLE_FIELD + packet(0x087e,5,clif->pHomMenu,2,4); // CZ_COMMAND_MER + packet(0x0889,8,clif->pMoveFromKafra,2,4); // CZ_MOVE_ITEM_FROM_STORE_TO_BODY + packet(0x089a,6,clif->pDropItem,2,4); // CZ_ITEM_THROW + packet(0x089f,26,clif->pPartyInvite2,2); // CZ_PARTY_JOIN_REQ + packet(0x08a6,5,clif->pChangeDir,2,4); // CZ_CHANGE_DIRECTION + packet(0x0938,-1,clif->pItemListWindowSelected,2,4,8); // CZ_ITEMLISTWIN_RES + packet(0x0944,36,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD + packet(0x094a,26,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS + packet(0x094f,18,clif->pPartyBookingRegisterReq,2,4); // CZ_PARTY_BOOKING_REQ_REGISTER + packet(0x096a,6,clif->pGetCharNameRequest,2); // CZ_REQNAME +#endif + #endif /* MAP_PACKETS_H */ diff --git a/src/map/packets_keys.h b/src/map/packets_keys.h index 424956bc9..85796813a 100644 --- a/src/map/packets_keys.h +++ b/src/map/packets_keys.h @@ -2132,6 +2132,27 @@ packetKeys(0x53024DA5,0x04EC212D,0x0BF87CD4); #endif +// 2017-09-27bRagexeRE, 2017-09-27dRagexeRE +#if PACKETVER == 20170927 + packetKeys(0x15624100,0x0CE1463E,0x0E5D6534); +#endif + +// 2017-10-02cRagexeRE +#if PACKETVER == 20171002 + packetKeys(0x15E1716C,0x4E765B63,0x357D2370); +#endif + +// 2017-10-11aRagexeRE, 2017-10-11bRagexeRE +#if PACKETVER == 20171011 + packetKeys(0x4F121B3E,0x12670E17,0x19896C11); +#endif + +// 2017-10-18aRagexeRE +#if PACKETVER == 20171018 + packetKeys(0x2CAA109C,0x158C1EC2,0x7A5E58F3); +#endif + + #if defined(OBFUSCATIONKEY1) && defined(OBFUSCATIONKEY2) && defined(OBFUSCATIONKEY3) packetKeys(OBFUSCATIONKEY1,OBFUSCATIONKEY2,OBFUSCATIONKEY3); #endif diff --git a/src/map/packets_struct.h b/src/map/packets_struct.h index 207c345da..03b555e2b 100644 --- a/src/map/packets_struct.h +++ b/src/map/packets_struct.h @@ -318,10 +318,12 @@ enum packet_headers { rodexadditem = 0x0A05, rodexremoveitem = 0x0A07, rodexopenwrite = 0x0A12, -#if PACKETVER < 20160600 +#if PACKETVER < 20160601 rodexmailList = 0x09F0, -#else // PACKETVER >= 20160600 +#elif PACKETVER < 20170419 rodexmailList = 0x0A7D, +#else // PACKETVER >= 20170419 + rodexmailList = 0x0Ac2, #endif #if PACKETVER < 20160316 rodexcheckplayer = 0x0A14, @@ -1369,11 +1371,16 @@ struct PACKET_ZC_NOTIFY_UNREADMAIL { } __attribute__((packed)); struct maillistinfo { +#if PACKETVER >= 20170419 + uint8 openType; +#endif int64 MailID; int8 Isread; uint8 type; char SenderName[24]; +#if PACKETVER < 20170419 int32 regDateTime; +#endif int32 expireDateTime; int16 Titlelength; char title[]; @@ -1382,8 +1389,10 @@ struct maillistinfo { struct PACKET_ZC_MAIL_LIST { int16 PacketType; int16 PacketLength; +#if PACKETVER < 20170419 int8 opentype; int8 cnt; +#endif int8 IsEnd; } __attribute__((packed)); @@ -1395,8 +1404,13 @@ struct PACKET_CZ_REQ_NEXT_MAIL_LIST { struct PACKET_CZ_REQ_OPEN_MAIL { int16 PacketType; +#if PACKETVER >= 20170419 + int64 Upper_MailID; + int8 unknown[16]; +#else int8 opentype; int64 Upper_MailID; +#endif } __attribute__((packed)); struct PACKET_CZ_REQ_READ_MAIL { @@ -1429,8 +1443,13 @@ struct PACKET_ZC_ACK_DELETE_MAIL { struct PACKET_CZ_REQ_REFRESH_MAIL_LIST { int16 PacketType; +#if PACKETVER >= 20170419 + int64 Upper_MailID; + int8 unknown[16]; +#else int8 opentype; int64 Upper_MailID; +#endif } __attribute__((packed)); struct PACKET_CZ_REQ_ZENY_FROM_MAIL { diff --git a/src/map/party.c b/src/map/party.c index 26b4bae8b..a4a7e6dca 100644 --- a/src/map/party.c +++ b/src/map/party.c @@ -731,6 +731,11 @@ bool party_changeleader(struct map_session_data *sd, struct map_session_data *ts return false; } + if (battle_config.party_change_leader_same_map && sd->bl.m != tsd->bl.m) { + clif->msgtable(sd, MSG_PARTY_LEADER_SAMEMAP); // It is only possible to change the party leader while on the same map. + return false; + } + if( map->list[sd->bl.m].flag.partylock ) { clif->message(sd->fd, msg_sd(sd,287)); // You cannot change party leaders in this map. return false; diff --git a/src/map/pc.c b/src/map/pc.c index a4a32545b..0636ebafa 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -6698,8 +6698,9 @@ int pc_follow(struct map_session_data *sd,int target_id) { return 0; } -int pc_checkbaselevelup(struct map_session_data *sd) { - unsigned int next = pc->nextbaseexp(sd); +int pc_checkbaselevelup(struct map_session_data *sd) +{ + uint64 next = pc->nextbaseexp(sd); nullpo_ret(sd); if (!next || sd->status.base_exp < next) @@ -6763,7 +6764,7 @@ void pc_baselevelchanged(struct map_session_data *sd) { int pc_checkjoblevelup(struct map_session_data *sd) { - unsigned int next = pc->nextjobexp(sd); + uint64 next = pc->nextjobexp(sd); nullpo_ret(sd); if(!next || sd->status.job_exp < next) @@ -6796,7 +6797,7 @@ int pc_checkjoblevelup(struct map_session_data *sd) /** * Alters EXP based on self bonuses that do not get shared with the party **/ -void pc_calcexp(struct map_session_data *sd, unsigned int *base_exp, unsigned int *job_exp, struct block_list *src) { +void pc_calcexp(struct map_session_data *sd, uint64 *base_exp, uint64 *job_exp, struct block_list *src) { int buff_ratio = 0, buff_job_ratio = 0, race_ratio = 0, pk_ratio = 0; int64 jexp, bexp; @@ -6861,8 +6862,8 @@ void pc_calcexp(struct map_session_data *sd, unsigned int *base_exp, unsigned in bexp += apply_percentrate64(bexp, buff_ratio, 100); jexp += apply_percentrate64(jexp, buff_ratio + buff_job_ratio, 100); - *job_exp = (unsigned int)cap_value(jexp, 1, UINT_MAX); - *base_exp = (unsigned int)cap_value(bexp, 1, UINT_MAX); + *job_exp = cap_value(jexp, 1, UINT64_MAX); + *base_exp = cap_value(bexp, 1, UINT64_MAX); } /** @@ -6871,9 +6872,10 @@ void pc_calcexp(struct map_session_data *sd, unsigned int *base_exp, unsigned in * @param is_quest Used to let client know that the EXP was from a quest (clif->displayexp) PACKETVER >= 20091027 * @retval true success **/ -bool pc_gainexp(struct map_session_data *sd, struct block_list *src, unsigned int base_exp,unsigned int job_exp,bool is_quest) { - float nextbp=0, nextjp=0; - unsigned int nextb=0, nextj=0; +bool pc_gainexp(struct map_session_data *sd, struct block_list *src, uint64 base_exp, uint64 job_exp, bool is_quest) +{ + float nextbp = 0, nextjp = 0; + uint64 nextb = 0, nextj = 0; nullpo_ret(sd); if (sd->bl.prev == NULL || pc_isdead(sd)) @@ -6889,7 +6891,7 @@ bool pc_gainexp(struct map_session_data *sd, struct block_list *src, unsigned in pc->calcexp(sd, &base_exp, &job_exp, src); if (sd->status.guild_id > 0) - base_exp -= guild->payexp(sd,base_exp); + base_exp -= guild->payexp(sd, base_exp); nextb = pc->nextbaseexp(sd); nextj = pc->nextjobexp(sd); @@ -6900,16 +6902,16 @@ bool pc_gainexp(struct map_session_data *sd, struct block_list *src, unsigned in if (nextj > 0) nextjp = (float) job_exp / (float) nextj; - if(battle_config.max_exp_gain_rate) { + if (battle_config.max_exp_gain_rate) { if (nextbp > battle_config.max_exp_gain_rate/1000.) { //Note that this value should never be greater than the original //base_exp, therefore no overflow checks are needed. [Skotlex] - base_exp = (unsigned int)(battle_config.max_exp_gain_rate/1000.*nextb); + base_exp = (uint64)(battle_config.max_exp_gain_rate / 1000. * nextb); if (sd->state.showexp) nextbp = (float) base_exp / (float) nextb; } if (nextjp > battle_config.max_exp_gain_rate/1000.) { - job_exp = (unsigned int)(battle_config.max_exp_gain_rate/1000.*nextj); + job_exp = (uint64)(battle_config.max_exp_gain_rate / 1000. * nextj); if (sd->state.showexp) nextjp = (float) job_exp / (float) nextj; } @@ -6919,23 +6921,23 @@ bool pc_gainexp(struct map_session_data *sd, struct block_list *src, unsigned in // Cap exp to the level up requirement of the previous level when you are at max level, // otherwise cap at UINT_MAX (this is required for some S. Novice bonuses). [Skotlex] if (base_exp) { - nextb = nextb?UINT_MAX:pc->thisbaseexp(sd); - if(sd->status.base_exp > nextb - base_exp) + nextb = nextb ? UINT64_MAX : pc->thisbaseexp(sd); + if (sd->status.base_exp > nextb - base_exp) sd->status.base_exp = nextb; else sd->status.base_exp += base_exp; pc->checkbaselevelup(sd); - clif->updatestatus(sd,SP_BASEEXP); + clif->updatestatus(sd, SP_BASEEXP); } if (job_exp) { - nextj = nextj?UINT_MAX:pc->thisjobexp(sd); - if(sd->status.job_exp > nextj - job_exp) + nextj = nextj ? UINT64_MAX : pc->thisjobexp(sd); + if (sd->status.job_exp > nextj - job_exp) sd->status.job_exp = nextj; else sd->status.job_exp += job_exp; pc->checkjoblevelup(sd); - clif->updatestatus(sd,SP_JOBEXP); + clif->updatestatus(sd, SP_JOBEXP); } #if PACKETVER >= 20091027 @@ -6948,7 +6950,8 @@ bool pc_gainexp(struct map_session_data *sd, struct block_list *src, unsigned in if(sd->state.showexp) { char output[256]; sprintf(output, - "Experience Gained Base:%u (%.2f%%) Job:%u (%.2f%%)",base_exp,nextbp*(float)100,job_exp,nextjp*(float)100); + "Experience Gained Base:%"PRIu64" (%.2f%%) Job:%"PRIu64" (%.2f%%)", + base_exp, nextbp * (float)100, job_exp, nextjp * (float)100); clif_disp_onlyself(sd, output); } @@ -6973,7 +6976,7 @@ int pc_maxjoblv(const struct map_session_data *sd) *------------------------------------------*/ //Base exp needed for next level. -unsigned int pc_nextbaseexp(const struct map_session_data *sd) +uint64 pc_nextbaseexp(const struct map_session_data *sd) { nullpo_ret(sd); @@ -6984,7 +6987,7 @@ unsigned int pc_nextbaseexp(const struct map_session_data *sd) } //Base exp needed for this level. -unsigned int pc_thisbaseexp(const struct map_session_data *sd) +uint64 pc_thisbaseexp(const struct map_session_data *sd) { if (sd->status.base_level > pc->maxbaselv(sd) || sd->status.base_level <= 1) return 0; @@ -7000,7 +7003,7 @@ unsigned int pc_thisbaseexp(const struct map_session_data *sd) *------------------------------------------*/ //Job exp needed for next level. -unsigned int pc_nextjobexp(const struct map_session_data *sd) +uint64 pc_nextjobexp(const struct map_session_data *sd) { nullpo_ret(sd); @@ -7010,7 +7013,7 @@ unsigned int pc_nextjobexp(const struct map_session_data *sd) } //Job exp needed for this level. -unsigned int pc_thisjobexp(const struct map_session_data *sd) +uint64 pc_thisjobexp(const struct map_session_data *sd) { if (sd->status.job_level > pc->maxjoblv(sd) || sd->status.job_level <= 1) return 0; @@ -7958,7 +7961,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) { // activate Steel body if a super novice dies at 99+% exp [celest] if ((sd->job & MAPID_UPPERMASK) == MAPID_SUPER_NOVICE && !sd->state.snovice_dead_flag) { - unsigned int next = pc->nextbaseexp(sd); + uint64 next = pc->nextbaseexp(sd); if( next == 0 ) next = pc->thisbaseexp(sd); if (get_percentage64(sd->status.base_exp, next) >= 99) { sd->state.snovice_dead_flag = 1; @@ -8329,7 +8332,7 @@ int pc_setparam(struct map_session_data *sd, int type, int64 val) if (val >= sd->status.job_level) { if (val > pc->maxjoblv(sd)) val = pc->maxjoblv(sd); - sd->status.skill_point += val - sd->status.job_level; + sd->status.skill_point += (int)val - sd->status.job_level; clif->updatestatus(sd, SP_SKILLPOINT); } sd->status.job_level = (int32)val; @@ -8410,28 +8413,28 @@ int pc_setparam(struct map_session_data *sd, int type, int64 val) } break; case SP_STR: - sd->status.str = cap_value(val, 1, pc_maxparameter(sd)); + sd->status.str = cap_value((int)val, 1, pc_maxparameter(sd)); break; case SP_AGI: - sd->status.agi = cap_value(val, 1, pc_maxparameter(sd)); + sd->status.agi = cap_value((int)val, 1, pc_maxparameter(sd)); break; case SP_VIT: - sd->status.vit = cap_value(val, 1, pc_maxparameter(sd)); + sd->status.vit = cap_value((int)val, 1, pc_maxparameter(sd)); break; case SP_INT: - sd->status.int_ = cap_value(val, 1, pc_maxparameter(sd)); + sd->status.int_ = cap_value((int)val, 1, pc_maxparameter(sd)); break; case SP_DEX: - sd->status.dex = cap_value(val, 1, pc_maxparameter(sd)); + sd->status.dex = cap_value((int)val, 1, pc_maxparameter(sd)); break; case SP_LUK: - sd->status.luk = cap_value(val, 1, pc_maxparameter(sd)); + sd->status.luk = cap_value((int)val, 1, pc_maxparameter(sd)); break; case SP_KARMA: - sd->status.karma = val; + sd->status.karma = (int)val; break; case SP_MANNER: - sd->status.manner = val; + sd->status.manner = (int)val; if( val < 0 ) sc_start(NULL, &sd->bl, SC_NOCHAT, 100, 0, 0); else { @@ -10988,6 +10991,35 @@ int pc_split_atoui(char* str, unsigned int* val, char sep, int max) return i; } +int pc_split_atoui64(char* str, uint64* val, char sep, int max) +{ + static int warning=0; + int i,j; + nullpo_ret(val); + for (i=0; i<max; i++) { + double f; + if (!str) break; + f = atof(str); + if (f < 0) + val[i] = 0; + else if (f > UINT64_MAX) { + val[i] = UINT64_MAX; + if (!warning) { + warning = 1; + ShowWarning("pc_readdb (exp.txt): Required exp per level is capped to %"PRIu64"\n", UINT64_MAX); + } + } else + val[i] = (uint64)f; + str = strchr(str,sep); + if (str) + *str++=0; + } + //Zero up the remaining. + for(j=i; j < max; j++) + val[j] = 0; + return i; +} + /** * Parses the skill tree config file. * @@ -11295,7 +11327,7 @@ int pc_readdb(void) { count++; job = jobs[0] = pc->class2idx(job_id); //We send one less and then one more because the last entry in the exp array should hold 0. - pc->max_level[job][type] = pc_split_atoui(split[3], pc->exp_table[job][type],',',maxlv-1)+1; + pc->max_level[job][type] = pc_split_atoui64(split[3], pc->exp_table[job][type], ',', maxlv - 1) + 1; //Reverse check in case the array has a bunch of trailing zeros... [Skotlex] //The reasoning behind the -2 is this... if the max level is 5, then the array //should look like this: @@ -11932,7 +11964,7 @@ bool pc_process_chat_message(struct map_session_data *sd, const char *message) */ void pc_check_supernovice_call(struct map_session_data *sd, const char *message) { - unsigned int next = pc->nextbaseexp(sd); + uint64 next = pc->nextbaseexp(sd); int percent = 0; nullpo_retv(sd); diff --git a/src/map/pc.h b/src/map/pc.h index 46aafa5e5..50cb1b68e 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -829,7 +829,7 @@ struct pc_interface { /* */ BEGIN_ZEROED_BLOCK; /* Everything within this block will be memset to 0 when status_defaults() is executed */ - unsigned int exp_table[CLASS_COUNT][2][MAX_LEVEL]; + uint64 exp_table[CLASS_COUNT][2][MAX_LEVEL]; int max_level[CLASS_COUNT][2]; unsigned int statp[MAX_LEVEL+1]; unsigned int level_penalty[3][RC_MAX][MAX_LEVEL*2+1]; @@ -949,11 +949,11 @@ END_ZEROED_BLOCK; /* End */ int (*maxjoblv) (const struct map_session_data *sd); int (*checkbaselevelup) (struct map_session_data *sd); int (*checkjoblevelup) (struct map_session_data *sd); - bool (*gainexp) (struct map_session_data *sd, struct block_list *src, unsigned int base_exp, unsigned int job_exp, bool is_quest); - unsigned int (*nextbaseexp) (const struct map_session_data *sd); - unsigned int (*thisbaseexp) (const struct map_session_data *sd); - unsigned int (*nextjobexp) (const struct map_session_data *sd); - unsigned int (*thisjobexp) (const struct map_session_data *sd); + bool (*gainexp) (struct map_session_data *sd, struct block_list *src, uint64 base_exp, uint64 job_exp, bool is_quest); + uint64 (*nextbaseexp) (const struct map_session_data *sd); + uint64 (*thisbaseexp) (const struct map_session_data *sd); + uint64 (*nextjobexp) (const struct map_session_data *sd); + uint64 (*thisjobexp) (const struct map_session_data *sd); int (*gets_status_point) (int level); int (*need_status_point) (struct map_session_data *sd,int type,int val); int (*maxparameterincrease) (struct map_session_data* sd, int type); @@ -1079,7 +1079,7 @@ END_ZEROED_BLOCK; /* End */ int (*bonus_addeff) (struct s_addeffect* effect, int max, enum sc_type id, int16 rate, int16 arrow_rate, uint8 flag, uint16 duration); int (*bonus_addeff_onskill) (struct s_addeffectonskill* effect, int max, enum sc_type id, short rate, short skill_id, unsigned char target); int (*bonus_item_drop) (struct s_add_drop *drop, const short max, short id, short group, int race, int rate); - void (*calcexp) (struct map_session_data *sd, unsigned int *base_exp, unsigned int *job_exp, struct block_list *src); + void (*calcexp) (struct map_session_data *sd, uint64 *base_exp, uint64 *job_exp, struct block_list *src); int (*respawn_timer) (int tid, int64 tick, int id, intptr_t data); int (*jobchange_killclone) (struct block_list *bl, va_list ap); int (*getstat) (struct map_session_data* sd, int type); diff --git a/src/map/rodex.c b/src/map/rodex.c index 63d7242db..dcecb6b8f 100644 --- a/src/map/rodex.c +++ b/src/map/rodex.c @@ -547,13 +547,18 @@ void rodex_clean(struct map_session_data *sd, int8 flag) /// User request to open rodex, load mails from char-server /// @param sd : Who's requesting /// @param open_type : Box Type (see RODEX_OPENTYPE) -void rodex_open(struct map_session_data *sd, int8 open_type) +void rodex_open(struct map_session_data *sd, int8 open_type, int64 first_mail_id) { +#if PACKETVER >= 20170419 + const int type = 1; +#else + const int type = 0; +#endif nullpo_retv(sd); if (open_type == RODEX_OPENTYPE_ACCOUNT && battle_config.feature_rodex_use_accountmail == false) open_type = RODEX_OPENTYPE_MAIL; - intif->rodex_requestinbox(sd->status.char_id, sd->status.account_id, 0, open_type, 0); + intif->rodex_requestinbox(sd->status.char_id, sd->status.account_id, type, open_type, first_mail_id); } /// User request to read next page of mails @@ -568,7 +573,7 @@ void rodex_next_page(struct map_session_data *sd, int8 open_type, int64 last_mai if (open_type == RODEX_OPENTYPE_ACCOUNT && battle_config.feature_rodex_use_accountmail == false) { // Should not happen open_type = RODEX_OPENTYPE_MAIL; - rodex->open(sd, open_type); + rodex->open(sd, open_type, 0); return; } diff --git a/src/map/rodex.h b/src/map/rodex.h index 18ecd91d6..ddf7cb32b 100644 --- a/src/map/rodex.h +++ b/src/map/rodex.h @@ -60,7 +60,7 @@ struct rodex_interface { void (*final) (void); bool (*isenabled) (void); - void (*open) (struct map_session_data *sd, int8 open_type); + void (*open) (struct map_session_data *sd, int8 open_type, int64 first_mail_id); void (*next_page) (struct map_session_data *sd, int8 open_type, int64 last_mail_id); void (*refresh) (struct map_session_data *sd, int8 open_type, int64 first_mail_id); void (*add_item) (struct map_session_data *sd, int16 idx, int16 amount); diff --git a/src/map/script.c b/src/map/script.c index 9788edf3b..c218e98a6 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -12779,6 +12779,76 @@ BUILDIN(setmapflagnosave) { return true; } +enum mapinfo_info { + MAPINFO_NAME, + MAPINFO_ID, + MAPINFO_SIZE_X, + MAPINFO_SIZE_Y, + MAPINFO_ZONE +}; + +BUILDIN(getmapinfo) +{ + enum mapinfo_info mode = script_getnum(st, 2); + int16 m; + + if (script_hasdata(st, 3)) { + if (script_isstringtype(st, 3)) { + const char *str = script_getstr(st, 3); + m = map->mapname2mapid(str); + } else { + m = script_getnum(st, 3); + } + } else { + struct block_list *bl = NULL; + + if (st->oid) { + bl = map->id2bl(st->oid); + } else if (st->rid) { + bl = map->id2bl(st->rid); + } + + if (bl == NULL) { + ShowError("script:getmapinfo: map not supplied and NPC/PC not attached!\n"); + script_pushint(st, -3); + return false; + } + + m = bl->m; + } + + if (m < 0) { + // here we don't throw an error, so the command can be used + // to detect whether or not a map exists + script_pushint(st, -1); + return true; + } + + switch (mode) { + case MAPINFO_NAME: + script_pushconststr(st, map->list[m].name); + break; + case MAPINFO_ID: + script_pushint(st, m); + break; + case MAPINFO_SIZE_X: + script_pushint(st, map->list[m].xs); + break; + case MAPINFO_SIZE_Y: + script_pushint(st, map->list[m].ys); + break; + case MAPINFO_ZONE: + script_pushstrcopy(st, map->list[m].zone->name); + break; + default: + ShowError("script:getmapinfo: unknown option in second argument (%u).\n", mode); + script_pushint(st, -2); + return false; + } + + return true; +} + BUILDIN(getmapflag) { int16 m,i; @@ -12841,6 +12911,7 @@ BUILDIN(getmapflag) case MF_RESET: script_pushint(st,map->list[m].flag.reset); break; case MF_NOTOMB: script_pushint(st,map->list[m].flag.notomb); break; case MF_NOCASHSHOP: script_pushint(st,map->list[m].flag.nocashshop); break; + case MF_NOAUTOLOOT: script_pushint(st, map->list[m].flag.noautoloot); break; case MF_NOVIEWID: script_pushint(st,map->list[m].flag.noviewid); break; } } @@ -12965,6 +13036,7 @@ BUILDIN(setmapflag) { case MF_RESET: map->list[m].flag.reset = 1; break; case MF_NOTOMB: map->list[m].flag.notomb = 1; break; case MF_NOCASHSHOP: map->list[m].flag.nocashshop = 1; break; + case MF_NOAUTOLOOT: map->list[m].flag.noautoloot = 1; break; case MF_NOVIEWID: map->list[m].flag.noviewid = (val <= 0) ? EQP_NONE : val; break; } } @@ -13052,6 +13124,7 @@ BUILDIN(removemapflag) { case MF_RESET: map->list[m].flag.reset = 0; break; case MF_NOTOMB: map->list[m].flag.notomb = 0; break; case MF_NOCASHSHOP: map->list[m].flag.nocashshop = 0; break; + case MF_NOAUTOLOOT: map->list[m].flag.noautoloot = 0; break; case MF_NOVIEWID: map->list[m].flag.noviewid = EQP_NONE; break; } } @@ -15790,19 +15863,38 @@ BUILDIN(getmapxy) return true; } +enum logmes_type { + LOGMES_NPC, + LOGMES_ATCOMMAND +}; + /*========================================== - * Allows player to write NPC logs (i.e. Bank NPC, etc) [Lupus] + * Allows player to write logs (i.e. Bank NPC, etc) [Lupus] *------------------------------------------*/ BUILDIN(logmes) { - const char *str; + const char *str = script_getstr(st, 2); struct map_session_data *sd = script->rid2sd(st); + enum logmes_type type = LOGMES_NPC; + nullpo_retr(false, sd); - if (sd == NULL) - return true; + if (script_hasdata(st, 3)) { + type = script_getnum(st, 3); + } + + switch (type) { + case LOGMES_ATCOMMAND: + logs->atcommand(sd, str); + break; + case LOGMES_NPC: + logs->npc(sd, str); + break; + default: + ShowError("script:logmes: Unknown log type!\n"); + st->state = END; + return false; + } - str = script_getstr(st,2); - logs->npc(sd,str); return true; } @@ -23419,7 +23511,7 @@ BUILDIN(dressroom) clif->dressroom_open(sd, 0); break; default: - ShowWarning("script:dressroom: unknown mode (%i).\n", mode); + ShowWarning("script:dressroom: unknown mode (%u).\n", mode); script_pushint(st, 0); return false; } @@ -23999,6 +24091,7 @@ void script_parse_builtin(void) { BUILDIN_DEF(isloggedin,"i?"), BUILDIN_DEF(setmapflagnosave,"ssii"), BUILDIN_DEF(getmapflag,"si"), + BUILDIN_DEF(getmapinfo,"i?"), BUILDIN_DEF(setmapflag,"si?"), BUILDIN_DEF(removemapflag,"si"), BUILDIN_DEF(pvpon,"s"), @@ -24075,7 +24168,7 @@ void script_parse_builtin(void) { BUILDIN_DEF(checkoption2,"i?"), BUILDIN_DEF(guildgetexp,"i"), BUILDIN_DEF(guildchangegm,"is"), - BUILDIN_DEF(logmes,"s"), //this command actls as MES but rints info into LOG file either SQL/TXT [Lupus] + BUILDIN_DEF(logmes,"s?"), //this command actls as MES but rints info into LOG file either SQL/TXT [Lupus] BUILDIN_DEF(summon,"si??"), // summons a slave monster [Celest] BUILDIN_DEF(isnight,""), // check whether it is night time [Celest] BUILDIN_DEF(isequipped,"i*"), // check whether another item/card has been equipped [Celest] @@ -24602,6 +24695,10 @@ void script_hardcoded_constants(void) script->set_constant("DATATYPE_VAR", DATATYPE_VAR, false, false); script->set_constant("DATATYPE_LABEL", DATATYPE_LABEL, false, false); + script->constdb_comment("Logmes types"); + script->set_constant("LOGMES_NPC", LOGMES_NPC, false, false); + script->set_constant("LOGMES_ATCOMMAND", LOGMES_ATCOMMAND, false, false); + script->constdb_comment("Item Subtypes (Weapon types)"); script->set_constant("W_FIST", W_FIST, false, false); script->set_constant("W_DAGGER", W_DAGGER, false, false); @@ -24653,6 +24750,13 @@ void script_hardcoded_constants(void) script->set_constant("DRESSROOM_OPEN", DRESSROOM_OPEN, false, false); script->set_constant("DRESSROOM_CLOSE", DRESSROOM_CLOSE, false, false); + script->constdb_comment("getmapinfo options"); + script->set_constant("MAPINFO_NAME", MAPINFO_NAME, false, false); + script->set_constant("MAPINFO_ID", MAPINFO_ID, false, false); + script->set_constant("MAPINFO_SIZE_X", MAPINFO_SIZE_X, false, false); + script->set_constant("MAPINFO_SIZE_Y", MAPINFO_SIZE_Y, false, false); + script->set_constant("MAPINFO_ZONE", MAPINFO_ZONE, false, false); + script->constdb_comment("Renewal"); #ifdef RENEWAL script->set_constant("RENEWAL", 1, false, false); diff --git a/src/map/script.h b/src/map/script.h index 189122230..283afa496 100644 --- a/src/map/script.h +++ b/src/map/script.h @@ -336,6 +336,7 @@ enum { MF_RESET, MF_NOTOMB, MF_NOCASHSHOP, + MF_NOAUTOLOOT, MF_NOVIEWID }; diff --git a/src/map/skill.c b/src/map/skill.c index a84955377..726deaa9a 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -13832,8 +13832,8 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id break; case PR_REDEMPTIO: { - int exp; - if( ((exp = pc->nextbaseexp(sd)) > 0 && get_percentage64(sd->status.base_exp, exp) < 1) || + int64 exp; + if (((exp = pc->nextbaseexp(sd)) > 0 && get_percentage64(sd->status.base_exp, exp) < 1) || ((exp = pc->nextjobexp(sd)) > 0 && get_percentage64(sd->status.job_exp, exp) < 1)) { clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); //Not enough exp. return 0; @@ -18984,7 +18984,8 @@ void skill_init_unit_layout (void) void skill_init_unit_layout_unknown(int skill_idx) { - ShowError("unknown unit layout at skill %d\n", skill_idx); + Assert_retv(skill_idx >= 0 && skill_idx < MAX_SKILL_DB); + ShowError("unknown unit layout at skill %d\n", skill->dbs->db[skill_idx].nameid); } int skill_block_check(struct block_list *bl, sc_type type , uint16 skill_id) diff --git a/src/map/status.h b/src/map/status.h index eb3cf491b..a104c66ab 100644 --- a/src/map/status.h +++ b/src/map/status.h @@ -1927,7 +1927,7 @@ enum e_mode //who were not on your field of sight when it happened) //opt1: Non stackable status changes. -enum { +enum e_opt1 { OPT1_STONE = 1, //Petrified OPT1_FREEZE, OPT1_STUN, @@ -1940,7 +1940,7 @@ enum { }; //opt2: Stackable status changes. -enum { +enum e_opt2 { OPT2_POISON = 0x0001, OPT2_CURSE = 0x0002, OPT2_SILENCE = 0x0004, @@ -1953,7 +1953,7 @@ enum { }; //opt3: (SHOW_EFST_*) -enum { +enum e_opt3 { OPT3_NORMAL = 0x00000000, OPT3_QUICKEN = 0x00000001, OPT3_OVERTHRUST = 0x00000002, diff --git a/src/map/unit.c b/src/map/unit.c index 00c78054b..0b5b21caf 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -474,7 +474,7 @@ int unit_walktoxy_timer(int tid, int64 tick, int id, intptr_t data) ud->to_x = bl->x; ud->to_y = bl->y; - if(battle_config.official_cell_stack_limit && map->count_oncell(bl->m, x, y, BL_CHAR|BL_NPC, 1) > battle_config.official_cell_stack_limit) { + if (battle_config.official_cell_stack_limit && map->count_oncell(bl->m, x, y, BL_CHAR|BL_NPC, 0x1 | 0x2) > battle_config.official_cell_stack_limit) { //Walked on occupied cell, call unit_walktoxy again if(ud->steptimer != INVALID_TIMER) { //Execute step timer on next step instead diff --git a/src/plugins/HPMHooking/HPMHooking.Defs.inc b/src/plugins/HPMHooking/HPMHooking.Defs.inc index cbd11e1b8..fed5810f4 100644 --- a/src/plugins/HPMHooking/HPMHooking.Defs.inc +++ b/src/plugins/HPMHooking/HPMHooking.Defs.inc @@ -1180,8 +1180,8 @@ typedef void (*HPMHOOK_pre_clif_viewequip_ack) (struct map_session_data **sd, st typedef void (*HPMHOOK_post_clif_viewequip_ack) (struct map_session_data *sd, struct map_session_data *tsd); typedef void (*HPMHOOK_pre_clif_equpcheckbox) (struct map_session_data **sd); typedef void (*HPMHOOK_post_clif_equpcheckbox) (struct map_session_data *sd); -typedef void (*HPMHOOK_pre_clif_displayexp) (struct map_session_data **sd, unsigned int *exp, char *type, bool *is_quest); -typedef void (*HPMHOOK_post_clif_displayexp) (struct map_session_data *sd, unsigned int exp, char type, bool is_quest); +typedef void (*HPMHOOK_pre_clif_displayexp) (struct map_session_data **sd, uint64 *exp, char *type, bool *is_quest); +typedef void (*HPMHOOK_post_clif_displayexp) (struct map_session_data *sd, uint64 exp, char type, bool is_quest); typedef void (*HPMHOOK_pre_clif_font) (struct map_session_data **sd); typedef void (*HPMHOOK_post_clif_font) (struct map_session_data *sd); typedef void (*HPMHOOK_pre_clif_progressbar) (struct map_session_data **sd, unsigned int *color, unsigned int *second); @@ -2260,6 +2260,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_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); @@ -2508,8 +2510,8 @@ typedef int (*HPMHOOK_pre_guild_getindex) (const struct guild **g, int *account_ typedef int (*HPMHOOK_post_guild_getindex) (int retVal___, const struct guild *g, int account_id, int char_id); typedef int (*HPMHOOK_pre_guild_getposition) (struct guild **g, struct map_session_data **sd); typedef int (*HPMHOOK_post_guild_getposition) (int retVal___, struct guild *g, struct map_session_data *sd); -typedef unsigned int (*HPMHOOK_pre_guild_payexp) (struct map_session_data **sd, unsigned int *exp); -typedef unsigned int (*HPMHOOK_post_guild_payexp) (unsigned int retVal___, struct map_session_data *sd, unsigned int exp); +typedef uint64 (*HPMHOOK_pre_guild_payexp) (struct map_session_data **sd, uint64 *exp); +typedef uint64 (*HPMHOOK_post_guild_payexp) (uint64 retVal___, struct map_session_data *sd, uint64 exp); typedef int (*HPMHOOK_pre_guild_getexp) (struct map_session_data **sd, int *exp); typedef int (*HPMHOOK_post_guild_getexp) (int retVal___, struct map_session_data *sd, int exp); typedef int (*HPMHOOK_pre_guild_create) (struct map_session_data **sd, const char **name); @@ -3846,6 +3848,32 @@ typedef void (*HPMHOOK_pre_login_config_set_defaults) (void); typedef void (*HPMHOOK_post_login_config_set_defaults) (void); typedef bool (*HPMHOOK_pre_login_config_read) (const char **filename, bool *included); typedef bool (*HPMHOOK_post_login_config_read) (bool retVal___, const char *filename, bool included); +typedef bool (*HPMHOOK_pre_login_config_read_inter) (const char **filename, struct config_t **config, bool *imported); +typedef bool (*HPMHOOK_post_login_config_read_inter) (bool retVal___, const char *filename, struct config_t *config, bool imported); +typedef bool (*HPMHOOK_pre_login_config_read_console) (const char **filename, struct config_t **config, bool *imported); +typedef bool (*HPMHOOK_post_login_config_read_console) (bool retVal___, const char *filename, struct config_t *config, bool imported); +typedef bool (*HPMHOOK_pre_login_config_read_log) (const char **filename, struct config_t **config, bool *imported); +typedef bool (*HPMHOOK_post_login_config_read_log) (bool retVal___, const char *filename, struct config_t *config, bool imported); +typedef bool (*HPMHOOK_pre_login_config_read_account) (const char **filename, struct config_t **config, bool *imported); +typedef bool (*HPMHOOK_post_login_config_read_account) (bool retVal___, const char *filename, struct config_t *config, bool imported); +typedef bool (*HPMHOOK_pre_login_config_read_permission) (const char **filename, struct config_t **config, bool *imported); +typedef bool (*HPMHOOK_post_login_config_read_permission) (bool retVal___, const char *filename, struct config_t *config, bool imported); +typedef bool (*HPMHOOK_pre_login_config_read_permission_hash) (const char **filename, struct config_t **config, bool *imported); +typedef bool (*HPMHOOK_post_login_config_read_permission_hash) (bool retVal___, const char *filename, struct config_t *config, bool imported); +typedef bool (*HPMHOOK_pre_login_config_read_permission_blacklist) (const char **filename, struct config_t **config, bool *imported); +typedef bool (*HPMHOOK_post_login_config_read_permission_blacklist) (bool retVal___, const char *filename, struct config_t *config, bool imported); +typedef bool (*HPMHOOK_pre_login_config_read_users) (const char **filename, struct config_t **config, bool *imported); +typedef bool (*HPMHOOK_post_login_config_read_users) (bool retVal___, const char *filename, struct config_t *config, bool imported); +typedef void (*HPMHOOK_pre_login_clear_dnsbl_servers) (void); +typedef void (*HPMHOOK_post_login_clear_dnsbl_servers) (void); +typedef void (*HPMHOOK_pre_login_config_set_dnsbl_servers) (struct config_setting_t **setting); +typedef void (*HPMHOOK_post_login_config_set_dnsbl_servers) (struct config_setting_t *setting); +typedef void (*HPMHOOK_pre_login_clear_client_hash_nodes) (void); +typedef void (*HPMHOOK_post_login_clear_client_hash_nodes) (void); +typedef void (*HPMHOOK_pre_login_config_set_md5hash) (struct config_setting_t **setting); +typedef void (*HPMHOOK_post_login_config_set_md5hash) (struct config_setting_t *setting); +typedef uint16 (*HPMHOOK_pre_login_convert_users_to_colors) (uint16 *users); +typedef uint16 (*HPMHOOK_post_login_convert_users_to_colors) (uint16 retVal___, uint16 users); #endif // LOGIN_LOGIN_H #ifdef CHAR_LOGINIF_H /* loginif */ typedef void (*HPMHOOK_pre_loginif_init) (void); @@ -5418,16 +5446,16 @@ typedef int (*HPMHOOK_pre_pc_checkbaselevelup) (struct map_session_data **sd); typedef int (*HPMHOOK_post_pc_checkbaselevelup) (int retVal___, struct map_session_data *sd); typedef int (*HPMHOOK_pre_pc_checkjoblevelup) (struct map_session_data **sd); typedef int (*HPMHOOK_post_pc_checkjoblevelup) (int retVal___, struct map_session_data *sd); -typedef bool (*HPMHOOK_pre_pc_gainexp) (struct map_session_data **sd, struct block_list **src, unsigned int *base_exp, unsigned int *job_exp, bool *is_quest); -typedef bool (*HPMHOOK_post_pc_gainexp) (bool retVal___, struct map_session_data *sd, struct block_list *src, unsigned int base_exp, unsigned int job_exp, bool is_quest); -typedef unsigned int (*HPMHOOK_pre_pc_nextbaseexp) (const struct map_session_data **sd); -typedef unsigned int (*HPMHOOK_post_pc_nextbaseexp) (unsigned int retVal___, const struct map_session_data *sd); -typedef unsigned int (*HPMHOOK_pre_pc_thisbaseexp) (const struct map_session_data **sd); -typedef unsigned int (*HPMHOOK_post_pc_thisbaseexp) (unsigned int retVal___, const struct map_session_data *sd); -typedef unsigned int (*HPMHOOK_pre_pc_nextjobexp) (const struct map_session_data **sd); -typedef unsigned int (*HPMHOOK_post_pc_nextjobexp) (unsigned int retVal___, const struct map_session_data *sd); -typedef unsigned int (*HPMHOOK_pre_pc_thisjobexp) (const struct map_session_data **sd); -typedef unsigned int (*HPMHOOK_post_pc_thisjobexp) (unsigned int retVal___, const struct map_session_data *sd); +typedef bool (*HPMHOOK_pre_pc_gainexp) (struct map_session_data **sd, struct block_list **src, uint64 *base_exp, uint64 *job_exp, bool *is_quest); +typedef bool (*HPMHOOK_post_pc_gainexp) (bool retVal___, struct map_session_data *sd, struct block_list *src, uint64 base_exp, uint64 job_exp, bool is_quest); +typedef uint64 (*HPMHOOK_pre_pc_nextbaseexp) (const struct map_session_data **sd); +typedef uint64 (*HPMHOOK_post_pc_nextbaseexp) (uint64 retVal___, const struct map_session_data *sd); +typedef uint64 (*HPMHOOK_pre_pc_thisbaseexp) (const struct map_session_data **sd); +typedef uint64 (*HPMHOOK_post_pc_thisbaseexp) (uint64 retVal___, const struct map_session_data *sd); +typedef uint64 (*HPMHOOK_pre_pc_nextjobexp) (const struct map_session_data **sd); +typedef uint64 (*HPMHOOK_post_pc_nextjobexp) (uint64 retVal___, const struct map_session_data *sd); +typedef uint64 (*HPMHOOK_pre_pc_thisjobexp) (const struct map_session_data **sd); +typedef uint64 (*HPMHOOK_post_pc_thisjobexp) (uint64 retVal___, const struct map_session_data *sd); typedef int (*HPMHOOK_pre_pc_gets_status_point) (int *level); typedef int (*HPMHOOK_post_pc_gets_status_point) (int retVal___, int level); typedef int (*HPMHOOK_pre_pc_need_status_point) (struct map_session_data **sd, int *type, int *val); @@ -5634,8 +5662,8 @@ typedef int (*HPMHOOK_pre_pc_bonus_addeff_onskill) (struct s_addeffectonskill ** typedef int (*HPMHOOK_post_pc_bonus_addeff_onskill) (int retVal___, struct s_addeffectonskill *effect, int max, enum sc_type id, short rate, short skill_id, unsigned char target); typedef int (*HPMHOOK_pre_pc_bonus_item_drop) (struct s_add_drop **drop, const short *max, short *id, short *group, int *race, int *rate); typedef int (*HPMHOOK_post_pc_bonus_item_drop) (int retVal___, struct s_add_drop *drop, const short max, short id, short group, int race, int rate); -typedef void (*HPMHOOK_pre_pc_calcexp) (struct map_session_data **sd, unsigned int **base_exp, unsigned int **job_exp, struct block_list **src); -typedef void (*HPMHOOK_post_pc_calcexp) (struct map_session_data *sd, unsigned int *base_exp, unsigned int *job_exp, struct block_list *src); +typedef void (*HPMHOOK_pre_pc_calcexp) (struct map_session_data **sd, uint64 **base_exp, uint64 **job_exp, struct block_list **src); +typedef void (*HPMHOOK_post_pc_calcexp) (struct map_session_data *sd, uint64 *base_exp, uint64 *job_exp, struct block_list *src); typedef int (*HPMHOOK_pre_pc_respawn_timer) (int *tid, int64 *tick, int *id, intptr_t *data); typedef int (*HPMHOOK_post_pc_respawn_timer) (int retVal___, int tid, int64 tick, int id, intptr_t data); typedef int (*HPMHOOK_pre_pc_jobchange_killclone) (struct block_list **bl, va_list ap); @@ -5892,8 +5920,8 @@ typedef void (*HPMHOOK_pre_rodex_final) (void); typedef void (*HPMHOOK_post_rodex_final) (void); typedef bool (*HPMHOOK_pre_rodex_isenabled) (void); typedef bool (*HPMHOOK_post_rodex_isenabled) (bool retVal___); -typedef void (*HPMHOOK_pre_rodex_open) (struct map_session_data **sd, int8 *open_type); -typedef void (*HPMHOOK_post_rodex_open) (struct map_session_data *sd, int8 open_type); +typedef void (*HPMHOOK_pre_rodex_open) (struct map_session_data **sd, int8 *open_type, int64 *first_mail_id); +typedef void (*HPMHOOK_post_rodex_open) (struct map_session_data *sd, int8 open_type, int64 first_mail_id); typedef void (*HPMHOOK_pre_rodex_next_page) (struct map_session_data **sd, int8 *open_type, int64 *last_mail_id); typedef void (*HPMHOOK_post_rodex_next_page) (struct map_session_data *sd, int8 open_type, int64 last_mail_id); typedef void (*HPMHOOK_pre_rodex_refresh) (struct map_session_data **sd, int8 *open_type, int64 *first_mail_id); diff --git a/src/plugins/HPMHooking/HPMHooking_login.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking_login.HPMHooksCore.inc index 57c1e0233..9c38c0c4c 100644 --- a/src/plugins/HPMHooking/HPMHooking_login.HPMHooksCore.inc +++ b/src/plugins/HPMHooking/HPMHooking_login.HPMHooksCore.inc @@ -376,6 +376,32 @@ struct { struct HPMHookPoint *HP_login_config_set_defaults_post; struct HPMHookPoint *HP_login_config_read_pre; struct HPMHookPoint *HP_login_config_read_post; + struct HPMHookPoint *HP_login_config_read_inter_pre; + struct HPMHookPoint *HP_login_config_read_inter_post; + struct HPMHookPoint *HP_login_config_read_console_pre; + struct HPMHookPoint *HP_login_config_read_console_post; + struct HPMHookPoint *HP_login_config_read_log_pre; + struct HPMHookPoint *HP_login_config_read_log_post; + struct HPMHookPoint *HP_login_config_read_account_pre; + struct HPMHookPoint *HP_login_config_read_account_post; + struct HPMHookPoint *HP_login_config_read_permission_pre; + struct HPMHookPoint *HP_login_config_read_permission_post; + struct HPMHookPoint *HP_login_config_read_permission_hash_pre; + struct HPMHookPoint *HP_login_config_read_permission_hash_post; + struct HPMHookPoint *HP_login_config_read_permission_blacklist_pre; + struct HPMHookPoint *HP_login_config_read_permission_blacklist_post; + struct HPMHookPoint *HP_login_config_read_users_pre; + struct HPMHookPoint *HP_login_config_read_users_post; + struct HPMHookPoint *HP_login_clear_dnsbl_servers_pre; + struct HPMHookPoint *HP_login_clear_dnsbl_servers_post; + struct HPMHookPoint *HP_login_config_set_dnsbl_servers_pre; + struct HPMHookPoint *HP_login_config_set_dnsbl_servers_post; + struct HPMHookPoint *HP_login_clear_client_hash_nodes_pre; + struct HPMHookPoint *HP_login_clear_client_hash_nodes_post; + struct HPMHookPoint *HP_login_config_set_md5hash_pre; + struct HPMHookPoint *HP_login_config_set_md5hash_post; + struct HPMHookPoint *HP_login_convert_users_to_colors_pre; + struct HPMHookPoint *HP_login_convert_users_to_colors_post; struct HPMHookPoint *HP_md5_string_pre; struct HPMHookPoint *HP_md5_string_post; struct HPMHookPoint *HP_md5_binary_pre; @@ -1049,6 +1075,32 @@ struct { int HP_login_config_set_defaults_post; int HP_login_config_read_pre; int HP_login_config_read_post; + int HP_login_config_read_inter_pre; + int HP_login_config_read_inter_post; + int HP_login_config_read_console_pre; + int HP_login_config_read_console_post; + int HP_login_config_read_log_pre; + int HP_login_config_read_log_post; + int HP_login_config_read_account_pre; + int HP_login_config_read_account_post; + int HP_login_config_read_permission_pre; + int HP_login_config_read_permission_post; + int HP_login_config_read_permission_hash_pre; + int HP_login_config_read_permission_hash_post; + int HP_login_config_read_permission_blacklist_pre; + int HP_login_config_read_permission_blacklist_post; + int HP_login_config_read_users_pre; + int HP_login_config_read_users_post; + int HP_login_clear_dnsbl_servers_pre; + int HP_login_clear_dnsbl_servers_post; + int HP_login_config_set_dnsbl_servers_pre; + int HP_login_config_set_dnsbl_servers_post; + int HP_login_clear_client_hash_nodes_pre; + int HP_login_clear_client_hash_nodes_post; + int HP_login_config_set_md5hash_pre; + int HP_login_config_set_md5hash_post; + int HP_login_convert_users_to_colors_pre; + int HP_login_convert_users_to_colors_post; int HP_md5_string_pre; int HP_md5_string_post; int HP_md5_binary_pre; diff --git a/src/plugins/HPMHooking/HPMHooking_login.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking_login.HookingPoints.inc index 125c54a12..ba4b941a9 100644 --- a/src/plugins/HPMHooking/HPMHooking_login.HookingPoints.inc +++ b/src/plugins/HPMHooking/HPMHooking_login.HookingPoints.inc @@ -211,6 +211,19 @@ struct HookingPointData HookingPoints[] = { { HP_POP(login->parse_request_connection, HP_login_parse_request_connection) }, { HP_POP(login->config_set_defaults, HP_login_config_set_defaults) }, { HP_POP(login->config_read, HP_login_config_read) }, + { HP_POP(login->config_read_inter, HP_login_config_read_inter) }, + { HP_POP(login->config_read_console, HP_login_config_read_console) }, + { HP_POP(login->config_read_log, HP_login_config_read_log) }, + { HP_POP(login->config_read_account, HP_login_config_read_account) }, + { HP_POP(login->config_read_permission, HP_login_config_read_permission) }, + { HP_POP(login->config_read_permission_hash, HP_login_config_read_permission_hash) }, + { HP_POP(login->config_read_permission_blacklist, HP_login_config_read_permission_blacklist) }, + { HP_POP(login->config_read_users, HP_login_config_read_users) }, + { HP_POP(login->clear_dnsbl_servers, HP_login_clear_dnsbl_servers) }, + { HP_POP(login->config_set_dnsbl_servers, HP_login_config_set_dnsbl_servers) }, + { HP_POP(login->clear_client_hash_nodes, HP_login_clear_client_hash_nodes) }, + { HP_POP(login->config_set_md5hash, HP_login_config_set_md5hash) }, + { HP_POP(login->convert_users_to_colors, HP_login_convert_users_to_colors) }, /* md5_interface */ { HP_POP(md5->string, HP_md5_string) }, { HP_POP(md5->binary, HP_md5_binary) }, diff --git a/src/plugins/HPMHooking/HPMHooking_login.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_login.Hooks.inc index 964d46b0a..0dbf2e5ae 100644 --- a/src/plugins/HPMHooking/HPMHooking_login.Hooks.inc +++ b/src/plugins/HPMHooking/HPMHooking_login.Hooks.inc @@ -4716,6 +4716,353 @@ bool HP_login_config_read(const char *filename, bool included) { } return retVal___; } +bool HP_login_config_read_inter(const char *filename, struct config_t *config, bool imported) { + int hIndex = 0; + bool retVal___ = false; + if (HPMHooks.count.HP_login_config_read_inter_pre > 0) { + bool (*preHookFunc) (const char **filename, struct config_t **config, bool *imported); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_config_read_inter_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_login_config_read_inter_pre[hIndex].func; + retVal___ = preHookFunc(&filename, &config, &imported); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.login.config_read_inter(filename, config, imported); + } + if (HPMHooks.count.HP_login_config_read_inter_post > 0) { + bool (*postHookFunc) (bool retVal___, const char *filename, struct config_t *config, bool imported); + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_config_read_inter_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_login_config_read_inter_post[hIndex].func; + retVal___ = postHookFunc(retVal___, filename, config, imported); + } + } + return retVal___; +} +bool HP_login_config_read_console(const char *filename, struct config_t *config, bool imported) { + int hIndex = 0; + bool retVal___ = false; + if (HPMHooks.count.HP_login_config_read_console_pre > 0) { + bool (*preHookFunc) (const char **filename, struct config_t **config, bool *imported); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_config_read_console_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_login_config_read_console_pre[hIndex].func; + retVal___ = preHookFunc(&filename, &config, &imported); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.login.config_read_console(filename, config, imported); + } + if (HPMHooks.count.HP_login_config_read_console_post > 0) { + bool (*postHookFunc) (bool retVal___, const char *filename, struct config_t *config, bool imported); + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_config_read_console_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_login_config_read_console_post[hIndex].func; + retVal___ = postHookFunc(retVal___, filename, config, imported); + } + } + return retVal___; +} +bool HP_login_config_read_log(const char *filename, struct config_t *config, bool imported) { + int hIndex = 0; + bool retVal___ = false; + if (HPMHooks.count.HP_login_config_read_log_pre > 0) { + bool (*preHookFunc) (const char **filename, struct config_t **config, bool *imported); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_config_read_log_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_login_config_read_log_pre[hIndex].func; + retVal___ = preHookFunc(&filename, &config, &imported); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.login.config_read_log(filename, config, imported); + } + if (HPMHooks.count.HP_login_config_read_log_post > 0) { + bool (*postHookFunc) (bool retVal___, const char *filename, struct config_t *config, bool imported); + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_config_read_log_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_login_config_read_log_post[hIndex].func; + retVal___ = postHookFunc(retVal___, filename, config, imported); + } + } + return retVal___; +} +bool HP_login_config_read_account(const char *filename, struct config_t *config, bool imported) { + int hIndex = 0; + bool retVal___ = false; + if (HPMHooks.count.HP_login_config_read_account_pre > 0) { + bool (*preHookFunc) (const char **filename, struct config_t **config, bool *imported); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_config_read_account_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_login_config_read_account_pre[hIndex].func; + retVal___ = preHookFunc(&filename, &config, &imported); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.login.config_read_account(filename, config, imported); + } + if (HPMHooks.count.HP_login_config_read_account_post > 0) { + bool (*postHookFunc) (bool retVal___, const char *filename, struct config_t *config, bool imported); + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_config_read_account_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_login_config_read_account_post[hIndex].func; + retVal___ = postHookFunc(retVal___, filename, config, imported); + } + } + return retVal___; +} +bool HP_login_config_read_permission(const char *filename, struct config_t *config, bool imported) { + int hIndex = 0; + bool retVal___ = false; + if (HPMHooks.count.HP_login_config_read_permission_pre > 0) { + bool (*preHookFunc) (const char **filename, struct config_t **config, bool *imported); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_config_read_permission_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_login_config_read_permission_pre[hIndex].func; + retVal___ = preHookFunc(&filename, &config, &imported); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.login.config_read_permission(filename, config, imported); + } + if (HPMHooks.count.HP_login_config_read_permission_post > 0) { + bool (*postHookFunc) (bool retVal___, const char *filename, struct config_t *config, bool imported); + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_config_read_permission_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_login_config_read_permission_post[hIndex].func; + retVal___ = postHookFunc(retVal___, filename, config, imported); + } + } + return retVal___; +} +bool HP_login_config_read_permission_hash(const char *filename, struct config_t *config, bool imported) { + int hIndex = 0; + bool retVal___ = false; + if (HPMHooks.count.HP_login_config_read_permission_hash_pre > 0) { + bool (*preHookFunc) (const char **filename, struct config_t **config, bool *imported); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_config_read_permission_hash_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_login_config_read_permission_hash_pre[hIndex].func; + retVal___ = preHookFunc(&filename, &config, &imported); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.login.config_read_permission_hash(filename, config, imported); + } + if (HPMHooks.count.HP_login_config_read_permission_hash_post > 0) { + bool (*postHookFunc) (bool retVal___, const char *filename, struct config_t *config, bool imported); + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_config_read_permission_hash_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_login_config_read_permission_hash_post[hIndex].func; + retVal___ = postHookFunc(retVal___, filename, config, imported); + } + } + return retVal___; +} +bool HP_login_config_read_permission_blacklist(const char *filename, struct config_t *config, bool imported) { + int hIndex = 0; + bool retVal___ = false; + if (HPMHooks.count.HP_login_config_read_permission_blacklist_pre > 0) { + bool (*preHookFunc) (const char **filename, struct config_t **config, bool *imported); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_config_read_permission_blacklist_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_login_config_read_permission_blacklist_pre[hIndex].func; + retVal___ = preHookFunc(&filename, &config, &imported); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.login.config_read_permission_blacklist(filename, config, imported); + } + if (HPMHooks.count.HP_login_config_read_permission_blacklist_post > 0) { + bool (*postHookFunc) (bool retVal___, const char *filename, struct config_t *config, bool imported); + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_config_read_permission_blacklist_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_login_config_read_permission_blacklist_post[hIndex].func; + retVal___ = postHookFunc(retVal___, filename, config, imported); + } + } + return retVal___; +} +bool HP_login_config_read_users(const char *filename, struct config_t *config, bool imported) { + int hIndex = 0; + bool retVal___ = false; + if (HPMHooks.count.HP_login_config_read_users_pre > 0) { + bool (*preHookFunc) (const char **filename, struct config_t **config, bool *imported); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_config_read_users_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_login_config_read_users_pre[hIndex].func; + retVal___ = preHookFunc(&filename, &config, &imported); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.login.config_read_users(filename, config, imported); + } + if (HPMHooks.count.HP_login_config_read_users_post > 0) { + bool (*postHookFunc) (bool retVal___, const char *filename, struct config_t *config, bool imported); + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_config_read_users_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_login_config_read_users_post[hIndex].func; + retVal___ = postHookFunc(retVal___, filename, config, imported); + } + } + return retVal___; +} +void HP_login_clear_dnsbl_servers(void) { + int hIndex = 0; + if (HPMHooks.count.HP_login_clear_dnsbl_servers_pre > 0) { + void (*preHookFunc) (void); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_clear_dnsbl_servers_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_login_clear_dnsbl_servers_pre[hIndex].func; + preHookFunc(); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.login.clear_dnsbl_servers(); + } + if (HPMHooks.count.HP_login_clear_dnsbl_servers_post > 0) { + void (*postHookFunc) (void); + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_clear_dnsbl_servers_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_login_clear_dnsbl_servers_post[hIndex].func; + postHookFunc(); + } + } + return; +} +void HP_login_config_set_dnsbl_servers(struct config_setting_t *setting) { + int hIndex = 0; + if (HPMHooks.count.HP_login_config_set_dnsbl_servers_pre > 0) { + void (*preHookFunc) (struct config_setting_t **setting); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_config_set_dnsbl_servers_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_login_config_set_dnsbl_servers_pre[hIndex].func; + preHookFunc(&setting); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.login.config_set_dnsbl_servers(setting); + } + if (HPMHooks.count.HP_login_config_set_dnsbl_servers_post > 0) { + void (*postHookFunc) (struct config_setting_t *setting); + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_config_set_dnsbl_servers_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_login_config_set_dnsbl_servers_post[hIndex].func; + postHookFunc(setting); + } + } + return; +} +void HP_login_clear_client_hash_nodes(void) { + int hIndex = 0; + if (HPMHooks.count.HP_login_clear_client_hash_nodes_pre > 0) { + void (*preHookFunc) (void); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_clear_client_hash_nodes_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_login_clear_client_hash_nodes_pre[hIndex].func; + preHookFunc(); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.login.clear_client_hash_nodes(); + } + if (HPMHooks.count.HP_login_clear_client_hash_nodes_post > 0) { + void (*postHookFunc) (void); + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_clear_client_hash_nodes_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_login_clear_client_hash_nodes_post[hIndex].func; + postHookFunc(); + } + } + return; +} +void HP_login_config_set_md5hash(struct config_setting_t *setting) { + int hIndex = 0; + if (HPMHooks.count.HP_login_config_set_md5hash_pre > 0) { + void (*preHookFunc) (struct config_setting_t **setting); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_config_set_md5hash_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_login_config_set_md5hash_pre[hIndex].func; + preHookFunc(&setting); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.login.config_set_md5hash(setting); + } + if (HPMHooks.count.HP_login_config_set_md5hash_post > 0) { + void (*postHookFunc) (struct config_setting_t *setting); + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_config_set_md5hash_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_login_config_set_md5hash_post[hIndex].func; + postHookFunc(setting); + } + } + return; +} +uint16 HP_login_convert_users_to_colors(uint16 users) { + int hIndex = 0; + uint16 retVal___ = 0; + if (HPMHooks.count.HP_login_convert_users_to_colors_pre > 0) { + uint16 (*preHookFunc) (uint16 *users); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_convert_users_to_colors_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_login_convert_users_to_colors_pre[hIndex].func; + retVal___ = preHookFunc(&users); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.login.convert_users_to_colors(users); + } + if (HPMHooks.count.HP_login_convert_users_to_colors_post > 0) { + uint16 (*postHookFunc) (uint16 retVal___, uint16 users); + for (hIndex = 0; hIndex < HPMHooks.count.HP_login_convert_users_to_colors_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_login_convert_users_to_colors_post[hIndex].func; + retVal___ = postHookFunc(retVal___, users); + } + } + return retVal___; +} /* md5_interface */ void HP_md5_string(const char *string, char *output) { int hIndex = 0; diff --git a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc index e2494067c..4bdc167f2 100644 --- a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc +++ b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc @@ -1896,6 +1896,8 @@ struct { struct HPMHookPoint *HP_clif_rodex_send_maillist_post; struct HPMHookPoint *HP_clif_rodex_send_refresh_pre; struct HPMHookPoint *HP_clif_rodex_send_refresh_post; + struct HPMHookPoint *HP_clif_rodex_send_mails_all_pre; + struct HPMHookPoint *HP_clif_rodex_send_mails_all_post; struct HPMHookPoint *HP_clif_pRodexReadMail_pre; struct HPMHookPoint *HP_clif_pRodexReadMail_post; struct HPMHookPoint *HP_clif_rodex_read_mail_pre; @@ -8093,6 +8095,8 @@ struct { int HP_clif_rodex_send_maillist_post; int HP_clif_rodex_send_refresh_pre; int HP_clif_rodex_send_refresh_post; + int HP_clif_rodex_send_mails_all_pre; + int HP_clif_rodex_send_mails_all_post; int HP_clif_pRodexReadMail_pre; int HP_clif_pRodexReadMail_post; int HP_clif_rodex_read_mail_pre; diff --git a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc index b094fa841..34b79bff8 100644 --- a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc +++ b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc @@ -970,6 +970,7 @@ struct HookingPointData HookingPoints[] = { { HP_POP(clif->rodex_send_mail_result, HP_clif_rodex_send_mail_result) }, { HP_POP(clif->rodex_send_maillist, HP_clif_rodex_send_maillist) }, { HP_POP(clif->rodex_send_refresh, HP_clif_rodex_send_refresh) }, + { HP_POP(clif->rodex_send_mails_all, HP_clif_rodex_send_mails_all) }, { HP_POP(clif->pRodexReadMail, HP_clif_pRodexReadMail) }, { HP_POP(clif->rodex_read_mail, HP_clif_rodex_read_mail) }, { HP_POP(clif->pRodexNextMaillist, HP_clif_pRodexNextMaillist) }, diff --git a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc index 786536aea..d0d062f4e 100644 --- a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc +++ b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc @@ -10602,10 +10602,10 @@ void HP_clif_equpcheckbox(struct map_session_data *sd) { } return; } -void HP_clif_displayexp(struct map_session_data *sd, unsigned int exp, char type, bool is_quest) { +void HP_clif_displayexp(struct map_session_data *sd, uint64 exp, char type, bool is_quest) { int hIndex = 0; if (HPMHooks.count.HP_clif_displayexp_pre > 0) { - void (*preHookFunc) (struct map_session_data **sd, unsigned int *exp, char *type, bool *is_quest); + void (*preHookFunc) (struct map_session_data **sd, uint64 *exp, char *type, bool *is_quest); *HPMforce_return = false; for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_displayexp_pre; hIndex++) { preHookFunc = HPMHooks.list.HP_clif_displayexp_pre[hIndex].func; @@ -10620,7 +10620,7 @@ void HP_clif_displayexp(struct map_session_data *sd, unsigned int exp, char type HPMHooks.source.clif.displayexp(sd, exp, type, is_quest); } if (HPMHooks.count.HP_clif_displayexp_post > 0) { - void (*postHookFunc) (struct map_session_data *sd, unsigned int exp, char type, bool is_quest); + void (*postHookFunc) (struct map_session_data *sd, uint64 exp, char type, bool is_quest); for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_displayexp_post; hIndex++) { postHookFunc = HPMHooks.list.HP_clif_displayexp_post[hIndex].func; postHookFunc(sd, exp, type, is_quest); @@ -24671,6 +24671,32 @@ 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) { + int hIndex = 0; + if (HPMHooks.count.HP_clif_rodex_send_mails_all_pre > 0) { + void (*preHookFunc) (int *fd, struct map_session_data **sd); + *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); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clif.rodex_send_mails_all(fd, sd); + } + if (HPMHooks.count.HP_clif_rodex_send_mails_all_post > 0) { + void (*postHookFunc) (int fd, struct map_session_data *sd); + 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); + } + } + return; +} void HP_clif_pRodexReadMail(int fd, struct map_session_data *sd) { int hIndex = 0; if (HPMHooks.count.HP_clif_pRodexReadMail_pre > 0) { @@ -27645,11 +27671,11 @@ int HP_guild_getposition(struct guild *g, struct map_session_data *sd) { } return retVal___; } -unsigned int HP_guild_payexp(struct map_session_data *sd, unsigned int exp) { +uint64 HP_guild_payexp(struct map_session_data *sd, uint64 exp) { int hIndex = 0; - unsigned int retVal___ = 0; + uint64 retVal___ = 0; if (HPMHooks.count.HP_guild_payexp_pre > 0) { - unsigned int (*preHookFunc) (struct map_session_data **sd, unsigned int *exp); + uint64 (*preHookFunc) (struct map_session_data **sd, uint64 *exp); *HPMforce_return = false; for (hIndex = 0; hIndex < HPMHooks.count.HP_guild_payexp_pre; hIndex++) { preHookFunc = HPMHooks.list.HP_guild_payexp_pre[hIndex].func; @@ -27664,7 +27690,7 @@ unsigned int HP_guild_payexp(struct map_session_data *sd, unsigned int exp) { retVal___ = HPMHooks.source.guild.payexp(sd, exp); } if (HPMHooks.count.HP_guild_payexp_post > 0) { - unsigned int (*postHookFunc) (unsigned int retVal___, struct map_session_data *sd, unsigned int exp); + uint64 (*postHookFunc) (uint64 retVal___, struct map_session_data *sd, uint64 exp); for (hIndex = 0; hIndex < HPMHooks.count.HP_guild_payexp_post; hIndex++) { postHookFunc = HPMHooks.list.HP_guild_payexp_post[hIndex].func; retVal___ = postHookFunc(retVal___, sd, exp); @@ -55930,11 +55956,11 @@ int HP_pc_checkjoblevelup(struct map_session_data *sd) { } return retVal___; } -bool HP_pc_gainexp(struct map_session_data *sd, struct block_list *src, unsigned int base_exp, unsigned int job_exp, bool is_quest) { +bool HP_pc_gainexp(struct map_session_data *sd, struct block_list *src, uint64 base_exp, uint64 job_exp, bool is_quest) { int hIndex = 0; bool retVal___ = false; if (HPMHooks.count.HP_pc_gainexp_pre > 0) { - bool (*preHookFunc) (struct map_session_data **sd, struct block_list **src, unsigned int *base_exp, unsigned int *job_exp, bool *is_quest); + bool (*preHookFunc) (struct map_session_data **sd, struct block_list **src, uint64 *base_exp, uint64 *job_exp, bool *is_quest); *HPMforce_return = false; for (hIndex = 0; hIndex < HPMHooks.count.HP_pc_gainexp_pre; hIndex++) { preHookFunc = HPMHooks.list.HP_pc_gainexp_pre[hIndex].func; @@ -55949,7 +55975,7 @@ bool HP_pc_gainexp(struct map_session_data *sd, struct block_list *src, unsigned retVal___ = HPMHooks.source.pc.gainexp(sd, src, base_exp, job_exp, is_quest); } if (HPMHooks.count.HP_pc_gainexp_post > 0) { - bool (*postHookFunc) (bool retVal___, struct map_session_data *sd, struct block_list *src, unsigned int base_exp, unsigned int job_exp, bool is_quest); + bool (*postHookFunc) (bool retVal___, struct map_session_data *sd, struct block_list *src, uint64 base_exp, uint64 job_exp, bool is_quest); for (hIndex = 0; hIndex < HPMHooks.count.HP_pc_gainexp_post; hIndex++) { postHookFunc = HPMHooks.list.HP_pc_gainexp_post[hIndex].func; retVal___ = postHookFunc(retVal___, sd, src, base_exp, job_exp, is_quest); @@ -55957,11 +55983,11 @@ bool HP_pc_gainexp(struct map_session_data *sd, struct block_list *src, unsigned } return retVal___; } -unsigned int HP_pc_nextbaseexp(const struct map_session_data *sd) { +uint64 HP_pc_nextbaseexp(const struct map_session_data *sd) { int hIndex = 0; - unsigned int retVal___ = 0; + uint64 retVal___ = 0; if (HPMHooks.count.HP_pc_nextbaseexp_pre > 0) { - unsigned int (*preHookFunc) (const struct map_session_data **sd); + uint64 (*preHookFunc) (const struct map_session_data **sd); *HPMforce_return = false; for (hIndex = 0; hIndex < HPMHooks.count.HP_pc_nextbaseexp_pre; hIndex++) { preHookFunc = HPMHooks.list.HP_pc_nextbaseexp_pre[hIndex].func; @@ -55976,7 +56002,7 @@ unsigned int HP_pc_nextbaseexp(const struct map_session_data *sd) { retVal___ = HPMHooks.source.pc.nextbaseexp(sd); } if (HPMHooks.count.HP_pc_nextbaseexp_post > 0) { - unsigned int (*postHookFunc) (unsigned int retVal___, const struct map_session_data *sd); + uint64 (*postHookFunc) (uint64 retVal___, const struct map_session_data *sd); for (hIndex = 0; hIndex < HPMHooks.count.HP_pc_nextbaseexp_post; hIndex++) { postHookFunc = HPMHooks.list.HP_pc_nextbaseexp_post[hIndex].func; retVal___ = postHookFunc(retVal___, sd); @@ -55984,11 +56010,11 @@ unsigned int HP_pc_nextbaseexp(const struct map_session_data *sd) { } return retVal___; } -unsigned int HP_pc_thisbaseexp(const struct map_session_data *sd) { +uint64 HP_pc_thisbaseexp(const struct map_session_data *sd) { int hIndex = 0; - unsigned int retVal___ = 0; + uint64 retVal___ = 0; if (HPMHooks.count.HP_pc_thisbaseexp_pre > 0) { - unsigned int (*preHookFunc) (const struct map_session_data **sd); + uint64 (*preHookFunc) (const struct map_session_data **sd); *HPMforce_return = false; for (hIndex = 0; hIndex < HPMHooks.count.HP_pc_thisbaseexp_pre; hIndex++) { preHookFunc = HPMHooks.list.HP_pc_thisbaseexp_pre[hIndex].func; @@ -56003,7 +56029,7 @@ unsigned int HP_pc_thisbaseexp(const struct map_session_data *sd) { retVal___ = HPMHooks.source.pc.thisbaseexp(sd); } if (HPMHooks.count.HP_pc_thisbaseexp_post > 0) { - unsigned int (*postHookFunc) (unsigned int retVal___, const struct map_session_data *sd); + uint64 (*postHookFunc) (uint64 retVal___, const struct map_session_data *sd); for (hIndex = 0; hIndex < HPMHooks.count.HP_pc_thisbaseexp_post; hIndex++) { postHookFunc = HPMHooks.list.HP_pc_thisbaseexp_post[hIndex].func; retVal___ = postHookFunc(retVal___, sd); @@ -56011,11 +56037,11 @@ unsigned int HP_pc_thisbaseexp(const struct map_session_data *sd) { } return retVal___; } -unsigned int HP_pc_nextjobexp(const struct map_session_data *sd) { +uint64 HP_pc_nextjobexp(const struct map_session_data *sd) { int hIndex = 0; - unsigned int retVal___ = 0; + uint64 retVal___ = 0; if (HPMHooks.count.HP_pc_nextjobexp_pre > 0) { - unsigned int (*preHookFunc) (const struct map_session_data **sd); + uint64 (*preHookFunc) (const struct map_session_data **sd); *HPMforce_return = false; for (hIndex = 0; hIndex < HPMHooks.count.HP_pc_nextjobexp_pre; hIndex++) { preHookFunc = HPMHooks.list.HP_pc_nextjobexp_pre[hIndex].func; @@ -56030,7 +56056,7 @@ unsigned int HP_pc_nextjobexp(const struct map_session_data *sd) { retVal___ = HPMHooks.source.pc.nextjobexp(sd); } if (HPMHooks.count.HP_pc_nextjobexp_post > 0) { - unsigned int (*postHookFunc) (unsigned int retVal___, const struct map_session_data *sd); + uint64 (*postHookFunc) (uint64 retVal___, const struct map_session_data *sd); for (hIndex = 0; hIndex < HPMHooks.count.HP_pc_nextjobexp_post; hIndex++) { postHookFunc = HPMHooks.list.HP_pc_nextjobexp_post[hIndex].func; retVal___ = postHookFunc(retVal___, sd); @@ -56038,11 +56064,11 @@ unsigned int HP_pc_nextjobexp(const struct map_session_data *sd) { } return retVal___; } -unsigned int HP_pc_thisjobexp(const struct map_session_data *sd) { +uint64 HP_pc_thisjobexp(const struct map_session_data *sd) { int hIndex = 0; - unsigned int retVal___ = 0; + uint64 retVal___ = 0; if (HPMHooks.count.HP_pc_thisjobexp_pre > 0) { - unsigned int (*preHookFunc) (const struct map_session_data **sd); + uint64 (*preHookFunc) (const struct map_session_data **sd); *HPMforce_return = false; for (hIndex = 0; hIndex < HPMHooks.count.HP_pc_thisjobexp_pre; hIndex++) { preHookFunc = HPMHooks.list.HP_pc_thisjobexp_pre[hIndex].func; @@ -56057,7 +56083,7 @@ unsigned int HP_pc_thisjobexp(const struct map_session_data *sd) { retVal___ = HPMHooks.source.pc.thisjobexp(sd); } if (HPMHooks.count.HP_pc_thisjobexp_post > 0) { - unsigned int (*postHookFunc) (unsigned int retVal___, const struct map_session_data *sd); + uint64 (*postHookFunc) (uint64 retVal___, const struct map_session_data *sd); for (hIndex = 0; hIndex < HPMHooks.count.HP_pc_thisjobexp_post; hIndex++) { postHookFunc = HPMHooks.list.HP_pc_thisjobexp_post[hIndex].func; retVal___ = postHookFunc(retVal___, sd); @@ -58826,10 +58852,10 @@ int HP_pc_bonus_item_drop(struct s_add_drop *drop, const short max, short id, sh } return retVal___; } -void HP_pc_calcexp(struct map_session_data *sd, unsigned int *base_exp, unsigned int *job_exp, struct block_list *src) { +void HP_pc_calcexp(struct map_session_data *sd, uint64 *base_exp, uint64 *job_exp, struct block_list *src) { int hIndex = 0; if (HPMHooks.count.HP_pc_calcexp_pre > 0) { - void (*preHookFunc) (struct map_session_data **sd, unsigned int **base_exp, unsigned int **job_exp, struct block_list **src); + void (*preHookFunc) (struct map_session_data **sd, uint64 **base_exp, uint64 **job_exp, struct block_list **src); *HPMforce_return = false; for (hIndex = 0; hIndex < HPMHooks.count.HP_pc_calcexp_pre; hIndex++) { preHookFunc = HPMHooks.list.HP_pc_calcexp_pre[hIndex].func; @@ -58844,7 +58870,7 @@ void HP_pc_calcexp(struct map_session_data *sd, unsigned int *base_exp, unsigned HPMHooks.source.pc.calcexp(sd, base_exp, job_exp, src); } if (HPMHooks.count.HP_pc_calcexp_post > 0) { - void (*postHookFunc) (struct map_session_data *sd, unsigned int *base_exp, unsigned int *job_exp, struct block_list *src); + void (*postHookFunc) (struct map_session_data *sd, uint64 *base_exp, uint64 *job_exp, struct block_list *src); for (hIndex = 0; hIndex < HPMHooks.count.HP_pc_calcexp_post; hIndex++) { postHookFunc = HPMHooks.list.HP_pc_calcexp_post[hIndex].func; postHookFunc(sd, base_exp, job_exp, src); @@ -61893,14 +61919,14 @@ bool HP_rodex_isenabled(void) { } return retVal___; } -void HP_rodex_open(struct map_session_data *sd, int8 open_type) { +void HP_rodex_open(struct map_session_data *sd, int8 open_type, int64 first_mail_id) { int hIndex = 0; if (HPMHooks.count.HP_rodex_open_pre > 0) { - void (*preHookFunc) (struct map_session_data **sd, int8 *open_type); + void (*preHookFunc) (struct map_session_data **sd, int8 *open_type, int64 *first_mail_id); *HPMforce_return = false; for (hIndex = 0; hIndex < HPMHooks.count.HP_rodex_open_pre; hIndex++) { preHookFunc = HPMHooks.list.HP_rodex_open_pre[hIndex].func; - preHookFunc(&sd, &open_type); + preHookFunc(&sd, &open_type, &first_mail_id); } if (*HPMforce_return) { *HPMforce_return = false; @@ -61908,13 +61934,13 @@ void HP_rodex_open(struct map_session_data *sd, int8 open_type) { } } { - HPMHooks.source.rodex.open(sd, open_type); + HPMHooks.source.rodex.open(sd, open_type, first_mail_id); } if (HPMHooks.count.HP_rodex_open_post > 0) { - void (*postHookFunc) (struct map_session_data *sd, int8 open_type); + void (*postHookFunc) (struct map_session_data *sd, int8 open_type, int64 first_mail_id); for (hIndex = 0; hIndex < HPMHooks.count.HP_rodex_open_post; hIndex++) { postHookFunc = HPMHooks.list.HP_rodex_open_post[hIndex].func; - postHookFunc(sd, open_type); + postHookFunc(sd, open_type, first_mail_id); } } return; |