From f7dbe79c3435897b691fe558579531a59a0eec57 Mon Sep 17 00:00:00 2001 From: lighta Date: Sat, 10 Dec 2022 22:16:52 +0100 Subject: [PATCH 1/8] Fix wedding skill checks (#5579) * Fixes #5576 and fixes #7475. * Fix WE_CALLPARTNER, WE_CALLPARENT and WE_CALLBABY fallthrough check. * Adds usage of packet struct. * Add autotrade check for WE_CALLPARTNER. Co-authored-by: Lemongrass3110 Co-authored-by: aleos --- src/map/clif.cpp | 23 ++++++++++------------- src/map/clif.hpp | 2 +- src/map/packets.hpp | 6 ++++++ src/map/skill.cpp | 22 +++++++++++++++++----- 4 files changed, 34 insertions(+), 19 deletions(-) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 2fa94d52cc..ff51b80536 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -9378,26 +9378,23 @@ void clif_wedding_effect(struct block_list *bl) /// Notifies the client of the name of the partner character (ZC_COUPLENAME). /// 01e6 .24B -void clif_callpartner(struct map_session_data *sd) +void clif_callpartner(struct map_session_data& sd) { - unsigned char buf[26]; + PACKET_ZC_COUPLENAME p = { 0 }; - nullpo_retv(sd); + p.packetType = HEADER_ZC_COUPLENAME; - WBUFW(buf,0) = 0x1e6; - - if( sd->status.partner_id ) { - const char *p = map_charid2nick(sd->status.partner_id); - struct map_session_data *p_sd = pc_get_partner(sd); - if( p != NULL && p_sd != NULL && !p_sd->state.autotrade ) - safestrncpy(WBUFCP(buf,2), p, NAME_LENGTH); + if( sd.status.partner_id ) { + struct map_session_data *p_sd = pc_get_partner(&sd); + if (p_sd != nullptr && !p_sd->state.autotrade) + safestrncpy(p.name, p_sd->status.name, NAME_LENGTH); else - WBUFB(buf,2) = 0; + p.name[0] = 0; } else {// Send zero-length name if no partner, to initialize the client buffer. - WBUFB(buf,2) = 0; + p.name[0] = 0; } - clif_send(buf, packet_len(0x1e6), &sd->bl, AREA); + clif_send(&p, sizeof(p), &sd.bl, AREA); } diff --git a/src/map/clif.hpp b/src/map/clif.hpp index df768c92f2..21557da5ba 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -687,7 +687,7 @@ void clif_emotion(struct block_list *bl,int type); void clif_talkiebox(struct block_list* bl, const char* talkie); void clif_wedding_effect(struct block_list *bl); void clif_divorced(struct map_session_data* sd, const char* name); -void clif_callpartner(struct map_session_data *sd); +void clif_callpartner(struct map_session_data& sd); void clif_playBGM( struct map_session_data& sd, const char* name ); void clif_soundeffect( struct block_list& bl, const char* name, int type, enum send_target target ); void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type, int target_id, t_tick tick); diff --git a/src/map/packets.hpp b/src/map/packets.hpp index d1ecb6d2a6..312a99c466 100644 --- a/src/map/packets.hpp +++ b/src/map/packets.hpp @@ -413,6 +413,11 @@ struct PACKET_ZC_ACK_ADD_EXCHANGE_ITEM { uint8 result; } __attribute__((packed)); +struct PACKET_ZC_COUPLENAME { + int16 packetType; + char name[NAME_LENGTH]; +} __attribute__((packed)); + // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute #if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 ) #pragma pack( pop ) @@ -439,6 +444,7 @@ DEFINE_PACKET_HEADER(ZC_BROADCAST2, 0x1c3) #else DEFINE_PACKET_HEADER(ZC_CHANGE_GUILD, 0x1b4) #endif +DEFINE_PACKET_HEADER(ZC_COUPLENAME, 0x1e6); DEFINE_PACKET_HEADER(ZC_FRIENDS_LIST, 0x201) DEFINE_PACKET_HEADER(ZC_NOTIFY_WEAPONITEMLIST, 0x221) DEFINE_PACKET_HEADER(ZC_ACK_WEAPONREFINE, 0x223) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index dfb4e1ab33..0de95f6ecf 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -12799,25 +12799,37 @@ TIMER_FUNC(skill_castend_id){ //These should become skill_castend_pos switch (ud->skill_id) { case WE_CALLPARTNER: - if (sd) - clif_callpartner(sd); + if (sd) { + map_session_data *p_sd = pc_get_partner(sd); + + if (p_sd && p_sd->state.autotrade) { + fail = true; + break; + } else + clif_callpartner(*sd); + } + break; case WE_CALLPARENT: if (sd) { - struct map_session_data *f_sd = pc_get_father(sd); - struct map_session_data *m_sd = pc_get_mother(sd); + map_session_data *f_sd = pc_get_father(sd); + map_session_data *m_sd = pc_get_mother(sd); + if ((f_sd && f_sd->state.autotrade) || (m_sd && m_sd->state.autotrade)) { fail = true; break; } } + break; case WE_CALLBABY: if (sd) { - struct map_session_data *c_sd = pc_get_child(sd); + map_session_data *c_sd = pc_get_child(sd); + if (c_sd && c_sd->state.autotrade) { fail = true; break; } } + break; case AM_RESURRECTHOMUN: case PF_SPIDERWEB: { From 1f1b5fe4a038a404bd7cc351955a9dd0e86e8497 Mon Sep 17 00:00:00 2001 From: Singe Horizontal <62802903+Singe-Horizontal@users.noreply.github.com> Date: Sun, 11 Dec 2022 05:06:07 +0100 Subject: [PATCH 2/8] Restores Dispell removing NPC_AGIUP (#7479) Fixes #7478 --- db/pre-re/status.yml | 1 - db/re/status.yml | 1 - 2 files changed, 2 deletions(-) diff --git a/db/pre-re/status.yml b/db/pre-re/status.yml index f58e6ebd7f..68f0a1fd35 100644 --- a/db/pre-re/status.yml +++ b/db/pre-re/status.yml @@ -1987,7 +1987,6 @@ Body: Flags: NoRemoveOnDead: true NoClearbuff: true - NoDispell: true NoBanishingBuster: true NoClearance: true - Status: Incmhprate diff --git a/db/re/status.yml b/db/re/status.yml index 469d2d2054..1574257e8f 100644 --- a/db/re/status.yml +++ b/db/re/status.yml @@ -2101,7 +2101,6 @@ Body: Flags: NoRemoveOnDead: true NoClearbuff: true - NoDispell: true NoBanishingBuster: true NoClearance: true - Status: Incmhprate From a1798f7094d19987fccb922eb40f3851fbf2770b Mon Sep 17 00:00:00 2001 From: Takius <65616872+Takiusu@users.noreply.github.com> Date: Mon, 12 Dec 2022 20:53:40 +0500 Subject: [PATCH 3/8] Fix skill SO_VARETYR_SPEAR (#7425) * Corrects the hit type resulting in a variance of damage. --- db/re/skill_db.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index fdefb50c4c..e26aa6c792 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -27608,8 +27608,8 @@ Body: DamageFlags: Splash: true Range: 9 - Hit: Single - HitCount: -3 + Hit: Multi_Hit + HitCount: 3 Element: Wind SplashArea: - Level: 1 From 3545a9c82f3179da85dd3e83991d6f9b54a414e1 Mon Sep 17 00:00:00 2001 From: Aleos Date: Mon, 12 Dec 2022 15:09:24 -0500 Subject: [PATCH 4/8] Minor corrections to SQL readme (#7484) * Cleans up a bit of the SQL readme so it's less confusing. Thanks to @emmamarshall451! --- sql-files/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sql-files/README.md b/sql-files/README.md index ad61e28179..5b36f09717 100644 --- a/sql-files/README.md +++ b/sql-files/README.md @@ -6,19 +6,19 @@ The files in this directory are basic SQL table building scripts. The contained ### New Install --- -For a new install, the following needs to be imported into the 'ragnarok' schema: +For a new install, the following needs to be imported into the main schema: Note: The schema name is defined in `conf/inter_athena.conf::map_server_db`. * main.sql - Contains tables for normal server usage. * web.sql - Contains tables for the web service * roulette_default_data.sql - Contains data for the client's roulette game. -For a new install, the following needs to be imported into the 'log' schema: +For a new install, the following can be imported into the main schema but is highly suggested to be imported into a separate schema for logs: Note: The schema name is defined in `conf/inter_athena.conf::log_db_db`. * logs.sql - Contains tables for logging of server events. -If your server is setup to read SQL database data, import the following: +If your server is setup to read SQL database data, import the following into the main schema: Note: If `conf/inter_athena.conf::use_sql_db` is set to yes continue with these imports else these can be skipped. Not all files have to be imported, only the ones that apply to the same mode as the server being ran. * item_cash_db.sql - Used for client's cash shop. @@ -44,8 +44,8 @@ Note: If `conf/inter_athena.conf::use_sql_db` is set to yes continue with these ### Updates --- -Over the course of time new features and optimizations will take place. This may require SQL changes to happen. In the `upgrades` folder will be upgrade files with an attached date. -These imports only have to executed if an update has occurred after the initial installation. Many times a SQL error will be displayed on the server console stating the format differs from what is required. +Over the course of time new features and optimizations will take place. This may require SQL changes to happen. In the `upgrades` folder will be SQL files with an attached date. +These only have to executed one time if an update has occurred after the initial installation. It's possible to see when an update may be required when a SQL error will be displayed on the server console stating the format differs from what is required. ### Compatibility --- @@ -76,4 +76,4 @@ To run these queries the user requires the [FILE](https://dev.mysql.com/doc/refm ### Notes --- -The web-server must be able to read the `login` and `guild` tables from the `login-server` and `char-server`, respectively. \ No newline at end of file +The `web-server` must be able to read the `login` and `guild` tables from the `login-server` and `char-server`, respectively. From 5a533a7a12efc349c53c74e3376a2b6a3e4cb151 Mon Sep 17 00:00:00 2001 From: Singe Horizontal <62802903+Singe-Horizontal@users.noreply.github.com> Date: Tue, 13 Dec 2022 14:23:00 +0100 Subject: [PATCH 5/8] Fixes drop rate for size-moded mobs (#7482) * Fixes #7481. * Restores correct drop rate for spawned size-modified monsters so that they read the current memory instead of the database value if changed. --- src/map/mob.cpp | 11 ++++++----- src/map/mob.hpp | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/map/mob.cpp b/src/map/mob.cpp index 5d59817a8b..735510c1e6 100644 --- a/src/map/mob.cpp +++ b/src/map/mob.cpp @@ -2456,14 +2456,15 @@ void mob_damage(struct mob_data *md, struct block_list *src, int damage) * @param drop_modifier: RENEWAL_DROP level modifier * @return Modified drop rate */ -int mob_getdroprate(struct block_list *src, std::shared_ptr mob, int base_rate, int drop_modifier) +int mob_getdroprate(struct block_list *src, std::shared_ptr mob, int base_rate, int drop_modifier, mob_data* md) { int drop_rate = base_rate; - if (battle_config.mob_size_influence) { // Change drops depending on monsters size [Valaris] - if (mob->status.size == SZ_MEDIUM && drop_rate >= 2) + if (md && battle_config.mob_size_influence) { // Change drops depending on monsters size [Valaris] + unsigned int mob_size = md->special_state.size; + if (mob_size == SZ_MEDIUM && drop_rate >= 2) drop_rate /= 2; // SZ_MEDIUM actually is small size modification... this is not a bug! - else if (mob->status.size == SZ_BIG) + else if (mob_size == SZ_BIG) drop_rate *= 2; } @@ -2809,7 +2810,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) if ( it == nullptr ) continue; - drop_rate = mob_getdroprate(src, md->db, md->db->dropitem[i].rate, drop_modifier); + drop_rate = mob_getdroprate(src, md->db, md->db->dropitem[i].rate, drop_modifier, md); // attempt to drop the item if (rnd() % 10000 >= drop_rate) diff --git a/src/map/mob.hpp b/src/map/mob.hpp index 865f6d9665..6c280c6d3d 100644 --- a/src/map/mob.hpp +++ b/src/map/mob.hpp @@ -547,7 +547,7 @@ void mob_add_spawn(uint16 mob_id, const struct spawn_info& new_spawn); const std::vector mob_get_spawns(uint16 mob_id); bool mob_has_spawn(uint16 mob_id); -int mob_getdroprate(struct block_list *src, std::shared_ptr mob, int base_rate, int drop_modifier); +int mob_getdroprate(struct block_list *src, std::shared_ptr mob, int base_rate, int drop_modifier, mob_data* md = nullptr); // MvP Tomb System int mvptomb_setdelayspawn(struct npc_data *nd); From ee2dcf816ef6960c94785eff36326cfe9d1b59b9 Mon Sep 17 00:00:00 2001 From: Aleos Date: Tue, 13 Dec 2022 15:44:42 -0500 Subject: [PATCH 6/8] New macro detection features (#7359) * Adds battle config macro_detection_punishment to ban or jail characters. * Adds battle config macro_detection_punishment_time to adjust the duration of ban/jail for players who fail the captcha challenges. * Adds script command macro_detector which invokes the captcha challenge. * General cleanups to the jail functions to remove duplicate code. * General cleanups to the macro punishment calls to remove duplicate code. * Ending SC_JAILED will now properly remove the jail status rather than trying to reset the timer to 1 second resolving any possibility of players getting stuck. Thanks to @Lemongrass3110! --- conf/battle/client.conf | 11 +++++ doc/script_commands.txt | 22 +++++++++ src/map/atcommand.cpp | 38 +++------------ src/map/battle.cpp | 2 + src/map/battle.hpp | 2 + src/map/clif.cpp | 2 +- src/map/pc.cpp | 102 +++++++++++++++++++++++++++++++++------- src/map/pc.hpp | 5 +- src/map/script.cpp | 21 +++++++++ src/map/status.cpp | 4 -- 10 files changed, 154 insertions(+), 55 deletions(-) diff --git a/conf/battle/client.conf b/conf/battle/client.conf index 5381b0489e..d07ea8b65b 100644 --- a/conf/battle/client.conf +++ b/conf/battle/client.conf @@ -158,3 +158,14 @@ macro_detection_retry: 3 // Amount of time in milliseconds before the macro detection will fail and the user will be banned. // Official: 60000 macro_detection_timeout: 60000 + +// Macro Detector punishment type +// 0 - Ban +// 1 - Jail +// Official: 0 +macro_detection_punishment: 0 + +// Macro Detector punishment duration +// Amount of time in minutes that the punishment type is active for. Use 0 for infinite. +// Official: 0 +macro_detection_punishment_time: 0 diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 82e4a74b16..a6d48a2c0b 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -6579,6 +6579,28 @@ Examples: --------------------------------------- +macro_detector({}); +macro_detector({""}); + +This command will display the captcha UI challenge onto the invoking character or the given /. + +Example: + // Use 'getareaunits' to gather an area of players to test. + // Build an int array of the account IDs. + .@num = getareaunits(BL_PC, "prontera", 150, 150, 160, 160, .@array[0]); + + mes "The number of Players in Prontera in between 150x150 and 160x160 is " + .@num + " ."; + mes "Players to challenge:"; + freeloop(1); // If the list is too big + for(.@i = 0; .@i < getarraysize(.@array); .@i++) { + mes (.@i + 1) + " " + convertpcinfo(.@array[.@i], CPC_NAME); + macro_detector .@array[.@i]; + } + freeloop(0); + end; + +--------------------------------------- + ================================== |5.- Mob / NPC -related commands.| ================================== diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp index 4675bb9ed1..e24bd4ef62 100644 --- a/src/map/atcommand.cpp +++ b/src/map/atcommand.cpp @@ -5218,8 +5218,7 @@ ACMD_FUNC(servertime) ACMD_FUNC(jail) { struct map_session_data *pl_sd; - int x, y; - unsigned short m_index; + nullpo_retr(-1, sd); memset(atcmd_player_name, '\0', sizeof(atcmd_player_name)); @@ -5244,21 +5243,7 @@ ACMD_FUNC(jail) return -1; } - switch(rnd() % 2) { //Jail Locations - case 0: - m_index = mapindex_name2id(MAP_JAIL); - x = 24; - y = 75; - break; - default: - m_index = mapindex_name2id(MAP_JAIL); - x = 49; - y = 75; - break; - } - - //Duration of INT_MAX to specify infinity. - sc_start4(NULL,&pl_sd->bl,SC_JAILED,100,INT_MAX,m_index,x,y,1000); + pc_jail(*pl_sd); clif_displaymessage(pl_sd->fd, msg_txt(sd,117)); // GM has send you in jails. clif_displaymessage(fd, msg_txt(sd,118)); // Player warped in jails. return 0; @@ -5296,7 +5281,7 @@ ACMD_FUNC(unjail) } //Reset jail time to 1 sec. - sc_start(NULL,&pl_sd->bl,SC_JAILED,100,1,1000); + pc_jail(*pl_sd, 0); clif_displaymessage(pl_sd->fd, msg_txt(sd,120)); // A GM has discharged you from jail. clif_displaymessage(fd, msg_txt(sd,121)); // Player unjailed. return 0; @@ -5305,8 +5290,8 @@ ACMD_FUNC(unjail) ACMD_FUNC(jailfor) { struct map_session_data *pl_sd = NULL; char * modif_p; - int jailtime = 0,x,y; - short m_index = 0; + int jailtime = 0; + nullpo_retr(-1, sd); memset(atcmd_output, '\0', sizeof(atcmd_output)); @@ -5363,19 +5348,8 @@ ACMD_FUNC(jailfor) { return -1; } - // Jail locations, add more as you wish. - switch(rnd()%2) { - case 1: // Jail #1 - m_index = mapindex_name2id(MAP_JAIL); - x = 49; y = 75; - break; - default: // Default Jail - m_index = mapindex_name2id(MAP_JAIL); - x = 24; y = 75; - break; - } + pc_jail(*pl_sd, jailtime); - sc_start4(NULL,&pl_sd->bl,SC_JAILED,100,jailtime,m_index,x,y,jailtime?60000:1000); //jailtime = 0: Time was reset to 0. Wait 1 second to warp player out (since it's done in status_change_timer). return 0; } diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 041a981ef4..fa54cfa151 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -10271,6 +10271,8 @@ static const struct _battle_data { { "break_mob_equip", &battle_config.break_mob_equip, 0, 0, 1, }, { "macro_detection_retry", &battle_config.macro_detection_retry, 3, 1, INT_MAX, }, { "macro_detection_timeout", &battle_config.macro_detection_timeout, 60000, 0, INT_MAX, }, + { "macro_detection_punishment", &battle_config.macro_detection_punishment, 0, 0, 1, }, + { "macro_detection_punishment_time", &battle_config.macro_detection_punishment_time, 0, 0, INT_MAX, }, { "feature.dynamicnpc_timeout", &battle_config.feature_dynamicnpc_timeout, 1000, 60000, INT_MAX, }, { "feature.dynamicnpc_rangex", &battle_config.feature_dynamicnpc_rangex, 2, 0, INT_MAX, }, diff --git a/src/map/battle.hpp b/src/map/battle.hpp index d416c622be..0ead94920d 100644 --- a/src/map/battle.hpp +++ b/src/map/battle.hpp @@ -714,6 +714,8 @@ struct Battle_Config int break_mob_equip; int macro_detection_retry; int macro_detection_timeout; + int macro_detection_punishment; + int macro_detection_punishment_time; int feature_dynamicnpc_timeout; int feature_dynamicnpc_rangex; diff --git a/src/map/clif.cpp b/src/map/clif.cpp index ff51b80536..ade4ba1762 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -24776,7 +24776,7 @@ void clif_parse_macro_reporter_ack(int fd, map_session_data *sd) { return; } - pc_macro_reporter_process(*sd, *tsd); + pc_macro_reporter_process(*tsd, sd->status.account_id); clif_macro_reporter_status(*sd, MCR_MONITORING); #endif } diff --git a/src/map/pc.cpp b/src/map/pc.cpp index 2cd6815274..96ebd0a297 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -15235,6 +15235,76 @@ void pc_attendance_claim_reward( struct map_session_data* sd ){ clif_attendence_response( sd, attendance_counter ); } +/** + * Send a player to jail and determine the location to send in jail. + * @param sd: Player data + * @param duration: Duration in minutes (default INT_MAX = infinite) + */ +void pc_jail(map_session_data &sd, int32 duration) { + uint16 m_index = mapindex_name2id(MAP_JAIL); + int16 x, y; + + switch (rnd() % 2) { // Jail Locations + case 0: // Jail #1 + x = 49; + y = 75; + break; + default: // Default Jail + x = 24; + y = 75; + break; + } + + duration = i32max(0, duration); // Can't be less than 0 seconds. + + // If duration > 0 then triggered via jailfor which checks every minute. + // If duration == INT_MAX then triggered via jail for infinite duration. + // If duration == 0 then triggered via unjail and end status. + if (duration > 0) + sc_start4(nullptr, &sd.bl, SC_JAILED, 100, duration, m_index, x, y, 60000); + else + status_change_end(&sd.bl, SC_JAILED); +} + +/** + * Determine the punishment type when failing macro checks. + * @param sd: Player data + * @param stype: Macro detection status type (for banning) + */ +static void pc_macro_punishment(map_session_data &sd, e_macro_detect_status stype) { + int32 duration = 0; + + // Determine if there's a unique duration + if (battle_config.macro_detection_punishment_time > 0) { + char time[13]; + + safesnprintf(time, 13, "+%dnm", battle_config.macro_detection_punishment_time); + duration = static_cast(solve_time(time)); + } + + // Delete the timer + if (sd.macro_detect.timer != INVALID_TIMER) + delete_timer(sd.macro_detect.timer, pc_macro_detector_timeout); + + // Clear the macro detect data + sd.macro_detect = {}; + sd.macro_detect.timer = INVALID_TIMER; + + // Unblock all actions for the player + sd.state.block_action &= ~PCBLOCK_ALL; + sd.state.block_action &= ~PCBLOCK_IMMUNE; + + if (battle_config.macro_detection_punishment == 0) { // Ban + clif_macro_detector_status(sd, stype); + chrif_req_login_operation(sd.macro_detect.reporter_aid, sd.status.name, (duration == 0 ? CHRIF_OP_LOGIN_BLOCK : CHRIF_OP_LOGIN_BAN), duration, 0, 0); + } else { // Jail + // Send success to close the window without closing the client + clif_macro_detector_status(sd, MCD_GOOD); + + pc_jail(sd, (duration == 0 ? INT_MAX : duration / 60)); + } +} + /** * Save a captcha image to memory via /macro_register. * @param sd: Player data @@ -15320,9 +15390,8 @@ TIMER_FUNC(pc_macro_detector_timeout) { sd->macro_detect.retry -= 1; if (sd->macro_detect.retry == 0) { - // All attempts have been exhausted block the user - clif_macro_detector_status(*sd, MCD_TIMEOUT); - chrif_req_login_operation(sd->macro_detect.reporter_aid, sd->status.name, CHRIF_OP_LOGIN_BLOCK, 0, 0, 0); + // All attempts have been exhausted, punish the user + pc_macro_punishment(*sd, MCD_TIMEOUT); } else { // Update the client clif_macro_detector_request_show(*sd); @@ -15373,10 +15442,9 @@ void pc_macro_detector_process_answer(map_session_data &sd, char captcha_answer[ // Deduct an answering attempt sd.macro_detect.retry -= 1; - // All attempts have been exhausted block the user + // All attempts have been exhausted, punish the user if (sd.macro_detect.retry <= 0) { - clif_macro_detector_status(sd, MCD_INCORRECT); - chrif_req_login_operation(sd.macro_detect.reporter_aid, sd.status.name, CHRIF_OP_LOGIN_BLOCK, 0, 0, 0); + pc_macro_punishment(sd, MCD_INCORRECT); return; } @@ -15399,9 +15467,9 @@ void pc_macro_detector_disconnect(map_session_data &sd) { sd.macro_detect.timer = INVALID_TIMER; } - // If the player disconnects before clearing the challenge the account is banned. + // If the player disconnects before clearing the challenge the player is punished. if (sd.macro_detect.retry != 0) - chrif_req_login_operation(sd.macro_detect.reporter_aid, sd.status.name, CHRIF_OP_LOGIN_BLOCK, 0, 0, 0); + pc_macro_punishment(sd, MCD_TIMEOUT); } /** @@ -15438,10 +15506,10 @@ void pc_macro_reporter_area_select(map_session_data &sd, const int16 x, const in /** * Send out captcha check to player. - * @param ssd: Source player data - * @param tsd: Target player data + * @param sd: Target player data + * @param reporter_account_id: Account ID of reporter */ -void pc_macro_reporter_process(map_session_data &ssd, map_session_data &tsd) { +void pc_macro_reporter_process(map_session_data &sd, int32 reporter_account_id) { if (captcha_db.empty()) return; @@ -15449,18 +15517,18 @@ void pc_macro_reporter_process(map_session_data &ssd, map_session_data &tsd) { const std::shared_ptr cd = captcha_db.random(); // Set macro detection data. - tsd.macro_detect.cd = cd; - tsd.macro_detect.reporter_aid = ssd.status.account_id; - tsd.macro_detect.retry = battle_config.macro_detection_retry; + sd.macro_detect.cd = cd; + sd.macro_detect.reporter_aid = reporter_account_id; + sd.macro_detect.retry = battle_config.macro_detection_retry; // Block all actions for the target player. - tsd.state.block_action |= (PCBLOCK_ALL | PCBLOCK_IMMUNE); + sd.state.block_action |= (PCBLOCK_ALL | PCBLOCK_IMMUNE); // Open macro detect client side. - clif_macro_detector_request(tsd); + clif_macro_detector_request(sd); // Start the timeout timer. - tsd.macro_detect.timer = add_timer(gettick() + battle_config.macro_detection_timeout, pc_macro_detector_timeout, tsd.bl.id, 0); + sd.macro_detect.timer = add_timer(gettick() + battle_config.macro_detection_timeout, pc_macro_detector_timeout, sd.bl.id, 0); } /** diff --git a/src/map/pc.hpp b/src/map/pc.hpp index b497a3c10c..23d69d7de1 100644 --- a/src/map/pc.hpp +++ b/src/map/pc.hpp @@ -1722,17 +1722,20 @@ bool pc_attendance_enabled(); int32 pc_attendance_counter( struct map_session_data* sd ); void pc_attendance_claim_reward( struct map_session_data* sd ); +void pc_jail(map_session_data &sd, int32 duration = INT_MAX); + // Captcha Register void pc_macro_captcha_register(map_session_data &sd, uint16 image_size, char captcha_answer[CAPTCHA_ANSWER_SIZE]); void pc_macro_captcha_register_upload(map_session_data & sd, uint16 upload_size, char *upload_data); // Macro Detector +TIMER_FUNC(pc_macro_detector_timeout); void pc_macro_detector_process_answer(map_session_data &sd, char captcha_answer[CAPTCHA_ANSWER_SIZE]); void pc_macro_detector_disconnect(map_session_data &sd); // Macro Reporter void pc_macro_reporter_area_select(map_session_data &sd, const int16 x, const int16 y, const int8 radius); -void pc_macro_reporter_process(map_session_data &ssd, map_session_data &tsd); +void pc_macro_reporter_process(map_session_data &sd, int32 reporter_account_id = -1); #ifdef MAP_GENERATOR void pc_reputation_generate(); diff --git a/src/map/script.cpp b/src/map/script.cpp index 323310eb1e..4fea520062 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -26829,6 +26829,25 @@ BUILDIN_FUNC(isdead) { return SCRIPT_CMD_SUCCESS; } +BUILDIN_FUNC(macro_detector) { + map_session_data *sd; + + if (script_hasdata(st, 2) && script_isstring(st, 2)) { // Character Name + if (!script_nick2sd(2, sd)) { + return SCRIPT_CMD_FAILURE; + } + } else { // Account ID + if (!script_accid2sd(2, sd)) { + return SCRIPT_CMD_FAILURE; + } + } + + // Reporter Account ID as -1 for server. + pc_macro_reporter_process(*sd); + + return SCRIPT_CMD_SUCCESS; +} + #include "../custom/script.inc" // declarations that were supposed to be exported from npc_chat.cpp @@ -27582,6 +27601,8 @@ struct script_function buildin_func[] = { BUILDIN_DEF(getfame, "?"), BUILDIN_DEF(getfamerank, "?"), BUILDIN_DEF(isdead, "?"), + BUILDIN_DEF(macro_detector, "?"), + #include "../custom/script_def.inc" {NULL,NULL,NULL}, diff --git a/src/map/status.cpp b/src/map/status.cpp index 2c8338efc7..78feb15c4d 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -11257,7 +11257,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty break; case SC_JAILED: // Val1 is duration in minutes. Use INT_MAX to specify 'unlimited' time. - tick = val1>0?1000:250; if (sd) { if (sd->mapindex != val2) { int pos = (bl->x&0xFFFF)|(bl->y<<16), // Current Coordinates @@ -13275,9 +13274,6 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid) } break; case SC_JAILED: - if(tid == INVALID_TIMER) - break; - // Natural expiration. if(sd && sd->mapindex == sce->val2) pc_setpos(sd,(unsigned short)sce->val3,sce->val4&0xFFFF, sce->val4>>16, CLR_TELEPORT); break; // Guess hes not in jail :P From 1f4c068c390f8908871cc67ac91969f314540814 Mon Sep 17 00:00:00 2001 From: Vincent Stumpf Date: Tue, 13 Dec 2022 23:47:53 -0800 Subject: [PATCH 7/8] Refactor status change entries (#7356) * Make map_session_data a class, call constructor/destructor on alloc/free * add getSCE * add create, delete, clear SCE * Use getSCE, make data access private * add a cache for last-fetched status --- src/map/atcommand.cpp | 32 +- src/map/battle.cpp | 1176 ++++++------- src/map/battleground.cpp | 8 +- src/map/buyingstore.cpp | 4 +- src/map/chrif.cpp | 16 +- src/map/clif.cpp | 70 +- src/map/elemental.cpp | 2 +- src/map/mail.cpp | 6 +- src/map/map.cpp | 57 +- src/map/mob.cpp | 40 +- src/map/npc.cpp | 2 +- src/map/party.cpp | 2 +- src/map/pc.cpp | 142 +- src/map/pc.hpp | 13 +- src/map/pet.cpp | 4 +- src/map/script.cpp | 26 +- src/map/skill.cpp | 1105 ++++++------ src/map/status.cpp | 3553 +++++++++++++++++++------------------- src/map/status.hpp | 12 +- src/map/unit.cpp | 84 +- 20 files changed, 3205 insertions(+), 3149 deletions(-) diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp index e24bd4ef62..ba4244ec7d 100644 --- a/src/map/atcommand.cpp +++ b/src/map/atcommand.cpp @@ -5238,7 +5238,7 @@ ACMD_FUNC(jail) return -1; } - if (pl_sd->sc.data[SC_JAILED]) { + if (pl_sd->sc.getSCE(SC_JAILED)) { clif_displaymessage(fd, msg_txt(sd,118)); // Player warped in jails. return -1; } @@ -5275,7 +5275,7 @@ ACMD_FUNC(unjail) return -1; } - if (!pl_sd->sc.data[SC_JAILED]) { + if (!pl_sd->sc.getSCE(SC_JAILED)) { clif_displaymessage(fd, msg_txt(sd,119)); // This player is not in jails. return -1; } @@ -5323,8 +5323,8 @@ ACMD_FUNC(jailfor) { } // Added by Coltaro - if(pl_sd->sc.data[SC_JAILED] && pl_sd->sc.data[SC_JAILED]->val1 != INT_MAX) { // Update the player's jail time - jailtime += pl_sd->sc.data[SC_JAILED]->val1; + if(pl_sd->sc.getSCE(SC_JAILED) && pl_sd->sc.getSCE(SC_JAILED)->val1 != INT_MAX) { // Update the player's jail time + jailtime += pl_sd->sc.getSCE(SC_JAILED)->val1; if (jailtime <= 0) { jailtime = 0; clif_displaymessage(pl_sd->fd, msg_txt(sd,120)); // GM has discharge you. @@ -5361,26 +5361,26 @@ ACMD_FUNC(jailtime){ nullpo_retr(-1, sd); - if (!sd->sc.data[SC_JAILED]) { + if (!sd->sc.getSCE(SC_JAILED)) { clif_displaymessage(fd, msg_txt(sd,1139)); // You are not in jail. return -1; } - if (sd->sc.data[SC_JAILED]->val1 == INT_MAX) { + if (sd->sc.getSCE(SC_JAILED)->val1 == INT_MAX) { clif_displaymessage(fd, msg_txt(sd,1140)); // You have been jailed indefinitely. return 0; } - if (sd->sc.data[SC_JAILED]->val1 <= 0) { // Was not jailed with @jailfor (maybe @jail? or warped there? or got recalled?) + if (sd->sc.getSCE(SC_JAILED)->val1 <= 0) { // Was not jailed with @jailfor (maybe @jail? or warped there? or got recalled?) clif_displaymessage(fd, msg_txt(sd,1141)); // You have been jailed for an unknown amount of time. return -1; } // Get remaining jail time - split_time(sd->sc.data[SC_JAILED]->val1*60,&year,&month,&day,&hour,&minute,&second); + split_time(sd->sc.getSCE(SC_JAILED)->val1*60,&year,&month,&day,&hour,&minute,&second); sprintf(atcmd_output,msg_txt(sd,402),msg_txt(sd,1142),year,month,day,hour,minute); // You will remain in jail for %d years, %d months, %d days, %d hours and %d minutes clif_displaymessage(fd, atcmd_output); - timestamp2string(timestr,20,now+sd->sc.data[SC_JAILED]->val1*60,"%Y-%m-%d %H:%M"); + timestamp2string(timestr,20,now+sd->sc.getSCE(SC_JAILED)->val1*60,"%Y-%m-%d %H:%M"); sprintf(atcmd_output,"Release date is: %s",timestr); clif_displaymessage(fd, atcmd_output); @@ -5425,7 +5425,7 @@ ACMD_FUNC(disguise) return -1; } - if (sd->sc.data[SC_MONSTER_TRANSFORM] || sd->sc.data[SC_ACTIVE_MONSTER_TRANSFORM]) { + if (sd->sc.getSCE(SC_MONSTER_TRANSFORM) || sd->sc.getSCE(SC_ACTIVE_MONSTER_TRANSFORM)) { clif_displaymessage(fd, msg_txt(sd,730)); // Character cannot be disguised while in monster transform. return -1; } @@ -7412,7 +7412,7 @@ ACMD_FUNC(unmute) return -1; } - if(!pl_sd->sc.data[SC_NOCHAT]) { + if(!pl_sd->sc.getSCE(SC_NOCHAT)) { clif_displaymessage(sd->fd,msg_txt(sd,1235)); // Player is not muted. return -1; } @@ -9707,7 +9707,7 @@ ACMD_FUNC(charcommands) { /* for new mounts */ ACMD_FUNC(mount2) { clif_displaymessage(sd->fd,msg_txt(sd,1362)); // NOTICE: If you crash with mount your LUA is outdated. - if (!sd->sc.data[SC_ALL_RIDING]) { + if (!sd->sc.getSCE(SC_ALL_RIDING)) { clif_displaymessage(sd->fd,msg_txt(sd,1363)); // You have mounted. sc_start(NULL, &sd->bl, SC_ALL_RIDING, 10000, 1, INFINITE_TICK); } else { @@ -10306,7 +10306,7 @@ ACMD_FUNC(changedress){ }; for( sc_type type : name2id ) { - if( sd->sc.data[type] ) { + if( sd->sc.getSCE(type) ) { status_change_end( &sd->bl, type ); // You should only be able to have one - so we cancel here break; @@ -10337,7 +10337,7 @@ ACMD_FUNC(costume) { if( !message || !*message ) { for( k = 0; k < len; k++ ) { - if( sd->sc.data[name2id[k]] ) { + if( sd->sc.getSCE(name2id[k]) ) { sprintf(atcmd_output, msg_txt(sd, 727), names[k]); // '%s' Costume removed. clif_displaymessage(sd->fd, atcmd_output); status_change_end(&sd->bl, (sc_type)name2id[k]); @@ -10354,7 +10354,7 @@ ACMD_FUNC(costume) { } for( k = 0; k < len; k++ ) { - if( sd->sc.data[name2id[k]] ) { + if( sd->sc.getSCE(name2id[k]) ) { sprintf(atcmd_output, msg_txt(sd, 724), names[k]); // You're already wearing a(n) '%s' costume, type '@costume' to remove it. clif_displaymessage(sd->fd, atcmd_output); return -1; @@ -11283,7 +11283,7 @@ bool is_atcommand(const int fd, struct map_session_data* sd, const char* message return false; //Block NOCHAT but do not display it as a normal message - if ( sd->sc.data[SC_NOCHAT] && sd->sc.data[SC_NOCHAT]->val1&MANNER_NOCOMMAND ) + if ( sd->sc.getSCE(SC_NOCHAT) && sd->sc.getSCE(SC_NOCHAT)->val1&MANNER_NOCOMMAND ) return true; // skip 10/11-langtype's codepage indicator, if detected diff --git a/src/map/battle.cpp b/src/map/battle.cpp index fa54cfa151..d8998d0758 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -358,13 +358,13 @@ int battle_delay_damage(t_tick tick, int amotion, struct block_list *src, struct sc = status_get_sc(target); if (sc) { - if (sc->data[SC_DEVOTION] && sc->data[SC_DEVOTION]->val1) - d_tbl = map_id2bl(sc->data[SC_DEVOTION]->val1); - if (sc->data[SC_WATER_SCREEN_OPTION] && sc->data[SC_WATER_SCREEN_OPTION]->val1) - e_tbl = map_id2bl(sc->data[SC_WATER_SCREEN_OPTION]->val1); + if (sc->getSCE(SC_DEVOTION) && sc->getSCE(SC_DEVOTION)->val1) + d_tbl = map_id2bl(sc->getSCE(SC_DEVOTION)->val1); + if (sc->getSCE(SC_WATER_SCREEN_OPTION) && sc->getSCE(SC_WATER_SCREEN_OPTION)->val1) + e_tbl = map_id2bl(sc->getSCE(SC_WATER_SCREEN_OPTION)->val1); } - if( ((d_tbl && check_distance_bl(target, d_tbl, sc->data[SC_DEVOTION]->val3)) || e_tbl) && + if( ((d_tbl && check_distance_bl(target, d_tbl, sc->getSCE(SC_DEVOTION)->val3)) || e_tbl) && damage > 0 && skill_id != CR_REFLECTSHIELD #ifndef RENEWAL && skill_id != PA_PRESSURE @@ -442,32 +442,32 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d if (sc && sc->count) { //increase dmg by src status switch(atk_elem){ case ELE_FIRE: - if (sc->data[SC_VOLCANO]) + if (sc->getSCE(SC_VOLCANO)) #ifdef RENEWAL - ratio += sc->data[SC_VOLCANO]->val3; + ratio += sc->getSCE(SC_VOLCANO)->val3; #else - damage += (int64)((damage*sc->data[SC_VOLCANO]->val3) / 100); + damage += (int64)((damage*sc->getSCE(SC_VOLCANO)->val3) / 100); #endif break; case ELE_WIND: - if (sc->data[SC_VIOLENTGALE]) + if (sc->getSCE(SC_VIOLENTGALE)) #ifdef RENEWAL - ratio += sc->data[SC_VIOLENTGALE]->val3; + ratio += sc->getSCE(SC_VIOLENTGALE)->val3; #else - damage += (int64)((damage*sc->data[SC_VIOLENTGALE]->val3) / 100); + damage += (int64)((damage*sc->getSCE(SC_VIOLENTGALE)->val3) / 100); #endif break; case ELE_WATER: - if (sc->data[SC_DELUGE]) + if (sc->getSCE(SC_DELUGE)) #ifdef RENEWAL - ratio += sc->data[SC_DELUGE]->val3; + ratio += sc->getSCE(SC_DELUGE)->val3; #else - damage += (int64)((damage*sc->data[SC_DELUGE]->val3) / 100); + damage += (int64)((damage*sc->getSCE(SC_DELUGE)->val3) / 100); #endif break; case ELE_GHOST: - if (sc->data[SC_TELEKINESIS_INTENSE]) - ratio += sc->data[SC_TELEKINESIS_INTENSE]->val3; + if (sc->getSCE(SC_TELEKINESIS_INTENSE)) + ratio += sc->getSCE(SC_TELEKINESIS_INTENSE)->val3; break; } } @@ -496,7 +496,7 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d if (tsc && tsc->count) { //increase dmg by target status switch(atk_elem) { case ELE_FIRE: - if (tsc->data[SC_SPIDERWEB]) { //Double damage + if (tsc->getSCE(SC_SPIDERWEB)) { //Double damage #ifdef RENEWAL ratio += 100; #else @@ -505,17 +505,17 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d //Remove a unit group or end whole status change status_change_end(target, SC_SPIDERWEB); } - if (tsc->data[SC_THORNSTRAP] && battle_getcurrentskill(src) != GN_CARTCANNON) + if (tsc->getSCE(SC_THORNSTRAP) && battle_getcurrentskill(src) != GN_CARTCANNON) status_change_end(target, SC_THORNSTRAP); - if (tsc->data[SC_CRYSTALIZE]) + if (tsc->getSCE(SC_CRYSTALIZE)) status_change_end(target, SC_CRYSTALIZE); - if (tsc->data[SC_EARTH_INSIGNIA]) + if (tsc->getSCE(SC_EARTH_INSIGNIA)) #ifdef RENEWAL ratio += 50; #else damage += (int64)(damage * 50 / 100); #endif - if( tsc->data[SC_WIDEWEB] ) { + if( tsc->getSCE(SC_WIDEWEB) ) { #ifdef RENEWAL ratio += 100; #else @@ -523,7 +523,7 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d #endif status_change_end(target,SC_WIDEWEB); } - if( tsc->data[SC_BURNT] ) { + if( tsc->getSCE(SC_BURNT) ) { #ifdef RENEWAL ratio += 400; #else @@ -532,36 +532,36 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d } break; case ELE_HOLY: - if (tsc->data[SC_ORATIO]) + if (tsc->getSCE(SC_ORATIO)) #ifdef RENEWAL - ratio += tsc->data[SC_ORATIO]->val1 * 2; + ratio += tsc->getSCE(SC_ORATIO)->val1 * 2; #else - damage += (int64)(damage * (tsc->data[SC_ORATIO]->val1 * 2) / 100); + damage += (int64)(damage * (tsc->getSCE(SC_ORATIO)->val1 * 2) / 100); #endif break; case ELE_POISON: - if (tsc->data[SC_VENOMIMPRESS]) + if (tsc->getSCE(SC_VENOMIMPRESS)) #ifdef RENEWAL - ratio += tsc->data[SC_VENOMIMPRESS]->val2; + ratio += tsc->getSCE(SC_VENOMIMPRESS)->val2; #else - damage += (int64)(damage * tsc->data[SC_VENOMIMPRESS]->val2 / 100); + damage += (int64)(damage * tsc->getSCE(SC_VENOMIMPRESS)->val2 / 100); #endif - if (tsc->data[SC_CLOUD_POISON]) { + if (tsc->getSCE(SC_CLOUD_POISON)) { #ifdef RENEWAL - ratio += 5 * tsc->data[SC_CLOUD_POISON]->val1; + ratio += 5 * tsc->getSCE(SC_CLOUD_POISON)->val1; #else - damage += (int64)(damage * 5 * tsc->data[SC_CLOUD_POISON]->val1 / 100); + damage += (int64)(damage * 5 * tsc->getSCE(SC_CLOUD_POISON)->val1 / 100); #endif } break; case ELE_WIND: - if (tsc->data[SC_WATER_INSIGNIA]) + if (tsc->getSCE(SC_WATER_INSIGNIA)) #ifdef RENEWAL ratio += 50; #else damage += (int64)(damage * 50 / 100); #endif - if (tsc->data[SC_CRYSTALIZE]) { + if (tsc->getSCE(SC_CRYSTALIZE)) { uint16 skill_id = battle_getcurrentskill(src); if (skill_get_type(skill_id)&BF_MAGIC) @@ -573,7 +573,7 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d } break; case ELE_WATER: - if (tsc->data[SC_FIRE_INSIGNIA]) + if (tsc->getSCE(SC_FIRE_INSIGNIA)) #ifdef RENEWAL ratio += 50; #else @@ -581,7 +581,7 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d #endif break; case ELE_EARTH: - if (tsc->data[SC_WIND_INSIGNIA]) + if (tsc->getSCE(SC_WIND_INSIGNIA)) #ifdef RENEWAL ratio += 50; #else @@ -590,15 +590,15 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d status_change_end(target, SC_MAGNETICFIELD); //freed if received earth dmg break; case ELE_NEUTRAL: - if (tsc->data[SC_ANTI_M_BLAST]) + if (tsc->getSCE(SC_ANTI_M_BLAST)) #ifdef RENEWAL - ratio += tsc->data[SC_ANTI_M_BLAST]->val2; + ratio += tsc->getSCE(SC_ANTI_M_BLAST)->val2; #else - damage += (int64)(damage * tsc->data[SC_ANTI_M_BLAST]->val2 / 100); + damage += (int64)(damage * tsc->getSCE(SC_ANTI_M_BLAST)->val2 / 100); #endif break; case ELE_DARK: - if (tsc->data[SC_SOULCURSE]) { + if (tsc->getSCE(SC_SOULCURSE)) { if (status_get_class_(target) == CLASS_BOSS) #ifdef RENEWAL ratio += 20; @@ -615,7 +615,7 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d break; } - if (tsc->data[SC_MAGIC_POISON]) + if (tsc->getSCE(SC_MAGIC_POISON)) #ifdef RENEWAL ratio += 50; #else @@ -767,8 +767,8 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li #endif cardfix = cardfix * (100 - tsd->bonus.magic_def_rate) / 100; - if( tsd->sc.data[SC_MDEF_RATE] ) - cardfix = cardfix * (100 - tsd->sc.data[SC_MDEF_RATE]->val1) / 100; + if( tsd->sc.getSCE(SC_MDEF_RATE) ) + cardfix = cardfix * (100 - tsd->sc.getSCE(SC_MDEF_RATE)->val1) / 100; APPLY_CARDFIX(damage, cardfix); } break; @@ -986,8 +986,8 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li cardfix = cardfix * (100 - tsd->bonus.near_attack_def_rate) / 100; else if (!nk[NK_IGNORELONGCARD]) // BF_LONG (there's no other choice) cardfix = cardfix * (100 - tsd->bonus.long_attack_def_rate) / 100; - if( tsd->sc.data[SC_DEF_RATE] ) - cardfix = cardfix * (100 - tsd->sc.data[SC_DEF_RATE]->val1) / 100; + if( tsd->sc.getSCE(SC_DEF_RATE) ) + cardfix = cardfix * (100 - tsd->sc.getSCE(SC_DEF_RATE)->val1) / 100; APPLY_CARDFIX(damage, cardfix); } break; @@ -1114,7 +1114,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe int flag = d->flag; // SC Types that must be first because they may or may not block damage - if ((sce = sc->data[SC_KYRIE]) && damage > 0) { + if ((sce = sc->getSCE(SC_KYRIE)) && damage > 0) { sce->val2 -= static_cast(cap_value(damage, INT_MIN, INT_MAX)); if (flag & BF_WEAPON || skill_id == TF_THROWSTONE) { if (sce->val2 >= 0) @@ -1126,7 +1126,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe status_change_end(target, SC_KYRIE); } - if ((sce = sc->data[SC_P_ALTER]) && damage > 0) { + if ((sce = sc->getSCE(SC_P_ALTER)) && damage > 0) { clif_specialeffect(target, EF_GUARD, AREA); sce->val3 -= static_cast(cap_value(damage, INT_MIN, INT_MAX)); if (sce->val3 >= 0) @@ -1137,7 +1137,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe status_change_end(target, SC_P_ALTER); } - if ((sce = sc->data[SC_TUNAPARTY]) && damage > 0) { + if ((sce = sc->getSCE(SC_TUNAPARTY)) && damage > 0) { sce->val2 -= static_cast(cap_value(damage, INT_MIN, INT_MAX)); if (sce->val2 >= 0) damage = 0; @@ -1147,21 +1147,21 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe status_change_end(target, SC_TUNAPARTY); } - if ((sce = sc->data[SC_DIMENSION1]) && damage > 0) { + if ((sce = sc->getSCE(SC_DIMENSION1)) && damage > 0) { sce->val2 -= static_cast(cap_value(damage, INT_MIN, INT_MAX)); if (sce->val2 <= 0) status_change_end(target, SC_DIMENSION1); return false; } - if ((sce = sc->data[SC_DIMENSION2]) && damage > 0) { + if ((sce = sc->getSCE(SC_DIMENSION2)) && damage > 0) { sce->val2 -= static_cast(cap_value(damage, INT_MIN, INT_MAX)); if (sce->val2 <= 0) status_change_end(target, SC_DIMENSION2); return false; } - if ((sce = sc->data[SC_GUARDIAN_S]) && damage > 0) { + if ((sce = sc->getSCE(SC_GUARDIAN_S)) && damage > 0) { clif_specialeffect(target, EF_GUARD3, AREA);// Not official but we gotta show some way the barrier is working. [Rytech] sce->val2 -= static_cast(cap_value(damage, INT_MIN, INT_MAX)); if (flag & BF_WEAPON) { @@ -1175,7 +1175,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe } // Weapon Blocking can be triggered while the above statuses are active. - if ((sce = sc->data[SC_WEAPONBLOCKING]) && flag & (BF_SHORT | BF_WEAPON) && rnd() % 100 < sce->val2) { + if ((sce = sc->getSCE(SC_WEAPONBLOCKING)) && flag & (BF_SHORT | BF_WEAPON) && rnd() % 100 < sce->val2) { clif_skill_nodamage(target, src, GC_WEAPONBLOCKING, sce->val1, 1); sc_start(src, target, SC_WEAPONBLOCK_ON, 100, src->id, skill_get_time2(GC_WEAPONBLOCKING, sce->val1)); d->dmg_lv = ATK_BLOCK; @@ -1186,7 +1186,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe return false; // ATK_BLOCK Type - if ((sce = sc->data[SC_SAFETYWALL]) && (flag&(BF_SHORT | BF_MAGIC)) == BF_SHORT) { + if ((sce = sc->getSCE(SC_SAFETYWALL)) && (flag&(BF_SHORT | BF_MAGIC)) == BF_SHORT) { std::shared_ptr group = skill_id2group(sce->val3); if (group) { @@ -1221,24 +1221,24 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe status_change_end(target, SC_SAFETYWALL); } - if ((sc->data[SC_PNEUMA] && (flag&(BF_MAGIC | BF_LONG)) == BF_LONG) || + if ((sc->getSCE(SC_PNEUMA) && (flag&(BF_MAGIC | BF_LONG)) == BF_LONG) || #ifdef RENEWAL - (sc->data[SC_BASILICA_CELL] + (sc->getSCE(SC_BASILICA_CELL) #else - (sc->data[SC_BASILICA] + (sc->getSCE(SC_BASILICA) #endif && !status_bl_has_mode(src, MD_STATUSIMMUNE) && skill_id != SP_SOULEXPLOSION) || - (sc->data[SC_ZEPHYR] && !(flag&BF_MAGIC && skill_id) && !(skill_get_inf(skill_id)&(INF_GROUND_SKILL | INF_SELF_SKILL))) || - sc->data[SC__MANHOLE] || - sc->data[SC_KINGS_GRACE] || - sc->data[SC_GRAVITYCONTROL] + (sc->getSCE(SC_ZEPHYR) && !(flag&BF_MAGIC && skill_id) && !(skill_get_inf(skill_id)&(INF_GROUND_SKILL | INF_SELF_SKILL))) || + sc->getSCE(SC__MANHOLE) || + sc->getSCE(SC_KINGS_GRACE) || + sc->getSCE(SC_GRAVITYCONTROL) ) { d->dmg_lv = ATK_BLOCK; return false; } - if (sc->data[SC_WHITEIMPRISON]) { // Gravitation and Pressure do damage without removing the effect + if (sc->getSCE(SC_WHITEIMPRISON)) { // Gravitation and Pressure do damage without removing the effect if (skill_id == MG_NAPALMBEAT || skill_id == MG_SOULSTRIKE || skill_id == WL_SOULEXPANSION || @@ -1255,7 +1255,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe } } - if ((sce = sc->data[SC_MILLENNIUMSHIELD]) && sce->val2 > 0 && damage > 0) { + if ((sce = sc->getSCE(SC_MILLENNIUMSHIELD)) && sce->val2 > 0 && damage > 0) { sce->val3 -= static_cast(cap_value(damage, INT_MIN, INT_MAX)); // absorb damage d->dmg_lv = ATK_BLOCK; if (sce->val3 <= 0) { // Shield Down @@ -1271,8 +1271,8 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe } // ATK_MISS Type - if ((sce = sc->data[SC_AUTOGUARD]) && flag&BF_WEAPON && rnd() % 100 < sce->val2 && !skill_get_inf2(skill_id, INF2_IGNOREAUTOGUARD)) { - status_change_entry *sce_d = sc->data[SC_DEVOTION]; + if ((sce = sc->getSCE(SC_AUTOGUARD)) && flag&BF_WEAPON && rnd() % 100 < sce->val2 && !skill_get_inf2(skill_id, INF2_IGNOREAUTOGUARD)) { + status_change_entry *sce_d = sc->getSCE(SC_DEVOTION); block_list *d_bl; int delay; @@ -1301,10 +1301,10 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe clif_skill_nodamage(target, target, CR_AUTOGUARD, sce->val1, 1); unit_set_walkdelay(target, gettick(), delay, 1); #ifdef RENEWAL - if (sc->data[SC_SHRINK]) + if (sc->getSCE(SC_SHRINK)) sc_start(src, target, SC_STUN, 50, skill_lv, skill_get_time2(skill_id, skill_lv)); #else - if (sc->data[SC_SHRINK] && rnd() % 100 < 5 * sce->val1) + if (sc->getSCE(SC_SHRINK) && rnd() % 100 < 5 * sce->val1) skill_blown(target, src, skill_get_blewcount(CR_SHRINK, 1), -1, BLOWN_NONE); #endif d->dmg_lv = ATK_MISS; @@ -1312,7 +1312,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe } } - if (sc->data[SC_NEUTRALBARRIER] && ((flag&(BF_LONG|BF_MAGIC)) == BF_LONG + if (sc->getSCE(SC_NEUTRALBARRIER) && ((flag&(BF_LONG|BF_MAGIC)) == BF_LONG #ifndef RENEWAL || skill_id == CR_ACIDDEMONSTRATION #endif @@ -1322,7 +1322,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe } // ATK_DEF Type - if ((sce = sc->data[SC_LIGHTNINGWALK]) && !(flag & BF_MAGIC) && flag&BF_LONG && rnd() % 100 < sce->val1) { + if ((sce = sc->getSCE(SC_LIGHTNINGWALK)) && !(flag & BF_MAGIC) && flag&BF_LONG && rnd() % 100 < sce->val1) { const int dx[8] = { 0,-1,-1,-1,0,1,1,1 }; const int dy[8] = { 1,1,0,-1,-1,-1,0,1 }; uint8 dir = map_calc_dir(target, src->x, src->y); @@ -1337,12 +1337,12 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe } // Other - if ((sc->data[SC_HERMODE] && flag&BF_MAGIC) || - (sc->data[SC_TATAMIGAESHI] && (flag&(BF_MAGIC | BF_LONG)) == BF_LONG) || - (sc->data[SC_MEIKYOUSISUI] && rnd() % 100 < 40)) // custom value + if ((sc->getSCE(SC_HERMODE) && flag&BF_MAGIC) || + (sc->getSCE(SC_TATAMIGAESHI) && (flag&(BF_MAGIC | BF_LONG)) == BF_LONG) || + (sc->getSCE(SC_MEIKYOUSISUI) && rnd() % 100 < 40)) // custom value return false; - if ((sce = sc->data[SC_PARRYING]) && flag&BF_WEAPON && skill_id != WS_CARTTERMINATION && rnd() % 100 < sce->val2) { + if ((sce = sc->getSCE(SC_PARRYING)) && flag&BF_WEAPON && skill_id != WS_CARTTERMINATION && rnd() % 100 < sce->val2) { clif_skill_nodamage(target, target, LK_PARRYING, sce->val1, 1); if (skill_id == LK_PARRYING) { @@ -1354,7 +1354,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe return false; } - if (sc->data[SC_DODGE] && (flag&BF_LONG || sc->data[SC_SPURT]) && (skill_id != NPC_EARTHQUAKE || (skill_id == NPC_EARTHQUAKE && flag & NPC_EARTHQUAKE_FLAG)) && rnd() % 100 < 20) { + if (sc->getSCE(SC_DODGE) && (flag&BF_LONG || sc->getSCE(SC_SPURT)) && (skill_id != NPC_EARTHQUAKE || (skill_id == NPC_EARTHQUAKE && flag & NPC_EARTHQUAKE_FLAG)) && rnd() % 100 < 20) { map_session_data *sd = map_id2sd(target->id); if (sd && pc_issit(sd)) @@ -1364,7 +1364,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe return false; } - if ((sce = sc->data[SC_KAUPE]) && (skill_id != NPC_EARTHQUAKE || (skill_id == NPC_EARTHQUAKE && flag & NPC_EARTHQUAKE_FLAG)) && rnd() % 100 < sce->val2) { //Kaupe blocks damage (skill or otherwise) from players, mobs, homuns, mercenaries. + if ((sce = sc->getSCE(SC_KAUPE)) && (skill_id != NPC_EARTHQUAKE || (skill_id == NPC_EARTHQUAKE && flag & NPC_EARTHQUAKE_FLAG)) && rnd() % 100 < sce->val2) { //Kaupe blocks damage (skill or otherwise) from players, mobs, homuns, mercenaries. clif_specialeffect(target, EF_STORMKICK4, AREA); //Shouldn't end until Breaker's non-weapon part connects. #ifndef RENEWAL @@ -1375,12 +1375,12 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe return false; } - if (flag&BF_MAGIC && (sce = sc->data[SC_PRESTIGE]) && rnd() % 100 < sce->val2) { + if (flag&BF_MAGIC && (sce = sc->getSCE(SC_PRESTIGE)) && rnd() % 100 < sce->val2) { clif_specialeffect(target, EF_STORMKICK4, AREA); // Still need confirm it. return false; } - if (((sce = sc->data[SC_UTSUSEMI]) || sc->data[SC_BUNSINJYUTSU]) && flag&BF_WEAPON && !skill_get_inf2(skill_id, INF2_IGNORECICADA)) { + if (((sce = sc->getSCE(SC_UTSUSEMI)) || sc->getSCE(SC_BUNSINJYUTSU)) && flag&BF_WEAPON && !skill_get_inf2(skill_id, INF2_IGNORECICADA)) { skill_additional_effect(src, target, skill_id, skill_lv, flag, ATK_BLOCK, gettick()); if (!status_isdead(src)) skill_counter_additional_effect(src, target, skill_id, skill_lv, flag, gettick()); @@ -1391,7 +1391,7 @@ bool battle_status_block_damage(struct block_list *src, struct block_list *targe //Both need to be consumed if they are active. if (sce && --sce->val2 <= 0) status_change_end(target, SC_UTSUSEMI); - if ((sce = sc->data[SC_BUNSINJYUTSU]) && --sce->val2 <= 0) + if ((sce = sc->getSCE(SC_BUNSINJYUTSU)) && --sce->val2 <= 0) status_change_end(target, SC_BUNSINJYUTSU); return false; } @@ -1447,7 +1447,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam sc = status_get_sc(bl); //check target status - if( sc && sc->data[SC_INVINCIBLE] && !sc->data[SC_INVINCIBLEOFF] ) + if( sc && sc->getSCE(SC_INVINCIBLE) && !sc->getSCE(SC_INVINCIBLEOFF) ) return 1; switch (skill_id) { @@ -1465,7 +1465,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam // Nothing can reduce the damage, but Safety Wall and Millennium Shield can block it completely. // So can defense sphere's but what the heck is that??? [Rytech] - if (skill_id == SJ_NOVAEXPLOSING && !(sc && (sc->data[SC_SAFETYWALL] || sc->data[SC_MILLENNIUMSHIELD]))) { + if (skill_id == SJ_NOVAEXPLOSING && !(sc && (sc->getSCE(SC_SAFETYWALL) || sc->getSCE(SC_MILLENNIUMSHIELD)))) { // Adjust this based on any possible PK damage rates. if (battle_config.pk_mode == 1 && map_getmapflag(bl->m, MF_PVP) > 0) damage = battle_calc_pk_damage(*src, *bl, damage, skill_id, flag); @@ -1479,11 +1479,11 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam // Damage increasing effects #ifdef RENEWAL // Flat +400% damage from melee - if (sc->data[SC_KAITE] && (flag&(BF_SHORT|BF_MAGIC)) == BF_SHORT) + if (sc->getSCE(SC_KAITE) && (flag&(BF_SHORT|BF_MAGIC)) == BF_SHORT) damage <<= 2; #endif - if (sc->data[SC_AETERNA] && skill_id != PF_SOULBURN) { + if (sc->getSCE(SC_AETERNA) && skill_id != PF_SOULBURN) { if (src->type != BL_MER || !skill_id) damage <<= 1; // Lex Aeterna only doubles damage of regular attacks from mercenaries @@ -1494,7 +1494,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam } #ifdef RENEWAL - if( sc->data[SC_RAID] ) { + if( sc->getSCE(SC_RAID) ) { if (status_get_class_(bl) == CLASS_BOSS) damage += damage * 15 / 100; else @@ -1503,11 +1503,11 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam #endif if( damage ) { - if( sc->data[SC_DEEPSLEEP] ) { + if( sc->getSCE(SC_DEEPSLEEP) ) { damage += damage / 2; // 1.5 times more damage while in Deep Sleep. status_change_end(bl,SC_DEEPSLEEP); } - if( tsd && sd && sc->data[SC_CRYSTALIZE] && flag&BF_WEAPON ) { + if( tsd && sd && sc->getSCE(SC_CRYSTALIZE) && flag&BF_WEAPON ) { switch(tsd->status.weapon) { case W_MACE: case W_2HMACE: @@ -1532,15 +1532,15 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam break; } } - if( sc->data[SC_VOICEOFSIREN] ) + if( sc->getSCE(SC_VOICEOFSIREN) ) status_change_end(bl,SC_VOICEOFSIREN); } - if (sc->data[SC_SOUNDOFDESTRUCTION]) + if (sc->getSCE(SC_SOUNDOFDESTRUCTION)) damage <<= 1; - if (sc->data[SC_DARKCROW] && (flag&(BF_SHORT|BF_MAGIC)) == BF_SHORT) { - int bonus = sc->data[SC_DARKCROW]->val2; - if( sc->data[SC_BURNT] && status_get_element(src) == ELE_FIRE ) + if (sc->getSCE(SC_DARKCROW) && (flag&(BF_SHORT|BF_MAGIC)) == BF_SHORT) { + int bonus = sc->getSCE(SC_DARKCROW)->val2; + if( sc->getSCE(SC_BURNT) && status_get_element(src) == ELE_FIRE ) damage += damage * 666 / 100; //Custom value if (status_get_class_(bl) == CLASS_BOSS) @@ -1548,15 +1548,15 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam damage += damage * bonus / 100; } - if (sc->data[SC_HOLY_OIL] && (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) + if (sc->getSCE(SC_HOLY_OIL) && (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) damage += damage * 50 / 100;// Need official adjustment. [Rytech] - if (sc->data[SC_SHADOW_SCAR]) // !TODO: Need official adjustment for this too. - damage += damage * (3 * sc->data[SC_SHADOW_SCAR]->val1) / 100; + if (sc->getSCE(SC_SHADOW_SCAR)) // !TODO: Need official adjustment for this too. + damage += damage * (3 * sc->getSCE(SC_SHADOW_SCAR)->val1) / 100; // Damage reductions // Assumptio increases DEF on RE mode, otherwise gives a reduction on the final damage. [Igniz] #ifndef RENEWAL - if( sc->data[SC_ASSUMPTIO] ) { + if( sc->getSCE(SC_ASSUMPTIO) ) { if( map_flag_vs(bl->m) ) damage = (int64)damage*2/3; //Receive 66% damage else @@ -1564,47 +1564,47 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam } #endif - if (sc->data[SC_DEFENDER] && + if (sc->getSCE(SC_DEFENDER) && skill_id != NJ_ZENYNAGE && skill_id != KO_MUCHANAGE && #ifdef RENEWAL ((flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON) || skill_id == GN_FIRE_EXPANSION_ACID)) #else (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) #endif - damage -= damage * sc->data[SC_DEFENDER]->val2 / 100; + damage -= damage * sc->getSCE(SC_DEFENDER)->val2 / 100; - if(sc->data[SC_ADJUSTMENT] && (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) + if(sc->getSCE(SC_ADJUSTMENT) && (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) damage -= damage * 20 / 100; - if(sc->data[SC_FOGWALL] && skill_id != RK_DRAGONBREATH && skill_id != RK_DRAGONBREATH_WATER && skill_id != NPC_DRAGONBREATH) { + if(sc->getSCE(SC_FOGWALL) && skill_id != RK_DRAGONBREATH && skill_id != RK_DRAGONBREATH_WATER && skill_id != NPC_DRAGONBREATH) { if(flag&BF_SKILL) //25% reduction damage -= damage * 25 / 100; else if ((flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) damage >>= 2; //75% reduction } - if (sc->data[SC_SPORE_EXPLOSION] && (flag & BF_LONG) == BF_LONG) + if (sc->getSCE(SC_SPORE_EXPLOSION) && (flag & BF_LONG) == BF_LONG) damage += damage * (status_get_class(bl) == CLASS_BOSS ? 5 : 10) / 100; - if(sc->data[SC_ARMORCHANGE]) { + if(sc->getSCE(SC_ARMORCHANGE)) { //On official servers, SC_ARMORCHANGE does not change DEF/MDEF but rather increases/decreases the damage if(flag&BF_WEAPON) - damage -= damage * sc->data[SC_ARMORCHANGE]->val2 / 100; + damage -= damage * sc->getSCE(SC_ARMORCHANGE)->val2 / 100; else if(flag&BF_MAGIC) - damage -= damage * sc->data[SC_ARMORCHANGE]->val3 / 100; + damage -= damage * sc->getSCE(SC_ARMORCHANGE)->val3 / 100; } - if(sc->data[SC_SMOKEPOWDER]) { + if(sc->getSCE(SC_SMOKEPOWDER)) { if( (flag&(BF_SHORT|BF_WEAPON)) == (BF_SHORT|BF_WEAPON) ) damage -= damage * 15 / 100; // 15% reduction to physical melee attacks else if( (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON) ) damage -= damage * 50 / 100; // 50% reduction to physical ranged attacks } - if (sc->data[SC_WATER_BARRIER]) + if (sc->getSCE(SC_WATER_BARRIER)) damage = damage * 80 / 100; // 20% reduction to all type attacks - if (sc->data[SC_SU_STOOP]) + if (sc->getSCE(SC_SU_STOOP)) damage -= damage * 90 / 100; // Compressed code, fixed by map.hpp [Epoque] @@ -1614,46 +1614,46 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam for (const auto &raceit : race2) { switch (raceit) { case RC2_MANUK: - if (sce = sc->data[SC_MANU_DEF]) + if (sce = sc->getSCE(SC_MANU_DEF)) damage -= damage * sce->val1 / 100; break; case RC2_SPLENDIDE: - if (sce = sc->data[SC_SPL_DEF]) + if (sce = sc->getSCE(SC_SPL_DEF)) damage -= damage * sce->val1 / 100; break; case RC2_OGH_ATK_DEF: - if (sc->data[SC_GLASTHEIM_DEF]) + if (sc->getSCE(SC_GLASTHEIM_DEF)) return 0; break; case RC2_OGH_HIDDEN: - if (sce = sc->data[SC_GLASTHEIM_HIDDEN]) + if (sce = sc->getSCE(SC_GLASTHEIM_HIDDEN)) damage -= damage * sce->val1 / 100; break; case RC2_BIO5_ACOLYTE_MERCHANT: - if (sce = sc->data[SC_LHZ_DUN_N1]) + if (sce = sc->getSCE(SC_LHZ_DUN_N1)) damage -= damage * sce->val2 / 100; break; case RC2_BIO5_MAGE_ARCHER: - if (sce = sc->data[SC_LHZ_DUN_N2]) + if (sce = sc->getSCE(SC_LHZ_DUN_N2)) damage -= damage * sce->val2 / 100; break; case RC2_BIO5_SWORDMAN_THIEF: - if (sce = sc->data[SC_LHZ_DUN_N3]) + if (sce = sc->getSCE(SC_LHZ_DUN_N3)) damage -= damage * sce->val2 / 100; break; case RC2_BIO5_MVP: - if (sce = sc->data[SC_LHZ_DUN_N4]) + if (sce = sc->getSCE(SC_LHZ_DUN_N4)) damage -= damage * sce->val2 / 100; break; } } } - if((sce=sc->data[SC_ARMOR]) && //NPC_DEFENDER + if((sce=sc->getSCE(SC_ARMOR)) && //NPC_DEFENDER sce->val3&flag && sce->val4&flag) - damage -= damage * sc->data[SC_ARMOR]->val2 / 100; + damage -= damage * sc->getSCE(SC_ARMOR)->val2 / 100; - if( sc->data[SC_ENERGYCOAT] && (skill_id == GN_HELLS_PLANT_ATK || + if( sc->getSCE(SC_ENERGYCOAT) && (skill_id == GN_HELLS_PLANT_ATK || #ifdef RENEWAL ((flag&BF_WEAPON || flag&BF_MAGIC) && skill_id != WS_CARTTERMINATION) #else @@ -1670,39 +1670,39 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam damage -= damage * 6 * (1 + per) / 100; //Reduction: 6% + 6% every 20% } - if(sc->data[SC_GRANITIC_ARMOR]) - damage -= damage * sc->data[SC_GRANITIC_ARMOR]->val2 / 100; + if(sc->getSCE(SC_GRANITIC_ARMOR)) + damage -= damage * sc->getSCE(SC_GRANITIC_ARMOR)->val2 / 100; - if(sc->data[SC_PAIN_KILLER]) { - damage -= sc->data[SC_PAIN_KILLER]->val2; + if(sc->getSCE(SC_PAIN_KILLER)) { + damage -= sc->getSCE(SC_PAIN_KILLER)->val2; damage = i64max(damage, 1); } - if( (sce=sc->data[SC_MAGMA_FLOW]) && (rnd()%100 <= sce->val2) ) + if( (sce=sc->getSCE(SC_MAGMA_FLOW)) && (rnd()%100 <= sce->val2) ) skill_castend_damage_id(bl,src,MH_MAGMA_FLOW,sce->val1,gettick(),0); - if( damage > 0 && (sce = sc->data[SC_STONEHARDSKIN]) ) { + if( damage > 0 && (sce = sc->getSCE(SC_STONEHARDSKIN)) ) { if( src->type == BL_MOB ) //using explicit call instead break_equip for duration sc_start(src,src, SC_STRIPWEAPON, 30, 0, skill_get_time2(RK_STONEHARDSKIN, sce->val1)); else if (flag&(BF_WEAPON|BF_SHORT)) skill_break_equip(src,src, EQP_WEAPON, 3000, BCT_SELF); } - if (src->type == BL_PC && sc->data[SC_GVG_GOLEM]) { + if (src->type == BL_PC && sc->getSCE(SC_GVG_GOLEM)) { if (flag&BF_WEAPON) - damage -= damage * sc->data[SC_GVG_GOLEM]->val3 / 100; + damage -= damage * sc->getSCE(SC_GVG_GOLEM)->val3 / 100; if (flag&BF_MAGIC) - damage -= damage * sc->data[SC_GVG_GOLEM]->val4 / 100; + damage -= damage * sc->getSCE(SC_GVG_GOLEM)->val4 / 100; } #ifdef RENEWAL // Renewal: steel body reduces all incoming damage to 1/10 [helvetica] - if( sc->data[SC_STEELBODY] ) + if( sc->getSCE(SC_STEELBODY) ) damage = damage > 10 ? damage / 10 : 1; #endif //Finally added to remove the status of immobile when Aimed Bolt is used. [Jobbie] - if( skill_id == RA_AIMEDBOLT && (sc->data[SC_BITE] || sc->data[SC_ANKLE] || sc->data[SC_ELECTRICSHOCKER]) ) { + if( skill_id == RA_AIMEDBOLT && (sc->getSCE(SC_BITE) || sc->getSCE(SC_ANKLE) || sc->getSCE(SC_ELECTRICSHOCKER)) ) { status_change_end(bl, SC_BITE); status_change_end(bl, SC_ANKLE); status_change_end(bl, SC_ELECTRICSHOCKER); @@ -1711,26 +1711,26 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam if (!damage) return 0; - if( sd && (sce = sc->data[SC_FORCEOFVANGUARD]) && flag&BF_WEAPON && rnd()%100 < sce->val2 ) + if( sd && (sce = sc->getSCE(SC_FORCEOFVANGUARD)) && flag&BF_WEAPON && rnd()%100 < sce->val2 ) pc_addspiritball(sd,skill_get_time(LG_FORCEOFVANGUARD,sce->val1),sce->val3); - if( sd && (sce = sc->data[SC_GT_ENERGYGAIN]) && flag&BF_WEAPON && rnd()%100 < sce->val2 ) { + if( sd && (sce = sc->getSCE(SC_GT_ENERGYGAIN)) && flag&BF_WEAPON && rnd()%100 < sce->val2 ) { int spheres = 5; - if( sc->data[SC_RAISINGDRAGON] ) - spheres += sc->data[SC_RAISINGDRAGON]->val1; + if( sc->getSCE(SC_RAISINGDRAGON) ) + spheres += sc->getSCE(SC_RAISINGDRAGON)->val1; pc_addspiritball(sd, skill_get_time2(SR_GENTLETOUCH_ENERGYGAIN, sce->val1), spheres); } - if (sc->data[SC_STYLE_CHANGE] && sc->data[SC_STYLE_CHANGE]->val1 == MH_MD_GRAPPLING) { + if (sc->getSCE(SC_STYLE_CHANGE) && sc->getSCE(SC_STYLE_CHANGE)->val1 == MH_MD_GRAPPLING) { TBL_HOM *hd = BL_CAST(BL_HOM,bl); // We add a sphere for when the Homunculus is being hit if (hd && (rnd()%100<50) ) // According to WarpPortal, this is a flat 50% chance hom_addspiritball(hd, 10); } - if( sc->data[SC__DEADLYINFECT] && (flag&(BF_SHORT|BF_MAGIC)) == BF_SHORT && damage > 0 && rnd()%100 < 30 + 10 * sc->data[SC__DEADLYINFECT]->val1 ) + if( sc->getSCE(SC__DEADLYINFECT) && (flag&(BF_SHORT|BF_MAGIC)) == BF_SHORT && damage > 0 && rnd()%100 < 30 + 10 * sc->getSCE(SC__DEADLYINFECT)->val1 ) status_change_spread(bl, src); } //End of target SC_ check @@ -1739,17 +1739,17 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam sc = status_get_sc(src); if (sc && sc->count) { - if( sc->data[SC_INVINCIBLE] && !sc->data[SC_INVINCIBLEOFF] ) + if( sc->getSCE(SC_INVINCIBLE) && !sc->getSCE(SC_INVINCIBLEOFF) ) damage += damage * 75 / 100; - if ((sce = sc->data[SC_BLOODLUST]) && flag&BF_WEAPON && damage > 0 && rnd()%100 < sce->val3) + if ((sce = sc->getSCE(SC_BLOODLUST)) && flag&BF_WEAPON && damage > 0 && rnd()%100 < sce->val3) status_heal(src, damage * sce->val4 / 100, 0, 3); - if ((sce = sc->data[SC_BLOODSUCKER]) && flag & BF_WEAPON && damage > 0 && rnd() % 100 < (2 * sce->val1 - 1)) + if ((sce = sc->getSCE(SC_BLOODSUCKER)) && flag & BF_WEAPON && damage > 0 && rnd() % 100 < (2 * sce->val1 - 1)) status_heal(src, damage * sce->val1 / 100, 0, 3); - if (flag&BF_MAGIC && bl->type == BL_PC && sc->data[SC_GVG_GIANT] && sc->data[SC_GVG_GIANT]->val4) - damage += damage * sc->data[SC_GVG_GIANT]->val4 / 100; + if (flag&BF_MAGIC && bl->type == BL_PC && sc->getSCE(SC_GVG_GIANT) && sc->getSCE(SC_GVG_GIANT)->val4) + damage += damage * sc->getSCE(SC_GVG_GIANT)->val4 / 100; // [Epoque] if (bl->type == BL_MOB) { @@ -1759,31 +1759,31 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam for (const auto &raceit : race2) { switch (raceit) { case RC2_MANUK: - if (sce = sc->data[SC_MANU_ATK]) + if (sce = sc->getSCE(SC_MANU_ATK)) damage += damage * sce->val1 / 100; break; case RC2_SPLENDIDE: - if (sce = sc->data[SC_SPL_ATK]) + if (sce = sc->getSCE(SC_SPL_ATK)) damage += damage * sce->val1 / 100; break; case RC2_OGH_ATK_DEF: - if (sc->data[SC_GLASTHEIM_ATK]) + if (sc->getSCE(SC_GLASTHEIM_ATK)) damage <<= 1; break; case RC2_BIO5_SWORDMAN_THIEF: - if (sce = sc->data[SC_LHZ_DUN_N1]) + if (sce = sc->getSCE(SC_LHZ_DUN_N1)) damage += damage * sce->val1 / 100; break; case RC2_BIO5_ACOLYTE_MERCHANT: - if (sce = sc->data[SC_LHZ_DUN_N2]) + if (sce = sc->getSCE(SC_LHZ_DUN_N2)) damage += damage * sce->val1 / 100; break; case RC2_BIO5_MAGE_ARCHER: - if (sce = sc->data[SC_LHZ_DUN_N3]) + if (sce = sc->getSCE(SC_LHZ_DUN_N3)) damage += damage * sce->val1 / 100; break; case RC2_BIO5_MVP: - if (sce = sc->data[SC_LHZ_DUN_N4]) + if (sce = sc->getSCE(SC_LHZ_DUN_N4)) damage += damage * sce->val1 / 100; break; } @@ -1791,31 +1791,31 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam } } - if (sc->data[SC_POISONINGWEAPON] && flag&BF_SHORT && damage > 0) { + if (sc->getSCE(SC_POISONINGWEAPON) && flag&BF_SHORT && damage > 0) { damage += damage * 10 / 100; - if (rnd() % 100 < sc->data[SC_POISONINGWEAPON]->val3) - sc_start4(src, bl, (sc_type)sc->data[SC_POISONINGWEAPON]->val2, 100, sc->data[SC_POISONINGWEAPON]->val1, 0, 1, 0, (sc->data[SC_POISONINGWEAPON]->val2 == SC_VENOMBLEED ? skill_get_time2(GC_POISONINGWEAPON, 1) : skill_get_time2(GC_POISONINGWEAPON, 2))); + if (rnd() % 100 < sc->getSCE(SC_POISONINGWEAPON)->val3) + sc_start4(src, bl, (sc_type)sc->getSCE(SC_POISONINGWEAPON)->val2, 100, sc->getSCE(SC_POISONINGWEAPON)->val1, 0, 1, 0, (sc->getSCE(SC_POISONINGWEAPON)->val2 == SC_VENOMBLEED ? skill_get_time2(GC_POISONINGWEAPON, 1) : skill_get_time2(GC_POISONINGWEAPON, 2))); } - if( sc->data[SC__DEADLYINFECT] && (flag&(BF_SHORT|BF_MAGIC)) == BF_SHORT && damage > 0 && rnd()%100 < 30 + 10 * sc->data[SC__DEADLYINFECT]->val1 ) + if( sc->getSCE(SC__DEADLYINFECT) && (flag&(BF_SHORT|BF_MAGIC)) == BF_SHORT && damage > 0 && rnd()%100 < 30 + 10 * sc->getSCE(SC__DEADLYINFECT)->val1 ) status_change_spread(src, bl); - if (sc->data[SC_STYLE_CHANGE] && sc->data[SC_STYLE_CHANGE]->val1 == MH_MD_FIGHTING) { + if (sc->getSCE(SC_STYLE_CHANGE) && sc->getSCE(SC_STYLE_CHANGE)->val1 == MH_MD_FIGHTING) { TBL_HOM *hd = BL_CAST(BL_HOM,src); //when attacking if (hd && (rnd()%100<50) ) hom_addspiritball(hd, 10); // According to WarpPortal, this is a flat 50% chance } - if (flag & BF_WEAPON && (sce = sc->data[SC_ADD_ATK_DAMAGE])) + if (flag & BF_WEAPON && (sce = sc->getSCE(SC_ADD_ATK_DAMAGE))) damage += damage * sce->val1 / 100; - if (flag & BF_MAGIC && (sce = sc->data[SC_ADD_MATK_DAMAGE])) + if (flag & BF_MAGIC && (sce = sc->getSCE(SC_ADD_MATK_DAMAGE))) damage += damage * sce->val1 / 100; - if (sc->data[SC_DANCEWITHWUG] && (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) - damage += damage * sc->data[SC_DANCEWITHWUG]->val1 / 100; - if (sc->data[SC_UNLIMITEDHUMMINGVOICE] && flag&BF_MAGIC) - damage += damage * sc->data[SC_UNLIMITEDHUMMINGVOICE]->val3 / 100; + if (sc->getSCE(SC_DANCEWITHWUG) && (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) + damage += damage * sc->getSCE(SC_DANCEWITHWUG)->val1 / 100; + if (sc->getSCE(SC_UNLIMITEDHUMMINGVOICE) && flag&BF_MAGIC) + damage += damage * sc->getSCE(SC_UNLIMITEDHUMMINGVOICE)->val3 / 100; - if (tsd && (sce = sc->data[SC_SOULREAPER])) { + if (tsd && (sce = sc->getSCE(SC_SOULREAPER))) { if (rnd()%100 < sce->val2 && tsd->soulball < MAX_SOUL_BALL) { clif_specialeffect(src, 1208, AREA); pc_addsoulball(tsd, 5 + 3 * pc_checkskill(tsd, SP_SOULENERGY)); @@ -2086,7 +2086,7 @@ int64 battle_addmastery(struct map_session_data *sd,struct block_list *target,in if((skill = pc_checkskill(sd,HT_BEASTBANE)) > 0 && (status->race == RC_INSECT || status->race == RC_BRUTE || status->race == RC_PLAYER_DORAM) ) { damage += (skill * 4); - if (sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_HUNTER) + if (sd->sc.getSCE(SC_SPIRIT) && sd->sc.getSCE(SC_SPIRIT)->val2 == SL_HUNTER) damage += sd->status.str; } @@ -2272,13 +2272,13 @@ static int battle_calc_base_weapon_attack(struct block_list *src, struct status_ atkmin = max(0, (int)(atkmin - variance + base_stat_bonus)); atkmax = min(UINT16_MAX, (int)(atkmax + variance + base_stat_bonus)); - if ((sc && sc->data[SC_MAXIMIZEPOWER]) || critical == true) + if ((sc && sc->getSCE(SC_MAXIMIZEPOWER)) || critical == true) damage = atkmax; else damage = rnd_value(atkmin, atkmax); } - if (sc && sc->data[SC_WEAPONPERFECTION]) + if (sc && sc->getSCE(SC_WEAPONPERFECTION)) weapon_perfection = true; battle_add_weapon_damage(sd, &damage, type); @@ -2320,7 +2320,7 @@ static int64 battle_calc_base_damage(struct block_list *src, struct status_data if (!sd) { //Mobs/Pets #ifndef RENEWAL - if (sc != nullptr && sc->data[SC_CHANGE] != nullptr) + if (sc != nullptr && sc->getSCE(SC_CHANGE) != nullptr) return status->matk_max; // [Aegis] simply uses raw max matk for base damage when Mental Charge active #endif if(flag&4) { @@ -2353,7 +2353,7 @@ static int64 battle_calc_base_damage(struct block_list *src, struct status_data } } - if (sc && sc->data[SC_MAXIMIZEPOWER]) + if (sc && sc->getSCE(SC_MAXIMIZEPOWER)) atkmin = atkmax; //Weapon Damage calculation @@ -2380,21 +2380,21 @@ static int64 battle_calc_base_damage(struct block_list *src, struct status_data case ELEMENTALID_AGNI_M: case ELEMENTALID_AGNI_L: case ELEMENTALID_ARDOR: - if (ele_sc->data[SC_FIRE_INSIGNIA] && ele_sc->data[SC_FIRE_INSIGNIA]->val1 == 1) + if (ele_sc->getSCE(SC_FIRE_INSIGNIA) && ele_sc->getSCE(SC_FIRE_INSIGNIA)->val1 == 1) damage += damage * 20 / 100; break; case ELEMENTALID_AQUA_S: case ELEMENTALID_AQUA_M: case ELEMENTALID_AQUA_L: case ELEMENTALID_DILUVIO: - if (ele_sc->data[SC_WATER_INSIGNIA] && ele_sc->data[SC_WATER_INSIGNIA]->val1 == 1) + if (ele_sc->getSCE(SC_WATER_INSIGNIA) && ele_sc->getSCE(SC_WATER_INSIGNIA)->val1 == 1) damage += damage * 20 / 100; break; case ELEMENTALID_VENTUS_S: case ELEMENTALID_VENTUS_M: case ELEMENTALID_VENTUS_L: case ELEMENTALID_PROCELLA: - if (ele_sc->data[SC_WIND_INSIGNIA] && ele_sc->data[SC_WIND_INSIGNIA]->val1 == 1) + if (ele_sc->getSCE(SC_WIND_INSIGNIA) && ele_sc->getSCE(SC_WIND_INSIGNIA)->val1 == 1) damage += damage * 20 / 100; break; case ELEMENTALID_TERA_S: @@ -2402,7 +2402,7 @@ static int64 battle_calc_base_damage(struct block_list *src, struct status_data case ELEMENTALID_TERA_L: case ELEMENTALID_TERREMOTUS: case ELEMENTALID_SERPENS: - if (ele_sc->data[SC_EARTH_INSIGNIA] && ele_sc->data[SC_EARTH_INSIGNIA]->val1 == 1) + if (ele_sc->getSCE(SC_EARTH_INSIGNIA) && ele_sc->getSCE(SC_EARTH_INSIGNIA)->val1 == 1) damage += damage * 20 / 100; break; } @@ -2787,19 +2787,19 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct } } - if(sc && sc->data[SC_CAMOUFLAGE]) - cri += 100 * min(10,sc->data[SC_CAMOUFLAGE]->val3); //max 100% (1K) + if(sc && sc->getSCE(SC_CAMOUFLAGE)) + cri += 100 * min(10,sc->getSCE(SC_CAMOUFLAGE)->val3); //max 100% (1K) //The official equation is *2, but that only applies when sd's do critical. //Therefore, we use the old value 3 on cases when an sd gets attacked by a mob cri -= tstatus->luk * ((!sd && tsd) ? 3 : 2); - if( tsc && tsc->data[SC_SLEEP] ) + if( tsc && tsc->getSCE(SC_SLEEP) ) cri <<= 1; switch(skill_id) { case 0: - if(sc && !sc->data[SC_AUTOCOUNTER]) + if(sc && !sc->getSCE(SC_AUTOCOUNTER)) break; clif_specialeffect(src, EF_AUTOCOUNTER, AREA); status_change_end(src, SC_AUTOCOUNTER); @@ -2832,7 +2832,7 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct cri /= 2; break; case WH_GALESTORM: - if (sc && !sc->data[SC_CALAMITYGALE]) + if (sc && !sc->getSCE(SC_CALAMITYGALE)) return false; } if(tsd && tsd->bonus.critical_def) @@ -2929,18 +2929,18 @@ static bool is_attack_hitting(struct Damage* wd, struct block_list *src, struct return true; else if(sd && sd->bonus.perfect_hit > 0 && rnd()%100 < sd->bonus.perfect_hit) return true; - else if (sc && sc->data[SC_FUSION]) + else if (sc && sc->getSCE(SC_FUSION)) return true; else if ((skill_id == AS_SPLASHER || skill_id == GN_SPORE_EXPLOSION) && !wd->miscflag) return true; - else if (skill_id == CR_SHIELDBOOMERANG && sc && sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_CRUSADER ) + else if (skill_id == CR_SHIELDBOOMERANG && sc && sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_CRUSADER ) return true; else if (tsc && tsc->opt1 && tsc->opt1 != OPT1_STONEWAIT && tsc->opt1 != OPT1_BURNING) return true; else if (nk[NK_IGNOREFLEE]) return true; - if( tsc && tsc->data[SC_NEUTRALBARRIER] && (wd->flag&(BF_LONG|BF_MAGIC)) == BF_LONG ) + if( tsc && tsc->getSCE(SC_NEUTRALBARRIER) && (wd->flag&(BF_LONG|BF_MAGIC)) == BF_LONG ) return false; flee = tstatus->flee; @@ -2966,7 +2966,7 @@ static bool is_attack_hitting(struct Damage* wd, struct block_list *src, struct hitrate += sstatus->hit - flee; //Fogwall's hit penalty is only for normal ranged attacks. - if ((wd->flag&(BF_LONG|BF_MAGIC)) == BF_LONG && !skill_id && tsc && tsc->data[SC_FOGWALL]) + if ((wd->flag&(BF_LONG|BF_MAGIC)) == BF_LONG && !skill_id && tsc && tsc->getSCE(SC_FOGWALL)) hitrate -= 50; if(sd && is_skill_using_arrow(src, skill_id)) @@ -3084,10 +3084,10 @@ static bool is_attack_hitting(struct Damage* wd, struct block_list *src, struct } if (sc) { - if (sc->data[SC_MTF_ASPD]) - hitrate += sc->data[SC_MTF_ASPD]->val2; - if (sc->data[SC_MTF_ASPD2]) - hitrate += sc->data[SC_MTF_ASPD2]->val2; + if (sc->getSCE(SC_MTF_ASPD)) + hitrate += sc->getSCE(SC_MTF_ASPD)->val2; + if (sc->getSCE(SC_MTF_ASPD2)) + hitrate += sc->getSCE(SC_MTF_ASPD2)->val2; } hitrate = cap_value(hitrate, battle_config.min_hitrate, battle_config.max_hitrate); @@ -3114,7 +3114,7 @@ static bool attack_ignores_def(struct Damage* wd, struct block_list *src, struct return true; else #endif - if (sc && sc->data[SC_FUSION]) + if (sc && sc->getSCE(SC_FUSION)) return true; else if (skill_id != CR_GRANDCROSS && skill_id != NPC_GRANDDARKNESS) { //Ignore Defense? @@ -3212,8 +3212,8 @@ int battle_get_weapon_element(struct Damage* wd, struct block_list *src, struct if(sd && sd->spiritcharm_type != CHARM_TYPE_NONE && sd->spiritcharm >= MAX_SPIRITCHARM) element = sd->spiritcharm_type; // Summoning 10 spiritcharm will endow your weapon // on official endows override all other elements [helvetica] - if(sc && sc->data[SC_ENCHANTARMS]) // Check for endows - element = sc->data[SC_ENCHANTARMS]->val1; + if(sc && sc->getSCE(SC_ENCHANTARMS)) // Check for endows + element = sc->getSCE(SC_ENCHANTARMS)->val1; } else if( element == ELE_ENDOWED ) //Use enchantment's element element = status_get_attack_sc_element(src,sc); else if( element == ELE_RANDOM ) //Use random element @@ -3229,22 +3229,22 @@ int battle_get_weapon_element(struct Damage* wd, struct block_list *src, struct break; case RK_DRAGONBREATH: if (sc) { - if (sc->data[SC_LUXANIMA]) // Lux Anima has priority over Giant Growth + if (sc->getSCE(SC_LUXANIMA)) // Lux Anima has priority over Giant Growth element = ELE_DARK; - else if (sc->data[SC_GIANTGROWTH]) + else if (sc->getSCE(SC_GIANTGROWTH)) element = ELE_HOLY; } break; case RK_DRAGONBREATH_WATER: if (sc) { - if (sc->data[SC_LUXANIMA]) // Lux Anima has priority over Fighting Spirit + if (sc->getSCE(SC_LUXANIMA)) // Lux Anima has priority over Fighting Spirit element = ELE_NEUTRAL; - else if (sc->data[SC_FIGHTINGSPIRIT]) + else if (sc->getSCE(SC_FIGHTINGSPIRIT)) element = ELE_GHOST; } break; case LG_HESPERUSLIT: - if (sc && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 4) + if (sc && sc->getSCE(SC_BANDING) && sc->getSCE(SC_BANDING)->val2 > 4) element = ELE_HOLY; break; case GN_CARTCANNON: @@ -3261,7 +3261,7 @@ int battle_get_weapon_element(struct Damage* wd, struct block_list *src, struct break; } - if (sc && sc->data[SC_GOLDENE_FERSE] && ((!skill_id && (rnd() % 100 < sc->data[SC_GOLDENE_FERSE]->val4)) || skill_id == MH_STAHL_HORN)) + if (sc && sc->getSCE(SC_GOLDENE_FERSE) && ((!skill_id && (rnd() % 100 < sc->getSCE(SC_GOLDENE_FERSE)->val4)) || skill_id == MH_STAHL_HORN)) element = ELE_HOLY; // calc_flag means the element should be calculated for damage only @@ -3345,13 +3345,13 @@ static void battle_calc_element_damage(struct Damage* wd, struct block_list *src #ifdef RENEWAL if (sd == nullptr) { // Only monsters have a single ATK for element, in pre-renewal we also apply element to entire ATK on players [helvetica] #endif - if (sc && sc->data[SC_WATK_ELEMENT]) { // Descriptions indicate this means adding a percent of a normal attack in another element [Skotlex] - int64 damage = battle_calc_base_damage(src, sstatus, &sstatus->rhw, sc, tstatus->size, (is_skill_using_arrow(src, skill_id) ? 2 : 0)) * sc->data[SC_WATK_ELEMENT]->val2 / 100; + if (sc && sc->getSCE(SC_WATK_ELEMENT)) { // Descriptions indicate this means adding a percent of a normal attack in another element [Skotlex] + int64 damage = battle_calc_base_damage(src, sstatus, &sstatus->rhw, sc, tstatus->size, (is_skill_using_arrow(src, skill_id) ? 2 : 0)) * sc->getSCE(SC_WATK_ELEMENT)->val2 / 100; - wd->damage += battle_attr_fix(src, target, damage, sc->data[SC_WATK_ELEMENT]->val1, tstatus->def_ele, tstatus->ele_lv); + wd->damage += battle_attr_fix(src, target, damage, sc->getSCE(SC_WATK_ELEMENT)->val1, tstatus->def_ele, tstatus->ele_lv); if (is_attack_left_handed(src, skill_id)) { - damage = battle_calc_base_damage(src, sstatus, &sstatus->lhw, sc, tstatus->size, (is_skill_using_arrow(src, skill_id) ? 2 : 0)) * sc->data[SC_WATK_ELEMENT]->val2 / 100; - wd->damage2 += battle_attr_fix(src, target, damage, sc->data[SC_WATK_ELEMENT]->val1, tstatus->def_ele, tstatus->ele_lv); + damage = battle_calc_base_damage(src, sstatus, &sstatus->lhw, sc, tstatus->size, (is_skill_using_arrow(src, skill_id) ? 2 : 0)) * sc->getSCE(SC_WATK_ELEMENT)->val2 / 100; + wd->damage2 += battle_attr_fix(src, target, damage, sc->getSCE(SC_WATK_ELEMENT)->val1, tstatus->def_ele, tstatus->ele_lv); } } #ifdef RENEWAL @@ -3449,26 +3449,26 @@ static void battle_calc_attack_masteries(struct Damage* wd, struct block_list *s if (sc) { // Status change considered as masteries #ifdef RENEWAL - if (sc->data[SC_NIBELUNGEN]) // With renewal, the level 4 weapon limitation has been removed - ATK_ADD(wd->masteryAtk, wd->masteryAtk2, sc->data[SC_NIBELUNGEN]->val2); + if (sc->getSCE(SC_NIBELUNGEN)) // With renewal, the level 4 weapon limitation has been removed + ATK_ADD(wd->masteryAtk, wd->masteryAtk2, sc->getSCE(SC_NIBELUNGEN)->val2); #endif - if(sc->data[SC_CAMOUFLAGE]) { - ATK_ADD(wd->damage, wd->damage2, 30 * min(10, sc->data[SC_CAMOUFLAGE]->val3)); + if(sc->getSCE(SC_CAMOUFLAGE)) { + ATK_ADD(wd->damage, wd->damage2, 30 * min(10, sc->getSCE(SC_CAMOUFLAGE)->val3)); #ifdef RENEWAL - ATK_ADD(wd->masteryAtk, wd->masteryAtk2, 30 * min(10, sc->data[SC_CAMOUFLAGE]->val3)); + ATK_ADD(wd->masteryAtk, wd->masteryAtk2, 30 * min(10, sc->getSCE(SC_CAMOUFLAGE)->val3)); #endif } - if(sc->data[SC_GN_CARTBOOST]) { - ATK_ADD(wd->damage, wd->damage2, 10 * sc->data[SC_GN_CARTBOOST]->val1); + if(sc->getSCE(SC_GN_CARTBOOST)) { + ATK_ADD(wd->damage, wd->damage2, 10 * sc->getSCE(SC_GN_CARTBOOST)->val1); #ifdef RENEWAL - ATK_ADD(wd->masteryAtk, wd->masteryAtk2, 10 * sc->data[SC_GN_CARTBOOST]->val1); + ATK_ADD(wd->masteryAtk, wd->masteryAtk2, 10 * sc->getSCE(SC_GN_CARTBOOST)->val1); #endif } - if (sc->data[SC_P_ALTER]) { - ATK_ADD(wd->damage, wd->damage2, sc->data[SC_P_ALTER]->val2); + if (sc->getSCE(SC_P_ALTER)) { + ATK_ADD(wd->damage, wd->damage2, sc->getSCE(SC_P_ALTER)->val2); #ifdef RENEWAL - ATK_ADD(wd->masteryAtk, wd->masteryAtk2, sc->data[SC_P_ALTER]->val2); + ATK_ADD(wd->masteryAtk, wd->masteryAtk2, sc->getSCE(SC_P_ALTER)->val2); #endif } } @@ -3497,7 +3497,7 @@ static void battle_calc_damage_parts(struct Damage* wd, struct block_list *src,s wd->statusAtk += battle_calc_status_attack(sstatus, EQI_HAND_R); wd->statusAtk2 += battle_calc_status_attack(sstatus, EQI_HAND_L); - if (sd && sd->sc.data[SC_SEVENWIND]) { // Mild Wind applies element to status ATK as well as weapon ATK [helvetica] + if (sd && sd->sc.getSCE(SC_SEVENWIND)) { // Mild Wind applies element to status ATK as well as weapon ATK [helvetica] wd->statusAtk = battle_attr_fix(src, target, wd->statusAtk, right_element, tstatus->def_ele, tstatus->ele_lv); wd->statusAtk2 = battle_attr_fix(src, target, wd->statusAtk, left_element, tstatus->def_ele, tstatus->ele_lv); } else { // status atk is considered neutral on normal attacks [helvetica] @@ -3513,11 +3513,11 @@ static void battle_calc_damage_parts(struct Damage* wd, struct block_list *src,s wd->weaponAtk2 += battle_calc_base_weapon_attack(src, tstatus, &sstatus->lhw, sd, critical); // Weapon ATK gain bonus from SC_SUB_WEAPONPROPERTY here ( +x% pseudo element damage) - if (sd && sd->sc.data[SC_SUB_WEAPONPROPERTY]) { - int64 bonus_atk = (int64)floor((float)( wd->weaponAtk * sd->sc.data[SC_SUB_WEAPONPROPERTY]->val2 / 100)); - int64 bonus_atk2 = (int64)floor((float)( wd->weaponAtk2 * sd->sc.data[SC_SUB_WEAPONPROPERTY]->val2 / 100)); - bonus_atk = battle_attr_fix(src, target, bonus_atk, sd->sc.data[SC_SUB_WEAPONPROPERTY]->val1, tstatus->def_ele, tstatus->ele_lv); - bonus_atk2 = battle_attr_fix(src, target, bonus_atk2, sd->sc.data[SC_SUB_WEAPONPROPERTY]->val1, tstatus->def_ele, tstatus->ele_lv); + if (sd && sd->sc.getSCE(SC_SUB_WEAPONPROPERTY)) { + int64 bonus_atk = (int64)floor((float)( wd->weaponAtk * sd->sc.getSCE(SC_SUB_WEAPONPROPERTY)->val2 / 100)); + int64 bonus_atk2 = (int64)floor((float)( wd->weaponAtk2 * sd->sc.getSCE(SC_SUB_WEAPONPROPERTY)->val2 / 100)); + bonus_atk = battle_attr_fix(src, target, bonus_atk, sd->sc.getSCE(SC_SUB_WEAPONPROPERTY)->val1, tstatus->def_ele, tstatus->ele_lv); + bonus_atk2 = battle_attr_fix(src, target, bonus_atk2, sd->sc.getSCE(SC_SUB_WEAPONPROPERTY)->val1, tstatus->def_ele, tstatus->ele_lv); wd->weaponAtk += bonus_atk; wd->weaponAtk2 += bonus_atk2; @@ -3661,7 +3661,7 @@ static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list * damagevalue = damagevalue * status_get_lv(src) / 100; if(sd) damagevalue = damagevalue * (90 + 10 * pc_checkskill(sd, RK_DRAGONTRAINING)) / 100; - if (sc && sc->data[SC_DRAGONIC_AURA])// Need official damage increase. [Rytech] + if (sc && sc->getSCE(SC_DRAGONIC_AURA))// Need official damage increase. [Rytech] damagevalue += damagevalue * 50 / 100; ATK_ADD(wd->damage, wd->damage2, damagevalue); #ifdef RENEWAL @@ -3691,8 +3691,8 @@ static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list * #endif sstatus->batk + sstatus->rhw.atk + (index >= 0 && sd->inventory_data[index] ? sd->inventory_data[index]->atk : 0)) * (skill_lv + 5) / 5; - if (sc && sc->data[SC_KAGEMUSYA]) - damagevalue += damagevalue * sc->data[SC_KAGEMUSYA]->val2 / 100; + if (sc && sc->getSCE(SC_KAGEMUSYA)) + damagevalue += damagevalue * sc->getSCE(SC_KAGEMUSYA)->val2 / 100; ATK_ADD(wd->damage, wd->damage2, damagevalue); #ifdef RENEWAL ATK_ADD(wd->weaponAtk, wd->weaponAtk2, damagevalue); @@ -3711,7 +3711,7 @@ static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list * battle_calc_damage_parts(wd, src, target, skill_id, skill_lv); else { i = (is_attack_critical(wd, src, target, skill_id, skill_lv, false)?1:0)| - (!skill_id && sc && sc->data[SC_CHANGE]?4:0); + (!skill_id && sc && sc->getSCE(SC_CHANGE)?4:0); wd->damage = battle_calc_base_damage(src, sstatus, &sstatus->rhw, sc, tstatus->size, i); if (is_attack_left_handed(src, skill_id)) @@ -3721,9 +3721,9 @@ static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list * i = (is_attack_critical(wd, src, target, skill_id, skill_lv, false)?1:0)| (is_skill_using_arrow(src, skill_id)?2:0)| (skill_id == HW_MAGICCRASHER?4:0)| - (!skill_id && sc && sc->data[SC_CHANGE]?4:0)| + (!skill_id && sc && sc->getSCE(SC_CHANGE)?4:0)| (skill_id == MO_EXTREMITYFIST?8:0)| - (sc && sc->data[SC_WEAPONPERFECTION]?8:0); + (sc && sc->getSCE(SC_WEAPONPERFECTION)?8:0); if (is_skill_using_arrow(src, skill_id) && sd) { switch(sd->status.weapon) { case W_BOW: @@ -3828,12 +3828,12 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s if( ( ( skill_lv = pc_checkskill(sd,TF_DOUBLE) ) > 0 && sd->weapontype1 == W_DAGGER ) || ( pc_checkskill_flag(*sd, TF_DOUBLE) > SKILL_FLAG_PERMANENT && sd->weapontype1 != W_FIST ) || ( sd->bonus.double_rate > 0 && sd->weapontype1 != W_FIST ) // Will fail bare-handed - || ( sc && sc->data[SC_KAGEMUSYA] && sd->weapontype1 != W_FIST )) // Will fail bare-handed + || ( sc && sc->getSCE(SC_KAGEMUSYA) && sd->weapontype1 != W_FIST )) // Will fail bare-handed { //Success chance is not added, the higher one is used [Skotlex] int max_rate = 0; - if (sc && sc->data[SC_KAGEMUSYA]) - max_rate = sc->data[SC_KAGEMUSYA]->val1 * 10; // Same rate as even levels of TF_DOUBLE + if (sc && sc->getSCE(SC_KAGEMUSYA)) + max_rate = sc->getSCE(SC_KAGEMUSYA)->val1 * 10; // Same rate as even levels of TF_DOUBLE else #ifdef RENEWAL max_rate = max(7 * skill_lv, sd->bonus.double_rate); @@ -3847,7 +3847,7 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s } } else if( ((sd->weapontype1 == W_REVOLVER && (skill_lv = pc_checkskill(sd,GS_CHAINACTION)) > 0) //Normal Chain Action effect - || (sc && sc->count && sc->data[SC_E_CHAIN] && (skill_lv = sc->data[SC_E_CHAIN]->val1) > 0)) //Chain Action of ETERNAL_CHAIN + || (sc && sc->count && sc->getSCE(SC_E_CHAIN) && (skill_lv = sc->getSCE(SC_E_CHAIN)->val1) > 0)) //Chain Action of ETERNAL_CHAIN && rnd()%100 < 5*skill_lv ) //Success rate { wd->div_ = skill_get_num(GS_CHAINACTION,skill_lv); @@ -3855,11 +3855,11 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s sc_start(src,src,SC_QD_SHOT_READY,100,target->id,skill_get_time(RL_QD_SHOT,1)); } - else if(sc && sc->data[SC_FEARBREEZE] && sd->weapontype1==W_BOW + else if(sc && sc->getSCE(SC_FEARBREEZE) && sd->weapontype1==W_BOW && (i = sd->equip_index[EQI_AMMO]) >= 0 && sd->inventory_data[i] && sd->inventory.u.items_inventory[i].amount > 1) { int chance = rnd()%100; - switch(sc->data[SC_FEARBREEZE]->val1) { + switch(sc->getSCE(SC_FEARBREEZE)->val1) { case 5: if( chance < 4) { wd->div_ = 5; break; } // 3 % chance to attack 5 times. case 4: if( chance < 7) { wd->div_ = 4; break; } // 6 % chance to attack 4 times. case 3: if( chance < 10) { wd->div_ = 3; break; } // 9 % chance to attack 3 times. @@ -3867,7 +3867,7 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s case 1: if( chance < 13) { wd->div_ = 2; break; } // 12 % chance to attack 2 times. } wd->div_ = min(wd->div_,sd->inventory.u.items_inventory[i].amount); - sc->data[SC_FEARBREEZE]->val4 = wd->div_-1; + sc->getSCE(SC_FEARBREEZE)->val4 = wd->div_-1; if (wd->div_ > 1) wd->type = DMG_MULTI_HIT; } @@ -3886,10 +3886,10 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s wd->div_ = (sd ? max(1, skill_lv) : 1); break; case RL_QD_SHOT: - wd->div_ = 1 + (sd ? sd->status.job_level : 1) / 20 + (tsc && tsc->data[SC_C_MARKER] ? 2 : 0); + wd->div_ = 1 + (sd ? sd->status.job_level : 1) / 20 + (tsc && tsc->getSCE(SC_C_MARKER) ? 2 : 0); break; case KO_JYUMONJIKIRI: - if( tsc && tsc->data[SC_JYUMONJIKIRI] ) + if( tsc && tsc->getSCE(SC_JYUMONJIKIRI) ) wd->div_ = wd->div_ * -1;// needs more info break; #ifdef RENEWAL @@ -3926,24 +3926,24 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * //Skill damage modifiers that stack linearly if(sc && skill_id != PA_SACRIFICE) { - if(sc->data[SC_OVERTHRUST]) - skillratio += sc->data[SC_OVERTHRUST]->val3; - if(sc->data[SC_MAXOVERTHRUST]) - skillratio += sc->data[SC_MAXOVERTHRUST]->val2; - if(sc->data[SC_BERSERK]) + if(sc->getSCE(SC_OVERTHRUST)) + skillratio += sc->getSCE(SC_OVERTHRUST)->val3; + if(sc->getSCE(SC_MAXOVERTHRUST)) + skillratio += sc->getSCE(SC_MAXOVERTHRUST)->val2; + if(sc->getSCE(SC_BERSERK)) #ifndef RENEWAL skillratio += 100; #else skillratio += 200; - if (sc && sc->data[SC_TRUESIGHT]) - skillratio += 2 * sc->data[SC_TRUESIGHT]->val1; - if (sc->data[SC_CONCENTRATION] && (skill_id != RK_DRAGONBREATH && skill_id != RK_DRAGONBREATH_WATER && skill_id != NPC_DRAGONBREATH)) - skillratio += sc->data[SC_CONCENTRATION]->val2; - if (sc && sc->data[SC_VIGOR])// Lacking info on how damage is increased. Guessing for now. [Rytech] + if (sc && sc->getSCE(SC_TRUESIGHT)) + skillratio += 2 * sc->getSCE(SC_TRUESIGHT)->val1; + if (sc->getSCE(SC_CONCENTRATION) && (skill_id != RK_DRAGONBREATH && skill_id != RK_DRAGONBREATH_WATER && skill_id != NPC_DRAGONBREATH)) + skillratio += sc->getSCE(SC_CONCENTRATION)->val2; + if (sc && sc->getSCE(SC_VIGOR))// Lacking info on how damage is increased. Guessing for now. [Rytech] skillratio += skillratio * 50 / 100; #endif if (!skill_id || skill_id == KN_AUTOCOUNTER) { - if (sc->data[SC_CRUSHSTRIKE]) { + if (sc->getSCE(SC_CRUSHSTRIKE)) { if (sd) { //ATK [{Weapon Level * (Weapon Upgrade Level + 6) * 100} + (Weapon ATK) + (Weapon Weight)]% short index = sd->equip_index[EQI_HAND_R]; @@ -3954,7 +3954,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * status_change_end(src,SC_CRUSHSTRIKE); skill_break_equip(src,src,EQP_WEAPON,2000,BCT_SELF); } else { - if (sc->data[SC_GIANTGROWTH] && (sd->class_&MAPID_THIRDMASK) == MAPID_RUNE_KNIGHT) { // Increase damage again if Crush Strike is not active + if (sc->getSCE(SC_GIANTGROWTH) && (sd->class_&MAPID_THIRDMASK) == MAPID_RUNE_KNIGHT) { // Increase damage again if Crush Strike is not active if (map_flag_vs(src->m)) // Only half of the 2.5x increase on versus-type maps skillratio += 125; else @@ -4006,7 +4006,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * #endif case KN_PIERCE: skillratio += 10 * skill_lv; - if (sc && sc->data[SC_CHARGINGPIERCE_COUNT] && sc->data[SC_CHARGINGPIERCE_COUNT]->val1 >= 10) + if (sc && sc->getSCE(SC_CHARGINGPIERCE_COUNT) && sc->getSCE(SC_CHARGINGPIERCE_COUNT)->val1 >= 10) skillratio *= 2; break; case ML_PIERCE: @@ -4155,7 +4155,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case MO_FINGEROFFENSIVE: #ifdef RENEWAL skillratio += 500 + skill_lv * 200; - if (tsc && tsc->data[SC_BLADESTOP]) + if (tsc && tsc->getSCE(SC_BLADESTOP)) skillratio += skillratio / 2; #else skillratio += 50 * skill_lv; @@ -4164,7 +4164,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case MO_INVESTIGATE: #ifdef RENEWAL skillratio += -100 + 100 * skill_lv; - if (tsc && tsc->data[SC_BLADESTOP]) + if (tsc && tsc->getSCE(SC_BLADESTOP)) skillratio += skillratio / 2; #else skillratio += 75 * skill_lv; @@ -4196,7 +4196,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * #else skillratio += 140 + 60 * skill_lv; #endif - if (sc->data[SC_GT_ENERGYGAIN]) + if (sc->getSCE(SC_GT_ENERGYGAIN)) skillratio += skillratio * 50 / 100; break; case BA_MUSICALSTRIKE: @@ -4214,7 +4214,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * #else skillratio += -60 + 100 * skill_lv; #endif - if (sc->data[SC_GT_ENERGYGAIN]) + if (sc->getSCE(SC_GT_ENERGYGAIN)) skillratio += skillratio * 50 / 100; break; case CH_CHAINCRUSH: @@ -4224,7 +4224,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * #else skillratio += 300 + 100 * skill_lv; #endif - if (sc->data[SC_GT_ENERGYGAIN]) + if (sc->getSCE(SC_GT_ENERGYGAIN)) skillratio += skillratio * 50 / 100; break; case CH_PALMSTRIKE: @@ -4240,7 +4240,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * break; case LK_JOINTBEAT: skillratio += 10 * skill_lv - 50; - if (wd->miscflag & BREAK_NECK || (tsc && tsc->data[SC_JOINTBEAT] && tsc->data[SC_JOINTBEAT]->val2 & BREAK_NECK)) // The 2x damage is only for the BREAK_NECK ailment. + if (wd->miscflag & BREAK_NECK || (tsc && tsc->getSCE(SC_JOINTBEAT) && tsc->getSCE(SC_JOINTBEAT)->val2 & BREAK_NECK)) // The 2x damage is only for the BREAK_NECK ailment. skillratio <<= 1; break; #ifdef RENEWAL @@ -4248,7 +4248,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case LK_SPIRALPIERCE: skillratio += 50 + 50 * skill_lv; RE_LVL_DMOD(100); - if (sc && sc->data[SC_CHARGINGPIERCE_COUNT] && sc->data[SC_CHARGINGPIERCE_COUNT]->val1 >= 10) + if (sc && sc->getSCE(SC_CHARGINGPIERCE_COUNT) && sc->getSCE(SC_CHARGINGPIERCE_COUNT)->val1 >= 10) skillratio *= 2; break; case ML_SPIRALPIERCE: @@ -4324,7 +4324,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * #else skillratio += 30 * skill_lv; #endif - if (sc && sc->data[SC_SHIELD_POWER])// Whats the official increase? [Rytech] + if (sc && sc->getSCE(SC_SHIELD_POWER))// Whats the official increase? [Rytech] skillratio += skillratio * 50 / 100; break; case WS_CARTTERMINATION: @@ -4346,11 +4346,11 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * break; case TK_JUMPKICK: //Different damage formulas depending on damage trigger - if (sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == skill_id) + if (sc && sc->getSCE(SC_COMBO) && sc->getSCE(SC_COMBO)->val1 == skill_id) skillratio += -100 + 4 * status_get_lv(src); //Tumble formula [4%*baselevel] else if (wd->miscflag) { skillratio += -100 + 4 * status_get_lv(src); //Running formula [4%*baselevel] - if (sc && sc->data[SC_SPURT]) //Spurt formula [8%*baselevel] + if (sc && sc->getSCE(SC_SPURT)) //Spurt formula [8%*baselevel] skillratio *= 2; } else @@ -4382,7 +4382,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * break; case GS_DESPERADO: skillratio += 50 * (skill_lv - 1); - if (sc && sc->data[SC_FALLEN_ANGEL]) + if (sc && sc->getSCE(SC_FALLEN_ANGEL)) skillratio *= 2; break; case GS_DUST: @@ -4487,9 +4487,9 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += 50 * pc_checkskill(sd,LK_SPIRALPIERCE); RE_LVL_DMOD(100); if (sc) { - if (sc->data[SC_CHARGINGPIERCE_COUNT] && sc->data[SC_CHARGINGPIERCE_COUNT]->val1 >= 10) + if (sc->getSCE(SC_CHARGINGPIERCE_COUNT) && sc->getSCE(SC_CHARGINGPIERCE_COUNT)->val1 >= 10) skillratio *= 2; - if (sc->data[SC_DRAGONIC_AURA])// Need official damage increase. [Rytech] + if (sc->getSCE(SC_DRAGONIC_AURA))// Need official damage increase. [Rytech] skillratio += skillratio * 50 / 100; } break; @@ -4552,8 +4552,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case GC_CROSSRIPPERSLASHER: skillratio += -100 + 80 * skill_lv + (sstatus->agi * 3); RE_LVL_DMOD(100); - if (sc && sc->data[SC_ROLLINGCUTTER]) - skillratio += sc->data[SC_ROLLINGCUTTER]->val1 * 200; + if (sc && sc->getSCE(SC_ROLLINGCUTTER)) + skillratio += sc->getSCE(SC_ROLLINGCUTTER)->val1 * 200; break; case GC_DARKCROW: skillratio += 100 * (skill_lv - 1); @@ -4574,14 +4574,14 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += 500 + 500 * skill_lv; // Level 1-5 is using fire element, like RK_DRAGONBREATH break; case RA_ARROWSTORM: - if (sc && sc->data[SC_FEARBREEZE]) + if (sc && sc->getSCE(SC_FEARBREEZE)) skillratio += -100 + 200 + 250 * skill_lv; else skillratio += -100 + 200 + 180 * skill_lv; RE_LVL_DMOD(100); break; case RA_AIMEDBOLT: - if (sc && sc->data[SC_FEARBREEZE]) + if (sc && sc->getSCE(SC_FEARBREEZE)) skillratio += -100 + 800 + 35 * skill_lv; else skillratio += -100 + 500 + 20 * skill_lv; @@ -4638,7 +4638,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case NC_POWERSWING: // According to current sources, only the str + dex gets modified by level [Akinari] skillratio += -100 + ((sstatus->str + sstatus->dex)/ 2) + 300 + 100 * skill_lv; RE_LVL_DMOD(100); - if (sc && sc->data[SC_ABR_BATTLE_WARIOR]) + if (sc && sc->getSCE(SC_ABR_BATTLE_WARIOR)) skillratio *= 2; break; case NC_MAGMA_ERUPTION: // 'Slam' damage @@ -4647,13 +4647,13 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case NC_AXETORNADO: skillratio += -100 + 200 + 180 * skill_lv + sstatus->vit / 6; // !TODO: What's the VIT bonus? RE_LVL_DMOD(100); - if (sc && sc->data[SC_AXE_STOMP])// Whats the official increase? [Rytech] + if (sc && sc->getSCE(SC_AXE_STOMP))// Whats the official increase? [Rytech] skillratio += skillratio * 50 / 100; break; case SC_FATALMENACE: skillratio += 120 * skill_lv + sstatus->agi / 6; // !TODO: What's the AGI bonus? RE_LVL_DMOD(100); - if (sc && sc->data[SC_ABYSS_DAGGER]) + if (sc && sc->getSCE(SC_ABYSS_DAGGER)) skillratio += skillratio * 50 / 100; break; case SC_TRIANGLESHOT: @@ -4667,13 +4667,13 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case LG_CANNONSPEAR: skillratio += -100 + skill_lv * (50 + sstatus->str); RE_LVL_DMOD(100); - if (sc && sc->data[SC_SPEAR_SCAR])// Whats the official increase? [Rytech] + if (sc && sc->getSCE(SC_SPEAR_SCAR))// Whats the official increase? [Rytech] skillratio += skillratio * 50 / 100; break; case LG_BANISHINGPOINT: skillratio += -100 + (80 * skill_lv) + ((sd) ? pc_checkskill(sd,SM_BASH) * 30 : 0); RE_LVL_DMOD(100); - if (sc && sc->data[SC_SPEAR_SCAR])// Whats the official increase? [Rytech] + if (sc && sc->getSCE(SC_SPEAR_SCAR))// Whats the official increase? [Rytech] skillratio += skillratio * 50 / 100; break; case LG_SHIELDPRESS: @@ -4685,7 +4685,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += sd->inventory_data[index]->weight / 10; } RE_LVL_DMOD(100); - if (sc && sc->data[SC_SHIELD_POWER])// Whats the official increase? [Rytech] + if (sc && sc->getSCE(SC_SHIELD_POWER))// Whats the official increase? [Rytech] skillratio += skillratio * 50 / 100; break; case LG_PINPOINTATTACK: @@ -4704,7 +4704,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case LG_OVERBRAND: - if(sc && sc->data[SC_OVERBRANDREADY]) + if(sc && sc->getSCE(SC_OVERBRANDREADY)) skillratio += -100 + 450 * skill_lv; else skillratio += -100 + 300 * skill_lv; @@ -4714,11 +4714,11 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case LG_EARTHDRIVE: skillratio += -100 + 380 * skill_lv + ((sstatus->str + sstatus->vit) / 6); // !TODO: What's the STR/VIT bonus? RE_LVL_DMOD(100); - if (sc && sc->data[SC_SHIELD_POWER])// Whats the official increase? [Rytech] + if (sc && sc->getSCE(SC_SHIELD_POWER))// Whats the official increase? [Rytech] skillratio += skillratio * 50 / 100; break; case LG_HESPERUSLIT: - if (sc && sc->data[SC_INSPIRATION]) + if (sc && sc->getSCE(SC_INSPIRATION)) skillratio += -100 + 450 * skill_lv; else skillratio += -100 + 300 * skill_lv; @@ -4726,7 +4726,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case SR_EARTHSHAKER: - if (tsc && ((tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK)) || tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_STEALTHFIELD] || tsc->data[SC__SHADOWFORM])) { + if (tsc && ((tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK)) || tsc->getSCE(SC_CAMOUFLAGE) || tsc->getSCE(SC_STEALTHFIELD) || tsc->getSCE(SC__SHADOWFORM))) { //[(Skill Level x 300) x (Caster Base Level / 100) + (Caster STR x 3)] % skillratio += -100 + 300 * skill_lv; RE_LVL_DMOD(100); @@ -4760,7 +4760,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += -100 + (hp + sp) / 4; RE_LVL_DMOD(100); } - if (sc->data[SC_GT_REVITALIZE]) + if (sc->getSCE(SC_GT_REVITALIZE)) skillratio += skillratio * 30 / 100; break; case SR_SKYNETBLOW: @@ -4770,14 +4770,14 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * break; case SR_RAMPAGEBLASTER: - if (tsc && tsc->data[SC_EARTHSHAKER]) { + if (tsc && tsc->getSCE(SC_EARTHSHAKER)) { skillratio += 1400 + 550 * skill_lv; RE_LVL_DMOD(120); } else { skillratio += 900 + 350 * skill_lv; RE_LVL_DMOD(150); } - if (sc->data[SC_GT_CHANGE]) + if (sc->getSCE(SC_GT_CHANGE)) skillratio += skillratio * 30 / 100; break; case SR_KNUCKLEARROW: @@ -4793,7 +4793,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += 400 + 100 * skill_lv; RE_LVL_DMOD(100); } - if (sc->data[SC_GT_CHANGE]) + if (sc->getSCE(SC_GT_CHANGE)) skillratio += skillratio * 30 / 100; break; case SR_WINDMILL: // ATK [(Caster Base Level + Caster DEX) x Caster Base Level / 100] % @@ -4801,12 +4801,12 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case SR_GATEOFHELL: - if (sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE) + if (sc && sc->getSCE(SC_COMBO) && sc->getSCE(SC_COMBO)->val1 == SR_FALLENEMPIRE) skillratio += -100 + 800 * skill_lv; else skillratio += -100 + 500 * skill_lv; RE_LVL_DMOD(100); - if (sc->data[SC_GT_REVITALIZE]) + if (sc->getSCE(SC_GT_REVITALIZE)) skillratio += skillratio * 30 / 100; break; case SR_GENTLETOUCH_QUIET: @@ -4843,7 +4843,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += -100 + 200 * skill_lv; if(sd && sd->cart_weight) skillratio += sd->cart_weight / 10 / (150 - min(sd->status.str,120)) + pc_checkskill(sd,GN_REMODELING_CART) * 50; - if (sc && sc->data[SC_BIONIC_WOODENWARRIOR]) + if (sc && sc->getSCE(SC_BIONIC_WOODENWARRIOR)) skillratio *= 2; } break; @@ -4854,7 +4854,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case GN_SPORE_EXPLOSION: skillratio += -100 + 400 + 200 * skill_lv; RE_LVL_DMOD(100); - if (sc && sc->data[SC_BIONIC_WOODEN_FAIRY]) + if (sc && sc->getSCE(SC_BIONIC_WOODEN_FAIRY)) skillratio *= 2; break; case GN_WALLOFTHORN: @@ -4928,16 +4928,16 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case KO_JYUMONJIKIRI: skillratio += -100 + 200 * skill_lv; RE_LVL_DMOD(120); - if(tsc && tsc->data[SC_JYUMONJIKIRI]) + if(tsc && tsc->getSCE(SC_JYUMONJIKIRI)) skillratio += skill_lv * status_get_lv(src); - if (sc && sc->data[SC_KAGEMUSYA]) - skillratio += skillratio * sc->data[SC_KAGEMUSYA]->val2 / 100; + if (sc && sc->getSCE(SC_KAGEMUSYA)) + skillratio += skillratio * sc->getSCE(SC_KAGEMUSYA)->val2 / 100; break; case KO_HUUMARANKA: skillratio += -100 + 150 * skill_lv + sstatus->str + (sd ? pc_checkskill(sd,NJ_HUUMA) * 100 : 0); RE_LVL_DMOD(100); - if (sc && sc->data[SC_KAGEMUSYA]) - skillratio += skillratio * sc->data[SC_KAGEMUSYA]->val2 / 100; + if (sc && sc->getSCE(SC_KAGEMUSYA)) + skillratio += skillratio * sc->getSCE(SC_KAGEMUSYA)->val2 / 100; break; case KO_SETSUDAN: skillratio += 100 * (skill_lv - 1); @@ -4945,7 +4945,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * if (tsc) { struct status_change_entry *sce; - if ((sce = tsc->data[SC_SPIRIT]) || (sce = tsc->data[SC_SOULGOLEM]) || (sce = tsc->data[SC_SOULSHADOW]) || (sce = tsc->data[SC_SOULFALCON]) || (sce = tsc->data[SC_SOULFAIRY])) // Bonus damage added when target is soul linked. + if ((sce = tsc->getSCE(SC_SPIRIT)) || (sce = tsc->getSCE(SC_SOULGOLEM)) || (sce = tsc->getSCE(SC_SOULSHADOW)) || (sce = tsc->getSCE(SC_SOULFALCON)) || (sce = tsc->getSCE(SC_SOULFAIRY))) // Bonus damage added when target is soul linked. skillratio += 200 * sce->val1; } break; @@ -4953,8 +4953,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += -100 + (sd ? pc_checkskill(sd,NJ_TOBIDOUGU) : 1) * (50 + sstatus->dex / 4) * skill_lv * 4 / 10; RE_LVL_DMOD(120); skillratio += 10 * (sd ? sd->status.job_level : 1); - if (sc && sc->data[SC_KAGEMUSYA]) - skillratio += skillratio * sc->data[SC_KAGEMUSYA]->val2 / 100; + if (sc && sc->getSCE(SC_KAGEMUSYA)) + skillratio += skillratio * sc->getSCE(SC_KAGEMUSYA)->val2 / 100; break; case KO_MAKIBISHI: skillratio += -100 + 20 * skill_lv; @@ -5069,8 +5069,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case SJ_FULLMOONKICK: skillratio += 1000 + 100 * skill_lv; RE_LVL_DMOD(100); - if (sc && sc->data[SC_LIGHTOFMOON]) - skillratio += skillratio * sc->data[SC_LIGHTOFMOON]->val2 / 100; + if (sc && sc->getSCE(SC_LIGHTOFMOON)) + skillratio += skillratio * sc->getSCE(SC_LIGHTOFMOON)->val2 / 100; break; case SJ_NEWMOONKICK: skillratio += 600 + 100 * skill_lv; @@ -5081,8 +5081,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case SJ_SOLARBURST: skillratio += 900 + 220 * skill_lv; RE_LVL_DMOD(100); - if (sc && sc->data[SC_LIGHTOFSUN]) - skillratio += skillratio * sc->data[SC_LIGHTOFSUN]->val2 / 100; + if (sc && sc->getSCE(SC_LIGHTOFSUN)) + skillratio += skillratio * sc->getSCE(SC_LIGHTOFSUN)->val2 / 100; break; case SJ_PROMINENCEKICK: skillratio += 50 + 50 * skill_lv; @@ -5091,8 +5091,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case SJ_FALLINGSTAR_ATK2: skillratio += 100 * skill_lv; RE_LVL_DMOD(100); - if (sc && sc->data[SC_LIGHTOFSTAR]) - skillratio += skillratio * sc->data[SC_LIGHTOFSTAR]->val2 / 100; + if (sc && sc->getSCE(SC_LIGHTOFSTAR)) + skillratio += skillratio * sc->getSCE(SC_LIGHTOFSTAR)->val2 / 100; break; case DK_SERVANTWEAPON_ATK: skillratio += 50 + 50 * skill_lv + 5 * sstatus->pow; @@ -5129,13 +5129,13 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case DK_MADNESS_CRUSHER:// How does weight affect the damage? [Rytech] skillratio += -100 + 450 * skill_lv + 5 * sstatus->pow; RE_LVL_DMOD(100); - if (sc && sc->data[SC_CHARGINGPIERCE_COUNT] && sc->data[SC_CHARGINGPIERCE_COUNT]->val1 >= 10) + if (sc && sc->getSCE(SC_CHARGINGPIERCE_COUNT) && sc->getSCE(SC_CHARGINGPIERCE_COUNT)->val1 >= 10) skillratio *= 2; break; case DK_STORMSLASH: skillratio += -100 + 120 * skill_lv + 5 * sstatus->pow; RE_LVL_DMOD(100); - if (sc && sc->data[SC_GIANTGROWTH]) + if (sc && sc->getSCE(SC_GIANTGROWTH)) skillratio *= 2; break; case IQ_OLEUM_SANCTUM: @@ -5151,7 +5151,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case IQ_EXPOSION_BLASTER: skillratio += -100 + 450 * skill_lv + 5 * sstatus->pow; RE_LVL_DMOD(100); - if (tsc && tsc->data[SC_HOLY_OIL]) + if (tsc && tsc->getSCE(SC_HOLY_OIL)) skillratio += skillratio * 50 / 100; break; case IQ_FIRST_BRAND: @@ -5292,17 +5292,17 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case WH_GALESTORM: skillratio += -100 + 250 * skill_lv + 5 * sstatus->con; RE_LVL_DMOD(100); - if (sc && sc->data[SC_CALAMITYGALE] && (tstatus->race == RC_BRUTE || tstatus->race == RC_FISH)) + if (sc && sc->getSCE(SC_CALAMITYGALE) && (tstatus->race == RC_BRUTE || tstatus->race == RC_FISH)) skillratio += skillratio * 50 / 100; break; case WH_CRESCIVE_BOLT: skillratio += -100 + 300 * skill_lv + 5 * sstatus->con; RE_LVL_DMOD(100); if (sc) { // At level 10 the SP usage of 100 increased by 20 on each count. So maybe damage increase is 20%??? [Rytech] - if (sc->data[SC_CRESCIVEBOLT]) - skillratio += skillratio * (20 * sc->data[SC_CRESCIVEBOLT]->val1) / 100; + if (sc->getSCE(SC_CRESCIVEBOLT)) + skillratio += skillratio * (20 * sc->getSCE(SC_CRESCIVEBOLT)->val1) / 100; - if (sc->data[SC_CALAMITYGALE]) { + if (sc->getSCE(SC_CALAMITYGALE)) { skillratio += skillratio * 20 / 100; if (tstatus->race == RC_BRUTE || tstatus->race == RC_FISH) @@ -5328,7 +5328,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case BO_ACIDIFIED_ZONE_FIRE_ATK: skillratio += -100 + 250 * skill_lv + 5 * sstatus->pow; RE_LVL_DMOD(100); - if (sc && sc->data[SC_RESEARCHREPORT]) { // Does this also affect skills like acid demo? [Rytech] + if (sc && sc->getSCE(SC_RESEARCHREPORT)) { // Does this also affect skills like acid demo? [Rytech] skillratio += skillratio * 50 / 100; if (tstatus->race == RC_FORMLESS || tstatus->race == RC_PLANT) @@ -5344,25 +5344,25 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case TR_ROSEBLOSSOM_ATK:// Same damage formula? [Rytech] skillratio += -100 + 500 * skill_lv + (sd ? pc_checkskill(sd, TR_STAGE_MANNER) : 5) * sstatus->con; RE_LVL_DMOD(100); - if (sc && sc->data[SC_MYSTIC_SYMPHONY]) { + if (sc && sc->getSCE(SC_MYSTIC_SYMPHONY)) { skillratio += skillratio * 40 / 100; if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN) skillratio += skillratio * 50 / 100; } - if (tsc && tsc->data[SC_SOUNDBLEND]) + if (tsc && tsc->getSCE(SC_SOUNDBLEND)) skillratio += skillratio * 50 / 100; break; case TR_RHYTHMSHOOTING: skillratio += -100 + 120 * skill_lv + (sd ? pc_checkskill(sd, TR_STAGE_MANNER) : 5) * sstatus->con; RE_LVL_DMOD(100); - if (sc && sc->data[SC_MYSTIC_SYMPHONY]) { + if (sc && sc->getSCE(SC_MYSTIC_SYMPHONY)) { skillratio += skillratio * 40 / 100; if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN) skillratio += skillratio * 50 / 100; } - if (tsc && tsc->data[SC_SOUNDBLEND]) + if (tsc && tsc->getSCE(SC_SOUNDBLEND)) skillratio += skillratio * 50 / 100; break; case ABR_BATTLE_BUSTER:// Need official formula. @@ -5458,13 +5458,13 @@ static void battle_attack_sc_bonus(struct Damage* wd, struct block_list *src, st //The following are applied on top of current damage and are stackable. if (sc) { #ifdef RENEWAL - if (sc->data[SC_WATK_ELEMENT] && skill_id != ASC_METEORASSAULT) - ATK_ADDRATE(wd->weaponAtk, wd->weaponAtk2, sc->data[SC_WATK_ELEMENT]->val2); - if (sc->data[SC_DRUMBATTLE]) - ATK_ADD(wd->equipAtk, wd->equipAtk2, sc->data[SC_DRUMBATTLE]->val2); - if (sc->data[SC_MADNESSCANCEL]) + if (sc->getSCE(SC_WATK_ELEMENT) && skill_id != ASC_METEORASSAULT) + ATK_ADDRATE(wd->weaponAtk, wd->weaponAtk2, sc->getSCE(SC_WATK_ELEMENT)->val2); + if (sc->getSCE(SC_DRUMBATTLE)) + ATK_ADD(wd->equipAtk, wd->equipAtk2, sc->getSCE(SC_DRUMBATTLE)->val2); + if (sc->getSCE(SC_MADNESSCANCEL)) ATK_ADD(wd->equipAtk, wd->equipAtk2, 100); - if (sc->data[SC_MAGICALBULLET]) { + if (sc->getSCE(SC_MAGICALBULLET)) { short tmdef = tstatus->mdef + tstatus->mdef2; if (sstatus->matk_min > tmdef && sstatus->matk_max > sstatus->matk_min) { @@ -5473,24 +5473,24 @@ static void battle_attack_sc_bonus(struct Damage* wd, struct block_list *src, st ATK_ADD(wd->weaponAtk, wd->weaponAtk2, i64max(sstatus->matk_min - tmdef, 0)); } } - if (sc->data[SC_GATLINGFEVER]) - ATK_ADD(wd->equipAtk, wd->equipAtk2, sc->data[SC_GATLINGFEVER]->val3); + if (sc->getSCE(SC_GATLINGFEVER)) + ATK_ADD(wd->equipAtk, wd->equipAtk2, sc->getSCE(SC_GATLINGFEVER)->val3); #else - if (sc->data[SC_TRUESIGHT]) - ATK_ADDRATE(wd->damage, wd->damage2, 2 * sc->data[SC_TRUESIGHT]->val1); + if (sc->getSCE(SC_TRUESIGHT)) + ATK_ADDRATE(wd->damage, wd->damage2, 2 * sc->getSCE(SC_TRUESIGHT)->val1); #endif - if (sc->data[SC_SPIRIT]) { - if (skill_id == AS_SONICBLOW && sc->data[SC_SPIRIT]->val2 == SL_ASSASIN) { + if (sc->getSCE(SC_SPIRIT)) { + if (skill_id == AS_SONICBLOW && sc->getSCE(SC_SPIRIT)->val2 == SL_ASSASIN) { ATK_ADDRATE(wd->damage, wd->damage2, map_flag_gvg2(src->m) ? 25 : 100); //+25% dmg on woe/+100% dmg on nonwoe RE_ALLATK_ADDRATE(wd, map_flag_gvg2(src->m) ? 25 : 100); //+25% dmg on woe/+100% dmg on nonwoe - } else if (skill_id == CR_SHIELDBOOMERANG && sc->data[SC_SPIRIT]->val2 == SL_CRUSADER) { + } else if (skill_id == CR_SHIELDBOOMERANG && sc->getSCE(SC_SPIRIT)->val2 == SL_CRUSADER) { ATK_ADDRATE(wd->damage, wd->damage2, 100); RE_ALLATK_ADDRATE(wd, 100); } } - if (sc->data[SC_GT_CHANGE]) - ATK_ADDRATE(wd->damage, wd->damage2, sc->data[SC_GT_CHANGE]->val1); - if (sc->data[SC_EDP]) { + if (sc->getSCE(SC_GT_CHANGE)) + ATK_ADDRATE(wd->damage, wd->damage2, sc->getSCE(SC_GT_CHANGE)->val1); + if (sc->getSCE(SC_EDP)) { switch(skill_id) { case AS_SPLASHER: case ASC_METEORASSAULT: @@ -5510,39 +5510,39 @@ static void battle_attack_sc_bonus(struct Damage* wd, struct block_list *src, st // Renewal EDP formula [helvetica] // weapon atk * (2.5 + (edp level * .3)) // equip atk * (2.5 + (edp level * .3)) - ATK_RATE(wd->weaponAtk, wd->weaponAtk2, 250 + (sc->data[SC_EDP]->val1 * 30)); - ATK_RATE(wd->equipAtk, wd->equipAtk2, 250 + (sc->data[SC_EDP]->val1 * 30)); + ATK_RATE(wd->weaponAtk, wd->weaponAtk2, 250 + (sc->getSCE(SC_EDP)->val1 * 30)); + ATK_RATE(wd->equipAtk, wd->equipAtk2, 250 + (sc->getSCE(SC_EDP)->val1 * 30)); break; #else default: - ATK_ADDRATE(wd->damage, wd->damage2, sc->data[SC_EDP]->val3); + ATK_ADDRATE(wd->damage, wd->damage2, sc->getSCE(SC_EDP)->val3); #endif } } - if (sc->data[SC_DANCEWITHWUG]) { + if (sc->getSCE(SC_DANCEWITHWUG)) { if (skill_get_inf2(skill_id, INF2_INCREASEDANCEWITHWUGDAMAGE)) { - ATK_ADDRATE(wd->damage, wd->damage2, sc->data[SC_DANCEWITHWUG]->val1 * 10 * battle_calc_chorusbonus(sd)); - RE_ALLATK_ADDRATE(wd, sc->data[SC_DANCEWITHWUG]->val1 * 10 * battle_calc_chorusbonus(sd)); + ATK_ADDRATE(wd->damage, wd->damage2, sc->getSCE(SC_DANCEWITHWUG)->val1 * 10 * battle_calc_chorusbonus(sd)); + RE_ALLATK_ADDRATE(wd, sc->getSCE(SC_DANCEWITHWUG)->val1 * 10 * battle_calc_chorusbonus(sd)); } - ATK_ADDRATE(wd->damage, wd->damage2, sc->data[SC_DANCEWITHWUG]->val1 * 2 * battle_calc_chorusbonus(sd)); + ATK_ADDRATE(wd->damage, wd->damage2, sc->getSCE(SC_DANCEWITHWUG)->val1 * 2 * battle_calc_chorusbonus(sd)); #ifdef RENEWAL - ATK_ADDRATE(wd->equipAtk, wd->equipAtk2, sc->data[SC_DANCEWITHWUG]->val1 * 2 * battle_calc_chorusbonus(sd)); + ATK_ADDRATE(wd->equipAtk, wd->equipAtk2, sc->getSCE(SC_DANCEWITHWUG)->val1 * 2 * battle_calc_chorusbonus(sd)); #endif } - if(sc->data[SC_ZENKAI] && sstatus->rhw.ele == sc->data[SC_ZENKAI]->val2) { + if(sc->getSCE(SC_ZENKAI) && sstatus->rhw.ele == sc->getSCE(SC_ZENKAI)->val2) { ATK_ADD(wd->damage, wd->damage2, 200); #ifdef RENEWAL ATK_ADD(wd->equipAtk, wd->equipAtk2, 200); #endif } - if (sc->data[SC_EQC]) { - ATK_ADDRATE(wd->damage, wd->damage2, -sc->data[SC_EQC]->val2); + if (sc->getSCE(SC_EQC)) { + ATK_ADDRATE(wd->damage, wd->damage2, -sc->getSCE(SC_EQC)->val2); #ifdef RENEWAL - ATK_ADDRATE(wd->equipAtk, wd->equipAtk2, -sc->data[SC_EQC]->val2); + ATK_ADDRATE(wd->equipAtk, wd->equipAtk2, -sc->getSCE(SC_EQC)->val2); #endif } - if(sc->data[SC_STYLE_CHANGE]) { + if(sc->getSCE(SC_STYLE_CHANGE)) { TBL_HOM *hd = BL_CAST(BL_HOM,src); if(hd) { @@ -5550,52 +5550,52 @@ static void battle_attack_sc_bonus(struct Damage* wd, struct block_list *src, st RE_ALLATK_ADD(wd, hd->homunculus.spiritball * 3); } } - if(sc->data[SC_UNLIMIT] && (wd->flag&(BF_LONG|BF_MAGIC)) == BF_LONG) { + if(sc->getSCE(SC_UNLIMIT) && (wd->flag&(BF_LONG|BF_MAGIC)) == BF_LONG) { switch(skill_id) { case RA_WUGDASH: case RA_WUGSTRIKE: case RA_WUGBITE: break; default: - ATK_ADDRATE(wd->damage, wd->damage2, sc->data[SC_UNLIMIT]->val2); - RE_ALLATK_ADDRATE(wd, sc->data[SC_UNLIMIT]->val2); + ATK_ADDRATE(wd->damage, wd->damage2, sc->getSCE(SC_UNLIMIT)->val2); + RE_ALLATK_ADDRATE(wd, sc->getSCE(SC_UNLIMIT)->val2); break; } } - if (sc->data[SC_HEAT_BARREL]) { - ATK_ADDRATE(wd->damage, wd->damage2, sc->data[SC_HEAT_BARREL]->val3); - RE_ALLATK_ADDRATE(wd, sc->data[SC_HEAT_BARREL]->val3); + if (sc->getSCE(SC_HEAT_BARREL)) { + ATK_ADDRATE(wd->damage, wd->damage2, sc->getSCE(SC_HEAT_BARREL)->val3); + RE_ALLATK_ADDRATE(wd, sc->getSCE(SC_HEAT_BARREL)->val3); } if((wd->flag&(BF_LONG|BF_MAGIC)) == BF_LONG) { - if (sc->data[SC_MTF_RANGEATK]) { // Monster Transformation bonus - ATK_ADDRATE(wd->damage, wd->damage2, sc->data[SC_MTF_RANGEATK]->val1); - RE_ALLATK_ADDRATE(wd, sc->data[SC_MTF_RANGEATK]->val1); + if (sc->getSCE(SC_MTF_RANGEATK)) { // Monster Transformation bonus + ATK_ADDRATE(wd->damage, wd->damage2, sc->getSCE(SC_MTF_RANGEATK)->val1); + RE_ALLATK_ADDRATE(wd, sc->getSCE(SC_MTF_RANGEATK)->val1); } - if (sc->data[SC_MTF_RANGEATK2]) { // Monster Transformation bonus - ATK_ADDRATE(wd->damage, wd->damage2, sc->data[SC_MTF_RANGEATK2]->val1); - RE_ALLATK_ADDRATE(wd, sc->data[SC_MTF_RANGEATK2]->val1); + if (sc->getSCE(SC_MTF_RANGEATK2)) { // Monster Transformation bonus + ATK_ADDRATE(wd->damage, wd->damage2, sc->getSCE(SC_MTF_RANGEATK2)->val1); + RE_ALLATK_ADDRATE(wd, sc->getSCE(SC_MTF_RANGEATK2)->val1); } - if (sc->data[SC_ARCLOUSEDASH] && sc->data[SC_ARCLOUSEDASH]->val4) { - ATK_ADDRATE(wd->damage, wd->damage2, sc->data[SC_ARCLOUSEDASH]->val4); - RE_ALLATK_ADDRATE(wd, sc->data[SC_ARCLOUSEDASH]->val4); + if (sc->getSCE(SC_ARCLOUSEDASH) && sc->getSCE(SC_ARCLOUSEDASH)->val4) { + ATK_ADDRATE(wd->damage, wd->damage2, sc->getSCE(SC_ARCLOUSEDASH)->val4); + RE_ALLATK_ADDRATE(wd, sc->getSCE(SC_ARCLOUSEDASH)->val4); } } - if (sd && wd->flag&BF_WEAPON && sc->data[SC_GVG_GIANT] && sc->data[SC_GVG_GIANT]->val3) { - ATK_ADDRATE(wd->damage, wd->damage2, sc->data[SC_GVG_GIANT]->val3); - RE_ALLATK_ADDRATE(wd, sc->data[SC_GVG_GIANT]->val3); + if (sd && wd->flag&BF_WEAPON && sc->getSCE(SC_GVG_GIANT) && sc->getSCE(SC_GVG_GIANT)->val3) { + ATK_ADDRATE(wd->damage, wd->damage2, sc->getSCE(SC_GVG_GIANT)->val3); + RE_ALLATK_ADDRATE(wd, sc->getSCE(SC_GVG_GIANT)->val3); } - if (skill_id == 0 && sc->data[SC_EXEEDBREAK]) { - ATK_ADDRATE(wd->damage, wd->damage2, sc->data[SC_EXEEDBREAK]->val2); - RE_ALLATK_ADDRATE(wd, sc->data[SC_EXEEDBREAK]->val2); + if (skill_id == 0 && sc->getSCE(SC_EXEEDBREAK)) { + ATK_ADDRATE(wd->damage, wd->damage2, sc->getSCE(SC_EXEEDBREAK)->val2); + RE_ALLATK_ADDRATE(wd, sc->getSCE(SC_EXEEDBREAK)->val2); } - if (sc->data[SC_PYREXIA] && sc->data[SC_PYREXIA]->val3 == 0 && skill_id == 0) { - ATK_ADDRATE(wd->damage, wd->damage2, sc->data[SC_PYREXIA]->val2); - RE_ALLATK_ADDRATE(wd, sc->data[SC_PYREXIA]->val2); + if (sc->getSCE(SC_PYREXIA) && sc->getSCE(SC_PYREXIA)->val3 == 0 && skill_id == 0) { + ATK_ADDRATE(wd->damage, wd->damage2, sc->getSCE(SC_PYREXIA)->val2); + RE_ALLATK_ADDRATE(wd, sc->getSCE(SC_PYREXIA)->val2); } - if (sc->data[SC_MIRACLE]) + if (sc->getSCE(SC_MIRACLE)) anger_id = 2; // Always treat all monsters as star flagged monster when in miracle state } @@ -5662,8 +5662,8 @@ static void battle_calc_defense_reduction(struct Damage* wd, struct block_list * } } - if (sc && sc->data[SC_EXPIATIO]) { - short i = 5 * sc->data[SC_EXPIATIO]->val1; // 5% per level + if (sc && sc->getSCE(SC_EXPIATIO)) { + short i = 5 * sc->getSCE(SC_EXPIATIO)->val1; // 5% per level i = min(i,100); //cap it to 100 for 0 def min def1 = (def1*(100-i))/100; @@ -5671,25 +5671,25 @@ static void battle_calc_defense_reduction(struct Damage* wd, struct block_list * } if (tsc) { - if (tsc->data[SC_FORCEOFVANGUARD]) { - short i = 2 * tsc->data[SC_FORCEOFVANGUARD]->val1; + if (tsc->getSCE(SC_FORCEOFVANGUARD)) { + short i = 2 * tsc->getSCE(SC_FORCEOFVANGUARD)->val1; def1 = (def1 * (100 + i)) / 100; } - if( tsc->data[SC_CAMOUFLAGE] ){ - short i = 5 * tsc->data[SC_CAMOUFLAGE]->val3; //5% per second + if( tsc->getSCE(SC_CAMOUFLAGE) ){ + short i = 5 * tsc->getSCE(SC_CAMOUFLAGE)->val3; //5% per second i = min(i,100); //cap it to 100 for 0 def min def1 = (def1*(100-i))/100; def2 = (def2*(100-i))/100; } - if (tsc->data[SC_GT_REVITALIZE]) - def1 += tsc->data[SC_GT_REVITALIZE]->val4; + if (tsc->getSCE(SC_GT_REVITALIZE)) + def1 += tsc->getSCE(SC_GT_REVITALIZE)->val4; - if (tsc->data[SC_OVERED_BOOST] && target->type == BL_PC) - def1 = (def1 * tsc->data[SC_OVERED_BOOST]->val4) / 100; + if (tsc->getSCE(SC_OVERED_BOOST) && target->type == BL_PC) + def1 = (def1 * tsc->getSCE(SC_OVERED_BOOST)->val4) / 100; } if( battle_config.vit_penalty_type && battle_config.vit_penalty_target&target->type ) { @@ -5699,11 +5699,11 @@ static void battle_calc_defense_reduction(struct Damage* wd, struct block_list * target_count = min(unit_counttargeted(target), (100 / battle_config.vit_penalty_num) + (battle_config.vit_penalty_count - 1)); if(target_count >= battle_config.vit_penalty_count) { if(battle_config.vit_penalty_type == 1) { - if( !tsc || !tsc->data[SC_STEELBODY] ) + if( !tsc || !tsc->getSCE(SC_STEELBODY) ) def1 = (def1 * (100 - (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num))/100; def2 = (def2 * (100 - (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num))/100; } else { //Assume type 2 - if( !tsc || !tsc->data[SC_STEELBODY] ) + if( !tsc || !tsc->getSCE(SC_STEELBODY) ) def1 -= (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num; def2 -= (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num; } @@ -5742,7 +5742,7 @@ static void battle_calc_defense_reduction(struct Damage* wd, struct block_list * #ifndef RENEWAL //VIT + rnd(0,[VIT/20]^2-1) vit_def = (def2/20)*(def2/20); - if (tsc && tsc->data[SC_SKA]) + if (tsc && tsc->getSCE(SC_SKA)) vit_def += 100; //Eska increases the random part of the formula by 100 vit_def = def2 + (vit_def>0?rnd()%vit_def:0); #else @@ -5820,15 +5820,15 @@ static void battle_calc_attack_post_defense(struct Damage* wd, struct block_list // Post skill/vit reduction damage increases if( sc ) { // SC skill damages - if(sc->data[SC_AURABLADE] + if(sc->getSCE(SC_AURABLADE) #ifndef RENEWAL && skill_id != LK_SPIRALPIERCE && skill_id != ML_SPIRALPIERCE #endif ) { #ifdef RENEWAL - ATK_ADD(wd->damage, wd->damage2, (3 + sc->data[SC_AURABLADE]->val1) * status_get_lv(src)); // !TODO: Confirm formula + ATK_ADD(wd->damage, wd->damage2, (3 + sc->getSCE(SC_AURABLADE)->val1) * status_get_lv(src)); // !TODO: Confirm formula #else - ATK_ADD(wd->damage, wd->damage2, 20 * sc->data[SC_AURABLADE]->val1); + ATK_ADD(wd->damage, wd->damage2, 20 * sc->getSCE(SC_AURABLADE)->val1); #endif } } @@ -5998,8 +5998,8 @@ struct block_list *battle_check_devotion(struct block_list *bl) { if (battle_config.devotion_rdamage && battle_config.devotion_rdamage > rnd() % 100) { struct status_change *sc = status_get_sc(bl); - if (sc && sc->data[SC_DEVOTION]) - d_bl = map_id2bl(sc->data[SC_DEVOTION]->val1); + if (sc && sc->getSCE(SC_DEVOTION)) + d_bl = map_id2bl(sc->getSCE(SC_DEVOTION)->val1); } return d_bl; } @@ -6087,34 +6087,34 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo int skill_damage = 0; //Reject Sword bugreport:4493 by Daegaladh - if(wd->damage && tsc && tsc->data[SC_REJECTSWORD] && + if(wd->damage && tsc && tsc->getSCE(SC_REJECTSWORD) && (src->type!=BL_PC || ( ((TBL_PC *)src)->weapontype1 == W_DAGGER || ((TBL_PC *)src)->weapontype1 == W_1HSWORD || ((TBL_PC *)src)->status.weapon == W_2HSWORD )) && - rnd()%100 < tsc->data[SC_REJECTSWORD]->val2 + rnd()%100 < tsc->getSCE(SC_REJECTSWORD)->val2 ) { ATK_RATER(wd->damage, 50) - clif_skill_nodamage(target,target,ST_REJECTSWORD,tsc->data[SC_REJECTSWORD]->val1,1); + clif_skill_nodamage(target,target,ST_REJECTSWORD, tsc->getSCE(SC_REJECTSWORD)->val1,1); status_fix_damage(target,src,wd->damage,clif_damage(target,src,gettick(),0,0,wd->damage,0,DMG_NORMAL,0,false),ST_REJECTSWORD); if (status_isdead(target)) return; - if( --(tsc->data[SC_REJECTSWORD]->val3) <= 0 ) + if( --(tsc->getSCE(SC_REJECTSWORD)->val3) <= 0 ) status_change_end(target, SC_REJECTSWORD); } - if( tsc && tsc->data[SC_CRESCENTELBOW] && wd->flag&BF_SHORT && rnd()%100 < tsc->data[SC_CRESCENTELBOW]->val2 ) { + if( tsc && tsc->getSCE(SC_CRESCENTELBOW) && wd->flag&BF_SHORT && rnd()%100 < tsc->getSCE(SC_CRESCENTELBOW)->val2 ) { //ATK [{(Target HP / 100) x Skill Level} x Caster Base Level / 125] % + [Received damage x {1 + (Skill Level x 0.2)}] int64 rdamage = 0; - int ratio = (int64)(status_get_hp(src) / 100) * tsc->data[SC_CRESCENTELBOW]->val1 * status_get_lv(target) / 125; + int ratio = (int64)(status_get_hp(src) / 100) * tsc->getSCE(SC_CRESCENTELBOW)->val1 * status_get_lv(target) / 125; if (ratio > 5000) ratio = 5000; // Maximum of 5000% ATK rdamage = battle_calc_base_damage(target,tstatus,&tstatus->rhw,tsc,sstatus->size,0); - rdamage = (int64)rdamage * ratio / 100 + wd->damage * (10 + tsc->data[SC_CRESCENTELBOW]->val1 * 20 / 10) / 10; - skill_blown(target, src, skill_get_blewcount(SR_CRESCENTELBOW_AUTOSPELL, tsc->data[SC_CRESCENTELBOW]->val1), unit_getdir(src), BLOWN_NONE); + rdamage = (int64)rdamage * ratio / 100 + wd->damage * (10 + tsc->getSCE(SC_CRESCENTELBOW)->val1 * 20 / 10) / 10; + skill_blown(target, src, skill_get_blewcount(SR_CRESCENTELBOW_AUTOSPELL, tsc->getSCE(SC_CRESCENTELBOW)->val1), unit_getdir(src), BLOWN_NONE); clif_skill_damage(target, src, gettick(), status_get_amotion(src), 0, rdamage, - 1, SR_CRESCENTELBOW_AUTOSPELL, tsc->data[SC_CRESCENTELBOW]->val1, DMG_SINGLE); // This is how official does + 1, SR_CRESCENTELBOW_AUTOSPELL, tsc->getSCE(SC_CRESCENTELBOW)->val1, DMG_SINGLE); // This is how official does clif_damage(src, target, gettick(), status_get_amotion(src)+1000, 0, rdamage/10, 1, DMG_NORMAL, 0, false); status_damage(target, src, rdamage, 0, 0, 0, 0); status_damage(src, target, rdamage/10, 0, 0, 1, 0); @@ -6123,7 +6123,7 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo if( sc ) { //SC_FUSION hp penalty [Komurka] - if (sc->data[SC_FUSION]) { + if (sc->getSCE(SC_FUSION)) { unsigned int hp = sstatus->max_hp; if (sd && tsd) { @@ -6134,13 +6134,13 @@ static void battle_calc_weapon_final_atk_modifiers(struct Damage* wd, struct blo hp = 2*hp/100; //2% hp loss per hit status_zap(src, hp, 0); } - if (sc->data[SC_VIGOR]) - status_zap(src, sc->data[SC_VIGOR]->val2, 0); + if (sc->getSCE(SC_VIGOR)) + status_zap(src, sc->getSCE(SC_VIGOR)->val2, 0); // Only affecting non-skills if (!skill_id && wd->dmg_lv > ATK_BLOCK) { - if (sc->data[SC_ENCHANTBLADE]) { + if (sc->getSCE(SC_ENCHANTBLADE)) { //[((Skill Lv x 20) + 100) x (casterBaseLevel / 150)] + casterInt + MATK - MDEF - MDEF2 - int64 enchant_dmg = sc->data[SC_ENCHANTBLADE]->val2; + int64 enchant_dmg = sc->getSCE(SC_ENCHANTBLADE)->val2; if (sstatus->matk_max > sstatus->matk_min) enchant_dmg = enchant_dmg + sstatus->matk_min + rnd() % (sstatus->matk_max - sstatus->matk_min); else @@ -6282,15 +6282,15 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block case NC_BOOSTKNUCKLE: case NC_VULCANARM: case NC_ARMSCANNON: - if (sc && sc->data[SC_ABR_DUAL_CANNON]) + if (sc && sc->getSCE(SC_ABR_DUAL_CANNON)) wd.div_ = 2; break; case NC_POWERSWING: - if (sc && sc->data[SC_ABR_BATTLE_WARIOR]) + if (sc && sc->getSCE(SC_ABR_BATTLE_WARIOR)) wd.div_ = -2; break; case GN_CARTCANNON: - if (sc && sc->data[SC_BIONIC_WOODENWARRIOR]) + if (sc && sc->getSCE(SC_BIONIC_WOODENWARRIOR)) wd.div_ = 2; break; case DK_SERVANT_W_PHANTOM: @@ -6305,16 +6305,16 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block wd.div_ = min(wd.div_ + wd.miscflag, 5); // Number of hits doesn't appear to go above 5. break; case SHC_ETERNAL_SLASH: - if (sc && sc->data[SC_E_SLASH_COUNT]) - wd.div_ = sc->data[SC_E_SLASH_COUNT]->val1; + if (sc && sc->getSCE(SC_E_SLASH_COUNT)) + wd.div_ = sc->getSCE(SC_E_SLASH_COUNT)->val1; break; case SHC_SHADOW_STAB: if (wd.miscflag == 2) wd.div_ = 2; break; case SHC_IMPACT_CRATER: - if (sc && sc->data[SC_ROLLINGCUTTER]) - wd.div_ = sc->data[SC_ROLLINGCUTTER]->val1; + if (sc && sc->getSCE(SC_ROLLINGCUTTER)) + wd.div_ = sc->getSCE(SC_ROLLINGCUTTER)->val1; break; case MT_AXE_STOMP: if (sd && sd->status.weapon == W_2HAXE) @@ -6324,7 +6324,7 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block } else { bool is_long = false; - if (is_skill_using_arrow(src, skill_id) || (sc && sc->data[SC_SOULATTACK])) + if (is_skill_using_arrow(src, skill_id) || (sc && sc->getSCE(SC_SOULATTACK))) is_long = true; wd.flag |= is_long ? BF_LONG : BF_SHORT; } @@ -6357,10 +6357,11 @@ void battle_do_reflect(int attack_type, struct Damage *wd, struct block_list* sr if (!tsc) return; - if (tsc->data[SC_MAXPAIN]) { - tsc->data[SC_MAXPAIN]->val2 = (int)damage; - if (!tsc->data[SC_KYOMU] && !(tsc->data[SC_DARKCROW] && (wd->flag&BF_SHORT))) //SC_KYOMU invalidates reflecting ability. SC_DARKCROW also does, but only for short weapon attack. - skill_castend_damage_id(target, src, NPC_MAXPAIN_ATK, tsc->data[SC_MAXPAIN]->val1, tick, ((wd->flag & 1) ? wd->flag - 1 : wd->flag)); + auto * sce = tsc->getSCE(SC_MAXPAIN); + if (sce) { + sce->val2 = (int)damage; + if (!tsc->getSCE(SC_KYOMU) && !(tsc->getSCE(SC_DARKCROW) && (wd->flag&BF_SHORT))) //SC_KYOMU invalidates reflecting ability. SC_DARKCROW also does, but only for short weapon attack. + skill_castend_damage_id(target, src, NPC_MAXPAIN_ATK, sce->val1, tick, ((wd->flag & 1) ? wd->flag - 1 : wd->flag)); } // Calculate skill reflect damage separately @@ -6370,9 +6371,9 @@ void battle_do_reflect(int attack_type, struct Damage *wd, struct block_list* sr struct block_list *d_bl = battle_check_devotion(src); status_change *sc = status_get_sc(src); - if (sc && sc->data[SC_VITALITYACTIVATION]) + if (sc && sc->getSCE(SC_VITALITYACTIVATION)) rdamage /= 2; - if( attack_type == BF_WEAPON && tsc->data[SC_REFLECTDAMAGE] ) // Don't reflect your own damage (Grand Cross) + if( attack_type == BF_WEAPON && tsc->getSCE(SC_REFLECTDAMAGE) ) // Don't reflect your own damage (Grand Cross) map_foreachinshootrange(battle_damage_area,target,skill_get_splash(LG_REFLECTDAMAGE,1),BL_CHAR,tick,target,wd->amotion,sstatus->dmotion,rdamage,wd->flag); else if( attack_type == BF_WEAPON || attack_type == BF_MISC) { rdelay = clif_damage(src, (!d_bl) ? src : d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0, false); @@ -6569,10 +6570,10 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl // Attacker status's that pierce Res. if (sc) { - if (sc->data[SC_A_TELUM]) - ignore_res += sc->data[SC_A_TELUM]->val2; - if (sc->data[SC_POTENT_VENOM]) - ignore_res += sc->data[SC_POTENT_VENOM]->val2; + if (sc->getSCE(SC_A_TELUM)) + ignore_res += sc->getSCE(SC_A_TELUM)->val2; + if (sc->getSCE(SC_POTENT_VENOM)) + ignore_res += sc->getSCE(SC_POTENT_VENOM)->val2; } ignore_res = min(ignore_res, 100); @@ -6659,7 +6660,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl double bonus = 1 + skill_lv * 2 / 10; ATK_ADD(wd.damage, wd.damage2, sstatus->max_hp - sstatus->hp); - if(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE) { + if(sc && sc->getSCE(SC_COMBO) && sc->getSCE(SC_COMBO)->val1 == SR_FALLENEMPIRE) { ATK_ADD(wd.damage, wd.damage2, static_cast(sstatus->max_sp * bonus) + 40 * status_get_lv(src)); } else ATK_ADD(wd.damage, wd.damage2, static_cast(sstatus->sp * bonus) + 10 * status_get_lv(src)); @@ -6675,11 +6676,14 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl ATK_ADD(wd.damage, wd.damage2, 6000 * skill_lv + status_get_lv(src)); // !TODO: Confirm base level bonus break; case NPC_MAXPAIN_ATK: - if (sc && sc->data[SC_MAXPAIN]) { - if (sc->data[SC_MAXPAIN]->val2) - wd.damage = sc->data[SC_MAXPAIN]->val2 * skill_lv / 10; - else if (sc->data[SC_MAXPAIN]->val3) - wd.damage = sc->data[SC_MAXPAIN]->val3 * skill_lv / 10; + if (sc) { + auto * sce = sc->getSCE(SC_MAXPAIN); + if (sce) { + if (sce->val2) + wd.damage = sce->val2 * skill_lv / 10; + else if (sce->val3) + wd.damage = sce->val3 * skill_lv / 10; + } } else wd.damage = 0; @@ -6860,24 +6864,24 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list if (sd && (sd->weapontype1 == W_STAFF || sd->weapontype1 == W_2HSTAFF || sd->weapontype1 == W_BOOK)) ad.div_ = 2; if( sc && sc->count ) { - if( sc->data[SC_HEATER_OPTION] ) - s_ele = sc->data[SC_HEATER_OPTION]->val3; - else if( sc->data[SC_COOLER_OPTION] ) - s_ele = sc->data[SC_COOLER_OPTION]->val3; - else if( sc->data[SC_BLAST_OPTION] ) - s_ele = sc->data[SC_BLAST_OPTION]->val3; - else if( sc->data[SC_CURSED_SOIL_OPTION] ) - s_ele = sc->data[SC_CURSED_SOIL_OPTION]->val3; - else if( sc->data[SC_FLAMETECHNIC_OPTION] ) - s_ele = sc->data[SC_FLAMETECHNIC_OPTION]->val3; - else if( sc->data[SC_COLD_FORCE_OPTION] ) - s_ele = sc->data[SC_COLD_FORCE_OPTION]->val3; - else if( sc->data[SC_GRACE_BREEZE_OPTION] ) - s_ele = sc->data[SC_GRACE_BREEZE_OPTION]->val3; - else if( sc->data[SC_EARTH_CARE_OPTION] ) - s_ele = sc->data[SC_EARTH_CARE_OPTION]->val3; - else if( sc->data[SC_DEEP_POISONING_OPTION] ) - s_ele = sc->data[SC_DEEP_POISONING_OPTION]->val3; + if( sc->getSCE(SC_HEATER_OPTION) ) + s_ele = sc->getSCE(SC_HEATER_OPTION)->val3; + else if( sc->getSCE(SC_COOLER_OPTION) ) + s_ele = sc->getSCE(SC_COOLER_OPTION)->val3; + else if( sc->getSCE(SC_BLAST_OPTION) ) + s_ele = sc->getSCE(SC_BLAST_OPTION)->val3; + else if( sc->getSCE(SC_CURSED_SOIL_OPTION) ) + s_ele = sc->getSCE(SC_CURSED_SOIL_OPTION)->val3; + else if( sc->getSCE(SC_FLAMETECHNIC_OPTION) ) + s_ele = sc->getSCE(SC_FLAMETECHNIC_OPTION)->val3; + else if( sc->getSCE(SC_COLD_FORCE_OPTION) ) + s_ele = sc->getSCE(SC_COLD_FORCE_OPTION)->val3; + else if( sc->getSCE(SC_GRACE_BREEZE_OPTION) ) + s_ele = sc->getSCE(SC_GRACE_BREEZE_OPTION)->val3; + else if( sc->getSCE(SC_EARTH_CARE_OPTION) ) + s_ele = sc->getSCE(SC_EARTH_CARE_OPTION)->val3; + else if( sc->getSCE(SC_DEEP_POISONING_OPTION) ) + s_ele = sc->getSCE(SC_DEEP_POISONING_OPTION)->val3; } break; case KO_KAIHOU: @@ -6885,19 +6889,19 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list s_ele = sd->spiritcharm_type; break; case AB_ADORAMUS: - if (sc && sc->data[SC_ANCILLA]) + if (sc && sc->getSCE(SC_ANCILLA)) s_ele = ELE_NEUTRAL; break; case LG_RAYOFGENESIS: - if (sc && sc->data[SC_INSPIRATION]) + if (sc && sc->getSCE(SC_INSPIRATION)) s_ele = ELE_NEUTRAL; break; case AG_DESTRUCTIVE_HURRICANE: - if (sc && sc->data[SC_CLIMAX] && sc->data[SC_CLIMAX]->val1 == 2) + if (sc && sc->getSCE(SC_CLIMAX) && sc->getSCE(SC_CLIMAX)->val1 == 2) ad.blewcount = 2; break; case AG_CRYSTAL_IMPACT: - if (sc && sc->data[SC_CLIMAX] && sc->data[SC_CLIMAX]->val1 == 2) + if (sc && sc->getSCE(SC_CLIMAX) && sc->getSCE(SC_CLIMAX)->val1 == 2) ad.div_ = 2; break; case ABC_ABYSS_SQUARE: @@ -7057,13 +7061,13 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case MG_COLDBOLT: case MG_LIGHTNINGBOLT: if (sc) { - if ((skill_id == MG_FIREBOLT && sc->data[SC_FLAMETECHNIC_OPTION]) || - (skill_id == MG_COLDBOLT && sc->data[SC_COLD_FORCE_OPTION]) || - (skill_id == MG_LIGHTNINGBOLT && sc->data[SC_GRACE_BREEZE_OPTION])) + if ((skill_id == MG_FIREBOLT && sc->getSCE(SC_FLAMETECHNIC_OPTION)) || + (skill_id == MG_COLDBOLT && sc->getSCE(SC_COLD_FORCE_OPTION)) || + (skill_id == MG_LIGHTNINGBOLT && sc->getSCE(SC_GRACE_BREEZE_OPTION))) skillratio *= 2; - if (sc->data[SC_SPELLFIST] && mflag & BF_SHORT) { - skillratio += (sc->data[SC_SPELLFIST]->val3 * 100) + (sc->data[SC_SPELLFIST]->val1 * 50 - 50) - 100; // val3 = used bolt level, val1 = used spellfist level. [Rytech] + if (sc->getSCE(SC_SPELLFIST) && mflag & BF_SHORT) { + skillratio += (sc->getSCE(SC_SPELLFIST)->val3 * 100) + (sc->getSCE(SC_SPELLFIST)->val1 * 50 - 50) - 100; // val3 = used bolt level, val1 = used spellfist level. [Rytech] ad.div_ = 1; // ad mods, to make it work similar to regular hits [Xazax] ad.flag = BF_WEAPON | BF_SHORT; ad.type = DMG_NORMAL; @@ -7081,7 +7085,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list break; case AL_HOLYLIGHT: skillratio += 25; - if (sd && sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_PRIEST) + if (sd && sd->sc.getSCE(SC_SPIRIT) && sd->sc.getSCE(SC_SPIRIT)->val2 == SL_PRIEST) skillratio *= 5; //Does 5x damage include bonuses from other skills? break; case AL_RUWACH: @@ -7112,7 +7116,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list #ifdef RENEWAL case WZ_EARTHSPIKE: skillratio += 100; - if (sc && sc->data[SC_EARTH_CARE_OPTION]) + if (sc && sc->getSCE(SC_EARTH_CARE_OPTION)) skillratio += skillratio * 80 / 100; break; #endif @@ -7151,7 +7155,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case NJ_HYOUSENSOU: #ifdef RENEWAL skillratio -= 30; - if (sc && sc->data[SC_SUITON]) + if (sc && sc->getSCE(SC_SUITON)) skillratio += 2 * skill_lv; #endif if(sd && sd->spiritcharm_type == CHARM_TYPE_WATER && sd->spiritcharm > 0) @@ -7244,7 +7248,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list RE_LVL_DMOD(100); break; case NPC_JACKFROST: - if (tsc && tsc->data[SC_FREEZING]) { + if (tsc && tsc->getSCE(SC_FREEZING)) { skillratio += 900 + 300 * skill_lv; RE_LVL_DMOD(100); } else { @@ -7253,7 +7257,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list } break; case WL_JACKFROST: - if (tsc && tsc->data[SC_MISTY_FROST]) + if (tsc && tsc->getSCE(SC_MISTY_FROST)) skillratio += -100 + 1200 + 600 * skill_lv; else skillratio += -100 + 1000 + 300 * skill_lv; @@ -7302,7 +7306,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list break; case LG_RAYOFGENESIS: skillratio += -100 + 230 * skill_lv + sstatus->int_ / 6; // !TODO: What's the INT bonus? - if (sc && sc->data[SC_INSPIRATION]) + if (sc && sc->getSCE(SC_INSPIRATION)) skillratio += 70 * skill_lv; RE_LVL_DMOD(100); break; @@ -7311,29 +7315,29 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list break; case WM_METALICSOUND: skillratio += -100 + 120 * skill_lv + 60 * ((sd) ? pc_checkskill(sd, WM_LESSON) : 1); - if (tsc && tsc->data[SC_SLEEP]) + if (tsc && tsc->getSCE(SC_SLEEP)) skillratio += 100; // !TODO: Confirm target sleeping bonus RE_LVL_DMOD(100); - if (tsc && tsc->data[SC_SOUNDBLEND]) + if (tsc && tsc->getSCE(SC_SOUNDBLEND)) skillratio += skillratio * 50 / 100; break; case WM_REVERBERATION: // MATK [{(Skill Level x 300) + 400} x Casters Base Level / 100] % skillratio += -100 + 700 + 300 * skill_lv; RE_LVL_DMOD(100); - if (tsc && tsc->data[SC_SOUNDBLEND]) + if (tsc && tsc->getSCE(SC_SOUNDBLEND)) skillratio += skillratio * 50 / 100; break; case SO_FIREWALK: skillratio += -100 + 60 * skill_lv; RE_LVL_DMOD(100); - if( sc && sc->data[SC_HEATER_OPTION] ) + if( sc && sc->getSCE(SC_HEATER_OPTION) ) skillratio += (sd ? sd->status.job_level / 2 : 0); break; case SO_ELECTRICWALK: skillratio += -100 + 60 * skill_lv; RE_LVL_DMOD(100); - if( sc && sc->data[SC_BLAST_OPTION] ) + if( sc && sc->getSCE(SC_BLAST_OPTION) ) skillratio += (sd ? sd->status.job_level / 2 : 0); break; case NPC_FIREWALK: @@ -7343,21 +7347,21 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case SO_EARTHGRAVE: skillratio += -100 + 2 * sstatus->int_ + 300 * pc_checkskill(sd, SA_SEISMICWEAPON) + sstatus->int_ * skill_lv; RE_LVL_DMOD(100); - if( sc && sc->data[SC_CURSED_SOIL_OPTION] ) + if( sc && sc->getSCE(SC_CURSED_SOIL_OPTION) ) skillratio += (sd ? sd->status.job_level * 5 : 0); break; case SO_DIAMONDDUST: skillratio += -100 + 2 * sstatus->int_ + 300 * pc_checkskill(sd, SA_FROSTWEAPON) + sstatus->int_ * skill_lv; RE_LVL_DMOD(100); - if( sc && sc->data[SC_COOLER_OPTION] ) + if( sc && sc->getSCE(SC_COOLER_OPTION) ) skillratio += (sd ? sd->status.job_level * 5 : 0); break; case SO_POISON_BUSTER: skillratio += -100 + 1000 + 300 * skill_lv + sstatus->int_ / 6; // !TODO: Confirm INT bonus - if( tsc && tsc->data[SC_CLOUD_POISON] ) + if( tsc && tsc->getSCE(SC_CLOUD_POISON) ) skillratio += 200 * skill_lv; RE_LVL_DMOD(100); - if( sc && sc->data[SC_CURSED_SOIL_OPTION] ) + if( sc && sc->getSCE(SC_CURSED_SOIL_OPTION) ) skillratio += (sd ? sd->status.job_level * 5 : 0); break; case NPC_POISON_BUSTER: @@ -7366,8 +7370,8 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case SO_PSYCHIC_WAVE: skillratio += -100 + 70 * skill_lv + 3 * sstatus->int_; RE_LVL_DMOD(100); - if (sc && (sc->data[SC_HEATER_OPTION] || sc->data[SC_COOLER_OPTION] || - sc->data[SC_BLAST_OPTION] || sc->data[SC_CURSED_SOIL_OPTION])) + if (sc && (sc->getSCE(SC_HEATER_OPTION) || sc->getSCE(SC_COOLER_OPTION) || + sc->getSCE(SC_BLAST_OPTION) || sc->getSCE(SC_CURSED_SOIL_OPTION))) skillratio += 20; break; case NPC_PSYCHIC_WAVE: @@ -7377,10 +7381,10 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list skillratio += -100 + 40 * skill_lv; RE_LVL_DMOD(100); if (sc) { - if (sc->data[SC_CURSED_SOIL_OPTION]) + if (sc->getSCE(SC_CURSED_SOIL_OPTION)) skillratio += (sd ? sd->status.job_level : 0); - if (sc->data[SC_DEEP_POISONING_OPTION]) + if (sc->getSCE(SC_DEEP_POISONING_OPTION)) skillratio += skillratio * 50 / 100; } break; @@ -7390,7 +7394,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case SO_VARETYR_SPEAR: skillratio += -100 + (2 * sstatus->int_ + 150 * (pc_checkskill(sd, SO_STRIKING) + pc_checkskill(sd, SA_LIGHTNINGLOADER)) + sstatus->int_ * skill_lv / 2) / 3; RE_LVL_DMOD(100); - if (sc && sc->data[SC_BLAST_OPTION]) + if (sc && sc->getSCE(SC_BLAST_OPTION)) skillratio += (sd ? sd->status.job_level * 5 : 0); break; case GN_DEMONIC_FIRE: @@ -7463,7 +7467,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list skillratio += 100; break; case SP_CURSEEXPLOSION: - if (tsc && tsc->data[SC_SOULCURSE]) + if (tsc && tsc->getSCE(SC_SOULCURSE)) skillratio += 1400 + 200 * skill_lv; else skillratio += 300 + 100 * skill_lv; @@ -7489,11 +7493,11 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case AG_DESTRUCTIVE_HURRICANE: skillratio += -100 + 1600 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); - if (sc && sc->data[SC_CLIMAX]) + if (sc && sc->getSCE(SC_CLIMAX)) { - if (sc->data[SC_CLIMAX]->val1 == 3) + if (sc->getSCE(SC_CLIMAX)->val1 == 3) skillratio *= 2; - else if (sc->data[SC_CLIMAX]->val1 == 5) + else if (sc->getSCE(SC_CLIMAX)->val1 == 5) skillratio += skillratio * 70 / 100; } break; @@ -7508,10 +7512,10 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case AG_VIOLENT_QUAKE_ATK: skillratio += -100 + 120 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); - if (sc && sc->data[SC_CLIMAX]) { - if (sc->data[SC_CLIMAX]->val1 == 1) + if (sc && sc->getSCE(SC_CLIMAX)) { + if (sc->getSCE(SC_CLIMAX)->val1 == 1) skillratio /= 2; - else if (sc->data[SC_CLIMAX]->val1 == 3) + else if (sc->getSCE(SC_CLIMAX)->val1 == 3) skillratio *= 2; } break; @@ -7526,10 +7530,10 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case AG_ALL_BLOOM_ATK: skillratio += -100 + 100 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); - if (sc && sc->data[SC_CLIMAX]) { - if (sc->data[SC_CLIMAX]->val1 == 2) + if (sc && sc->getSCE(SC_CLIMAX)) { + if (sc->getSCE(SC_CLIMAX)->val1 == 2) skillratio /= 2; - else if (sc->data[SC_CLIMAX]->val1 == 3) + else if (sc->getSCE(SC_CLIMAX)->val1 == 3) skillratio *= 2; } break; @@ -7540,17 +7544,17 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case AG_CRYSTAL_IMPACT: skillratio += -100 + 800 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); - if (sc && sc->data[SC_CLIMAX]) { - if (sc->data[SC_CLIMAX]->val1 == 3) + if (sc && sc->getSCE(SC_CLIMAX)) { + if (sc->getSCE(SC_CLIMAX)->val1 == 3) skillratio += skillratio * 50 / 100; - else if (sc->data[SC_CLIMAX]->val1 == 4) + else if (sc->getSCE(SC_CLIMAX)->val1 == 4) skillratio /= 2; } break; case AG_CRYSTAL_IMPACT_ATK:// Said to deal the same damage as the main attack. skillratio += -100 + 800 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); - if (sc && sc->data[SC_CLIMAX] && sc->data[SC_CLIMAX]->val1 == 4) + if (sc && sc->getSCE(SC_CLIMAX) && sc->getSCE(SC_CLIMAX)->val1 == 4) skillratio += skillratio * 150 / 100; break; case AG_TORNADO_STORM: @@ -7606,7 +7610,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list RE_LVL_DMOD(100); if ((i = pc_checkskill_imperial_guard(sd, 3)) > 0) skillratio += skillratio * i / 100; - if (sc && sc->data[SC_HOLY_S]) + if (sc && sc->getSCE(SC_HOLY_S)) skillratio += 20 * skill_lv; break; case CD_ARBITRIUM: @@ -7647,7 +7651,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case TR_SOUNDBLEND: skillratio += -100 + 120 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); - if (sc && sc->data[SC_MYSTIC_SYMPHONY]) { + if (sc && sc->getSCE(SC_MYSTIC_SYMPHONY)) { skillratio += skillratio * 40 / 100; if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN) @@ -7657,31 +7661,31 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case EM_DIAMOND_STORM: skillratio += -100 + 700 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); - if (sc && sc->data[SC_SUMMON_ELEMENTAL_DILUVIO]) + if (sc && sc->getSCE(SC_SUMMON_ELEMENTAL_DILUVIO)) skillratio += skillratio * 30 / 100; break; case EM_LIGHTNING_LAND: skillratio += -100 + 150 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); - if (sc && sc->data[SC_SUMMON_ELEMENTAL_PROCELLA]) + if (sc && sc->getSCE(SC_SUMMON_ELEMENTAL_PROCELLA)) skillratio += skillratio * 30 / 100; break; case EM_VENOM_SWAMP: skillratio += -100 + 150 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); - if (sc && sc->data[SC_SUMMON_ELEMENTAL_SERPENS]) + if (sc && sc->getSCE(SC_SUMMON_ELEMENTAL_SERPENS)) skillratio += skillratio * 30 / 100; break; case EM_CONFLAGRATION: skillratio += -100 + 150 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); - if (sc && sc->data[SC_SUMMON_ELEMENTAL_ARDOR]) + if (sc && sc->getSCE(SC_SUMMON_ELEMENTAL_ARDOR)) skillratio += skillratio * 30 / 100; break; case EM_TERRA_DRIVE: skillratio += -100 + 700 * skill_lv + 5 * sstatus->spl; RE_LVL_DMOD(100); - if (sc && sc->data[SC_SUMMON_ELEMENTAL_TERREMOTUS]) + if (sc && sc->getSCE(SC_SUMMON_ELEMENTAL_TERREMOTUS)) skillratio += skillratio * 30 / 100; break; case ABC_FROM_THE_ABYSS_ATK: @@ -7726,10 +7730,10 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list } if (sc) {// Insignia's increases the damage of offensive magic by a fixed percentage depending on the element. - if ((sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 3 && s_ele == ELE_FIRE) || - (sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 3 && s_ele == ELE_WATER) || - (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 3 && s_ele == ELE_WIND) || - (sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 3 && s_ele == ELE_EARTH)) + if ((sc->getSCE(SC_FIRE_INSIGNIA) && sc->getSCE(SC_FIRE_INSIGNIA)->val1 == 3 && s_ele == ELE_FIRE) || + (sc->getSCE(SC_WATER_INSIGNIA) && sc->getSCE(SC_WATER_INSIGNIA)->val1 == 3 && s_ele == ELE_WATER) || + (sc->getSCE(SC_WIND_INSIGNIA) && sc->getSCE(SC_WIND_INSIGNIA)->val1 == 3 && s_ele == ELE_WIND) || + (sc->getSCE(SC_EARTH_INSIGNIA) && sc->getSCE(SC_EARTH_INSIGNIA)->val1 == 3 && s_ele == ELE_EARTH)) skillratio += 25; } @@ -7774,8 +7778,8 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list short ignore_mres = 0;// Value used as percentage. // Attacker status's that pierce MRes. - if (sc && sc->data[SC_A_VITA]) - ignore_mres += sc->data[SC_A_VITA]->val2; + if (sc && sc->getSCE(SC_A_VITA)) + ignore_mres += sc->getSCE(SC_A_VITA)->val2; ignore_mres = min(ignore_mres, 100); @@ -7796,8 +7800,8 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list defType mdef = tstatus->mdef; int mdef2= tstatus->mdef2; - if (sc && sc->data[SC_EXPIATIO]) { - i = 5 * sc->data[SC_EXPIATIO]->val1; // 5% per level + if (sc && sc->getSCE(SC_EXPIATIO)) { + i = 5 * sc->getSCE(SC_EXPIATIO)->val1; // 5% per level i = min(i, 100); //cap it to 100 for 5 mdef min mdef -= mdef * i / 100; @@ -7841,22 +7845,22 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list switch(skill_id) { case MG_LIGHTNINGBOLT: case MG_THUNDERSTORM: - if(sc->data[SC_GUST_OPTION]) + if(sc->getSCE(SC_GUST_OPTION)) ad.damage += (6 + sstatus->int_ / 4) + max(sstatus->dex - 10, 0) / 30; break; case MG_FIREBOLT: case MG_FIREWALL: - if(sc->data[SC_PYROTECHNIC_OPTION]) + if(sc->getSCE(SC_PYROTECHNIC_OPTION)) ad.damage += (6 + sstatus->int_ / 4) + max(sstatus->dex - 10, 0) / 30; break; case MG_COLDBOLT: case MG_FROSTDIVER: - if(sc->data[SC_AQUAPLAY_OPTION]) + if(sc->getSCE(SC_AQUAPLAY_OPTION)) ad.damage += (6 + sstatus->int_ / 4) + max(sstatus->dex - 10, 0) / 30; break; case WZ_EARTHSPIKE: case WZ_HEAVENDRIVE: - if(sc->data[SC_PETROLOGY_OPTION]) + if(sc->getSCE(SC_PETROLOGY_OPTION)) ad.damage += (6 + sstatus->int_ / 4) + max(sstatus->dex - 10, 0) / 30; break; } @@ -8109,7 +8113,7 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * md.damage = (int64)sstatus->hp + (atk.damage * (int64)sstatus->hp * skill_lv) / (int64)sstatus->max_hp; - if (sc && sc->data[SC_BUNSINJYUTSU] && (i = sc->data[SC_BUNSINJYUTSU]->val2) > 0) { // mirror image bonus only occurs if active + if (sc && sc->getSCE(SC_BUNSINJYUTSU) && (i = sc->getSCE(SC_BUNSINJYUTSU)->val2) > 0) { // mirror image bonus only occurs if active md.div_ = -(i + 2); // mirror image count + 2 md.damage += (md.damage * (((i + 1) * 10) / 5)) / 10; } @@ -8362,8 +8366,8 @@ struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct bl status_change *tsc = status_get_sc(target); // Weapon Blocking has the ability to trigger on ATK_MISS as well. - if (tsc != nullptr && tsc->data[SC_WEAPONBLOCKING]) { - status_change_entry *tsce = tsc->data[SC_WEAPONBLOCKING]; + if (tsc != nullptr && tsc->getSCE(SC_WEAPONBLOCKING)) { + status_change_entry *tsce = tsc->getSCE(SC_WEAPONBLOCKING); if (attack_type == BF_WEAPON && rnd() % 100 < tsce->val2) { clif_skill_nodamage(target, bl, GC_WEAPONBLOCKING, tsce->val1, 1); @@ -8394,16 +8398,16 @@ int64 battle_calc_return_damage(struct block_list* tbl, struct block_list *src, status_change *tsc = status_get_sc(tbl); if (tsc) { // These statuses do not reflect any damage (off the target) - if (tsc->data[SC_WHITEIMPRISON] || tsc->data[SC_DARKCROW] || tsc->data[SC_KYOMU]) + if (tsc->getSCE(SC_WHITEIMPRISON) || tsc->getSCE(SC_DARKCROW) || tsc->getSCE(SC_KYOMU)) return 0; } status_change *sc = status_get_sc(src); if (sc) { - if (sc->data[SC_HELLS_PLANT]) + if (sc->getSCE(SC_HELLS_PLANT)) return 0; - if (sc->data[SC_REF_T_POTION]) + if (sc->getSCE(SC_REF_T_POTION)) return 1; // Returns 1 damage } @@ -8415,36 +8419,36 @@ int64 battle_calc_return_damage(struct block_list* tbl, struct block_list *src, rdamage += damage * tsd->bonus.short_weapon_damage_return / 100; rdamage = i64max(rdamage, 1); } else if( status_reflect && tsc && tsc->count ) { - if( tsc->data[SC_REFLECTSHIELD] ) { + if( tsc->getSCE(SC_REFLECTSHIELD) ) { status_change_entry *sce_d; block_list *d_bl; - if( (sce_d = tsc->data[SC_DEVOTION]) && (d_bl = map_id2bl(sce_d->val1)) && + if( (sce_d = tsc->getSCE(SC_DEVOTION)) && (d_bl = map_id2bl(sce_d->val1)) && ((d_bl->type == BL_MER && ((TBL_MER*)d_bl)->master && ((TBL_MER*)d_bl)->master->bl.id == tbl->id) || (d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce_d->val2] == tbl->id)) ) { //Don't reflect non-skill attack if has SC_REFLECTSHIELD from Devotion bonus inheritance - if( (!skill_id && battle_config.devotion_rdamage_skill_only && tsc->data[SC_REFLECTSHIELD]->val4) || + if( (!skill_id && battle_config.devotion_rdamage_skill_only && tsc->getSCE(SC_REFLECTSHIELD)->val4) || !check_distance_bl(tbl,d_bl,sce_d->val3) ) return 0; } } - if ( tsc->data[SC_REFLECTSHIELD] && skill_id != WS_CARTTERMINATION && skill_id != NPC_MAXPAIN_ATK ) { + if ( tsc->getSCE(SC_REFLECTSHIELD) && skill_id != WS_CARTTERMINATION && skill_id != NPC_MAXPAIN_ATK ) { // Don't reflect non-skill attack if has SC_REFLECTSHIELD from Devotion bonus inheritance - if (!skill_id && battle_config.devotion_rdamage_skill_only && tsc->data[SC_REFLECTSHIELD]->val4) + if (!skill_id && battle_config.devotion_rdamage_skill_only && tsc->getSCE(SC_REFLECTSHIELD)->val4) rdamage = 0; else { - rdamage += damage * tsc->data[SC_REFLECTSHIELD]->val2 / 100; + rdamage += damage * tsc->getSCE(SC_REFLECTSHIELD)->val2 / 100; rdamage = i64max(rdamage, 1); } } - if (tsc->data[SC_DEATHBOUND] && skill_id != WS_CARTTERMINATION && skill_id != GN_HELLS_PLANT_ATK && !status_bl_has_mode(src,MD_STATUSIMMUNE)) { + if (tsc->getSCE(SC_DEATHBOUND) && skill_id != WS_CARTTERMINATION && skill_id != GN_HELLS_PLANT_ATK && !status_bl_has_mode(src,MD_STATUSIMMUNE)) { if (distance_bl(src,tbl) <= 0 || !map_check_dir(map_calc_dir(tbl,src->x,src->y), unit_getdir(tbl))) { - int64 rd1 = i64min(damage, status_get_max_hp(tbl)) * tsc->data[SC_DEATHBOUND]->val2 / 100; // Amplify damage. + int64 rd1 = i64min(damage, status_get_max_hp(tbl)) * tsc->getSCE(SC_DEATHBOUND)->val2 / 100; // Amplify damage. *dmg = rd1 * 30 / 100; // Received damage = 30% of amplified damage. - clif_skill_damage(src, tbl, gettick(), status_get_amotion(src), 0, -30000, 1, RK_DEATHBOUND, tsc->data[SC_DEATHBOUND]->val1, DMG_SINGLE); - skill_blown(tbl, src, skill_get_blewcount(RK_DEATHBOUND, tsc->data[SC_DEATHBOUND]->val1), unit_getdir(src), BLOWN_NONE); + clif_skill_damage(src, tbl, gettick(), status_get_amotion(src), 0, -30000, 1, RK_DEATHBOUND, tsc->getSCE(SC_DEATHBOUND)->val1, DMG_SINGLE); + skill_blown(tbl, src, skill_get_blewcount(RK_DEATHBOUND, tsc->getSCE(SC_DEATHBOUND)->val1), unit_getdir(src), BLOWN_NONE); status_change_end(tbl, SC_DEATHBOUND); rdamage += rd1 * 70 / 100; // Target receives 70% of the amplified damage. [Rytech] } @@ -8466,12 +8470,12 @@ int64 battle_calc_return_damage(struct block_list* tbl, struct block_list *src, } if (sc) { - if (status_reflect && sc->data[SC_REFLECTDAMAGE]) { - rdamage -= damage * sc->data[SC_REFLECTDAMAGE]->val2 / 100; + if (status_reflect && sc->getSCE(SC_REFLECTDAMAGE)) { + rdamage -= damage * sc->getSCE(SC_REFLECTDAMAGE)->val2 / 100; rdamage = i64max(rdamage, 1); } - if (sc->data[SC_VENOMBLEED] && sc->data[SC_VENOMBLEED]->val3 == 0) { - rdamage -= damage * sc->data[SC_VENOMBLEED]->val2 / 100; + if (sc->getSCE(SC_VENOMBLEED) && sc->getSCE(SC_VENOMBLEED)->val3 == 0) { + rdamage -= damage * sc->getSCE(SC_VENOMBLEED)->val2 / 100; rdamage = i64max(rdamage, 1); } } @@ -8766,20 +8770,20 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t } } if (sc && sc->count) { - if (sc->data[SC_CLOAKING] && !(sc->data[SC_CLOAKING]->val4 & 2)) + if (sc->getSCE(SC_CLOAKING) && !(sc->getSCE(SC_CLOAKING)->val4 & 2)) status_change_end(src, SC_CLOAKING); - else if (sc->data[SC_CLOAKINGEXCEED] && !(sc->data[SC_CLOAKINGEXCEED]->val4 & 2)) + else if (sc->getSCE(SC_CLOAKINGEXCEED) && !(sc->getSCE(SC_CLOAKINGEXCEED)->val4 & 2)) status_change_end(src, SC_CLOAKINGEXCEED); - else if (sc->data[SC_NEWMOON] && --(sc->data[SC_NEWMOON]->val2) <= 0) + else if (sc->getSCE(SC_NEWMOON) && --(sc->getSCE(SC_NEWMOON)->val2) <= 0) status_change_end(src, SC_NEWMOON); } - if (tsc && tsc->data[SC_AUTOCOUNTER] && status_check_skilluse(target, src, KN_AUTOCOUNTER, 1)) { + if (tsc && tsc->getSCE(SC_AUTOCOUNTER) && status_check_skilluse(target, src, KN_AUTOCOUNTER, 1)) { uint8 dir = map_calc_dir(target,src->x,src->y); int t_dir = unit_getdir(target); int dist = distance_bl(src, target); if (dist <= 0 || (!map_check_dir(dir,t_dir) && dist <= tstatus->rhw.range+1)) { - uint16 skill_lv = tsc->data[SC_AUTOCOUNTER]->val1; + uint16 skill_lv = tsc->getSCE(SC_AUTOCOUNTER)->val1; clif_skillcastcancel(target); //Remove the casting bar. [Skotlex] clif_damage(src, target, tick, sstatus->amotion, 1, 0, 1, DMG_NORMAL, 0, false); //Display MISS. @@ -8789,13 +8793,13 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t } } - if( tsc && tsc->data[SC_BLADESTOP_WAIT] && + if( tsc && tsc->getSCE(SC_BLADESTOP_WAIT) && #ifndef RENEWAL status_get_class_(src) != CLASS_BOSS && #endif (src->type == BL_PC || tsd == NULL || distance_bl(src, target) <= (tsd->status.weapon == W_FIST ? 1 : 2)) ) { - uint16 skill_lv = tsc->data[SC_BLADESTOP_WAIT]->val1; + uint16 skill_lv = tsc->getSCE(SC_BLADESTOP_WAIT)->val1; int duration = skill_get_time2(MO_BLADESTOP,skill_lv); #ifdef RENEWAL @@ -8819,8 +8823,8 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t int triple_rate = 30 - skillv; //Base Rate #endif - if (sc && sc->data[SC_SKILLRATE_UP] && sc->data[SC_SKILLRATE_UP]->val1 == MO_TRIPLEATTACK) { - triple_rate+= triple_rate*(sc->data[SC_SKILLRATE_UP]->val2)/100; + if (sc && sc->getSCE(SC_SKILLRATE_UP) && sc->getSCE(SC_SKILLRATE_UP)->val1 == MO_TRIPLEATTACK) { + triple_rate+= triple_rate*(sc->getSCE(SC_SKILLRATE_UP)->val2)/100; status_change_end(src, SC_SKILLRATE_UP); } if (rnd()%100 < triple_rate) { @@ -8833,11 +8837,11 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t } if (sc) { - if (sc->data[SC_SACRIFICE]) { - uint16 skill_lv = sc->data[SC_SACRIFICE]->val1; + if (sc->getSCE(SC_SACRIFICE)) { + uint16 skill_lv = sc->getSCE(SC_SACRIFICE)->val1; damage_lv ret_val; - if( --sc->data[SC_SACRIFICE]->val2 <= 0 ) + if( --sc->getSCE(SC_SACRIFICE)->val2 <= 0 ) status_change_end(src, SC_SACRIFICE); /** @@ -8851,39 +8855,39 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t return ATK_MISS; return ret_val; } - if (sc->data[SC_MAGICALATTACK]) { - if( skill_attack(BF_MAGIC,src,src,target,NPC_MAGICALATTACK,sc->data[SC_MAGICALATTACK]->val1,tick,0) ) + if (sc->getSCE(SC_MAGICALATTACK)) { + if( skill_attack(BF_MAGIC,src,src,target,NPC_MAGICALATTACK,sc->getSCE(SC_MAGICALATTACK)->val1,tick,0) ) return ATK_DEF; return ATK_MISS; } - if( sc->data[SC_GT_ENERGYGAIN] ) { + if( sc->getSCE(SC_GT_ENERGYGAIN) ) { int spheres = 5; - if( sc->data[SC_RAISINGDRAGON] ) - spheres += sc->data[SC_RAISINGDRAGON]->val1; + if( sc->getSCE(SC_RAISINGDRAGON) ) + spheres += sc->getSCE(SC_RAISINGDRAGON)->val1; - if( sd && rnd()%100 < sc->data[SC_GT_ENERGYGAIN]->val2 ) - pc_addspiritball(sd, skill_get_time2(SR_GENTLETOUCH_ENERGYGAIN, sc->data[SC_GT_ENERGYGAIN]->val1), spheres); + if( sd && rnd()%100 < sc->getSCE(SC_GT_ENERGYGAIN)->val2 ) + pc_addspiritball(sd, skill_get_time2(SR_GENTLETOUCH_ENERGYGAIN, sc->getSCE(SC_GT_ENERGYGAIN)->val1), spheres); } } - if( tsc && tsc->data[SC_GT_ENERGYGAIN] ) { + if( tsc && tsc->getSCE(SC_GT_ENERGYGAIN) ) { int spheres = 5; - if( tsc->data[SC_RAISINGDRAGON] ) - spheres += tsc->data[SC_RAISINGDRAGON]->val1; + if( tsc->getSCE(SC_RAISINGDRAGON) ) + spheres += tsc->getSCE(SC_RAISINGDRAGON)->val1; - if( tsd && rnd()%100 < tsc->data[SC_GT_ENERGYGAIN]->val2 ) - pc_addspiritball(tsd, skill_get_time2(SR_GENTLETOUCH_ENERGYGAIN, tsc->data[SC_GT_ENERGYGAIN]->val1), spheres); + if( tsd && rnd()%100 < tsc->getSCE(SC_GT_ENERGYGAIN)->val2 ) + pc_addspiritball(tsd, skill_get_time2(SR_GENTLETOUCH_ENERGYGAIN, tsc->getSCE(SC_GT_ENERGYGAIN)->val1), spheres); } - if (tsc && tsc->data[SC_MTF_MLEATKED] && rnd()%100 < tsc->data[SC_MTF_MLEATKED]->val2) - clif_skill_nodamage(target, target, SM_ENDURE, tsc->data[SC_MTF_MLEATKED]->val1, sc_start(src, target, SC_ENDURE, 100, tsc->data[SC_MTF_MLEATKED]->val1, skill_get_time(SM_ENDURE, tsc->data[SC_MTF_MLEATKED]->val1))); + if (tsc && tsc->getSCE(SC_MTF_MLEATKED) && rnd()%100 < tsc->getSCE(SC_MTF_MLEATKED)->val2) + clif_skill_nodamage(target, target, SM_ENDURE, tsc->getSCE(SC_MTF_MLEATKED)->val1, sc_start(src, target, SC_ENDURE, 100, tsc->getSCE(SC_MTF_MLEATKED)->val1, skill_get_time(SM_ENDURE, tsc->getSCE(SC_MTF_MLEATKED)->val1))); - if(tsc && tsc->data[SC_KAAHI] && tstatus->hp < tstatus->max_hp && status_charge(target, 0, tsc->data[SC_KAAHI]->val3)) { + if(tsc && tsc->getSCE(SC_KAAHI) && tstatus->hp < tstatus->max_hp && status_charge(target, 0, tsc->getSCE(SC_KAAHI)->val3)) { int hp_heal = tstatus->max_hp - tstatus->hp; - if (hp_heal > tsc->data[SC_KAAHI]->val2) - hp_heal = tsc->data[SC_KAAHI]->val2; + if (hp_heal > tsc->getSCE(SC_KAAHI)->val2) + hp_heal = tsc->getSCE(SC_KAAHI)->val2; if (hp_heal) status_heal(target, hp_heal, 0, 2); } @@ -8894,12 +8898,12 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t vellum_damage = true; if( sc && sc->count ) { - if (sc->data[SC_EXEEDBREAK]) + if (sc->getSCE(SC_EXEEDBREAK)) status_change_end(src, SC_EXEEDBREAK); - if( sc->data[SC_SPELLFIST] && !vellum_damage ){ + if( sc->getSCE(SC_SPELLFIST) && !vellum_damage ){ if (status_charge(src, 0, 20)) { if (!is_infinite_defense(target, wd.flag)) { - struct Damage ad = battle_calc_attack(BF_MAGIC, src, target, sc->data[SC_SPELLFIST]->val2, sc->data[SC_SPELLFIST]->val3, flag | BF_SHORT); + struct Damage ad = battle_calc_attack(BF_MAGIC, src, target, sc->getSCE(SC_SPELLFIST)->val2, sc->getSCE(SC_SPELLFIST)->val3, flag | BF_SHORT); wd.damage = ad.damage; DAMAGE_DIV_FIX(wd.damage, wd.div_); // Double the damage for multiple hits. @@ -8910,14 +8914,14 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t } else status_change_end(src,SC_SPELLFIST); } - if (sc->data[SC_GIANTGROWTH] && (wd.flag&BF_SHORT) && rnd()%100 < sc->data[SC_GIANTGROWTH]->val2 && !is_infinite_defense(target, wd.flag) && !vellum_damage) + if (sc->getSCE(SC_GIANTGROWTH) && (wd.flag&BF_SHORT) && rnd()%100 < sc->getSCE(SC_GIANTGROWTH)->val2 && !is_infinite_defense(target, wd.flag) && !vellum_damage) wd.damage += wd.damage * 150 / 100; // 2.5 times damage - if( sd && battle_config.arrow_decrement && sc->data[SC_FEARBREEZE] && sc->data[SC_FEARBREEZE]->val4 > 0) { + if( sd && battle_config.arrow_decrement && sc->getSCE(SC_FEARBREEZE) && sc->getSCE(SC_FEARBREEZE)->val4 > 0) { short idx = sd->equip_index[EQI_AMMO]; - if (idx >= 0 && sd->inventory.u.items_inventory[idx].amount >= sc->data[SC_FEARBREEZE]->val4) { - pc_delitem(sd,idx,sc->data[SC_FEARBREEZE]->val4,0,1,LOG_TYPE_CONSUME); - sc->data[SC_FEARBREEZE]->val4 = 0; + if (idx >= 0 && sd->inventory.u.items_inventory[idx].amount >= sc->getSCE(SC_FEARBREEZE)->val4) { + pc_delitem(sd,idx,sc->getSCE(SC_FEARBREEZE)->val4,0,1,LOG_TYPE_CONSUME); + sc->getSCE(SC_FEARBREEZE)->val4 = 0; } } } @@ -8927,14 +8931,14 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t damage = wd.damage + wd.damage2; if( damage > 0 && src != target ) { - if (sc && sc->data[SC_DUPLELIGHT] && (wd.flag & BF_SHORT)) { // Activates only from regular melee damage. Success chance is seperate for both duple light attacks. - uint16 duple_rate = 10 + 2 * sc->data[SC_DUPLELIGHT]->val1; + if (sc && sc->getSCE(SC_DUPLELIGHT) && (wd.flag & BF_SHORT)) { // Activates only from regular melee damage. Success chance is seperate for both duple light attacks. + uint16 duple_rate = 10 + 2 * sc->getSCE(SC_DUPLELIGHT)->val1; if (rand() % 100 < duple_rate) - skill_castend_damage_id(src, target, AB_DUPLELIGHT_MELEE, sc->data[SC_DUPLELIGHT]->val1, tick, flag | SD_LEVEL); + skill_castend_damage_id(src, target, AB_DUPLELIGHT_MELEE, sc->getSCE(SC_DUPLELIGHT)->val1, tick, flag | SD_LEVEL); if (rand() % 100 < duple_rate) - skill_castend_damage_id(src, target, AB_DUPLELIGHT_MAGIC, sc->data[SC_DUPLELIGHT]->val1, tick, flag | SD_LEVEL); + skill_castend_damage_id(src, target, AB_DUPLELIGHT_MAGIC, sc->getSCE(SC_DUPLELIGHT)->val1, tick, flag | SD_LEVEL); } } @@ -8957,7 +8961,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t map_freeblock_lock(); - if( !(tsc && tsc->data[SC_DEVOTION]) && !vellum_damage && skill_check_shadowform(target, damage, wd.div_) ) { + if( !(tsc && tsc->getSCE(SC_DEVOTION)) && !vellum_damage && skill_check_shadowform(target, damage, wd.div_) ) { if( !status_isdead(target) ) skill_additional_effect(src, target, 0, 0, wd.flag, wd.dmg_lv, tick); if( wd.dmg_lv > ATK_BLOCK ) @@ -8965,8 +8969,8 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t } else battle_delay_damage(tick, wd.amotion, src, target, wd.flag, 0, 0, damage, wd.dmg_lv, wd.dmotion, true, wd.isspdamage); if( tsc ) { - if( tsc->data[SC_DEVOTION] ) { - struct status_change_entry *sce = tsc->data[SC_DEVOTION]; + if( tsc->getSCE(SC_DEVOTION) ) { + struct status_change_entry *sce = tsc->getSCE(SC_DEVOTION); struct block_list *d_bl = map_id2bl(sce->val1); if( d_bl && ( @@ -8988,8 +8992,8 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t skill_sit( dsd, 0 ); } - if (d_sc && d_sc->data[SC_REBOUND_S]) - devotion_damage -= devotion_damage * d_sc->data[SC_REBOUND_S]->val2 / 100; + if (d_sc && d_sc->getSCE(SC_REBOUND_S)) + devotion_damage -= devotion_damage * d_sc->getSCE(SC_REBOUND_S)->val2 / 100; clif_damage(d_bl, d_bl, gettick(), wd.amotion, wd.dmotion, devotion_damage, 1, DMG_NORMAL, 0, false); status_fix_damage(NULL, d_bl, devotion_damage, 0, CR_DEVOTION); @@ -8998,16 +9002,16 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t else status_change_end(target, SC_DEVOTION); } - if (target->type == BL_PC && (wd.flag&BF_SHORT) && tsc->data[SC_CIRCLE_OF_FIRE_OPTION]) { + if (target->type == BL_PC && (wd.flag&BF_SHORT) && tsc->getSCE(SC_CIRCLE_OF_FIRE_OPTION)) { s_elemental_data *ed = ((TBL_PC*)target)->ed; if (ed) { - clif_skill_damage(&ed->bl, target, tick, status_get_amotion(src), 0, -30000, 1, EL_CIRCLE_OF_FIRE, tsc->data[SC_CIRCLE_OF_FIRE_OPTION]->val1, DMG_SINGLE); - skill_attack(BF_WEAPON,&ed->bl,&ed->bl,src,EL_CIRCLE_OF_FIRE,tsc->data[SC_CIRCLE_OF_FIRE_OPTION]->val1,tick,wd.flag); + clif_skill_damage(&ed->bl, target, tick, status_get_amotion(src), 0, -30000, 1, EL_CIRCLE_OF_FIRE, tsc->getSCE(SC_CIRCLE_OF_FIRE_OPTION)->val1, DMG_SINGLE); + skill_attack(BF_WEAPON,&ed->bl,&ed->bl,src,EL_CIRCLE_OF_FIRE,tsc->getSCE(SC_CIRCLE_OF_FIRE_OPTION)->val1,tick,wd.flag); } } - if (tsc->data[SC_WATER_SCREEN_OPTION]) { - struct block_list *e_bl = map_id2bl(tsc->data[SC_WATER_SCREEN_OPTION]->val1); + if (tsc->getSCE(SC_WATER_SCREEN_OPTION)) { + struct block_list *e_bl = map_id2bl(tsc->getSCE(SC_WATER_SCREEN_OPTION)->val1); if (e_bl && !status_isdead(e_bl)) { clif_damage(e_bl, e_bl, tick, 0, 0, damage, wd.div_, DMG_NORMAL, 0, false); @@ -9015,12 +9019,12 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t } } } - if (sc && sc->data[SC_AUTOSPELL] && rnd()%100 < sc->data[SC_AUTOSPELL]->val4) { + if (sc && sc->getSCE(SC_AUTOSPELL) && rnd()%100 < sc->getSCE(SC_AUTOSPELL)->val4) { int sp = 0; - uint16 skill_id = sc->data[SC_AUTOSPELL]->val2; - uint16 skill_lv = sc->data[SC_AUTOSPELL]->val3; + uint16 skill_id = sc->getSCE(SC_AUTOSPELL)->val2; + uint16 skill_lv = sc->getSCE(SC_AUTOSPELL)->val3; int i = rnd()%100; - if (sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_SAGE) + if (sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_SAGE) i = 0; //Max chance, no skill_lv reduction. [Skotlex] //reduction only for skill_lv > 1 if (skill_lv > 1) { @@ -9056,12 +9060,12 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t } if (sd) { uint16 r_skill = 0, sk_idx = 0; - if( wd.flag&BF_WEAPON && sc && sc->data[SC__AUTOSHADOWSPELL] && rnd()%100 < sc->data[SC__AUTOSHADOWSPELL]->val3 && - (r_skill = (uint16)sc->data[SC__AUTOSHADOWSPELL]->val1) && (sk_idx = skill_get_index(r_skill)) && + if( wd.flag&BF_WEAPON && sc && sc->getSCE(SC__AUTOSHADOWSPELL) && rnd()%100 < sc->getSCE(SC__AUTOSHADOWSPELL)->val3 && + (r_skill = (uint16)sc->getSCE(SC__AUTOSHADOWSPELL)->val1) && (sk_idx = skill_get_index(r_skill)) && sd->status.skill[sk_idx].id != 0 && sd->status.skill[sk_idx].flag == SKILL_FLAG_PLAGIARIZED ) { if (r_skill != AL_HOLYLIGHT && r_skill != PR_MAGNUS) { - int r_lv = sc->data[SC__AUTOSHADOWSPELL]->val2, type; + int r_lv = sc->getSCE(SC__AUTOSHADOWSPELL)->val2, type; if( (type = skill_get_casttype(r_skill)) == CAST_GROUND ) { int maxcount = 0; @@ -9110,11 +9114,11 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t clif_status_change(src, EFST_POSTDELAY, 1, skill_delayfix(src, r_skill, r_lv), 0, 0, 1); } } - if (wd.flag&BF_WEAPON && sc && sc->data[SC_FALLINGSTAR] && rand()%100 < sc->data[SC_FALLINGSTAR]->val2) { + if (wd.flag&BF_WEAPON && sc && sc->getSCE(SC_FALLINGSTAR) && rand()%100 < sc->getSCE(SC_FALLINGSTAR)->val2) { if (sd) sd->state.autocast = 1; - if (status_charge(src, 0, skill_get_sp(SJ_FALLINGSTAR_ATK, sc->data[SC_FALLINGSTAR]->val1))) - skill_castend_nodamage_id(src, src, SJ_FALLINGSTAR_ATK, sc->data[SC_FALLINGSTAR]->val1, tick, flag); + if (status_charge(src, 0, skill_get_sp(SJ_FALLINGSTAR_ATK, sc->getSCE(SC_FALLINGSTAR)->val1))) + skill_castend_nodamage_id(src, src, SJ_FALLINGSTAR_ATK, sc->getSCE(SC_FALLINGSTAR)->val1, tick, flag); if (sd) sd->state.autocast = 0; } @@ -9122,9 +9126,9 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t if( sc ){ // It has a success chance of triggering even tho the description says nothing about it. // TODO: Need to find out what the official success chance is. [Rytech] - if( sc->data[SC_SERVANTWEAPON] && sd->servantball > 0 && rnd() % 100 < 20 ){ + if( sc->getSCE(SC_SERVANTWEAPON) && sd->servantball > 0 && rnd() % 100 < 20 ){ uint16 skill_id = DK_SERVANTWEAPON_ATK; - uint16 skill_lv = sc->data[SC_SERVANTWEAPON]->val1; + uint16 skill_lv = sc->getSCE(SC_SERVANTWEAPON)->val1; sd->state.autocast = 1; pc_delservantball( *sd ); @@ -9134,7 +9138,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t } // TODO: Whats the official success chance? Is SP consumed for every autocast? [Rytech] - if( sc->data[SC_DUPLELIGHT] && pc_checkskill(sd, CD_PETITIO) > 0 && rnd() % 100 < 20 ){ + if( sc->getSCE(SC_DUPLELIGHT) && pc_checkskill(sd, CD_PETITIO) > 0 && rnd() % 100 < 20 ){ uint16 skill_id = CD_PETITIO; uint16 skill_lv = pc_checkskill( sd, CD_PETITIO ); @@ -9146,9 +9150,9 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t // It has a success chance of triggering even tho the description says nothing about it. // TODO: Need to find out what the official success chance is. [Rytech] - if( sc->data[SC_ABYSSFORCEWEAPON] && sd->abyssball > 0 && rnd() % 100 < 20 ){ + if( sc->getSCE(SC_ABYSSFORCEWEAPON) && sd->abyssball > 0 && rnd() % 100 < 20 ){ uint16 skill_id = ABC_FROM_THE_ABYSS_ATK; - uint16 skill_lv = sc->data[SC_ABYSSFORCEWEAPON]->val1; + uint16 skill_lv = sc->getSCE(SC_ABYSSFORCEWEAPON)->val1; sd->state.autocast = 1; pc_delabyssball( *sd ); @@ -9159,7 +9163,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t // It has a success chance of triggering even tho the description says nothing about it. // TODO: Need to find out what the official success chance is. [Rytech] - if( sc->data[SC_ABYSSFORCEWEAPON] && rnd() % 100 < 20 ){ + if( sc->getSCE(SC_ABYSSFORCEWEAPON) && rnd() % 100 < 20 ){ uint16 skill_id = ABC_ABYSS_SQUARE; uint16 skill_lv = pc_checkskill(sd, ABC_ABYSS_SQUARE); @@ -9170,15 +9174,15 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t } // Autocasted skills from super elemental supportive buffs. - if (sc->data[SC_FLAMETECHNIC_OPTION] && rnd() % 100 < 7) + if (sc->getSCE(SC_FLAMETECHNIC_OPTION) && rnd() % 100 < 7) battle_autocast_elembuff_skill(sd, target, MG_FIREBOLT, tick, flag); - if (sc->data[SC_COLD_FORCE_OPTION] && rnd() % 100 < 7) + if (sc->getSCE(SC_COLD_FORCE_OPTION) && rnd() % 100 < 7) battle_autocast_elembuff_skill(sd, target, MG_COLDBOLT, tick, flag); - if (sc->data[SC_GRACE_BREEZE_OPTION] && rnd() % 100 < 7) + if (sc->getSCE(SC_GRACE_BREEZE_OPTION) && rnd() % 100 < 7) battle_autocast_elembuff_skill(sd, target, MG_LIGHTNINGBOLT, tick, flag); - if (sc->data[SC_EARTH_CARE_OPTION] && rnd() % 100 < 7) + if (sc->getSCE(SC_EARTH_CARE_OPTION) && rnd() % 100 < 7) battle_autocast_elembuff_skill(sd, target, WZ_EARTHSPIKE, tick, flag); - if (sc->data[SC_DEEP_POISONING_OPTION] && rnd() % 100 < 7) + if (sc->getSCE(SC_DEEP_POISONING_OPTION) && rnd() % 100 < 7) battle_autocast_elembuff_skill(sd, target, SO_POISON_BUSTER, tick, flag); } if (wd.flag & BF_WEAPON && src != target && damage > 0) { @@ -9190,13 +9194,13 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t } if (tsc) { - if (damage > 0 && tsc->data[SC_POISONREACT] && - (rnd()%100 < tsc->data[SC_POISONREACT]->val3 + if (damage > 0 && tsc->getSCE(SC_POISONREACT) && + (rnd()%100 < tsc->getSCE(SC_POISONREACT)->val3 || sstatus->def_ele == ELE_POISON) && // check_distance_bl(src, target, tstatus->rhw.range+1) && Doesn't checks range! o.O; status_check_skilluse(target, src, TF_POISON, 0) ) { //Poison React - struct status_change_entry *sce = tsc->data[SC_POISONREACT]; + struct status_change_entry *sce = tsc->getSCE(SC_POISONREACT); if (sstatus->def_ele == ELE_POISON) { sce->val2 = 0; skill_attack(BF_WEAPON,target,target,src,AS_POISONREACT,sce->val1,tick,0); @@ -9209,7 +9213,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t } } - if (sd && tsc && wd.flag&BF_LONG && tsc->data[SC_WINDSIGN] && rand()%100 < tsc->data[SC_WINDSIGN]->val2) + if (sd && tsc && wd.flag&BF_LONG && tsc->getSCE(SC_WINDSIGN) && rand()%100 < tsc->getSCE(SC_WINDSIGN)->val2) status_heal(src, 0, 0, 1, 0); map_freeblock_unlock(); @@ -9340,7 +9344,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f if (((TBL_PC*)target)->invincible_timer != INVALID_TIMER || pc_isinvisible((TBL_PC*)target)) return -1; //Cannot be targeted yet. if( sc && sc->count ) { - if( sc->data[SC_VOICEOFSIREN] && sc->data[SC_VOICEOFSIREN]->val2 == target->id ) + if( sc->getSCE(SC_VOICEOFSIREN) && sc->getSCE(SC_VOICEOFSIREN)->val2 == target->id ) return -1; } } @@ -9435,7 +9439,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f sd = BL_CAST(BL_PC, t_bl); sc = status_get_sc(t_bl); - if( ((sd->state.block_action & PCBLOCK_IMMUNE) || (sc->data[SC_KINGS_GRACE] && s_bl->type != BL_PC)) && flag&BCT_ENEMY ) + if( ((sd->state.block_action & PCBLOCK_IMMUNE) || (sc->getSCE(SC_KINGS_GRACE) && s_bl->type != BL_PC)) && flag&BCT_ENEMY ) return 0; // Global immunity only to Attacks if( sd->status.karma && s_bl->type == BL_PC && ((TBL_PC*)s_bl)->status.karma ) state |= BCT_ENEMY; // Characters with bad karma may fight amongst them @@ -9483,7 +9487,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f } //Status changes that prevent traps from triggering if (sc && sc->count && inf2[INF2_ISTRAP]) { - if( sc->data[SC_SIGHTBLASTER] && sc->data[SC_SIGHTBLASTER]->val2 > 0 && sc->data[SC_SIGHTBLASTER]->val4%2 == 0) + if( sc->getSCE(SC_SIGHTBLASTER) && sc->getSCE(SC_SIGHTBLASTER)->val2 > 0 && sc->getSCE(SC_SIGHTBLASTER)->val4%2 == 0) return -1; } } diff --git a/src/map/battleground.cpp b/src/map/battleground.cpp index 5004b8be35..42e8c51e86 100644 --- a/src/map/battleground.cpp +++ b/src/map/battleground.cpp @@ -848,18 +848,18 @@ static bool bg_queue_check_status(struct map_session_data* sd, const char *name) nullpo_retr(false, sd); if (sd->sc.count) { - if (sd->sc.data[SC_ENTRY_QUEUE_APPLY_DELAY]) { // Exclude any player who's recently left a battleground queue + if (sd->sc.getSCE(SC_ENTRY_QUEUE_APPLY_DELAY)) { // Exclude any player who's recently left a battleground queue char buf[CHAT_SIZE_MAX]; - sprintf(buf, msg_txt(sd, 339), static_cast((get_timer(sd->sc.data[SC_ENTRY_QUEUE_APPLY_DELAY]->timer)->tick - gettick()) / 1000)); // You can't apply to a battleground queue for %d seconds due to recently leaving one. + sprintf(buf, msg_txt(sd, 339), static_cast((get_timer(sd->sc.getSCE(SC_ENTRY_QUEUE_APPLY_DELAY)->timer)->tick - gettick()) / 1000)); // You can't apply to a battleground queue for %d seconds due to recently leaving one. clif_bg_queue_apply_result(BG_APPLY_NONE, name, sd); clif_messagecolor(&sd->bl, color_table[COLOR_LIGHT_GREEN], buf, false, SELF); return false; } - if (sd->sc.data[SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT]) { // Exclude any player who's recently deserted a battleground + if (sd->sc.getSCE(SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT)) { // Exclude any player who's recently deserted a battleground char buf[CHAT_SIZE_MAX]; - int32 status_tick = static_cast(DIFF_TICK(get_timer(sd->sc.data[SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT]->timer)->tick, gettick()) / 1000); + int32 status_tick = static_cast(DIFF_TICK(get_timer(sd->sc.getSCE(SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT)->timer)->tick, gettick()) / 1000); sprintf(buf, msg_txt(sd, 338), status_tick / 60, status_tick % 60); // You can't apply to a battleground queue due to recently deserting a battleground. Time remaining: %d minutes and %d seconds. clif_bg_queue_apply_result(BG_APPLY_NONE, name, sd); diff --git a/src/map/buyingstore.cpp b/src/map/buyingstore.cpp index 9c768d4a1b..7bb99575b7 100644 --- a/src/map/buyingstore.cpp +++ b/src/map/buyingstore.cpp @@ -73,7 +73,7 @@ int8 buyingstore_setup(struct map_session_data* sd, unsigned char slots){ return 1; } - if( sd->sc.data[SC_NOCHAT] && (sd->sc.data[SC_NOCHAT]->val1&MANNER_NOROOM) ) + if( sd->sc.getSCE(SC_NOCHAT) && (sd->sc.getSCE(SC_NOCHAT)->val1&MANNER_NOROOM) ) {// custom: mute limitation return 2; } @@ -140,7 +140,7 @@ int8 buyingstore_create( struct map_session_data* sd, int zenylimit, unsigned ch return 6; } - if( sd->sc.data[SC_NOCHAT] && (sd->sc.data[SC_NOCHAT]->val1&MANNER_NOROOM) ) + if( sd->sc.getSCE(SC_NOCHAT) && (sd->sc.getSCE(SC_NOCHAT)->val1&MANNER_NOROOM) ) {// custom: mute limitation return 2; } diff --git a/src/map/chrif.cpp b/src/map/chrif.cpp index 79413cc84d..d9398d1d14 100644 --- a/src/map/chrif.cpp +++ b/src/map/chrif.cpp @@ -171,6 +171,7 @@ bool chrif_auth_delete(uint32 account_id, uint32 char_id, enum sd_state state) { if (node->sd->regs.arrays) node->sd->regs.arrays->destroy(node->sd->regs.arrays, script_free_array_db); + node->sd->~map_session_data(); aFree(node->sd); } @@ -1325,10 +1326,11 @@ int chrif_save_scdata(struct map_session_data *sd) { //parses the sc_data of the WFIFOL(char_fd,8) = sd->status.char_id; for (i = 0; i < SC_MAX; i++) { - if (!sc->data[i]) + auto sce = sc->getSCE(static_cast(i)); + if (!sce) continue; - if (sc->data[i]->timer != INVALID_TIMER) { - timer = get_timer(sc->data[i]->timer); + if (sce->timer != INVALID_TIMER) { + timer = get_timer(sce->timer); if (timer == NULL || timer->func != status_change_timer) continue; if (DIFF_TICK(timer->tick,tick) > 0) @@ -1338,10 +1340,10 @@ int chrif_save_scdata(struct map_session_data *sd) { //parses the sc_data of the } else data.tick = INFINITE_TICK; //Infinite duration data.type = i; - data.val1 = sc->data[i]->val1; - data.val2 = sc->data[i]->val2; - data.val3 = sc->data[i]->val3; - data.val4 = sc->data[i]->val4; + data.val1 = sce->val1; + data.val2 = sce->val2; + data.val3 = sce->val3; + data.val4 = sce->val4; memcpy(WFIFOP(char_fd,14 +count*sizeof(struct status_change_data)), &data, sizeof(struct status_change_data)); count++; diff --git a/src/map/clif.cpp b/src/map/clif.cpp index ade4ba1762..6e74a5829e 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -454,7 +454,7 @@ static int clif_send_sub(struct block_list *bl, va_list ap) /* unless visible, hold it here */ if (!battle_config.update_enemy_position && clif_ally_only && !sd->special_state.intravision && - !sd->sc.data[SC_INTRAVISION] && battle_check_target(src_bl,&sd->bl,BCT_ENEMY) > 0) + !sd->sc.getSCE(SC_INTRAVISION) && battle_check_target(src_bl,&sd->bl,BCT_ENEMY) > 0) return 0; WFIFOHEAD(fd, len); @@ -1560,13 +1560,13 @@ static void clif_millenniumshield_single(int fd, map_session_data *sd) { nullpo_retv(sd); - if (sd->sc.data[SC_MILLENNIUMSHIELD] == nullptr) + if (sd->sc.getSCE(SC_MILLENNIUMSHIELD) == nullptr) return; WFIFOHEAD(fd, packet_len(0x440)); WFIFOW(fd, 0) = 0x440; WFIFOL(fd, 2) = sd->bl.id; - WFIFOW(fd, 6) = sd->sc.data[SC_MILLENNIUMSHIELD]->val2; + WFIFOW(fd, 6) = sd->sc.getSCE(SC_MILLENNIUMSHIELD)->val2; WFIFOW(fd, 8) = 0; WFIFOSET(fd, packet_len(0x440)); } @@ -1705,8 +1705,8 @@ int clif_spawn( struct block_list *bl, bool walking ){ if (sd->spiritball > 0) clif_spiritball(&sd->bl); - if (sd->sc.data[SC_MILLENNIUMSHIELD]) - clif_millenniumshield(&sd->bl, sd->sc.data[SC_MILLENNIUMSHIELD]->val2); + if (sd->sc.getSCE(SC_MILLENNIUMSHIELD)) + clif_millenniumshield(&sd->bl, sd->sc.getSCE(SC_MILLENNIUMSHIELD)->val2); if (sd->soulball > 0) clif_soulball(sd); if (sd->servantball > 0) @@ -4241,8 +4241,8 @@ void clif_changeoption_target( struct block_list* bl, struct block_list* target //Whenever we send "changeoption" to the client, the provoke icon is lost //There is probably an option for the provoke icon, but as we don't know it, we have to do this for now - if( sc->data[SC_PROVOKE] ){ - const struct TimerData *td = get_timer( sc->data[SC_PROVOKE]->timer ); + if( sc->getSCE(SC_PROVOKE) ){ + const struct TimerData *td = get_timer( sc->getSCE(SC_PROVOKE)->timer ); clif_status_change( bl, status_db.getIcon(SC_PROVOKE), 1, ( !td ? INFINITE_TICK : DIFF_TICK( td->tick, gettick() ) ), 0, 0, 0 ); } @@ -4874,7 +4874,7 @@ static void clif_getareachar_pc(struct map_session_data* sd,struct map_session_d if(dstsd->spiritball > 0) clif_spiritball( &dstsd->bl, &sd->bl, SELF ); - if (dstsd->sc.data[SC_MILLENNIUMSHIELD]) + if (dstsd->sc.getSCE(SC_MILLENNIUMSHIELD)) clif_millenniumshield_single(sd->fd, dstsd); if (dstsd->spiritcharm_type != CHARM_TYPE_NONE && dstsd->spiritcharm > 0) clif_spiritcharm_single(sd->fd, dstsd); @@ -4899,7 +4899,7 @@ static void clif_getareachar_pc(struct map_session_data* sd,struct map_session_d if( i < MAX_DEVOTION ) clif_devotion(&dstsd->bl, sd); // display link (dstsd - crusader) to sd - if( dstsd->sc.data[SC_DEVOTION] && (d_bl = map_id2bl(dstsd->sc.data[SC_DEVOTION]->val1)) != NULL ) + if( dstsd->sc.getSCE(SC_DEVOTION) && (d_bl = map_id2bl(dstsd->sc.getSCE(SC_DEVOTION)->val1)) != NULL ) clif_devotion(d_bl, sd); } @@ -5086,7 +5086,7 @@ int clif_damage(struct block_list* src, struct block_list* dst, t_tick tick, int type = clif_calc_delay(type,div,damage+damage2,ddelay); sc = status_get_sc(dst); if(sc && sc->count) { - if(sc->data[SC_HALLUCINATION]) { + if(sc->getSCE(SC_HALLUCINATION)) { damage = clif_hallucination_damage(); if(damage2) damage2 = clif_hallucination_damage(); } @@ -5897,7 +5897,7 @@ int clif_skill_damage(struct block_list *src,struct block_list *dst,t_tick tick, type = clif_calc_delay(type,div,damage,ddelay); if( ( sc = status_get_sc(dst) ) && sc->count ) { - if(sc->data[SC_HALLUCINATION] && damage) + if(sc->getSCE(SC_HALLUCINATION) && damage) damage = clif_hallucination_damage(); } @@ -5994,7 +5994,7 @@ int clif_skill_damage2(struct block_list *src,struct block_list *dst,t_tick tick sc = status_get_sc(dst); if(sc && sc->count) { - if(sc->data[SC_HALLUCINATION] && damage) + if(sc->getSCE(SC_HALLUCINATION) && damage) damage = clif_hallucination_damage(); } @@ -6464,7 +6464,7 @@ void clif_efst_status_change_sub(struct block_list *tbl, struct block_list *bl, for (i = 0; i < sc_display_count; i++) { enum sc_type type = sc_display[i]->type; struct status_change *sc = status_get_sc(bl); - const struct TimerData *td = (sc && sc->data[type] ? get_timer(sc->data[type]->timer) : NULL); + const struct TimerData *td = (sc && sc->getSCE(type) ? get_timer(sc->getSCE(type)->timer) : NULL); t_tick tick = 0; if (td) @@ -6482,8 +6482,8 @@ void clif_efst_status_change_sub(struct block_list *tbl, struct block_list *bl, } break; case SC_HELLS_PLANT: - if( sc && sc->data[type] ){ - tick = sc->data[type]->val4; + if( sc && sc->getSCE(type) ){ + tick = sc->getSCE(type)->val4; } break; } @@ -9810,7 +9810,7 @@ void clif_refresh(struct map_session_data *sd) #endif if (sd->spiritball) clif_spiritball( &sd->bl, &sd->bl, SELF ); - if (sd->sc.data[SC_MILLENNIUMSHIELD]) + if (sd->sc.getSCE(SC_MILLENNIUMSHIELD)) clif_millenniumshield_single(sd->fd, sd); if (sd->spiritcharm_type != CHARM_TYPE_NONE && sd->spiritcharm > 0) clif_spiritcharm_single(sd->fd, sd); @@ -10664,6 +10664,8 @@ void clif_parse_WantToConnection(int fd, struct map_session_data* sd) } CREATE(sd, TBL_PC, 1); + // placement new + new(sd) map_session_data(); sd->fd = fd; #ifdef PACKET_OBFUSCATION sd->cryptKey = (((((clif_cryptKey[0] * clif_cryptKey[1]) + clif_cryptKey[2]) & 0xFFFFFFFF) * clif_cryptKey[1]) + clif_cryptKey[2]) & 0xFFFFFFFF; @@ -10872,7 +10874,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd) clif_status_load(&sd->bl, EFST_RIDING, 1); else if (sd->sc.option&OPTION_WUGRIDER) clif_status_load(&sd->bl, EFST_WUGRIDER, 1); - else if (sd->sc.data[SC_ALL_RIDING]) + else if (sd->sc.getSCE(SC_ALL_RIDING)) clif_status_load(&sd->bl, EFST_ALL_RIDING, 1); if(sd->status.manner < 0) @@ -11054,7 +11056,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd) if (sd->sc.opt2) //Client loses these on warp. clif_changeoption(&sd->bl); - if ((sd->sc.data[SC_MONSTER_TRANSFORM] || sd->sc.data[SC_ACTIVE_MONSTER_TRANSFORM]) && battle_config.mon_trans_disable_in_gvg && mapdata_flag_gvg2(mapdata)) { + if ((sd->sc.getSCE(SC_MONSTER_TRANSFORM) || sd->sc.getSCE(SC_ACTIVE_MONSTER_TRANSFORM)) && battle_config.mon_trans_disable_in_gvg && mapdata_flag_gvg2(mapdata)) { status_change_end(&sd->bl, SC_MONSTER_TRANSFORM); status_change_end(&sd->bl, SC_ACTIVE_MONSTER_TRANSFORM); clif_displaymessage(sd->fd, msg_txt(sd,731)); // Transforming into monster is not allowed in Guild Wars. @@ -11308,7 +11310,7 @@ void clif_parse_WalkToXY(int fd, struct map_session_data *sd) } else if (pc_cant_act(sd)) return; - if(sd->sc.data[SC_RUN] || sd->sc.data[SC_WUGDASH]) + if(sd->sc.getSCE(SC_RUN) || sd->sc.getSCE(SC_WUGDASH)) return; RFIFOPOS(fd, packet_db[RFIFOW(fd,0)].pos[0], &x, &y, NULL); @@ -11320,8 +11322,8 @@ void clif_parse_WalkToXY(int fd, struct map_session_data *sd) // Cloaking wall check is actually updated when you click to process next movement // not when you move each cell. This is official behaviour. - if (sd->sc.data[SC_CLOAKING]) - skill_check_cloaking(&sd->bl, sd->sc.data[SC_CLOAKING]); + if (sd->sc.getSCE(SC_CLOAKING)) + skill_check_cloaking(&sd->bl, sd->sc.getSCE(SC_CLOAKING)); status_change_end(&sd->bl, SC_ROLLINGCUTTER); // If you move, you lose your counters. [malufett] status_change_end(&sd->bl, SC_CRESCIVEBOLT); @@ -11364,7 +11366,7 @@ void clif_parse_QuitGame(int fd, struct map_session_data *sd) { /* Rovert's prevent logout option fixed [Valaris] */ //int type = RFIFOW(fd,packet_db[RFIFOW(fd,0)].pos[0]); - if( !sd->sc.data[SC_CLOAKING] && !sd->sc.data[SC_HIDING] && !sd->sc.data[SC_CHASEWALK] && !sd->sc.data[SC_CLOAKINGEXCEED] && !sd->sc.data[SC_SUHIDE] && !sd->sc.data[SC_NEWMOON] && + if( !sd->sc.getSCE(SC_CLOAKING) && !sd->sc.getSCE(SC_HIDING) && !sd->sc.getSCE(SC_CHASEWALK) && !sd->sc.getSCE(SC_CLOAKINGEXCEED) && !sd->sc.getSCE(SC_SUHIDE) && !sd->sc.getSCE(SC_NEWMOON) && (!battle_config.prevent_logout || sd->canlog_tick == 0 || DIFF_TICK(gettick(), sd->canlog_tick) > battle_config.prevent_logout) ) { pc_damage_log_clear(sd,0); @@ -11651,8 +11653,8 @@ void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type, break; if (sd->sc.count && ( - sd->sc.data[SC_DANCING] || - (sd->sc.data[SC_GRAVITATION] && sd->sc.data[SC_GRAVITATION]->val3 == BCT_SELF) + sd->sc.getSCE(SC_DANCING) || + (sd->sc.getSCE(SC_GRAVITATION) && sd->sc.getSCE(SC_GRAVITATION)->val3 == BCT_SELF) )) //No sitting during these states either. break; @@ -11737,7 +11739,7 @@ void clif_parse_Restart(int fd, struct map_session_data *sd) break; case 0x01: /* Rovert's Prevent logout option - Fixed [Valaris] */ - if( !sd->sc.data[SC_CLOAKING] && !sd->sc.data[SC_HIDING] && !sd->sc.data[SC_CHASEWALK] && !sd->sc.data[SC_CLOAKINGEXCEED] && !sd->sc.data[SC_SUHIDE] && !sd->sc.data[SC_NEWMOON] && + if( !sd->sc.getSCE(SC_CLOAKING) && !sd->sc.getSCE(SC_HIDING) && !sd->sc.getSCE(SC_CHASEWALK) && !sd->sc.getSCE(SC_CLOAKINGEXCEED) && !sd->sc.getSCE(SC_SUHIDE) && !sd->sc.getSCE(SC_NEWMOON) && (!battle_config.prevent_logout || sd->canlog_tick == 0 || DIFF_TICK(gettick(), sd->canlog_tick) > battle_config.prevent_logout) ) { //Send to char-server for character selection. pc_damage_log_clear(sd,0); @@ -12261,7 +12263,7 @@ void clif_parse_CreateChatRoom(int fd, struct map_session_data* sd) char s_password[CHATROOM_PASS_SIZE]; char s_title[CHATROOM_TITLE_SIZE]; - if (sd->sc.data[SC_NOCHAT] && sd->sc.data[SC_NOCHAT]->val1&MANNER_NOROOM) + if (sd->sc.getSCE(SC_NOCHAT) && sd->sc.getSCE(SC_NOCHAT)->val1&MANNER_NOROOM) return; if(battle_config.basic_skill_check && pc_checkskill(sd,NV_BASIC) < 4 && pc_checkskill(sd, SU_BASIC_SKILL) < 1) { clif_skill_fail(sd,1,USESKILL_FAIL_LEVEL,3); @@ -12501,7 +12503,7 @@ void clif_parse_RemoveOption(int fd,struct map_session_data *sd) { if( !(sd->sc.option&(OPTION_RIDING|OPTION_FALCON|OPTION_DRAGON|OPTION_MADOGEAR)) #ifdef NEW_CARTS - && sd->sc.data[SC_PUSH_CART] ) + && sd->sc.getSCE(SC_PUSH_CART) ) pc_setcart(sd,0); #else ) @@ -12683,9 +12685,9 @@ static void clif_parse_UseSkillToPos_homun(struct homun_data *hd, struct map_ses } #ifdef RENEWAL - if (hd->sc.data[SC_BASILICA_CELL]) + if (hd->sc.getSCE(SC_BASILICA_CELL)) #else - if (hd->sc.data[SC_BASILICA]) + if (hd->sc.getSCE(SC_BASILICA)) #endif return; lv = hom_checkskill(hd, skill_id); @@ -12736,9 +12738,9 @@ static void clif_parse_UseSkillToPos_mercenary(s_mercenary_data *md, struct map_ } #ifdef RENEWAL - if (md->sc.data[SC_BASILICA_CELL]) + if (md->sc.getSCE(SC_BASILICA_CELL)) #else - if (md->sc.data[SC_BASILICA]) + if (md->sc.getSCE(SC_BASILICA)) #endif return; lv = mercenary_checkskill(md, skill_id); @@ -12822,7 +12824,7 @@ void clif_parse_skill_toid( struct map_session_data* sd, uint16 skill_id, uint16 return; #ifndef RENEWAL - if( sd->sc.data[SC_BASILICA] && (skill_id != HP_BASILICA || sd->sc.data[SC_BASILICA]->val4 != sd->bl.id) ) + if( sd->sc.getSCE(SC_BASILICA) && (skill_id != HP_BASILICA || sd->sc.getSCE(SC_BASILICA)->val4 != sd->bl.id) ) return; // On basilica only caster can use Basilica again to stop it. #endif @@ -12938,7 +12940,7 @@ static void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, uin return; #ifndef RENEWAL - if( sd->sc.data[SC_BASILICA] && (skill_id != HP_BASILICA || sd->sc.data[SC_BASILICA]->val4 != sd->bl.id) ) + if( sd->sc.getSCE(SC_BASILICA) && (skill_id != HP_BASILICA || sd->sc.getSCE(SC_BASILICA)->val4 != sd->bl.id) ) return; // On basilica only caster can use Basilica again to stop it. #endif @@ -14000,7 +14002,7 @@ void clif_parse_OpenVending(int fd, struct map_session_data* sd){ } } - if( sd->sc.data[SC_NOCHAT] && sd->sc.data[SC_NOCHAT]->val1&MANNER_NOROOM ) + if( sd->sc.getSCE(SC_NOCHAT) && sd->sc.getSCE(SC_NOCHAT)->val1&MANNER_NOROOM ) return; if( map_getmapflag(sd->bl.m, MF_NOVENDING) ) { clif_displaymessage (sd->fd, msg_txt(sd,276)); // "You can't open a shop on this map" diff --git a/src/map/elemental.cpp b/src/map/elemental.cpp index 5a784470f4..2639439e35 100644 --- a/src/map/elemental.cpp +++ b/src/map/elemental.cpp @@ -583,7 +583,7 @@ static int elemental_ai_sub_timer(s_elemental_data *ed, map_session_data *sd, t_ int master_dist, view_range; - if( ed->sc.count && ed->sc.data[SC_BLIND] ) + if( ed->sc.count && ed->sc.getSCE(SC_BLIND) ) view_range = 3; else view_range = ed->db->range2; diff --git a/src/map/mail.cpp b/src/map/mail.cpp index d4eb32d18c..549f318a70 100644 --- a/src/map/mail.cpp +++ b/src/map/mail.cpp @@ -438,11 +438,11 @@ void mail_send(struct map_session_data *sd, const char *dest_name, const char *t mail_refresh_remaining_amount(sd); // After calling mail_refresh_remaining_amount the status should always be there - if( sd->sc.data[SC_DAILYSENDMAILCNT] == NULL || sd->sc.data[SC_DAILYSENDMAILCNT]->val2 >= battle_config.mail_daily_count ){ + if( sd->sc.getSCE(SC_DAILYSENDMAILCNT) == NULL || sd->sc.getSCE(SC_DAILYSENDMAILCNT)->val2 >= battle_config.mail_daily_count ){ clif_Mail_send(sd, WRITE_MAIL_FAILED_CNT); return; }else{ - sc_start2( &sd->bl, &sd->bl, SC_DAILYSENDMAILCNT, 100, date_get_dayofyear(), sd->sc.data[SC_DAILYSENDMAILCNT]->val2 + 1, INFINITE_TICK ); + sc_start2( &sd->bl, &sd->bl, SC_DAILYSENDMAILCNT, 100, date_get_dayofyear(), sd->sc.getSCE(SC_DAILYSENDMAILCNT)->val2 + 1, INFINITE_TICK ); } } @@ -490,7 +490,7 @@ void mail_refresh_remaining_amount( struct map_session_data* sd ){ nullpo_retv(sd); // If it was not yet started or it was started on another day - if( sd->sc.data[SC_DAILYSENDMAILCNT] == NULL || sd->sc.data[SC_DAILYSENDMAILCNT]->val1 != doy ){ + if( sd->sc.getSCE(SC_DAILYSENDMAILCNT) == NULL || sd->sc.getSCE(SC_DAILYSENDMAILCNT)->val1 != doy ){ sc_start2( &sd->bl, &sd->bl, SC_DAILYSENDMAILCNT, 100, doy, 0, INFINITE_TICK ); } } diff --git a/src/map/map.cpp b/src/map/map.cpp index 3391edef34..a090a9f5f2 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -462,8 +462,8 @@ int map_moveblock(struct block_list *bl, int x1, int y1, t_tick tick) status_change_end(bl, SC_TATAMIGAESHI); status_change_end(bl, SC_MAGICROD); status_change_end(bl, SC_SU_STOOP); - if (sc->data[SC_PROPERTYWALK] && - sc->data[SC_PROPERTYWALK]->val3 >= skill_get_maxcount(sc->data[SC_PROPERTYWALK]->val1,sc->data[SC_PROPERTYWALK]->val2) ) + if (sc->getSCE(SC_PROPERTYWALK) && + sc->getSCE(SC_PROPERTYWALK)->val3 >= skill_get_maxcount(sc->getSCE(SC_PROPERTYWALK)->val1,sc->getSCE(SC_PROPERTYWALK)->val2) ) status_change_end(bl,SC_PROPERTYWALK); } } else @@ -498,49 +498,49 @@ int map_moveblock(struct block_list *bl, int x1, int y1, t_tick tick) } if (sc && sc->count) { - if (sc->data[SC_DANCING]) - skill_unit_move_unit_group(skill_id2group(sc->data[SC_DANCING]->val2), bl->m, x1-x0, y1-y0); + if (sc->getSCE(SC_DANCING)) + skill_unit_move_unit_group(skill_id2group(sc->getSCE(SC_DANCING)->val2), bl->m, x1-x0, y1-y0); else { - if (sc->data[SC_CLOAKING] && sc->data[SC_CLOAKING]->val1 < 3 && !skill_check_cloaking(bl, NULL)) + if (sc->getSCE(SC_CLOAKING) && sc->getSCE(SC_CLOAKING)->val1 < 3 && !skill_check_cloaking(bl, NULL)) status_change_end(bl, SC_CLOAKING); - if (sc->data[SC_WARM]) - skill_unit_move_unit_group(skill_id2group(sc->data[SC_WARM]->val4), bl->m, x1-x0, y1-y0); - if (sc->data[SC_BANDING]) - skill_unit_move_unit_group(skill_id2group(sc->data[SC_BANDING]->val4), bl->m, x1-x0, y1-y0); + if (sc->getSCE(SC_WARM)) + skill_unit_move_unit_group(skill_id2group(sc->getSCE(SC_WARM)->val4), bl->m, x1-x0, y1-y0); + if (sc->getSCE(SC_BANDING)) + skill_unit_move_unit_group(skill_id2group(sc->getSCE(SC_BANDING)->val4), bl->m, x1-x0, y1-y0); - if (sc->data[SC_NEUTRALBARRIER_MASTER]) - skill_unit_move_unit_group(skill_id2group(sc->data[SC_NEUTRALBARRIER_MASTER]->val2), bl->m, x1-x0, y1-y0); - else if (sc->data[SC_STEALTHFIELD_MASTER]) - skill_unit_move_unit_group(skill_id2group(sc->data[SC_STEALTHFIELD_MASTER]->val2), bl->m, x1-x0, y1-y0); + if (sc->getSCE(SC_NEUTRALBARRIER_MASTER)) + skill_unit_move_unit_group(skill_id2group(sc->getSCE(SC_NEUTRALBARRIER_MASTER)->val2), bl->m, x1-x0, y1-y0); + else if (sc->getSCE(SC_STEALTHFIELD_MASTER)) + skill_unit_move_unit_group(skill_id2group(sc->getSCE(SC_STEALTHFIELD_MASTER)->val2), bl->m, x1-x0, y1-y0); - if( sc->data[SC__SHADOWFORM] ) {//Shadow Form Caster Moving + if( sc->getSCE(SC__SHADOWFORM) ) {//Shadow Form Caster Moving struct block_list *d_bl; - if( (d_bl = map_id2bl(sc->data[SC__SHADOWFORM]->val2)) == NULL || !check_distance_bl(bl,d_bl,10) ) + if( (d_bl = map_id2bl(sc->getSCE(SC__SHADOWFORM)->val2)) == NULL || !check_distance_bl(bl,d_bl,10) ) status_change_end(bl,SC__SHADOWFORM); } - if (sc->data[SC_PROPERTYWALK] - && sc->data[SC_PROPERTYWALK]->val3 < skill_get_maxcount(sc->data[SC_PROPERTYWALK]->val1,sc->data[SC_PROPERTYWALK]->val2) + if (sc->getSCE(SC_PROPERTYWALK) + && sc->getSCE(SC_PROPERTYWALK)->val3 < skill_get_maxcount(sc->getSCE(SC_PROPERTYWALK)->val1,sc->getSCE(SC_PROPERTYWALK)->val2) && map_find_skill_unit_oncell(bl,bl->x,bl->y,SO_ELECTRICWALK,NULL,0) == NULL && map_find_skill_unit_oncell(bl,bl->x,bl->y,NPC_ELECTRICWALK,NULL,0) == NULL && map_find_skill_unit_oncell(bl,bl->x,bl->y,SO_FIREWALK,NULL,0) == NULL && map_find_skill_unit_oncell(bl,bl->x,bl->y,NPC_FIREWALK,NULL,0) == NULL - && skill_unitsetting(bl,sc->data[SC_PROPERTYWALK]->val1,sc->data[SC_PROPERTYWALK]->val2,x0, y0,0)) { - sc->data[SC_PROPERTYWALK]->val3++; + && skill_unitsetting(bl,sc->getSCE(SC_PROPERTYWALK)->val1,sc->getSCE(SC_PROPERTYWALK)->val2,x0, y0,0)) { + sc->getSCE(SC_PROPERTYWALK)->val3++; } } /* Guild Aura Moving */ if( bl->type == BL_PC && ((TBL_PC*)bl)->state.gmaster_flag ) { - if (sc->data[SC_LEADERSHIP]) - skill_unit_move_unit_group(skill_id2group(sc->data[SC_LEADERSHIP]->val4), bl->m, x1-x0, y1-y0); - if (sc->data[SC_GLORYWOUNDS]) - skill_unit_move_unit_group(skill_id2group(sc->data[SC_GLORYWOUNDS]->val4), bl->m, x1-x0, y1-y0); - if (sc->data[SC_SOULCOLD]) - skill_unit_move_unit_group(skill_id2group(sc->data[SC_SOULCOLD]->val4), bl->m, x1-x0, y1-y0); - if (sc->data[SC_HAWKEYES]) - skill_unit_move_unit_group(skill_id2group(sc->data[SC_HAWKEYES]->val4), bl->m, x1-x0, y1-y0); + if (sc->getSCE(SC_LEADERSHIP)) + skill_unit_move_unit_group(skill_id2group(sc->getSCE(SC_LEADERSHIP)->val4), bl->m, x1-x0, y1-y0); + if (sc->getSCE(SC_GLORYWOUNDS)) + skill_unit_move_unit_group(skill_id2group(sc->getSCE(SC_GLORYWOUNDS)->val4), bl->m, x1-x0, y1-y0); + if (sc->getSCE(SC_SOULCOLD)) + skill_unit_move_unit_group(skill_id2group(sc->getSCE(SC_SOULCOLD)->val4), bl->m, x1-x0, y1-y0); + if (sc->getSCE(SC_HAWKEYES)) + skill_unit_move_unit_group(skill_id2group(sc->getSCE(SC_HAWKEYES)->val4), bl->m, x1-x0, y1-y0); } } } else @@ -2105,7 +2105,7 @@ int map_quit(struct map_session_data *sd) { std::bitset &flag = it.second->flag; //No need to save infinite status - if (flag[SCF_NOSAVEINFINITE] && sd->sc.data[it.first] && sd->sc.data[it.first]->val4 > 0) { + if (flag[SCF_NOSAVEINFINITE] && sd->sc.getSCE(it.first) && sd->sc.getSCE(it.first)->val4 > 0) { status_change_end(&sd->bl, static_cast(it.first)); continue; } @@ -3895,7 +3895,6 @@ int parse_console(const char* buf){ int n; struct map_session_data sd; - memset(&sd, 0, sizeof(struct map_session_data)); strcpy(sd.status.name, "console"); if( ( n = sscanf(buf, "%63[^:]:%63[^:]:%11s %6hd %6hd[^\n]", type, command, mapname, &x, &y) ) < 5 ){ diff --git a/src/map/mob.cpp b/src/map/mob.cpp index 735510c1e6..ec9fab2323 100644 --- a/src/map/mob.cpp +++ b/src/map/mob.cpp @@ -573,7 +573,7 @@ bool mob_ksprotected (struct block_list *src, struct block_list *target) if( md->get_bosstype() == BOSSTYPE_MVP || md->master_id ) return false; // MVP, Slaves mobs ignores KS - if( (sce = md->sc.data[SC_KSPROTECTED]) == nullptr ) + if( (sce = md->sc.getSCE(SC_KSPROTECTED)) == nullptr ) break; // No KS Protected if( sd->bl.id == sce->val1 || // Same Owner @@ -1709,7 +1709,7 @@ static bool mob_ai_sub_hard(struct mob_data *md, t_tick tick) return false; } - if (md->sc.count && md->sc.data[SC_BLIND]) + if (md->sc.count && md->sc.getSCE(SC_BLIND)) view_range = 3; else view_range = md->db->range2; @@ -1744,9 +1744,9 @@ static bool mob_ai_sub_hard(struct mob_data *md, t_tick tick) { //Rude attacked check. if( !battle_check_range(&md->bl, tbl, md->status.rhw.range) && ( //Can't attack back and can't reach back. - (!can_move && DIFF_TICK(tick, md->ud.canmove_tick) > 0 && (battle_config.mob_ai&0x2 || md->sc.data[SC_SPIDERWEB] - || md->sc.data[SC_BITE] || md->sc.data[SC_VACUUM_EXTREME] || md->sc.data[SC_THORNSTRAP] - || md->sc.data[SC__MANHOLE] // Not yet confirmed if boss will teleport once it can't reach target. + (!can_move && DIFF_TICK(tick, md->ud.canmove_tick) > 0 && (battle_config.mob_ai&0x2 || md->sc.getSCE(SC_SPIDERWEB) + || md->sc.getSCE(SC_BITE) || md->sc.getSCE(SC_VACUUM_EXTREME) || md->sc.getSCE(SC_THORNSTRAP) + || md->sc.getSCE(SC__MANHOLE) // Not yet confirmed if boss will teleport once it can't reach target. || md->walktoxy_fail_count > 0) ) || !mob_can_reach(md, tbl, md->min_chase) @@ -1769,9 +1769,9 @@ static bool mob_ai_sub_hard(struct mob_data *md, t_tick tick) || (battle_config.mob_ai&0x2 && !status_check_skilluse(&md->bl, abl, 0, 0)) // Cannot normal attack back to Attacker || (!battle_check_range(&md->bl, abl, md->status.rhw.range) // Not on Melee Range and ... && ( // Reach check - (!can_move && DIFF_TICK(tick, md->ud.canmove_tick) > 0 && (battle_config.mob_ai&0x2 || md->sc.data[SC_SPIDERWEB] - || md->sc.data[SC_BITE] || md->sc.data[SC_VACUUM_EXTREME] || md->sc.data[SC_THORNSTRAP] - || md->sc.data[SC__MANHOLE] // Not yet confirmed if boss will teleport once it can't reach target. + (!can_move && DIFF_TICK(tick, md->ud.canmove_tick) > 0 && (battle_config.mob_ai&0x2 || md->sc.getSCE(SC_SPIDERWEB) + || md->sc.getSCE(SC_BITE) || md->sc.getSCE(SC_VACUUM_EXTREME) || md->sc.getSCE(SC_THORNSTRAP) + || md->sc.getSCE(SC__MANHOLE) // Not yet confirmed if boss will teleport once it can't reach target. || md->walktoxy_fail_count > 0) ) || !mob_can_reach(md, abl, dist+md->db->range3) @@ -2487,8 +2487,8 @@ int mob_getdroprate(struct block_list *src, std::shared_ptr mob, int b drop_rate_bonus += sd->indexed_bonus.dropaddclass[mob->status.class_] + sd->indexed_bonus.dropaddclass[CLASS_ALL]; drop_rate_bonus += sd->indexed_bonus.dropaddrace[mob->status.race] + sd->indexed_bonus.dropaddrace[RC_ALL]; - if (sd->sc.data[SC_ITEMBOOST]) - drop_rate_bonus += sd->sc.data[SC_ITEMBOOST]->val1; + if (sd->sc.getSCE(SC_ITEMBOOST)) + drop_rate_bonus += sd->sc.getSCE(SC_ITEMBOOST)->val1; int cap; @@ -2634,15 +2634,15 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) int bonus = 100; //Bonus on top of your share (common to all attackers). int pnum = 0; #ifndef RENEWAL - if (md->sc.data[SC_RICHMANKIM]) - bonus += md->sc.data[SC_RICHMANKIM]->val2; + if (md->sc.getSCE(SC_RICHMANKIM)) + bonus += md->sc.getSCE(SC_RICHMANKIM)->val2; #else - if (sd && sd->sc.data[SC_RICHMANKIM]) - bonus += sd->sc.data[SC_RICHMANKIM]->val2; + if (sd && sd->sc.getSCE(SC_RICHMANKIM)) + bonus += sd->sc.getSCE(SC_RICHMANKIM)->val2; #endif if(sd) { temp = status_get_class(&md->bl); - if(sd->sc.data[SC_MIRACLE]) i = 2; //All mobs are Star Targets + if(sd->sc.getSCE(SC_MIRACLE)) i = 2; //All mobs are Star Targets else ARR_FIND(0, MAX_PC_FEELHATE, i, temp == sd->hate_mob[i] && (battle_config.allow_skill_without_day || sg_info[i].day_func())); @@ -3059,7 +3059,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) //Emperium destroyed by script. Discard mvp character. [Skotlex] mvp_sd = NULL; - rebirth = ( md->sc.data[SC_KAIZEL] || md->sc.data[SC_ULTIMATE_S] || (md->sc.data[SC_REBIRTH] && !md->state.rebirth) ); + rebirth = ( md->sc.getSCE(SC_KAIZEL) || md->sc.getSCE(SC_ULTIMATE_S) || (md->sc.getSCE(SC_REBIRTH) && !md->state.rebirth) ); if( !rebirth ) { // Only trigger event on final kill if( src ) { switch( src->type ) { //allowed type @@ -3656,11 +3656,11 @@ int mob_getfriendstatus_sub(struct block_list *bl,va_list ap) if( cond2==-1 ){ int j; for(j=SC_COMMON_MIN;j<=SC_COMMON_MAX && !flag;j++){ - if ((flag=(md->sc.data[j] != NULL))) //Once an effect was found, break out. [Skotlex] + if ((flag=(md->sc.getSCE(j) != NULL))) //Once an effect was found, break out. [Skotlex] break; } }else - flag=( md->sc.data[cond2] != NULL ); + flag=( md->sc.getSCE(cond2) != NULL ); if( flag^( cond1==MSC_FRIENDSTATUSOFF ) ) (*fr)=md; @@ -3768,10 +3768,10 @@ int mobskill_use(struct mob_data *md, t_tick tick, int event, int64 damage) flag = 0; } else if (ms[i]->cond2 == -1) { for (j = SC_COMMON_MIN; j <= SC_COMMON_MAX; j++) - if ((flag = (md->sc.data[j]!=NULL)) != 0) + if ((flag = (md->sc.getSCE(j)!=NULL)) != 0) break; } else { - flag = (md->sc.data[ms[i]->cond2]!=NULL); + flag = (md->sc.getSCE(ms[i]->cond2)!=NULL); } flag ^= (ms[i]->cond1 == MSC_MYSTATUSOFF); break; case MSC_FRIENDHPLTMAXRATE: // friend HP < maxhp% diff --git a/src/map/npc.cpp b/src/map/npc.cpp index f876e07f12..cf5939f027 100644 --- a/src/map/npc.cpp +++ b/src/map/npc.cpp @@ -1874,7 +1874,7 @@ int npc_touch_areanpc(struct map_session_data* sd, int16 m, int16 x, int16 y, st switch (nd->subtype) { case NPCTYPE_WARP: - if ((!nd->trigger_on_hidden && (pc_ishiding(sd) || (sd->sc.count && sd->sc.data[SC_CAMOUFLAGE]))) || pc_isdead(sd)) + if ((!nd->trigger_on_hidden && (pc_ishiding(sd) || (sd->sc.count && sd->sc.getSCE(SC_CAMOUFLAGE)))) || pc_isdead(sd)) break; // hidden or dead chars cannot use warps if (!pc_job_can_entermap((enum e_job)sd->status.class_, map_mapindex2mapid(nd->u.warp.mapindex), pc_get_group_level(sd))) break; diff --git a/src/map/party.cpp b/src/map/party.cpp index 42b7e5a349..c0dd406ecf 100644 --- a/src/map/party.cpp +++ b/src/map/party.cpp @@ -1006,7 +1006,7 @@ int party_skill_check(struct map_session_data *sd, int party_id, uint16 skill_id break; case MO_COMBOFINISH: //Increase Counter rate of Star Gladiators if((p_sd->class_&MAPID_UPPERMASK) == MAPID_STAR_GLADIATOR - && p_sd->sc.data[SC_READYCOUNTER] + && p_sd->sc.getSCE(SC_READYCOUNTER) && pc_checkskill(p_sd,SG_FRIEND)) { sc_start4(&p_sd->bl,&p_sd->bl,SC_SKILLRATE_UP,100,TK_COUNTER, 50+50*pc_checkskill(p_sd,SG_FRIEND), //+100/150/200% rate diff --git a/src/map/pc.cpp b/src/map/pc.cpp index 96ebd0a297..de76637c38 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -916,7 +916,7 @@ int pc_addsoulball(map_session_data *sd, int max) status_change *sc = status_get_sc(&sd->bl); - if (sc == nullptr || sc->data[SC_SOULENERGY] == nullptr) { + if (sc == nullptr || sc->getSCE(SC_SOULENERGY) == nullptr) { sc_start(&sd->bl, &sd->bl, SC_SOULENERGY, 100, 0, skill_get_time2(SP_SOULCOLLECT, 1)); sd->soulball = 0; } @@ -949,14 +949,14 @@ int pc_delsoulball(map_session_data *sd, int count, bool type) status_change *sc = status_get_sc(&sd->bl); - if (sd->soulball <= 0 || sc == nullptr || sc->data[SC_SOULENERGY] == nullptr) { + if (sd->soulball <= 0 || sc == nullptr || sc->getSCE(SC_SOULENERGY) == nullptr) { sd->soulball = 0; }else{ sd->soulball -= cap_value(count, 0, sd->soulball); if (sd->soulball == 0) status_change_end(&sd->bl, SC_SOULENERGY); else - sc->data[SC_SOULENERGY]->val1 = sd->soulball; + sc->getSCE(SC_SOULENERGY)->val1 = sd->soulball; } if (!type) @@ -1307,7 +1307,7 @@ void pc_makesavestatus(struct map_session_data *sd) { #else sd->status.option = sd->sc.option&(OPTION_INVISIBLE|OPTION_CART|OPTION_FALCON|OPTION_RIDING|OPTION_DRAGON|OPTION_WUG|OPTION_WUGRIDER|OPTION_MADOGEAR); #endif - if (sd->sc.data[SC_JAILED]) { //When Jailed, do not move last point. + if (sd->sc.getSCE(SC_JAILED)) { //When Jailed, do not move last point. if(pc_isdead(sd)){ pc_setrestartvalue(sd, 0); } else { @@ -1825,24 +1825,24 @@ uint8 pc_isequip(struct map_session_data *sd,int n) } if (sd->sc.count) { - if(item->equip & EQP_ARMS && item->type == IT_WEAPON && sd->sc.data[SC_STRIPWEAPON]) // Also works with left-hand weapons [DracoRPG] + if(item->equip & EQP_ARMS && item->type == IT_WEAPON && sd->sc.getSCE(SC_STRIPWEAPON)) // Also works with left-hand weapons [DracoRPG] return ITEM_EQUIP_ACK_FAIL; - if(item->equip & EQP_SHIELD && item->type == IT_ARMOR && sd->sc.data[SC_STRIPSHIELD]) + if(item->equip & EQP_SHIELD && item->type == IT_ARMOR && sd->sc.getSCE(SC_STRIPSHIELD)) return ITEM_EQUIP_ACK_FAIL; - if(item->equip & EQP_ARMOR && sd->sc.data[SC_STRIPARMOR]) + if(item->equip & EQP_ARMOR && sd->sc.getSCE(SC_STRIPARMOR)) return ITEM_EQUIP_ACK_FAIL; - if(item->equip & EQP_HEAD_TOP && sd->sc.data[SC_STRIPHELM]) + if(item->equip & EQP_HEAD_TOP && sd->sc.getSCE(SC_STRIPHELM)) return ITEM_EQUIP_ACK_FAIL; - if(item->equip & EQP_ACC && sd->sc.data[SC__STRIPACCESSORY]) + if(item->equip & EQP_ACC && sd->sc.getSCE(SC__STRIPACCESSORY)) return ITEM_EQUIP_ACK_FAIL; - if (item->equip & EQP_ARMS && sd->sc.data[SC__WEAKNESS]) + if (item->equip & EQP_ARMS && sd->sc.getSCE(SC__WEAKNESS)) return ITEM_EQUIP_ACK_FAIL; - if (item->equip & EQP_SHADOW_GEAR && sd->sc.data[SC_SHADOW_STRIP]) + if (item->equip & EQP_SHADOW_GEAR && sd->sc.getSCE(SC_SHADOW_STRIP)) return ITEM_EQUIP_ACK_FAIL; - if(item->equip && (sd->sc.data[SC_KYOUGAKU] || sd->sc.data[SC_SUHIDE])) + if(item->equip && (sd->sc.getSCE(SC_KYOUGAKU) || sd->sc.getSCE(SC_SUHIDE))) return ITEM_EQUIP_ACK_FAIL; - if (sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_SUPERNOVICE) { + if (sd->sc.getSCE(SC_SPIRIT) && sd->sc.getSCE(SC_SPIRIT)->val2 == SL_SUPERNOVICE) { //Spirit of Super Novice equip bonuses. [Skotlex] if (sd->status.base_level > 90 && item->equip & EQP_HELM) return ITEM_EQUIP_ACK_OK; //Can equip all helms @@ -2528,7 +2528,7 @@ void pc_calc_skilltree(struct map_session_data *sd) if (!sd->status.skill[sk_idx].lv && ( (skill->inf2[INF2_ISQUEST] && !battle_config.quest_skill_learn) || skill->inf2[INF2_ISWEDDING] || - (skill->inf2[INF2_ISSPIRIT] && !sd->sc.data[SC_SPIRIT]) + (skill->inf2[INF2_ISSPIRIT] && !sd->sc.getSCE(SC_SPIRIT)) )) continue; //Cannot be learned via normal means. Note this check DOES allows raising already known skills. @@ -2575,7 +2575,7 @@ void pc_calc_skilltree(struct map_session_data *sd) } // Enable Bard/Dancer spirit linked skills. - if (sd->sc.count && sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_BARDDANCER) { + if (sd->sc.count && sd->sc.getSCE(SC_SPIRIT) && sd->sc.getSCE(SC_SPIRIT)->val2 == SL_BARDDANCER) { std::vector> linked_skills = { { BA_WHISTLE, DC_HUMMING }, { BA_ASSASSINCROSS, DC_DONTFORGETME }, { BA_POEMBRAGI, DC_FORTUNEKISS }, @@ -2655,7 +2655,7 @@ static void pc_check_skilltree(struct map_session_data *sd) if( !sd->status.skill[sk_idx].lv && ( (skill->inf2[INF2_ISQUEST] && !battle_config.quest_skill_learn) || skill->inf2[INF2_ISWEDDING] || - (skill->inf2[INF2_ISSPIRIT] && !sd->sc.data[SC_SPIRIT]) + (skill->inf2[INF2_ISSPIRIT] && !sd->sc.getSCE(SC_SPIRIT)) ) ) continue; //Cannot be learned via normal means. @@ -2816,7 +2816,7 @@ void pc_updateweightstatus(struct map_session_data *sd) nullpo_retv(sd); - old_overweight = (sd->sc.data[SC_WEIGHT90]) ? 2 : (sd->sc.data[SC_WEIGHT50]) ? 1 : 0; + old_overweight = (sd->sc.getSCE(SC_WEIGHT90)) ? 2 : (sd->sc.getSCE(SC_WEIGHT50)) ? 1 : 0; #ifdef RENEWAL new_overweight = (pc_is90overweight(sd)) ? 2 : (pc_is70overweight(sd)) ? 1 : 0; #else @@ -6212,7 +6212,7 @@ int pc_useitem(struct map_session_data *sd,int n) /* Items with delayed consume are not meant to work while in mounts except reins of mount(12622) */ if( id->flag.delay_consume > 0 ) { - if( nameid != ITEMID_REINS_OF_MOUNT && sd->sc.data[SC_ALL_RIDING] ) + if( nameid != ITEMID_REINS_OF_MOUNT && sd->sc.getSCE(SC_ALL_RIDING) ) return 0; else if( pc_issit(sd) ) return 0; @@ -6612,8 +6612,8 @@ int pc_steal_coin(struct map_session_data *sd,struct block_list *target) md = (TBL_MOB*)target; target_lv = status_get_lv(target); - if (md->state.steal_coin_flag || md->sc.data[SC_STONE] || md->sc.data[SC_FREEZE] || md->sc.data[SC_HANDICAPSTATE_FROSTBITE] || - md->sc.data[SC_HANDICAPSTATE_SWOONING] || md->sc.data[SC_HANDICAPSTATE_LIGHTNINGSTRIKE] || md->sc.data[SC_HANDICAPSTATE_CRYSTALLIZATION] || + if (md->state.steal_coin_flag || md->sc.getSCE(SC_STONE) || md->sc.getSCE(SC_FREEZE) || md->sc.getSCE(SC_HANDICAPSTATE_FROSTBITE) || + md->sc.getSCE(SC_HANDICAPSTATE_SWOONING) || md->sc.getSCE(SC_HANDICAPSTATE_LIGHTNINGSTRIKE) || md->sc.getSCE(SC_HANDICAPSTATE_CRYSTALLIZATION) || status_bl_has_mode(target,MD_STATUSIMMUNE) || util::vector_exists(status_get_race2(&md->bl), RC2_TREASURE)) return 0; @@ -6691,12 +6691,12 @@ enum e_setpos pc_setpos(struct map_session_data* sd, unsigned short mapindex, in return SETPOS_MAPINDEX; // You may not get out! for (const auto &it : status_db) { - if (sc->data[it.first]) { + if (sc->getSCE(it.first)) { if (it.second->flag[SCF_REMOVEONMAPWARP]) status_change_end(&sd->bl, static_cast(it.first)); if (it.second->flag[SCF_RESTARTONMAPWARP] && it.second->skill_id > 0) { - status_change_entry *sce = sd->sc.data[it.first]; + status_change_entry *sce = sd->sc.getSCE(it.first); if (sce->timer != INVALID_TIMER) delete_timer(sce->timer, status_change_timer); @@ -6988,7 +6988,7 @@ int pc_get_skillcooldown(struct map_session_data *sd, uint16 skill_id, uint16 sk if (skill_id == SJ_NOVAEXPLOSING) { struct status_change *sc = status_get_sc(&sd->bl); - if (sc && sc->data[SC_DIMENSION]) + if (sc && sc->getSCE(SC_DIMENSION)) return 0; } @@ -7135,12 +7135,12 @@ static void pc_checkallowskill(struct map_session_data *sd) if (flag[SCF_REQUIREWEAPON]) { // Skills requiring specific weapon types if (status == SC_DANCING && !battle_config.dancing_weaponswitch_fix) continue; - if (sd->sc.data[status] && !pc_check_weapontype(sd, skill_get_weapontype(it.second->skill_id))) + if (sd->sc.getSCE(status) && !pc_check_weapontype(sd, skill_get_weapontype(it.second->skill_id))) status_change_end(&sd->bl, status); } if (flag[SCF_REQUIRESHIELD]) { // Skills requiring a shield - if (sd->sc.data[status] && sd->status.shield <= 0) + if (sd->sc.getSCE(status) && sd->status.shield <= 0) status_change_end(&sd->bl, status); } } @@ -8074,10 +8074,10 @@ static void pc_calcexp(struct map_session_data *sd, t_exp *base_exp, t_exp *job_ } // Give EXPBOOST for quests even if src is NULL. - if (sd->sc.data[SC_EXPBOOST]) { - bonus += sd->sc.data[SC_EXPBOOST]->val1; + if (sd->sc.getSCE(SC_EXPBOOST)) { + bonus += sd->sc.getSCE(SC_EXPBOOST)->val1; if (battle_config.vip_bm_increase && pc_isvip(sd)) // Increase Battle Manual EXP rate for VIP - bonus += (sd->sc.data[SC_EXPBOOST]->val1 / battle_config.vip_bm_increase); + bonus += (sd->sc.getSCE(SC_EXPBOOST)->val1 / battle_config.vip_bm_increase); } if (*base_exp) { @@ -8086,8 +8086,8 @@ static void pc_calcexp(struct map_session_data *sd, t_exp *base_exp, t_exp *job_ } // Give JEXPBOOST for quests even if src is NULL. - if (sd->sc.data[SC_JEXPBOOST]) - bonus += sd->sc.data[SC_JEXPBOOST]->val1; + if (sd->sc.getSCE(SC_JEXPBOOST)) + bonus += sd->sc.getSCE(SC_JEXPBOOST)->val1; if (*job_exp) { t_exp exp = (t_exp)(*job_exp + ((double)*job_exp * ((bonus + vip_bonus_job) / 100.))); @@ -9137,7 +9137,7 @@ int pc_resetskill(struct map_session_data* sd, int flag) if( i&OPTION_CART && pc_checkskill(sd, MC_PUSHCART) ) i &= ~OPTION_CART; #else - if( sd->sc.data[SC_PUSH_CART] ) + if( sd->sc.getSCE(SC_PUSH_CART) ) pc_setcart(sd, 0); #endif if( i != sd->sc.option ) @@ -9146,9 +9146,9 @@ int pc_resetskill(struct map_session_data* sd, int flag) if( hom_is_active(sd->hd) && pc_checkskill(sd, AM_CALLHOMUN) ) hom_vaporize(sd, HOM_ST_ACTIVE); - if (sd->sc.data[SC_SPRITEMABLE] && pc_checkskill(sd, SU_SPRITEMABLE)) + if (sd->sc.getSCE(SC_SPRITEMABLE) && pc_checkskill(sd, SU_SPRITEMABLE)) status_change_end(&sd->bl, SC_SPRITEMABLE); - if (sd->sc.data[SC_SOULATTACK] && pc_checkskill(sd, SU_SOULATTACK)) + if (sd->sc.getSCE(SC_SOULATTACK) && pc_checkskill(sd, SU_SOULATTACK)) status_change_end(&sd->bl, SC_SOULATTACK); } @@ -9833,15 +9833,15 @@ bool pc_revive_item(struct map_session_data *sd) { if (!pc_isdead(sd) || sd->respawn_tid != INVALID_TIMER) return false; - if (sd->sc.data[SC_HELLPOWER]) // Cannot resurrect while under the effect of SC_HELLPOWER. + if (sd->sc.getSCE(SC_HELLPOWER)) // Cannot resurrect while under the effect of SC_HELLPOWER. return false; int16 item_position = itemdb_group.item_exists_pc(sd, IG_TOKEN_OF_SIEGFRIED); uint8 hp = 100, sp = 100; if (item_position < 0) { - if (sd->sc.data[SC_LIGHT_OF_REGENE]) { - hp = sd->sc.data[SC_LIGHT_OF_REGENE]->val2; + if (sd->sc.getSCE(SC_LIGHT_OF_REGENE)) { + hp = sd->sc.getSCE(SC_LIGHT_OF_REGENE)->val2; sp = 0; } else @@ -10357,7 +10357,7 @@ int pc_itemheal(struct map_session_data *sd, t_itemid itemid, int hp, int sp) // A potion produced by an Alchemist in the Fame Top 10 gets +50% effect [DracoRPG] if (potion_flag == 2) { bonus += bonus * 50 / 100; - if (sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_ROGUE) + if (sd->sc.getSCE(SC_SPIRIT) && sd->sc.getSCE(SC_SPIRIT)->val2 == SL_ROGUE) bonus += bonus; // Receive an additional +100% effect from ranked potions to HP only } //All item bonuses. @@ -10372,16 +10372,16 @@ int pc_itemheal(struct map_session_data *sd, t_itemid itemid, int hp, int sp) } } // Recovery Potion - if (sd->sc.data[SC_INCHEALRATE]) - bonus += bonus * sd->sc.data[SC_INCHEALRATE]->val1 / 100; + if (sd->sc.getSCE(SC_INCHEALRATE)) + bonus += bonus * sd->sc.getSCE(SC_INCHEALRATE)->val1 / 100; // 2014 Halloween Event : Pumpkin Bonus - if (sd->sc.data[SC_MTF_PUMPKIN]) { + if (sd->sc.getSCE(SC_MTF_PUMPKIN)) { if (itemid == ITEMID_PUMPKIN) - bonus += bonus * sd->sc.data[SC_MTF_PUMPKIN]->val1 / 100; + bonus += bonus * sd->sc.getSCE(SC_MTF_PUMPKIN)->val1 / 100; else if (itemid == ITEMID_COOKIE_BAT) - bonus += sd->sc.data[SC_MTF_PUMPKIN]->val2; + bonus += sd->sc.getSCE(SC_MTF_PUMPKIN)->val2; } - if (sd->sc.data[SC_VITALIZE_POTION]) + if (sd->sc.getSCE(SC_VITALIZE_POTION)) bonus += bonus * 10 / 100; tmp = hp * bonus / 100; // Overflow check @@ -10412,26 +10412,26 @@ int pc_itemheal(struct map_session_data *sd, t_itemid itemid, int hp, int sp) } if (sd->sc.count) { // Critical Wound and Death Hurt stack - if (sd->sc.data[SC_CRITICALWOUND]) - penalty += sd->sc.data[SC_CRITICALWOUND]->val2; + if (sd->sc.getSCE(SC_CRITICALWOUND)) + penalty += sd->sc.getSCE(SC_CRITICALWOUND)->val2; - if (sd->sc.data[SC_DEATHHURT] && sd->sc.data[SC_DEATHHURT]->val3 == 1) + if (sd->sc.getSCE(SC_DEATHHURT) && sd->sc.getSCE(SC_DEATHHURT)->val3 == 1) penalty += 20; - if (sd->sc.data[SC_NORECOVER_STATE]) + if (sd->sc.getSCE(SC_NORECOVER_STATE)) penalty = 100; - if (sd->sc.data[SC_VITALITYACTIVATION]) + if (sd->sc.getSCE(SC_VITALITYACTIVATION)) hp += hp / 2; // 1.5 times - if (sd->sc.data[SC_WATER_INSIGNIA] && sd->sc.data[SC_WATER_INSIGNIA]->val1 == 2) { + if (sd->sc.getSCE(SC_WATER_INSIGNIA) && sd->sc.getSCE(SC_WATER_INSIGNIA)->val1 == 2) { hp += hp / 10; sp += sp / 10; } #ifdef RENEWAL - if (sd->sc.data[SC_APPLEIDUN]) - hp += sd->sc.data[SC_APPLEIDUN]->val3 / 100; + if (sd->sc.getSCE(SC_APPLEIDUN)) + hp += sd->sc.getSCE(SC_APPLEIDUN)->val3 / 100; #endif if (penalty > 0) { @@ -10440,10 +10440,10 @@ int pc_itemheal(struct map_session_data *sd, t_itemid itemid, int hp, int sp) } #ifdef RENEWAL - if (sd->sc.data[SC_EXTREMITYFIST2]) + if (sd->sc.getSCE(SC_EXTREMITYFIST2)) sp = 0; #endif - if (sd->sc.data[SC_BITESCAR]) + if (sd->sc.getSCE(SC_BITESCAR)) hp = 0; } @@ -10695,7 +10695,7 @@ bool pc_jobchange(struct map_session_data *sd,int job, char upper) if( i&OPTION_CART && !pc_checkskill(sd, MC_PUSHCART) ) i&=~OPTION_CART; #else - if( sd->sc.data[SC_PUSH_CART] && !pc_checkskill(sd, MC_PUSHCART) ) + if( sd->sc.getSCE(SC_PUSH_CART) && !pc_checkskill(sd, MC_PUSHCART) ) pc_setcart(sd, 0); #endif if(i != sd->sc.option) @@ -10704,11 +10704,11 @@ bool pc_jobchange(struct map_session_data *sd,int job, char upper) if(hom_is_active(sd->hd) && !pc_checkskill(sd, AM_CALLHOMUN)) hom_vaporize(sd, HOM_ST_ACTIVE); - if (sd->sc.data[SC_SPRITEMABLE] && !pc_checkskill(sd, SU_SPRITEMABLE)) + if (sd->sc.getSCE(SC_SPRITEMABLE) && !pc_checkskill(sd, SU_SPRITEMABLE)) status_change_end(&sd->bl, SC_SPRITEMABLE); - if (sd->sc.data[SC_SOULATTACK] && !pc_checkskill(sd, SU_SOULATTACK)) + if (sd->sc.getSCE(SC_SOULATTACK) && !pc_checkskill(sd, SU_SOULATTACK)) status_change_end(&sd->bl, SC_SOULATTACK); - if( sd->sc.data[SC_SPIRIT] ){ + if( sd->sc.getSCE(SC_SPIRIT) ){ status_change_end( &sd->bl, SC_SPIRIT ); } @@ -10931,13 +10931,13 @@ bool pc_setcart(struct map_session_data *sd,int type) { switch( type ) { case 0: - if( !sd->sc.data[SC_PUSH_CART] ) + if( !sd->sc.getSCE(SC_PUSH_CART) ) return 0; status_change_end(&sd->bl,SC_PUSH_CART); clif_clearcart(sd->fd); break; default:/* everything else is an allowed ID so we can move on */ - if( !sd->sc.data[SC_PUSH_CART] ) { /* first time, so fill cart data */ + if( !sd->sc.getSCE(SC_PUSH_CART) ) { /* first time, so fill cart data */ clif_cartlist(sd); status_calc_cart_weight(sd, (e_status_calc_weight_opt)(CALCWT_ITEM|CALCWT_MAXBONUS|CALCWT_CARTSTATE)); } @@ -10977,7 +10977,7 @@ void pc_setfalcon(struct map_session_data* sd, int flag) *------------------------------------------*/ void pc_setriding(struct map_session_data* sd, int flag) { - if( sd->sc.data[SC_ALL_RIDING] ) + if( sd->sc.getSCE(SC_ALL_RIDING) ) return; if( flag ){ @@ -11723,7 +11723,7 @@ bool pc_equipitem(struct map_session_data *sd,short n,int req_pos,bool equipswit } return false; } - if( sd->sc.count && (sd->sc.cant.equip || (sd->sc.data[SC_PYROCLASTIC] && sd->inventory_data[n]->type == IT_WEAPON)) ) { + if( sd->sc.count && (sd->sc.cant.equip || (sd->sc.getSCE(SC_PYROCLASTIC) && sd->inventory_data[n]->type == IT_WEAPON)) ) { if( equipswitch ){ clif_equipswitch_add( sd, n, req_pos, ITEM_EQUIP_ACK_FAIL ); }else{ @@ -12001,7 +12001,7 @@ static void pc_unequipitem_sub(struct map_session_data *sd, int n, int flag) { status_calc_pc(sd, SCO_FORCE); } - if (sd->sc.data[SC_SIGNUMCRUCIS] && !battle_check_undead(sd->battle_status.race, sd->battle_status.def_ele)) + if (sd->sc.getSCE(SC_SIGNUMCRUCIS) && !battle_check_undead(sd->battle_status.race, sd->battle_status.def_ele)) status_change_end(&sd->bl, SC_SIGNUMCRUCIS); //OnUnEquip script [Skotlex] @@ -12055,7 +12055,7 @@ bool pc_unequipitem(struct map_session_data *sd, int n, int flag) { } // status change that makes player cannot unequip equipment if (!(flag&2) && sd->sc.count &&( sd->sc.cant.unequip || - (sd->sc.data[SC_PYROCLASTIC] && sd->inventory_data[n]->type == IT_WEAPON))) // can't switch weapon + (sd->sc.getSCE(SC_PYROCLASTIC) && sd->inventory_data[n]->type == IT_WEAPON))) // can't switch weapon { clif_unequipitemack(sd,n,0,0); return false; @@ -12753,7 +12753,7 @@ bool pc_setstand(struct map_session_data *sd, bool force){ // Cannot stand yet // TODO: Move to SCS_NOSTAND [Cydh] - if (!force && (sd->sc.data[SC_SITDOWN_FORCE] || sd->sc.data[SC_BANANA_BOMB_SITDOWN])) + if (!force && (sd->sc.getSCE(SC_SITDOWN_FORCE) || sd->sc.getSCE(SC_BANANA_BOMB_SITDOWN))) return false; status_change_end(&sd->bl, SC_TENSIONRELAX); @@ -12776,7 +12776,7 @@ bool pc_setstand(struct map_session_data *sd, bool force){ * @param heat: Amount of Heat to adjust **/ void pc_overheat(map_session_data &sd, int16 heat) { - status_change_entry *sce = sd.sc.data[SC_OVERHEAT_LIMITPOINT]; + status_change_entry *sce = sd.sc.getSCE(SC_OVERHEAT_LIMITPOINT); if (sce) { sce->val1 += heat; @@ -14270,8 +14270,8 @@ uint8 pc_itemcd_check(struct map_session_data *sd, struct item_data *id, t_tick return pc_itemcd_add(sd, id, tick, n); // Send reply of delay remains - if (sc->data[id->delay.sc]) { - const struct TimerData *timer = get_timer(sc->data[id->delay.sc]->timer); + if (sc->getSCE(id->delay.sc)) { + const struct TimerData *timer = get_timer(sc->getSCE(id->delay.sc)->timer); clif_msg_value(sd, ITEM_REUSE_LIMIT, (int)(timer ? DIFF_TICK(timer->tick, tick) / 1000 : 99)); return 1; } @@ -14379,8 +14379,8 @@ void pc_scdata_received(struct map_session_data *sd) { status_calc_cart_weight(sd, (e_status_calc_weight_opt)(CALCWT_ITEM|CALCWT_MAXBONUS|CALCWT_CARTSTATE)); } - if (sd->sc.data[SC_SOULENERGY]) - sd->soulball = sd->sc.data[SC_SOULENERGY]->val1; + if (sd->sc.getSCE(SC_SOULENERGY)) + sd->soulball = sd->sc.getSCE(SC_SOULENERGY)->val1; } /** @@ -14784,10 +14784,10 @@ void pc_cell_basilica(struct map_session_data *sd) { #endif if (!map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKBASILICA)) { - if (sd->sc.data[type]) + if (sd->sc.getSCE(type)) status_change_end(&sd->bl, type); } - else if (!sd->sc.data[type]) + else if (!sd->sc.getSCE(type)) sc_start(&sd->bl,&sd->bl, type,100,0,INFINITE_TICK); } diff --git a/src/map/pc.hpp b/src/map/pc.hpp index 23d69d7de1..c42ff1f6ff 100644 --- a/src/map/pc.hpp +++ b/src/map/pc.hpp @@ -372,7 +372,8 @@ struct s_qi_display { e_questinfo_markcolor color; }; -struct map_session_data { +class map_session_data { +public: struct block_list bl; struct unit_data ud; struct view_data vd; @@ -1151,7 +1152,7 @@ static bool pc_cant_act( struct map_session_data* sd ){ #define pc_isvip(sd) ( false ) #endif #ifdef NEW_CARTS - #define pc_iscarton(sd) ( (sd)->sc.data[SC_PUSH_CART] ) + #define pc_iscarton(sd) ( (sd)->sc.getSCE(SC_PUSH_CART) ) #else #define pc_iscarton(sd) ( (sd)->sc.option&OPTION_CART ) #endif @@ -1232,14 +1233,14 @@ enum e_mado_type : uint16 { #define pc_rightside_mdef(sd) ( (sd)->battle_status.mdef2 - ((sd)->battle_status.vit>>1) ) #define pc_leftside_matk(sd) \ (\ - ((sd)->sc.data[SC_MAGICPOWER] && (sd)->sc.data[SC_MAGICPOWER]->val4) \ - ?((sd)->battle_status.matk_min * 100 + 50) / ((sd)->sc.data[SC_MAGICPOWER]->val3+100) \ + ((sd)->sc.getSCE(SC_MAGICPOWER) && (sd)->sc.getSCE(SC_MAGICPOWER)->val4) \ + ?((sd)->battle_status.matk_min * 100 + 50) / ((sd)->sc.getSCE(SC_MAGICPOWER)->val3+100) \ :(sd)->battle_status.matk_min \ ) #define pc_rightside_matk(sd) \ (\ - ((sd)->sc.data[SC_MAGICPOWER] && (sd)->sc.data[SC_MAGICPOWER]->val4) \ - ?((sd)->battle_status.matk_max * 100 + 50) / ((sd)->sc.data[SC_MAGICPOWER]->val3+100) \ + ((sd)->sc.getSCE(SC_MAGICPOWER) && (sd)->sc.getSCE(SC_MAGICPOWER)->val4) \ + ?((sd)->battle_status.matk_max * 100 + 50) / ((sd)->sc.getSCE(SC_MAGICPOWER)->val3+100) \ :(sd)->battle_status.matk_max \ ) #endif diff --git a/src/map/pet.cpp b/src/map/pet.cpp index fb5db221eb..befdf0a304 100644 --- a/src/map/pet.cpp +++ b/src/map/pet.cpp @@ -1295,7 +1295,7 @@ int pet_catch_process2(struct map_session_data* sd, int target_id) struct status_change* tsc = status_get_sc( &md->bl ); - if( battle_config.pet_hide_check && tsc && ( tsc->data[SC_HIDING] || tsc->data[SC_CLOAKING] || tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_NEWMOON] || tsc->data[SC_CLOAKINGEXCEED] ) ){ + if( battle_config.pet_hide_check && tsc && ( tsc->getSCE(SC_HIDING) || tsc->getSCE(SC_CLOAKING) || tsc->getSCE(SC_CAMOUFLAGE) || tsc->getSCE(SC_NEWMOON) || tsc->getSCE(SC_CLOAKINGEXCEED) ) ){ clif_pet_roulette( sd, 0 ); sd->catch_target_class = PET_CATCH_FAIL; @@ -2066,7 +2066,7 @@ TIMER_FUNC(pet_recovery_timer){ return 0; } - if(sd->sc.data[pd->recovery->type]) { + if(sd->sc.getSCE(pd->recovery->type)) { //Display a heal animation? //Detoxify is chosen for now. clif_skill_nodamage(&pd->bl,&sd->bl,TF_DETOXIFY,1,1); diff --git a/src/map/script.cpp b/src/map/script.cpp index 4fea520062..4889510347 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -6043,16 +6043,16 @@ BUILDIN_FUNC(percentheal) return SCRIPT_CMD_SUCCESS; #ifdef RENEWAL - if( sd->sc.data[SC_EXTREMITYFIST2] ) + if( sd->sc.getSCE(SC_EXTREMITYFIST2) ) sp = 0; #endif - if (sd->sc.data[SC_NORECOVER_STATE]) { + if (sd->sc.getSCE(SC_NORECOVER_STATE)) { hp = 0; sp = 0; } - if (sd->sc.data[SC_BITESCAR]) + if (sd->sc.getSCE(SC_BITESCAR)) hp = 0; pc_percentheal(sd,hp,sp); @@ -12321,7 +12321,7 @@ BUILDIN_FUNC(sc_end) if (sc == nullptr) return SCRIPT_CMD_SUCCESS; - struct status_change_entry *sce = sc->data[type]; + struct status_change_entry *sce = sc->getSCE(type); if (sce == nullptr) return SCRIPT_CMD_SUCCESS; @@ -12418,7 +12418,7 @@ BUILDIN_FUNC(getstatus) return SCRIPT_CMD_SUCCESS; } - if( sd->sc.count == 0 || !sd->sc.data[id] ) + if( sd->sc.count == 0 || !sd->sc.getSCE(id) ) {// no status is active script_pushint(st, 0); return SCRIPT_CMD_SUCCESS; @@ -12426,13 +12426,13 @@ BUILDIN_FUNC(getstatus) switch( type ) { - case 1: script_pushint(st, sd->sc.data[id]->val1); break; - case 2: script_pushint(st, sd->sc.data[id]->val2); break; - case 3: script_pushint(st, sd->sc.data[id]->val3); break; - case 4: script_pushint(st, sd->sc.data[id]->val4); break; + case 1: script_pushint(st, sd->sc.getSCE(id)->val1); break; + case 2: script_pushint(st, sd->sc.getSCE(id)->val2); break; + case 3: script_pushint(st, sd->sc.getSCE(id)->val3); break; + case 4: script_pushint(st, sd->sc.getSCE(id)->val4); break; case 5: { - struct TimerData* timer = (struct TimerData*)get_timer(sd->sc.data[id]->timer); + struct TimerData* timer = (struct TimerData*)get_timer(sd->sc.getSCE(id)->timer); if( timer ) {// return the amount of time remaining @@ -22395,7 +22395,7 @@ BUILDIN_FUNC(ismounting) { if (!script_charid2sd(2,sd)) return SCRIPT_CMD_FAILURE; - if( sd->sc.data[SC_ALL_RIDING] ) + if( sd->sc.getSCE(SC_ALL_RIDING) ) script_pushint(st,1); else script_pushint(st,0); @@ -22416,11 +22416,11 @@ BUILDIN_FUNC(setmounting) { if( sd->sc.option&(OPTION_WUGRIDER|OPTION_RIDING|OPTION_DRAGON|OPTION_MADOGEAR) ) { clif_msg(sd, NEED_REINS_OF_MOUNT); script_pushint(st,0); //can't mount with one of these - } else if (sd->sc.data[SC_CLOAKING] || sd->sc.data[SC_CHASEWALK] || sd->sc.data[SC_CLOAKINGEXCEED] || sd->sc.data[SC_CAMOUFLAGE] || sd->sc.data[SC_STEALTHFIELD] || sd->sc.data[SC__FEINTBOMB]) { + } else if (sd->sc.getSCE(SC_CLOAKING) || sd->sc.getSCE(SC_CHASEWALK) || sd->sc.getSCE(SC_CLOAKINGEXCEED) || sd->sc.getSCE(SC_CAMOUFLAGE) || sd->sc.getSCE(SC_STEALTHFIELD) || sd->sc.getSCE(SC__FEINTBOMB)) { // SC_HIDING, SC__INVISIBILITY, SC__SHADOWFORM, SC_SUHIDE already disable item usage script_pushint(st, 0); // Silent failure } else { - if( sd->sc.data[SC_ALL_RIDING] ) + if( sd->sc.getSCE(SC_ALL_RIDING) ) status_change_end(&sd->bl, SC_ALL_RIDING); //release mount else sc_start(NULL, &sd->bl, SC_ALL_RIDING, 10000, 1, INFINITE_TICK); //mount diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 0de95f6ecf..38758e0eae 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -649,52 +649,52 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk #endif if (sc && sc->count) { - if (sc->data[SC_OFFERTORIUM] && (skill_id == AB_HIGHNESSHEAL || skill_id == AB_CHEAL || skill_id == NPC_CHEAL || skill_id == PR_SANCTUARY || skill_id == AL_HEAL || + if (sc->getSCE(SC_OFFERTORIUM) && (skill_id == AB_HIGHNESSHEAL || skill_id == AB_CHEAL || skill_id == NPC_CHEAL || skill_id == PR_SANCTUARY || skill_id == AL_HEAL || skill_id == CD_DILECTIO_HEAL || skill_id == CD_MEDIALE_VOTUM )) #ifdef RENEWAL - hp_bonus += sc->data[SC_OFFERTORIUM]->val2; + hp_bonus += sc->getSCE(SC_OFFERTORIUM)->val2; #else - hp += hp * sc->data[SC_OFFERTORIUM]->val2 / 100; + hp += hp * sc->getSCE(SC_OFFERTORIUM)->val2 / 100; #endif - if (sc->data[SC_GLASTHEIM_HEAL] && skill_id != NPC_EVILLAND && skill_id != BA_APPLEIDUN) + if (sc->getSCE(SC_GLASTHEIM_HEAL) && skill_id != NPC_EVILLAND && skill_id != BA_APPLEIDUN) #ifdef RENEWAL - hp_bonus += sc->data[SC_GLASTHEIM_HEAL]->val1; + hp_bonus += sc->getSCE(SC_GLASTHEIM_HEAL)->val1; #else - hp += hp * sc->data[SC_GLASTHEIM_HEAL]->val1 / 100; + hp += hp * sc->getSCE(SC_GLASTHEIM_HEAL)->val1 / 100; #endif #ifdef RENEWAL - if (sc->data[SC_MEDIALE] && skill_id == CD_MEDIALE_VOTUM) - hp_bonus += sc->data[SC_MEDIALE]->val2; + if (sc->getSCE(SC_MEDIALE) && skill_id == CD_MEDIALE_VOTUM) + hp_bonus += sc->getSCE(SC_MEDIALE)->val2; #endif } if (tsc && tsc->count) { if (skill_id != NPC_EVILLAND && skill_id != BA_APPLEIDUN) { - if (tsc->data[SC_INCHEALRATE]) + if (tsc->getSCE(SC_INCHEALRATE)) #ifdef RENEWAL - hp_bonus += tsc->data[SC_INCHEALRATE]->val1; //Only affects Heal, Sanctuary and PotionPitcher.(like bHealPower) [Inkfish] + hp_bonus += tsc->getSCE(SC_INCHEALRATE)->val1; //Only affects Heal, Sanctuary and PotionPitcher.(like bHealPower) [Inkfish] #else - hp += hp * tsc->data[SC_INCHEALRATE]->val1 / 100; + hp += hp * tsc->getSCE(SC_INCHEALRATE)->val1 / 100; #endif - if (tsc->data[SC_GLASTHEIM_HEAL]) + if (tsc->getSCE(SC_GLASTHEIM_HEAL)) #ifdef RENEWAL - hp_bonus += tsc->data[SC_GLASTHEIM_HEAL]->val2; + hp_bonus += tsc->getSCE(SC_GLASTHEIM_HEAL)->val2; #else - hp += hp * tsc->data[SC_GLASTHEIM_HEAL]->val2 / 100; + hp += hp * tsc->getSCE(SC_GLASTHEIM_HEAL)->val2 / 100; #endif - if (tsc->data[SC_ANCILLA]) + if (tsc->getSCE(SC_ANCILLA)) #ifdef RENEWAL - hp_bonus += tsc->data[SC_ANCILLA]->val1; + hp_bonus += tsc->getSCE(SC_ANCILLA)->val1; #else - hp += hp * tsc->data[SC_ANCILLA]->val1 / 100; - if (tsc->data[SC_WATER_INSIGNIA] && tsc->data[SC_WATER_INSIGNIA]->val1 == 2) + hp += hp * tsc->getSCE(SC_ANCILLA)->val1 / 100; + if (tsc->getSCE(SC_WATER_INSIGNIA) && tsc->getSCE(SC_WATER_INSIGNIA)->val1 == 2) hp += hp / 10; #endif #ifdef RENEWAL - if (tsc->data[SC_ASSUMPTIO]) - hp_bonus += tsc->data[SC_ASSUMPTIO]->val1 * 2; + if (tsc->getSCE(SC_ASSUMPTIO)) + hp_bonus += tsc->getSCE(SC_ASSUMPTIO)->val1 * 2; #endif - if (tsc->data[SC_VITALIZE_POTION]) + if (tsc->getSCE(SC_VITALIZE_POTION)) #ifdef RENEWAL hp_bonus += 10; #else @@ -729,7 +729,7 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk max += wMatk + variance; } - if( sc && sc->data[SC_RECOGNIZEDSPELL] ) + if( sc && sc->getSCE(SC_RECOGNIZEDSPELL) ) min = max; if( sd && sd->right_weapon.overrefine > 0 ){ @@ -747,7 +747,7 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk // Global multipliers are applied after the MATK is applied if (tsc && tsc->count) { if (skill_id != NPC_EVILLAND && skill_id != BA_APPLEIDUN) { - if (tsc->data[SC_WATER_INSIGNIA] && tsc->data[SC_WATER_INSIGNIA]->val1 == 2) + if (tsc->getSCE(SC_WATER_INSIGNIA) && tsc->getSCE(SC_WATER_INSIGNIA)->val1 == 2) global_bonus *= 1.1f; } } @@ -761,11 +761,11 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk if (heal && tsc && tsc->count) { uint8 penalty = 0; - if (tsc->data[SC_CRITICALWOUND]) - penalty += tsc->data[SC_CRITICALWOUND]->val2; - if (tsc->data[SC_DEATHHURT] && tsc->data[SC_DEATHHURT]->val3 == 1) + if (tsc->getSCE(SC_CRITICALWOUND)) + penalty += tsc->getSCE(SC_CRITICALWOUND)->val2; + if (tsc->getSCE(SC_DEATHHURT) && tsc->getSCE(SC_DEATHHURT)->val3 == 1) penalty += 20; - if (tsc->data[SC_NORECOVER_STATE]) + if (tsc->getSCE(SC_NORECOVER_STATE)) penalty = 100; if (penalty > 0) { #ifdef RENEWAL @@ -812,11 +812,11 @@ int8 skill_isCopyable(struct map_session_data *sd, uint16 skill_id) { s_skill_copyable copyable = skill_db.find(skill_id)->copyable; //Plagiarism only able to copy skill while SC_PRESERVE is not active and skill is copyable by Plagiarism - if (copyable.option & SKILL_COPY_PLAGIARISM && pc_checkskill(sd,RG_PLAGIARISM) && !sd->sc.data[SC_PRESERVE]) + if (copyable.option & SKILL_COPY_PLAGIARISM && pc_checkskill(sd,RG_PLAGIARISM) && !sd->sc.getSCE(SC_PRESERVE)) return 1; //Reproduce can copy skill if SC__REPRODUCE is active and the skill is copyable by Reproduce - if (copyable.option & SKILL_COPY_REPRODUCE && pc_checkskill(sd,SC_REPRODUCE) && sd->sc.data[SC__REPRODUCE] && sd->sc.data[SC__REPRODUCE]->val1) + if (copyable.option & SKILL_COPY_REPRODUCE && pc_checkskill(sd,SC_REPRODUCE) && sd->sc.getSCE(SC__REPRODUCE) && sd->sc.getSCE(SC__REPRODUCE)->val1) return 2; return 0; @@ -879,7 +879,7 @@ bool skill_isNotOk(uint16 skill_id, struct map_session_data *sd) return true; } - if( sd->sc.data[SC_ALL_RIDING] ) + if( sd->sc.getSCE(SC_ALL_RIDING) ) return true; //You can't use skills while in the new mounts (The client doesn't let you, this is to make cheat-safe) switch (skill_id) { @@ -1041,61 +1041,61 @@ bool skill_isNotOk_hom(struct homun_data *hd, uint16 skill_id, uint16 skill_lv) } break; case MH_GOLDENE_FERSE: // Can't be used with Angriff's Modus - if (sc && sc->data[SC_ANGRIFFS_MODUS]) + if (sc && sc->getSCE(SC_ANGRIFFS_MODUS)) return true; break; case MH_ANGRIFFS_MODUS: - if (sc && sc->data[SC_GOLDENE_FERSE]) + if (sc && sc->getSCE(SC_GOLDENE_FERSE)) return true; break; case MH_TINDER_BREAKER: // Must be in grappling mode - if (!(sc && sc->data[SC_STYLE_CHANGE] && sc->data[SC_STYLE_CHANGE]->val1 == MH_MD_GRAPPLING)) { + if (!(sc && sc->getSCE(SC_STYLE_CHANGE) && sc->getSCE(SC_STYLE_CHANGE)->val1 == MH_MD_GRAPPLING)) { clif_skill_fail(sd, skill_id, USESKILL_FAIL_STYLE_CHANGE_GRAPPLER, 1); return true; } break; case MH_SONIC_CRAW: // Must be in fighting mode - if (!(sc && sc->data[SC_STYLE_CHANGE] && sc->data[SC_STYLE_CHANGE]->val1 == MH_MD_FIGHTING)) { + if (!(sc && sc->getSCE(SC_STYLE_CHANGE) && sc->getSCE(SC_STYLE_CHANGE)->val1 == MH_MD_FIGHTING)) { clif_skill_fail(sd, skill_id, USESKILL_FAIL_STYLE_CHANGE_FIGHTER, 0); return true; } break; case MH_SILVERVEIN_RUSH: - if (!(sc && sc->data[SC_STYLE_CHANGE] && sc->data[SC_STYLE_CHANGE]->val1 == MH_MD_FIGHTING)) { + if (!(sc && sc->getSCE(SC_STYLE_CHANGE) && sc->getSCE(SC_STYLE_CHANGE)->val1 == MH_MD_FIGHTING)) { clif_skill_fail(sd, skill_id, USESKILL_FAIL_STYLE_CHANGE_FIGHTER, 0); return true; } - if (!(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == MH_SONIC_CRAW)) { + if (!(sc && sc->getSCE(SC_COMBO) && sc->getSCE(SC_COMBO)->val1 == MH_SONIC_CRAW)) { clif_skill_fail(sd, skill_id, USESKILL_FAIL_COMBOSKILL, MH_SONIC_CRAW); return true; } break; case MH_MIDNIGHT_FRENZY: - if (!(sc && sc->data[SC_STYLE_CHANGE] && sc->data[SC_STYLE_CHANGE]->val1 == MH_MD_FIGHTING)) { + if (!(sc && sc->getSCE(SC_STYLE_CHANGE) && sc->getSCE(SC_STYLE_CHANGE)->val1 == MH_MD_FIGHTING)) { clif_skill_fail(sd, skill_id, USESKILL_FAIL_STYLE_CHANGE_FIGHTER, 0); return true; } - if (!(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == MH_SILVERVEIN_RUSH)) { + if (!(sc && sc->getSCE(SC_COMBO) && sc->getSCE(SC_COMBO)->val1 == MH_SILVERVEIN_RUSH)) { clif_skill_fail(sd, skill_id, USESKILL_FAIL_COMBOSKILL, MH_SILVERVEIN_RUSH); return true; } break; case MH_CBC: - if (!(sc && sc->data[SC_STYLE_CHANGE] && sc->data[SC_STYLE_CHANGE]->val1 == MH_MD_GRAPPLING)) { + if (!(sc && sc->getSCE(SC_STYLE_CHANGE) && sc->getSCE(SC_STYLE_CHANGE)->val1 == MH_MD_GRAPPLING)) { clif_skill_fail(sd, skill_id, USESKILL_FAIL_STYLE_CHANGE_GRAPPLER, 0); return true; } - if (!(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == MH_TINDER_BREAKER)) { + if (!(sc && sc->getSCE(SC_COMBO) && sc->getSCE(SC_COMBO)->val1 == MH_TINDER_BREAKER)) { clif_skill_fail(sd, skill_id, USESKILL_FAIL_COMBOSKILL, MH_TINDER_BREAKER); return true; } break; case MH_EQC: - if (!(sc && sc->data[SC_STYLE_CHANGE] && sc->data[SC_STYLE_CHANGE]->val1 == MH_MD_GRAPPLING)) { + if (!(sc && sc->getSCE(SC_STYLE_CHANGE) && sc->getSCE(SC_STYLE_CHANGE)->val1 == MH_MD_GRAPPLING)) { clif_skill_fail(sd, skill_id, USESKILL_FAIL_STYLE_CHANGE_GRAPPLER, 0); return true; } - if (!(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == MH_CBC)) { + if (!(sc && sc->getSCE(SC_COMBO) && sc->getSCE(SC_COMBO)->val1 == MH_CBC)) { clif_skill_fail(sd, skill_id, USESKILL_FAIL_COMBOSKILL, MH_CBC); return true; } @@ -1238,25 +1238,25 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 // Taekwon combos activate on traps, so we need to check them even for targets that don't have status if (sd && skill_id == 0 && !(attack_type&BF_SKILL) && sc) { // Chance to trigger Taekwon kicks - if (sc->data[SC_READYSTORM] && + if (sc->getSCE(SC_READYSTORM) && sc_start4(src, src, SC_COMBO, 15, TK_STORMKICK, 0, 2, 0, (2000 - 4 * sstatus->agi - 2 * sstatus->dex))) ; //Stance triggered - else if (sc->data[SC_READYDOWN] && + else if (sc->getSCE(SC_READYDOWN) && sc_start4(src, src, SC_COMBO, 15, TK_DOWNKICK, 0, 2, 0, (2000 - 4 * sstatus->agi - 2 * sstatus->dex))) ; //Stance triggered - else if (sc->data[SC_READYTURN] && + else if (sc->getSCE(SC_READYTURN) && sc_start4(src, src, SC_COMBO, 15, TK_TURNKICK, 0, 2, 0, (2000 - 4 * sstatus->agi - 2 * sstatus->dex))) ; //Stance triggered - else if (sc->data[SC_READYCOUNTER]) { //additional chance from SG_FRIEND [Komurka] + else if (sc->getSCE(SC_READYCOUNTER)) { //additional chance from SG_FRIEND [Komurka] rate = 20; - if (sc->data[SC_SKILLRATE_UP] && sc->data[SC_SKILLRATE_UP]->val1 == TK_COUNTER) { - rate += rate*sc->data[SC_SKILLRATE_UP]->val2 / 100; + if (sc->getSCE(SC_SKILLRATE_UP) && sc->getSCE(SC_SKILLRATE_UP)->val1 == TK_COUNTER) { + rate += rate*sc->getSCE(SC_SKILLRATE_UP)->val2 / 100; status_change_end(src, SC_SKILLRATE_UP); } sc_start4(src, src, SC_COMBO, rate, TK_COUNTER, @@ -1311,7 +1311,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 // Enchanting Shadow gives a chance to inflict Shadow Wounds to the enemy. if (sc != nullptr) { - status_change_entry *sce = sc->data[SC_SHADOW_WEAPON]; + status_change_entry *sce = sc->getSCE(SC_SHADOW_WEAPON); unit_data *ud = unit_bl2ud(bl); if (sce != nullptr && ud != nullptr && rnd_chance(sce->val1, 100)) { @@ -1394,14 +1394,14 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 if (sc) { struct status_change_entry *sce; // Enchant Poison gives a chance to poison attacked enemies - if((sce=sc->data[SC_ENCPOISON])) //Don't use sc_start since chance comes in 1/10000 rate. + if((sce=sc->getSCE(SC_ENCPOISON))) //Don't use sc_start since chance comes in 1/10000 rate. status_change_start(src,bl,SC_POISON,sce->val2, sce->val1,src->id,0,0, skill_get_time2(AS_ENCHANTPOISON,sce->val1),SCSTART_NONE); // Enchant Deadly Poison gives a chance to deadly poison attacked enemies - if((sce=sc->data[SC_EDP])) + if((sce=sc->getSCE(SC_EDP))) sc_start4(src,bl,SC_DPOISON,sce->val2, sce->val1,src->id,0,0, skill_get_time2(ASC_EDP,sce->val1)); - if ((sce = sc->data[SC_LUXANIMA]) && rnd() % 100 < sce->val2) + if ((sce = sc->getSCE(SC_LUXANIMA)) && rnd() % 100 < sce->val2) skill_castend_nodamage_id(src, bl, RK_STORMBLAST, 1, tick, 0); } } @@ -1689,7 +1689,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 break; case PF_FOGWALL: - if (src != bl && !tsc->data[SC_DELUGE]) + if (src != bl && !tsc->getSCE(SC_DELUGE)) sc_start(src,bl,SC_BLIND,100,skill_lv,skill_get_time2(skill_id,skill_lv)); break; @@ -1731,7 +1731,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 case TK_JUMPKICK: // debuff the following statuses - if( dstsd && dstsd->class_ != MAPID_SOUL_LINKER && !tsc->data[SC_PRESERVE] ) { + if( dstsd && dstsd->class_ != MAPID_SOUL_LINKER && !tsc->getSCE(SC_PRESERVE) ) { status_change_end(bl, SC_SPIRIT); status_change_end(bl, SC_ADRENALINE2); status_change_end(bl, SC_KAITE); @@ -1844,7 +1844,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 // Status chances are applied officially through a check // The skill first trys to give the frozen status to targets that are hit sc_start(src, bl, SC_FREEZE, 10 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv)); - if (!tsc->data[SC_FREEZE]) // If it fails to give the frozen status, it will attempt to give the freezing status + if (!tsc->getSCE(SC_FREEZE)) // If it fails to give the frozen status, it will attempt to give the freezing status sc_start(src, bl, SC_FREEZING, 20 + skill_lv * 10, skill_lv, skill_get_time2(skill_id, skill_lv)); break; case NC_POWERSWING: @@ -1888,7 +1888,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 sc_start(src,bl, SC_BLIND, 100, skill_lv, skill_get_time(skill_id,skill_lv)); break; case LG_HESPERUSLIT: - if( pc_checkskill(sd,LG_PINPOINTATTACK) > 0 && sc && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 5 ) + if( pc_checkskill(sd,LG_PINPOINTATTACK) > 0 && sc && sc->getSCE(SC_BANDING) && sc->getSCE(SC_BANDING)->val2 > 5 ) skill_castend_damage_id(src,bl,LG_PINPOINTATTACK,rnd_value(1, pc_checkskill(sd,LG_PINPOINTATTACK)),tick,0); break; case SR_DRAGONCOMBO: @@ -1913,7 +1913,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 break; case SO_DIAMONDDUST: rate = 5 + 5 * skill_lv; - if( sc && sc->data[SC_COOLER_OPTION] ) + if( sc && sc->getSCE(SC_COOLER_OPTION) ) rate += (sd ? sd->status.job_level / 5 : 0); sc_start(src,bl, SC_CRYSTALIZE, rate, skill_lv, skill_get_time2(skill_id, skill_lv)); break; @@ -2039,7 +2039,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 if (n <= 0) break; - if (!tsc->data[status]) + if (!tsc->getSCE(status)) continue; if (it.second->flag[SCF_NOBANISHINGBUSTER]) @@ -2049,7 +2049,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 case SC_WHISTLE: case SC_ASSNCROS: case SC_POEMBRAGI: case SC_APPLEIDUN: case SC_HUMMING: case SC_DONTFORGETME: case SC_FORTUNE: case SC_SERVICE4U: - if (!battle_config.dispel_song || tsc->data[status]->val4 == 0) + if (!battle_config.dispel_song || tsc->getSCE(status)->val4 == 0) continue; //If in song area don't end it, even if config enabled break; case SC_ASSUMPTIO: @@ -2058,7 +2058,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 break; } if( status == SC_BERSERK || status == SC_SATURDAYNIGHTFEVER ) - tsc->data[status]->val2 = 0; + tsc->getSCE(status)->val2 = 0; status_change_end(bl,status); n--; } @@ -2105,7 +2105,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 sc_start(src, bl, SC_HANDICAPSTATE_DEEPBLIND, 30 + 10 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv)); break; case AG_DESTRUCTIVE_HURRICANE:// Targets hit are dealt a additional hit through Climax. - if (sc && sc->data[SC_CLIMAX] && sc->data[SC_CLIMAX]->val1 == 1) + if (sc && sc->getSCE(SC_CLIMAX) && sc->getSCE(SC_CLIMAX)->val1 == 1) skill_castend_damage_id(src, bl, AG_DESTRUCTIVE_HURRICANE_CLIMAX, skill_lv, tick, SD_LEVEL|SD_ANIMATION); break; case AG_CRYSTAL_IMPACT:// Targets hit are dealt aftershock damage. @@ -2208,9 +2208,9 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 #ifndef RENEWAL if( sc ) { - if(sc->data[SC_OVERTHRUST]) + if(sc->getSCE(SC_OVERTHRUST)) rate += 10; - if(sc->data[SC_MAXOVERTHRUST]) + if(sc->getSCE(SC_MAXOVERTHRUST)) rate += 10; } #endif @@ -2224,10 +2224,10 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 if( sd ) rate += sd->bonus.break_weapon_rate; if (sc) { - if (sc->data[SC_MELTDOWN]) - rate += sc->data[SC_MELTDOWN]->val2; - if (sc->data[SC_WEAPONBREAKER]) - rate += sc->data[SC_WEAPONBREAKER]->val2; + if (sc->getSCE(SC_MELTDOWN)) + rate += sc->getSCE(SC_MELTDOWN)->val2; + if (sc->getSCE(SC_WEAPONBREAKER)) + rate += sc->getSCE(SC_WEAPONBREAKER)->val2; } if( rate ) skill_break_equip(src,bl, EQP_WEAPON, rate, BCT_ENEMY); @@ -2236,8 +2236,8 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 rate = 0; if( sd ) rate += sd->bonus.break_armor_rate; - if( sc && sc->data[SC_MELTDOWN] ) - rate += sc->data[SC_MELTDOWN]->val3; + if( sc && sc->getSCE(SC_MELTDOWN) ) + rate += sc->getSCE(SC_MELTDOWN)->val3; if( rate ) skill_break_equip(src,bl, EQP_ARMOR, rate, BCT_ENEMY); } @@ -2257,14 +2257,14 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 if( sd && sd->ed && sc && !status_isdead(bl) && !skill_id ) { struct unit_data *ud = unit_bl2ud(src); - if( sc->data[SC_WILD_STORM_OPTION] ) - skill = sc->data[SC_WILD_STORM_OPTION]->val2; - else if( sc->data[SC_UPHEAVAL_OPTION] ) - skill = sc->data[SC_UPHEAVAL_OPTION]->val3; - else if( sc->data[SC_TROPIC_OPTION] ) - skill = sc->data[SC_TROPIC_OPTION]->val3; - else if( sc->data[SC_CHILLY_AIR_OPTION] ) - skill = sc->data[SC_CHILLY_AIR_OPTION]->val3; + if( sc->getSCE(SC_WILD_STORM_OPTION) ) + skill = sc->getSCE(SC_WILD_STORM_OPTION)->val2; + else if( sc->getSCE(SC_UPHEAVAL_OPTION) ) + skill = sc->getSCE(SC_UPHEAVAL_OPTION)->val3; + else if( sc->getSCE(SC_TROPIC_OPTION) ) + skill = sc->getSCE(SC_TROPIC_OPTION)->val3; + else if( sc->getSCE(SC_CHILLY_AIR_OPTION) ) + skill = sc->getSCE(SC_CHILLY_AIR_OPTION)->val3; else skill = 0; @@ -2408,7 +2408,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 if (sd && sc) { struct status_change_entry *sce; - if ((sce = sc->data[SC_2011RWC_SCROLL]) && rnd() % 1000 <= 10) + if ((sce = sc->getSCE(SC_2011RWC_SCROLL)) && rnd() % 1000 <= 10) skill_castend_nodamage_id(src, src, AC_CONCENTRATION, max(3, pc_checkskill(sd,AC_CONCENTRATION)), tick, 0); } @@ -2591,9 +2591,9 @@ int skill_counter_additional_effect (struct block_list* src, struct block_list * { status_change *sc = status_get_sc(src); - if( sc && sc->data[SC_FORCEOFVANGUARD]) { - for(int i = 0; i < sc->data[SC_FORCEOFVANGUARD]->val3; i++ ) - pc_addspiritball(sd, skill_get_time(LG_FORCEOFVANGUARD,1),sc->data[SC_FORCEOFVANGUARD]->val3); + if( sc && sc->getSCE(SC_FORCEOFVANGUARD)) { + for(int i = 0; i < sc->getSCE(SC_FORCEOFVANGUARD)->val3; i++ ) + pc_addspiritball(sd, skill_get_time(LG_FORCEOFVANGUARD,1),sc->getSCE(SC_FORCEOFVANGUARD)->val3); } } break; @@ -2638,10 +2638,10 @@ int skill_counter_additional_effect (struct block_list* src, struct block_list * if( skill_id == WZ_WATERBALL ) {//(bugreport:5303) struct status_change *sc = NULL; if( ( sc = status_get_sc(src) ) ) { - if(sc->data[SC_SPIRIT] && - sc->data[SC_SPIRIT]->val2 == SL_WIZARD && - sc->data[SC_SPIRIT]->val3 == WZ_WATERBALL) - sc->data[SC_SPIRIT]->val3 = 0; //Clear bounced spell check. + if(sc->getSCE(SC_SPIRIT) && + sc->getSCE(SC_SPIRIT)->val2 == SL_WIZARD && + sc->getSCE(SC_SPIRIT)->val3 == WZ_WATERBALL) + sc->getSCE(SC_SPIRIT)->val3 = 0; //Clear bounced spell check. } } } @@ -2653,7 +2653,7 @@ int skill_counter_additional_effect (struct block_list* src, struct block_list * if (dstsd && !status_isdead(bl) && !(skill_id && skill_get_nk(skill_id, NK_NODAMAGE))) { struct status_change *sc = status_get_sc(bl); - if (sc && sc->data[SC_DORAM_SVSP] && attack_type&(BF_MAGIC|BF_LONG)) + if (sc && sc->getSCE(SC_DORAM_SVSP) && attack_type&(BF_MAGIC|BF_LONG)) skill_castend_damage_id(bl, src, SU_SV_STEMSPEAR, (pc_checkskill(dstsd, SU_SV_STEMSPEAR) ? pc_checkskill(dstsd, SU_SV_STEMSPEAR) : 1), tick, 0); } @@ -2777,7 +2777,7 @@ int skill_break_equip(struct block_list *src, struct block_list *bl, unsigned sh // Grant player skills/items the ability to "break" non-player equipment. // WS_MELTDOWN is exempt from this check. - if (!battle_config.break_mob_equip && bl->type != BL_PC && !(src_sc && src_sc->data[SC_MELTDOWN])) + if (!battle_config.break_mob_equip && bl->type != BL_PC && !(src_sc && src_sc->getSCE(SC_MELTDOWN))) return 0; const int where_list[6] = { EQP_WEAPON, EQP_ARMOR, EQP_SHIELD, EQP_HELM, EQP_ACC, EQP_SHADOW_GEAR }; @@ -2823,7 +2823,7 @@ int skill_break_equip(struct block_list *src, struct block_list *bl, unsigned sh for (i = 0; i < 6; i++) { if (where&where_list[i]) { - if (sc && sc->count && sc->data[scdef[i]]) + if (sc && sc->count && sc->getSCE(scdef[i])) where&=~where_list[i]; else if (rnd()%10000 >= rate) where&=~where_list[i]; @@ -3017,7 +3017,7 @@ bool skill_strip_equip(struct block_list *src, struct block_list *target, uint16 } for (uint8 i = 0; i < ARRAYLENGTH(pos); i++) { - if (location&pos[i] && sc_def[i] > SC_NONE && tsc->data[sc_def[i]]) + if (location&pos[i] && sc_def[i] > SC_NONE && tsc->getSCE(sc_def[i])) location &=~ pos[i]; } if (!location) @@ -3086,13 +3086,13 @@ short skill_blown(struct block_list* src, struct block_list* target, char count, } if (tsc) { - if (tsc->data[SC_SU_STOOP]) // Any knockback will cancel it. + if (tsc->getSCE(SC_SU_STOOP)) // Any knockback will cancel it. status_change_end(target, SC_SU_STOOP); - if (tsc->data[SC_ROLLINGCUTTER]) + if (tsc->getSCE(SC_ROLLINGCUTTER)) status_change_end(target, SC_ROLLINGCUTTER); - if (tsc->data[SC_CRESCIVEBOLT]) + if (tsc->getSCE(SC_CRESCIVEBOLT)) status_change_end(target, SC_CRESCIVEBOLT); - if (tsc->data[SC_SV_ROOTTWIST]) // Shouldn't move. + if (tsc->getSCE(SC_SV_ROOTTWIST)) // Shouldn't move. return 0; } @@ -3110,17 +3110,17 @@ static int skill_magic_reflect(struct block_list* src, struct block_list* bl, in struct map_session_data* sd = BL_CAST(BL_PC, bl); // Deadly Projection null's all magic reflection. - if (sc && sc->data[SC_DEADLY_DEFEASANCE]) + if (sc && sc->getSCE(SC_DEADLY_DEFEASANCE)) return 0; - if (!sc || !sc->data[SC_KYOMU]) { // Kyomu doesn't reflect + if (!sc || !sc->getSCE(SC_KYOMU)) { // Kyomu doesn't reflect // Item-based reflection - Bypasses Boss check if (sd && sd->bonus.magic_damage_return && type && rnd()%100 < sd->bonus.magic_damage_return) return 1; } // Magic Mirror reflection - Bypasses Boss check - if (sc && sc->data[SC_MAGICMIRROR] && rnd()%100 < sc->data[SC_MAGICMIRROR]->val2) + if (sc && sc->getSCE(SC_MAGICMIRROR) && rnd()%100 < sc->getSCE(SC_MAGICMIRROR)->val2) return 1; if( status_get_class_(src) == CLASS_BOSS ) @@ -3131,7 +3131,7 @@ static int skill_magic_reflect(struct block_list* src, struct block_list* bl, in return 0; // Kaite reflection - Does not bypass Boss check - if( sc->data[SC_KAITE] && (src->type == BL_PC || status_get_lv(src) <= 80) + if( sc->getSCE(SC_KAITE) && (src->type == BL_PC || status_get_lv(src) <= 80) #ifdef RENEWAL && type // Does not reflect AoE #endif @@ -3139,7 +3139,7 @@ static int skill_magic_reflect(struct block_list* src, struct block_list* bl, in // Kaite only works against non-players if they are low-level. // Kyomu doesn't disable Kaite, but the "skill fail chance" part of Kyomu applies to it. clif_specialeffect(bl, EF_ATTACKENERGY2, AREA); - if( --sc->data[SC_KAITE]->val2 <= 0 ) + if( --sc->getSCE(SC_KAITE)->val2 <= 0 ) status_change_end(bl, SC_KAITE); return 2; } @@ -3231,7 +3231,7 @@ void skill_combo(struct block_list* src,struct block_list *dsrc, struct block_li if(sc == NULL) return; //End previous combo state after skill is invoked - if ((sce = sc->data[SC_COMBO]) != NULL) { + if ((sce = sc->getSCE(SC_COMBO)) != NULL) { switch (skill_id) { case TK_TURNKICK: case TK_STORMKICK: @@ -3281,7 +3281,7 @@ void skill_combo(struct block_list* src,struct block_list *dsrc, struct block_li target_id = 0; // Will target current auto-target instead } case CH_CHAINCRUSH: - if (!duration && pc_checkskill(sd, MO_EXTREMITYFIST) > 0 && sd->spiritball > 0 && sd->sc.data[SC_EXPLOSIONSPIRITS]) { + if (!duration && pc_checkskill(sd, MO_EXTREMITYFIST) > 0 && sd->spiritball > 0 && sd->sc.getSCE(SC_EXPLOSIONSPIRITS)) { duration = 1; target_id = 0; // Will target current auto-target instead } @@ -3346,7 +3346,7 @@ static void skill_do_copy(struct block_list* src,struct block_list *bl, uint16 s if (!tsd || (!pc_checkskill(tsd,RG_PLAGIARISM) && !pc_checkskill(tsd,SC_REPRODUCE))) return; //If SC_PRESERVE is active and SC__REPRODUCE is not active, nothing to do - else if (tsd->sc.data[SC_PRESERVE] && !tsd->sc.data[SC__REPRODUCE]) + else if (tsd->sc.getSCE(SC_PRESERVE) && !tsd->sc.getSCE(SC__REPRODUCE)) return; else { uint16 idx; @@ -3380,7 +3380,7 @@ static void skill_do_copy(struct block_list* src,struct block_list *bl, uint16 s struct status_change *tsc = status_get_sc(bl); //Already did SC check //Skill level copied depends on Reproduce skill that used - lv = (tsc) ? tsc->data[SC__REPRODUCE]->val1 : 1; + lv = (tsc) ? tsc->getSCE(SC__REPRODUCE)->val1 : 1; if( tsd->reproduceskill_idx > 0 && tsd->status.skill[tsd->reproduceskill_idx].flag == SKILL_FLAG_PLAGIARIZED ) { clif_deleteskill(tsd,tsd->status.skill[tsd->reproduceskill_idx].id); tsd->status.skill[tsd->reproduceskill_idx].id = 0; @@ -3545,12 +3545,12 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * tsc = NULL; //Don't need it. //Trick Dead protects you from damage, but not from buffs and the like, hence it's placed here. - if (tsc && tsc->data[SC_TRICKDEAD]) + if (tsc && tsc->getSCE(SC_TRICKDEAD)) return 0; #ifndef RENEWAL //When Gravitational Field is active, damage can only be dealt by Gravitational Field and Autospells - if(sd && sc && sc->data[SC_GRAVITATION] && sc->data[SC_GRAVITATION]->val3 == BCT_SELF && skill_id != HW_GRAVITATION && !sd->state.autocast) + if(sd && sc && sc->getSCE(SC_GRAVITATION) && sc->getSCE(SC_GRAVITATION)->val3 == BCT_SELF && skill_id != HW_GRAVITATION && !sd->state.autocast) return 0; #endif @@ -3601,7 +3601,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * //Reflected magic damage will not cause the caster to be knocked back [Playtester] flag |= 4; //Spirit of Wizard blocks Kaite's reflection - if( type == 2 && tsc && tsc->data[SC_SPIRIT] && tsc->data[SC_SPIRIT]->val2 == SL_WIZARD ) + if( type == 2 && tsc && tsc->getSCE(SC_SPIRIT) && tsc->getSCE(SC_SPIRIT)->val2 == SL_WIZARD ) { //Consume one Fragment per hit of the casted skill? [Skotlex] type = tsd?pc_search_inventory (tsd, ITEMID_FRAGMENT_OF_CRYSTAL):0; if (type >= 0) { @@ -3609,8 +3609,8 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * pc_delitem(tsd, type, 1, 0, 1, LOG_TYPE_CONSUME); dmg.damage = dmg.damage2 = 0; dmg.dmg_lv = ATK_MISS; - tsc->data[SC_SPIRIT]->val3 = skill_id; - tsc->data[SC_SPIRIT]->val4 = dsrc->id; + tsc->getSCE(SC_SPIRIT)->val3 = skill_id; + tsc->getSCE(SC_SPIRIT)->val4 = dsrc->id; } } else if( type != 2 ) /* Kaite bypasses */ additional_effects = false; @@ -3635,7 +3635,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * dmg.damage = battle_attr_fix(bl, bl, dmg.damage, s_ele, status_get_element(bl), status_get_element_level(bl)); - if( tsc && tsc->data[SC_ENERGYCOAT] ) { + if( tsc && tsc->getSCE(SC_ENERGYCOAT) ) { struct status_data *status = status_get_status_data(bl); int per = 100*status->sp / status->max_sp -1; //100% should be counted as the 80~99% interval per /=20; //Uses 20% SP intervals. @@ -3654,19 +3654,19 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * #endif } - if(tsc && tsc->data[SC_MAGICROD] && src == dsrc) { + if(tsc && tsc->getSCE(SC_MAGICROD) && src == dsrc) { int sp = skill_get_sp(skill_id,skill_lv); #ifndef RENEWAL clif_skill_nodamage(bl,bl,SA_MAGICROD,skill_lv,1); #endif dmg.damage = dmg.damage2 = 0; dmg.dmg_lv = ATK_MISS; //This will prevent skill additional effect from taking effect. [Skotlex] - sp = sp * tsc->data[SC_MAGICROD]->val2 / 100; + sp = sp * tsc->getSCE(SC_MAGICROD)->val2 / 100; if(skill_id == WZ_WATERBALL && skill_lv > 1) sp = sp/((skill_lv|1)*(skill_lv|1)); //Estimate SP cost of a single water-ball status_heal(bl, 0, sp, 2); } - if( (dmg.damage || dmg.damage2) && tsc && (tsc->data[SC_HALLUCINATIONWALK] && rnd()%100 < tsc->data[SC_HALLUCINATIONWALK]->val3 || tsc->data[SC_NPC_HALLUCINATIONWALK] && rnd()%100 < tsc->data[SC_NPC_HALLUCINATIONWALK]->val3) ) { + if( (dmg.damage || dmg.damage2) && tsc && (tsc->getSCE(SC_HALLUCINATIONWALK) && rnd()%100 < tsc->getSCE(SC_HALLUCINATIONWALK)->val3 || tsc->getSCE(SC_NPC_HALLUCINATIONWALK) && rnd()%100 < tsc->getSCE(SC_NPC_HALLUCINATIONWALK)->val3) ) { dmg.damage = dmg.damage2 = 0; dmg.dmg_lv = ATK_MISS; } @@ -3674,19 +3674,20 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * damage = dmg.damage + dmg.damage2; - if ((dmg.flag & BF_MAGIC) && tsc && tsc->data[SC_MAXPAIN]) { - tsc->data[SC_MAXPAIN]->val3 = (int)damage; - tsc->data[SC_MAXPAIN]->val2 = 0; - if (!tsc->data[SC_KYOMU]) //SC_KYOMU invalidates reflecting ability. - skill_castend_damage_id(bl, src, NPC_MAXPAIN_ATK, tsc->data[SC_MAXPAIN]->val1, tick, flag); + if ((dmg.flag & BF_MAGIC) && tsc && tsc->getSCE(SC_MAXPAIN)) { + auto * sce = tsc->getSCE(SC_MAXPAIN); + sce->val3 = (int)damage; + sce->val2 = 0; + if (!tsc->getSCE(SC_KYOMU)) //SC_KYOMU invalidates reflecting ability. + skill_castend_damage_id(bl, src, NPC_MAXPAIN_ATK, sce->val1, tick, flag); } if( (skill_id == AL_INCAGI || skill_id == AL_BLESSING || skill_id == CASH_BLESSING || skill_id == CASH_INCAGI || - skill_id == MER_INCAGI || skill_id == MER_BLESSING) && tsc && tsc->data[SC_CHANGEUNDEAD] ) + skill_id == MER_INCAGI || skill_id == MER_BLESSING) && tsc && tsc->getSCE(SC_CHANGEUNDEAD) ) damage = 1; - if( damage && tsc && tsc->data[SC_GENSOU] && dmg.flag&BF_MAGIC ){ + if( damage && tsc && tsc->getSCE(SC_GENSOU) && dmg.flag&BF_MAGIC ){ struct block_list *nbl; nbl = battle_getenemyarea(bl,bl->x,bl->y,2,BL_CHAR,bl->id); if( nbl ){ // Only one target is chosen. @@ -3733,7 +3734,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * case SL_STUN: if (skill_lv >= 7) { struct status_change *sc_cur = status_get_sc(src); - if (sc_cur && !sc_cur->data[SC_SMA]) + if (sc_cur && !sc_cur->getSCE(SC_SMA)) sc_start(src,src,SC_SMA,100,skill_lv,skill_get_time(SL_SMA, skill_lv)); } break; @@ -3744,10 +3745,10 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * case LK_SPIRALPIERCE: case RK_HUNDREDSPEAR: case DK_MADNESS_CRUSHER: - if (sc && sc->data[SC_CHARGINGPIERCE]) { - if (sc->data[SC_CHARGINGPIERCE_COUNT]) { - if (sc->data[SC_CHARGINGPIERCE_COUNT]->val1 < 10) // If the charge count is below 10, add 1. - sc_start(src, src, SC_CHARGINGPIERCE_COUNT, 100, sc->data[SC_CHARGINGPIERCE_COUNT]->val1 + 1, skill_get_time2(DK_CHARGINGPIERCE, 1)); + if (sc && sc->getSCE(SC_CHARGINGPIERCE)) { + if (sc->getSCE(SC_CHARGINGPIERCE_COUNT)) { + if (sc->getSCE(SC_CHARGINGPIERCE_COUNT)->val1 < 10) // If the charge count is below 10, add 1. + sc_start(src, src, SC_CHARGINGPIERCE_COUNT, 100, sc->getSCE(SC_CHARGINGPIERCE_COUNT)->val1 + 1, skill_get_time2(DK_CHARGINGPIERCE, 1)); else { // If charge count is 10, bonus damage is applied for 1 attack and then the count status ends. clif_specialeffect(bl, 1767, AREA); status_change_end(src, SC_CHARGINGPIERCE_COUNT); @@ -3938,7 +3939,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * // Instant damage if( !dmg.amotion ) { - if( (!tsc || (!tsc->data[SC_DEVOTION] && skill_id != CR_REFLECTSHIELD && !tsc->data[SC_WATER_SCREEN_OPTION]) + if( (!tsc || (!tsc->getSCE(SC_DEVOTION) && skill_id != CR_REFLECTSHIELD && !tsc->getSCE(SC_WATER_SCREEN_OPTION)) #ifndef RENEWAL || skill_id == HW_GRAVITATION #endif @@ -3986,8 +3987,8 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * && skill_id != PA_PRESSURE && skill_id != HW_GRAVITATION #endif ) { - if (tsc->data[SC_DEVOTION]) { - struct status_change_entry *sce = tsc->data[SC_DEVOTION]; + if (tsc->getSCE(SC_DEVOTION)) { + struct status_change_entry *sce = tsc->getSCE(SC_DEVOTION); struct block_list *d_bl = map_id2bl(sce->val1); if (d_bl && ( @@ -4000,8 +4001,8 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * // Needed to check the devotion master for Rebound Shield status. struct status_change *d_sc = status_get_sc(d_bl); - if (d_sc && d_sc->data[SC_REBOUND_S]) - devotion_damage -= devotion_damage * d_sc->data[SC_REBOUND_S]->val2 / 100; + if (d_sc && d_sc->getSCE(SC_REBOUND_S)) + devotion_damage -= devotion_damage * d_sc->getSCE(SC_REBOUND_S)->val2 / 100; if (!rmdamage) { clif_damage(d_bl, d_bl, gettick(), 0, 0, devotion_damage, 0, DMG_NORMAL, 0, false); @@ -4023,8 +4024,8 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * status_fix_damage(src, bl, damage, dmg.dmotion, 0); } } - if (tsc->data[SC_WATER_SCREEN_OPTION]) { - struct status_change_entry *sce = tsc->data[SC_WATER_SCREEN_OPTION]; + if (tsc->getSCE(SC_WATER_SCREEN_OPTION)) { + struct status_change_entry *sce = tsc->getSCE(SC_WATER_SCREEN_OPTION); struct block_list *e_bl = map_id2bl(sce->val1); if (e_bl) { @@ -4065,15 +4066,15 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * battle_drain(sd, bl, dmg.damage, dmg.damage2, tstatus->race, tstatus->class_); } - if (sd && tsc && dmg.flag&BF_LONG && tsc->data[SC_WINDSIGN] && rand()%100 < tsc->data[SC_WINDSIGN]->val2) + if (sd && tsc && dmg.flag&BF_LONG && tsc->getSCE(SC_WINDSIGN) && rand()%100 < tsc->getSCE(SC_WINDSIGN)->val2) status_heal(src, 0, 0, 1, 0); if( damage > 0 ) { // Post-damage effects switch( skill_id ) { case GC_VENOMPRESSURE: { struct status_change *ssc = status_get_sc(src); - if( ssc && ssc->data[SC_POISONINGWEAPON] && rnd()%100 < 70 + 5*skill_lv ) { - sc_start4(src, bl, (sc_type)ssc->data[SC_POISONINGWEAPON]->val2, 100, ssc->data[SC_POISONINGWEAPON]->val1, 0, 1, 0, skill_get_time2(GC_POISONINGWEAPON, 1)); + if( ssc && ssc->getSCE(SC_POISONINGWEAPON) && rnd()%100 < 70 + 5*skill_lv ) { + sc_start4(src, bl, (sc_type)ssc->getSCE(SC_POISONINGWEAPON)->val2, 100, ssc->getSCE(SC_POISONINGWEAPON)->val1, 0, 1, 0, skill_get_time2(GC_POISONINGWEAPON, 1)); status_change_end(src,SC_POISONINGWEAPON); clif_skill_nodamage(src,bl,skill_id,skill_lv,1); } @@ -4089,7 +4090,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * case MG_COLDBOLT: case MG_FIREBOLT: case MG_LIGHTNINGBOLT: - if (sc && sc->data[SC_DOUBLECAST] && rnd() % 100 < sc->data[SC_DOUBLECAST]->val2) + if (sc && sc->getSCE(SC_DOUBLECAST) && rnd() % 100 < sc->getSCE(SC_DOUBLECAST)->val2) //skill_addtimerskill(src, tick + dmg.div_*dmg.amotion, bl->id, 0, 0, skill_id, skill_lv, BF_MAGIC, flag|2); skill_addtimerskill(src, tick + dmg.amotion, bl->id, 0, 0, skill_id, skill_lv, BF_MAGIC, flag|2); break; @@ -4582,10 +4583,10 @@ static TIMER_FUNC(skill_timerskill){ } else { struct status_change *sc = status_get_sc(src); if(sc) { - if(sc->data[SC_SPIRIT] && - sc->data[SC_SPIRIT]->val2 == SL_WIZARD && - sc->data[SC_SPIRIT]->val3 == skl->skill_id) - sc->data[SC_SPIRIT]->val3 = 0; //Clear bounced spell check. + if(sc->getSCE(SC_SPIRIT) && + sc->getSCE(SC_SPIRIT)->val2 == SL_WIZARD && + sc->getSCE(SC_SPIRIT)->val3 == skl->skill_id) + sc->getSCE(SC_SPIRIT)->val3 = 0; //Clear bounced spell check. } } break; @@ -4686,7 +4687,7 @@ static TIMER_FUNC(skill_timerskill){ case SU_SV_ROOTTWIST_ATK: { struct status_change *tsc = status_get_sc(target); - if (tsc && tsc->data[SC_SV_ROOTTWIST]) { + if (tsc && tsc->getSCE(SC_SV_ROOTTWIST)) { if (check_distance_bl(src, target, 32)) // Only damage if caster is within 32x32 area skill_attack(skl->type, src, target, target, skl->skill_id, skl->skill_lv, tick, skl->flag); skill_addtimerskill(src, tick + 1000, target->id, 0, 0, skl->skill_id, skl->skill_lv, skl->type, skl->flag); @@ -5196,8 +5197,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; case SHC_ETERNAL_SLASH: - if( sc && sc->data[SC_E_SLASH_COUNT] ) - sc_start(src, src, SC_E_SLASH_COUNT, 100, min( 5, 1 + sc->data[SC_E_SLASH_COUNT]->val1 ), skill_get_time(skill_id, skill_lv)); + if( sc && sc->getSCE(SC_E_SLASH_COUNT) ) + sc_start(src, src, SC_E_SLASH_COUNT, 100, min( 5, 1 + sc->getSCE(SC_E_SLASH_COUNT)->val1 ), skill_get_time(skill_id, skill_lv)); else sc_start(src, src, SC_E_SLASH_COUNT, 100, 1, skill_get_time(skill_id, skill_lv)); clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); @@ -5205,7 +5206,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; case SHC_SHADOW_STAB: - if (sc && (sc->data[SC_CLOAKING] || sc->data[SC_CLOAKINGEXCEED])) + if (sc && (sc->getSCE(SC_CLOAKING) || sc->getSCE(SC_CLOAKINGEXCEED))) flag |= 2;// Flag to deal 2 hits. status_change_end(src, SC_CLOAKING); @@ -5218,8 +5219,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case WH_CRESCIVE_BOLT: clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); - if( sc && sc->data[SC_CRESCIVEBOLT] ) - sc_start(src, src, SC_CRESCIVEBOLT, 100, min( 3, 1 + sc->data[SC_CRESCIVEBOLT]->val1 ), skill_get_time(skill_id, skill_lv)); + if( sc && sc->getSCE(SC_CRESCIVEBOLT) ) + sc_start(src, src, SC_CRESCIVEBOLT, 100, min( 3, 1 + sc->getSCE(SC_CRESCIVEBOLT)->val1 ), skill_get_time(skill_id, skill_lv)); else sc_start(src, src, SC_CRESCIVEBOLT, 100, 1, skill_get_time(skill_id, skill_lv)); break; @@ -5248,14 +5249,14 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case LK_JOINTBEAT: flag = 1 << rnd() % 6; - if (flag != BREAK_NECK && tsc && tsc->data[SC_JOINTBEAT] && tsc->data[SC_JOINTBEAT]->val2 & BREAK_NECK) + if (flag != BREAK_NECK && tsc && tsc->getSCE(SC_JOINTBEAT) && tsc->getSCE(SC_JOINTBEAT)->val2 & BREAK_NECK) flag = BREAK_NECK; // Target should always receive double damage if neck is already broken if (skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag)) status_change_start(src, bl, SC_JOINTBEAT, (50 * (skill_lv + 1) - (270 * tstatus->str) / 100) * 10, skill_lv, flag & BREAK_FLAGS, src->id, 0, skill_get_time2(skill_id, skill_lv), SCSTART_NONE); break; case MO_COMBOFINISH: - if (!(flag&1) && sc && sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_MONK) + if (!(flag&1) && sc && sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_MONK) { //Becomes a splash attack when Soul Linked. map_foreachinshootrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv),BL_CHAR|BL_SKILL, @@ -5624,14 +5625,14 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint int heal = 0; std::bitset inf2 = skill_db.find(skill_id)->inf2; - if (tsc && tsc->data[SC_HOVERING] && inf2[INF2_IGNOREHOVERING]) + if (tsc && tsc->getSCE(SC_HOVERING) && inf2[INF2_IGNOREHOVERING]) break; // Under Hovering characters are immune to select trap and ground target skills. if (skill_id == AB_ADORAMUS && map_getcell(bl->m, bl->x, bl->y, CELL_CHKLANDPROTECTOR)) break; // No damage should happen if the target is on Land Protector // Servant Weapon - Demol only hits if the target is marked with a sign by the attacking caster. - if (skill_id == DK_SERVANT_W_DEMOL && !(tsc && tsc->data[SC_SERVANT_SIGN] && tsc->data[SC_SERVANT_SIGN]->val1 == src->id)) + if (skill_id == DK_SERVANT_W_DEMOL && !(tsc && tsc->getSCE(SC_SERVANT_SIGN) && tsc->getSCE(SC_SERVANT_SIGN)->val1 == src->id)) break; // Deft Stab - Make sure the flag of 2 is passed on when the skill is double casted. @@ -5717,7 +5718,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);// Trigger animation on servants. break; case AG_CRYSTAL_IMPACT_ATK: - if (sc && sc->data[SC_CLIMAX] && sc->data[SC_CLIMAX]->val1 == 5) + if (sc && sc->getSCE(SC_CLIMAX) && sc->getSCE(SC_CLIMAX)->val1 == 5) splash_size = 2;// Gives the aftershock hit a 5x5 splash AoE. break; case AG_ROCK_DOWN: @@ -5741,8 +5742,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if (sd) { uint8 limit = 5; - if (sc && sc->data[SC_RAISINGDRAGON]) - limit += sc->data[SC_RAISINGDRAGON]->val1; + if (sc && sc->getSCE(SC_RAISINGDRAGON)) + limit += sc->getSCE(SC_RAISINGDRAGON)->val1; for (uint8 i = 0; i < limit; i++) pc_addspiritball(sd, skill_get_time(skill_id, skill_lv), limit); } @@ -5774,7 +5775,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; case TR_METALIC_FURY: clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); - if (tsc && tsc->data[SC_SOUNDBLEND]) + if (tsc && tsc->getSCE(SC_SOUNDBLEND)) skill_area_temp[0] = 1 + rnd()%4; break; } @@ -6062,14 +6063,14 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint skill_attack(BF_MISC, src, src, bl, skill_id, skill_lv, tick, flag); // We can end Dimension here since the cooldown code is processed before this point. - if (sc && sc->data[SC_DIMENSION]) + if (sc && sc->getSCE(SC_DIMENSION)) status_change_end(src, SC_DIMENSION); else // Dimension not active? Activate the 2 second skill block penalty. sc_start(src, &sd->bl, SC_NOVAEXPLOSING, 100, skill_lv, skill_get_time(skill_id, skill_lv)); break; case SP_SOULEXPLOSION: - if (!(tsc && (tsc->data[SC_SPIRIT] || tsc->data[SC_SOULGOLEM] || tsc->data[SC_SOULSHADOW] || tsc->data[SC_SOULFALCON] || tsc->data[SC_SOULFAIRY])) || tstatus->hp < 10 * tstatus->max_hp / 100) { // Requires target to have a soul link and more then 10% of MaxHP. + if (!(tsc && (tsc->getSCE(SC_SPIRIT) || tsc->getSCE(SC_SOULGOLEM) || tsc->getSCE(SC_SOULSHADOW) || tsc->getSCE(SC_SOULFALCON) || tsc->getSCE(SC_SOULFAIRY))) || tstatus->hp < 10 * tstatus->max_hp / 100) { // Requires target to have a soul link and more then 10% of MaxHP. // With this skill requiring a soul link, and the target to have more then 10% if MaxHP, I wonder // if the cooldown still happens after it fails. Need a confirm. [Rytech] if (sd) @@ -6143,7 +6144,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case RK_DRAGONBREATH_WATER: case RK_DRAGONBREATH: case NPC_DRAGONBREATH: - if( tsc && tsc->data[SC_HIDING] ) + if( tsc && tsc->getSCE(SC_HIDING) ) clif_skill_nodamage(src,src,skill_id,skill_lv,1); else { skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); @@ -6151,7 +6152,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; case NPC_SELFDESTRUCTION: - if( tsc && tsc->data[SC_HIDING] ) + if( tsc && tsc->getSCE(SC_HIDING) ) break; case HVAN_EXPLOSION: if (src != bl) @@ -6246,7 +6247,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; case GC_CROSSRIPPERSLASHER: - if( sd && !(sc && sc->data[SC_ROLLINGCUTTER]) ) + if( sd && !(sc && sc->getSCE(SC_ROLLINGCUTTER)) ) clif_skill_fail(sd,skill_id,USESKILL_FAIL_CONDITION,0); else { @@ -6265,11 +6266,11 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case GC_PHANTOMMENACE: if (flag&1) { // Only Hits Invisible Targets - if(tsc && (tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK) || tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_STEALTHFIELD])) { + if(tsc && (tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK) || tsc->getSCE(SC_CAMOUFLAGE) || tsc->getSCE(SC_STEALTHFIELD))) { status_change_end(bl, SC_CLOAKINGEXCEED); skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); } - if (tsc && tsc->data[SC__SHADOWFORM] && rnd() % 100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] % + if (tsc && tsc->getSCE(SC__SHADOWFORM) && rnd() % 100 < 100 - tsc->getSCE(SC__SHADOWFORM)->val1 * 10) // [100 - (Skill Level x 10)] % status_change_end(bl, SC__SHADOWFORM); // Should only end, no damage dealt. } break; @@ -6324,16 +6325,16 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint } else if (sc) { // No SC? No spheres int i, k = 0; - if (sc->data[SC_SPHERE_5]) // If 5 spheres, remove last one (based on reverse order) and only do 4 actions (Official behavior) + if (sc->getSCE(SC_SPHERE_5)) // If 5 spheres, remove last one (based on reverse order) and only do 4 actions (Official behavior) status_change_end(src, SC_SPHERE_1); for (i = SC_SPHERE_5; i >= SC_SPHERE_1; i--) { // Loop should always be 4 for regular players, but unconditional_skill could be less - if (sc->data[static_cast(i)] == nullptr) + if (sc->getSCE(static_cast(i)) == nullptr) continue; uint16 subskill = 0; - switch (sc->data[static_cast(i)]->val1) { + switch (sc->getSCE(static_cast(i))->val1) { case WLS_FIRE: subskill = WL_TETRAVORTEX_FIRE; k |= 1; @@ -6373,13 +6374,13 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint skill_toggle_magicpower(src, skill_id); // No hit will be amplified #endif if (skill_lv == 1) { // SpellBook - if (sc->data[SC_FREEZE_SP] == nullptr) + if (sc->getSCE(SC_FREEZE_SP) == nullptr) break; bool found_spell = false; for (i = SC_MAXSPELLBOOK; i >= SC_SPELLBOOK1; i--) { // List all available spell to be released - if (sc->data[i] != nullptr) { + if (sc->getSCE(i) != nullptr) { found_spell = true; break; } @@ -6389,14 +6390,14 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; // Now extract the data from the preserved spell - uint16 pres_skill_id = sc->data[i]->val1; - uint16 pres_skill_lv = sc->data[i]->val2; - uint16 point = sc->data[i]->val3; + uint16 pres_skill_id = sc->getSCE(i)->val1; + uint16 pres_skill_lv = sc->getSCE(i)->val2; + uint16 point = sc->getSCE(i)->val3; status_change_end(src, static_cast(i)); - if( sc->data[SC_FREEZE_SP]->val2 > point ) - sc->data[SC_FREEZE_SP]->val2 -= point; + if( sc->getSCE(SC_FREEZE_SP)->val2 > point ) + sc->getSCE(SC_FREEZE_SP)->val2 -= point; else // Last spell to be released status_change_end(src, SC_FREEZE_SP); @@ -6428,13 +6429,13 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint skill_blockpc_start(sd, pres_skill_id, cooldown); } else { // Summoned Balls for (i = SC_SPHERE_5; i >= SC_SPHERE_1; i--) { - if (sc->data[static_cast(i)] == nullptr) + if (sc->getSCE(static_cast(i)) == nullptr) continue; - int skele = WL_RELEASE - 5 + sc->data[static_cast(i)]->val1 - WLS_FIRE; // Convert Ball Element into Skill ATK for balls + int skele = WL_RELEASE - 5 + sc->getSCE(static_cast(i))->val1 - WLS_FIRE; // Convert Ball Element into Skill ATK for balls // WL_SUMMON_ATK_FIRE, WL_SUMMON_ATK_WIND, WL_SUMMON_ATK_WATER, WL_SUMMON_ATK_GROUND - skill_addtimerskill(src, tick + (t_tick)status_get_adelay(src) * abs(i - SC_SPHERE_1), bl->id, 0, 0, skele, sc->data[static_cast(i)]->val2, BF_MAGIC, flag | SD_LEVEL); + skill_addtimerskill(src, tick + (t_tick)status_get_adelay(src) * abs(i - SC_SPHERE_1), bl->id, 0, 0, skele, sc->getSCE(static_cast(i))->val2, BF_MAGIC, flag | SD_LEVEL); status_change_end(src, static_cast(i)); // Eliminate ball } clif_skill_nodamage(src, bl, skill_id, 0, 1); @@ -6480,11 +6481,11 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case RA_SENSITIVEKEEN: if( bl->type != BL_SKILL ) { // Only Hits Invisible Targets - if (tsc && ((tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK)) || tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_STEALTHFIELD])) { + if (tsc && ((tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK)) || tsc->getSCE(SC_CAMOUFLAGE) || tsc->getSCE(SC_STEALTHFIELD))) { status_change_end(bl, SC_CLOAKINGEXCEED); skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); } - if (tsc && tsc->data[SC__SHADOWFORM] && rnd() % 100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] % + if (tsc && tsc->getSCE(SC__SHADOWFORM) && rnd() % 100 < 100 - tsc->getSCE(SC__SHADOWFORM)->val1 * 10) // [100 - (Skill Level x 10)] % status_change_end(bl, SC__SHADOWFORM); // Should only end, no damage dealt. } else { skill_unit *su = BL_CAST(BL_SKILL, bl); @@ -6511,7 +6512,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint status_change_end(bl, SC_CLOAKINGEXCEED); status_change_end(bl, SC_CAMOUFLAGE); status_change_end(bl, SC_NEWMOON); - if (tsc && tsc->data[SC__SHADOWFORM] && rnd() % 100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] % + if (tsc && tsc->getSCE(SC__SHADOWFORM) && rnd() % 100 < 100 - tsc->getSCE(SC__SHADOWFORM)->val1 * 10) // [100 - (Skill Level x 10)] % status_change_end(bl, SC__SHADOWFORM); sc_start(src,bl, SC_INFRAREDSCAN, 10000, skill_lv, skill_get_time(skill_id, skill_lv)); } else { @@ -6585,7 +6586,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if( flag&1 ) { //by default cloaking skills are remove by aoe skills so no more checking/removing except hiding and cloaking exceed. skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); status_change_end(bl, SC_CLOAKINGEXCEED); - if (tsc && tsc->data[SC__SHADOWFORM] && rnd() % 100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] % + if (tsc && tsc->getSCE(SC__SHADOWFORM) && rnd() % 100 < 100 - tsc->getSCE(SC__SHADOWFORM)->val1 * 10) // [100 - (Skill Level x 10)] % status_change_end(bl, SC__SHADOWFORM); } else { map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); @@ -6597,7 +6598,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if (flag & 1) { skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); } else if (sd) { - if (sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE && !sc->data[SC_FLASHCOMBO]) + if (sc && sc->getSCE(SC_COMBO) && sc->getSCE(SC_COMBO)->val1 == SR_FALLENEMPIRE && !sc->getSCE(SC_FLASHCOMBO)) flag |= 8; // Only apply Combo bonus when Tiger Cannon is not used through Flash Combo map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR | BL_SKILL, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id); } @@ -6614,7 +6615,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; case NPC_POISON_BUSTER: - if( tsc && tsc->data[SC_POISON] ) { + if( tsc && tsc->getSCE(SC_POISON) ) { skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag); status_change_end(bl, SC_POISON); } @@ -6703,7 +6704,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint clif_skill_nodamage(src,battle_get_master(src),skill_id,skill_lv,1); clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); - if( (tsc_ele && tsc_ele->data[type2]) || (tsc && tsc->data[type]) ) { + if( (tsc_ele && tsc_ele->getSCE(type2)) || (tsc && tsc->getSCE(type)) ) { status_change_end(battle_get_master(src),type); status_change_end(src,type2); } @@ -6770,12 +6771,12 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; } // Triggered by RL_FLICKER - if (sd && sd->flicker && tsc && tsc->data[SC_H_MINE] && tsc->data[SC_H_MINE]->val2 == src->id) { + if (sd && sd->flicker && tsc && tsc->getSCE(SC_H_MINE) && tsc->getSCE(SC_H_MINE)->val2 == src->id) { // Splash damage around it! map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_damage_id); flag |= 1; // Don't consume requirement - tsc->data[SC_H_MINE]->val3 = 1; // Mark the SC end because not expired + tsc->getSCE(SC_H_MINE)->val3 = 1; // Mark the SC end because not expired status_change_end(bl, SC_H_MINE); sc_start4(src, bl, SC_BURNING, 10 * skill_lv, skill_lv, 1000, src->id, 0, skill_get_time2(skill_id,skill_lv)); } @@ -6789,7 +6790,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case RL_QD_SHOT: if (skill_area_temp[1] == bl->id) break; - if (flag&1 && tsc && tsc->data[SC_C_MARKER]) + if (flag&1 && tsc && tsc->getSCE(SC_C_MARKER)) skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag|SD_ANIMATION); break; case RL_D_TAIL: @@ -6797,7 +6798,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if (flag&1) skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag|SD_ANIMATION); else { - if (sd && tsc && tsc->data[SC_C_MARKER]) { + if (sd && tsc && tsc->getSCE(SC_C_MARKER)) { int i; ARR_FIND(0, MAX_SKILL_CRIMSON_MARKER, i, sd->c_marker[i] == bl->id); @@ -6843,7 +6844,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case SJ_FALLINGSTAR_ATK: if (sd) { // If a player used the skill it will search for targets marked by that player. - if (tsc && tsc->data[SC_FLASHKICK] && tsc->data[SC_FLASHKICK]->val4 == 1) { // Mark placed by a player. + if (tsc && tsc->getSCE(SC_FLASHKICK) && tsc->getSCE(SC_FLASHKICK)->val4 == 1) { // Mark placed by a player. int8 i = 0; ARR_FIND(0, MAX_STELLAR_MARKS, i, sd->stellar_mark[i] == bl->id); @@ -6852,7 +6853,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint skill_castend_damage_id(src, bl, SJ_FALLINGSTAR_ATK2, skill_lv, tick, 0); } } - } else if ( tsc && tsc->data[SC_FLASHKICK] && tsc->data[SC_FLASHKICK]->val4 == 2 ) { // Mark placed by a monster. + } else if ( tsc && tsc->getSCE(SC_FLASHKICK) && tsc->getSCE(SC_FLASHKICK)->val4 == 2 ) { // Mark placed by a monster. // If a monster used the skill it will search for targets marked by any monster since they can't track their own targets. skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); skill_castend_damage_id(src, bl, SJ_FALLINGSTAR_ATK2, skill_lv, tick, 0); @@ -6871,7 +6872,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint } // Check if the target is already tagged by another source. - if ((tsd && tsd->sc.data[SC_FLASHKICK] && tsd->sc.data[SC_FLASHKICK]->val1 != src->id) || (tmd && tmd->sc.data[SC_FLASHKICK] && tmd->sc.data[SC_FLASHKICK]->val1 != src->id)) { // Same as the above check, but for monsters. + if ((tsd && tsd->sc.getSCE(SC_FLASHKICK) && tsd->sc.getSCE(SC_FLASHKICK)->val1 != src->id) || (tmd && tmd->sc.getSCE(SC_FLASHKICK) && tmd->sc.getSCE(SC_FLASHKICK)->val1 != src->id)) { // Same as the above check, but for monsters. // Can't tag a player that was already tagged from another source. if (sd) clif_skill_fail(sd,skill_id, USESKILL_FAIL, 0); @@ -6926,7 +6927,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint return 1; } - if( sc && sc->data[SC_CURSEDCIRCLE_ATKER] ) //Should only remove after the skill has been casted. + if( sc && sc->getSCE(SC_CURSEDCIRCLE_ATKER) ) //Should only remove after the skill has been casted. status_change_end(src,SC_CURSEDCIRCLE_ATKER); map_freeblock_unlock(); @@ -7136,7 +7137,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui type = skill_get_sc(skill_id); tsc = status_get_sc(bl); - tsce = (tsc && type != SC_NONE)?tsc->data[type]:NULL; + tsce = (tsc && type != SC_NONE)?tsc->getSCE(type):NULL; if (src!=bl && type > SC_NONE && CHK_ELEMENT((i = skill_get_ele(skill_id, skill_lv))) && i > ELE_NEUTRAL && @@ -7157,8 +7158,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui heal = 0; if( tsc && tsc->count ) { - if( tsc->data[SC_KAITE] && !status_has_mode(sstatus,MD_STATUSIMMUNE) ) { //Bounce back heal - if (--tsc->data[SC_KAITE]->val2 <= 0) + if( tsc->getSCE(SC_KAITE) && !status_has_mode(sstatus,MD_STATUSIMMUNE) ) { //Bounce back heal + if (--tsc->getSCE(SC_KAITE)->val2 <= 0) status_change_end(bl, SC_KAITE); if (src == bl) heal=0; //When you try to heal yourself under Kaite, the heal is voided. @@ -7167,13 +7168,13 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui dstsd = sd; } } - else if (tsc->data[SC_BERSERK] || tsc->data[SC_SATURDAYNIGHTFEVER]) + else if (tsc->getSCE(SC_BERSERK) || tsc->getSCE(SC_SATURDAYNIGHTFEVER)) heal = 0; //Needed so that it actually displays 0 when healing. } if (skill_id == AL_HEAL) status_change_end(bl, SC_BITESCAR); clif_skill_nodamage (src, bl, skill_id, heal, 1); - if( tsc && tsc->data[SC_AKAITSUKI] && heal && skill_id != HLIF_HEAL ) + if( tsc && tsc->getSCE(SC_AKAITSUKI) && heal && skill_id != HLIF_HEAL ) heal = ~heal + 1; t_exp heal_get_jobexp = status_heal(bl,heal,0,0); @@ -7244,7 +7245,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; { int per = 0, sper = 0; - if (tsc && tsc->data[SC_HELLPOWER]) { + if (tsc && tsc->getSCE(SC_HELLPOWER)) { clif_skill_nodamage(src, bl, ALL_RESURRECTION, skill_lv, 1); break; } @@ -7434,9 +7435,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if( tsc && status_has_mode(&dstmd->status,MD_STATUSIMMUNE) ) { const enum sc_type scs[] = { SC_QUAGMIRE, SC_PROVOKE, SC_ROKISWEIL, SC_GRAVITATION, SC_SUITON, SC_STRIPWEAPON, SC_STRIPSHIELD, SC_STRIPARMOR, SC_STRIPHELM, SC_BLADESTOP }; for (i = SC_COMMON_MIN; i <= SC_COMMON_MAX; i++) - if (tsc->data[i]) status_change_end(bl, (sc_type)i); + if (tsc->getSCE(i)) status_change_end(bl, (sc_type)i); for (i = 0; i < ARRAYLENGTH(scs); i++) - if (tsc->data[scs[i]]) status_change_end(bl, scs[i]); + if (tsc->getSCE(scs[i])) status_change_end(bl, scs[i]); } } break; @@ -7478,7 +7479,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case CG_MARIONETTE: { - if( (sd && dstsd && (dstsd->class_&MAPID_UPPERMASK) == MAPID_BARDDANCER && dstsd->status.sex == sd->status.sex) || (tsc && (tsc->data[SC_CURSE] || tsc->data[SC_QUAGMIRE])) ) + if( (sd && dstsd && (dstsd->class_&MAPID_UPPERMASK) == MAPID_BARDDANCER && dstsd->status.sex == sd->status.sex) || (tsc && (tsc->getSCE(SC_CURSE) || tsc->getSCE(SC_QUAGMIRE))) ) {// Cannot cast on another bard/dancer-type class of the same gender as caster, or targets under Curse/Quagmire clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); map_freeblock_unlock(); @@ -7489,15 +7490,15 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if( sc && tsc ) { - if( !sc->data[SC_MARIONETTE] && !tsc->data[SC_MARIONETTE2] ) + if( !sc->getSCE(SC_MARIONETTE) && !tsc->getSCE(SC_MARIONETTE2) ) { sc_start(src,src,SC_MARIONETTE,100,bl->id,skill_get_time(skill_id,skill_lv)); sc_start(src,bl,SC_MARIONETTE2,100,src->id,skill_get_time(skill_id,skill_lv)); clif_skill_nodamage(src,bl,skill_id,skill_lv,1); } else - if( sc->data[SC_MARIONETTE ] && sc->data[SC_MARIONETTE ]->val1 == bl->id && - tsc->data[SC_MARIONETTE2] && tsc->data[SC_MARIONETTE2]->val1 == src->id ) + if( sc->getSCE(SC_MARIONETTE ) && sc->getSCE(SC_MARIONETTE )->val1 == bl->id && + tsc->getSCE(SC_MARIONETTE2) && tsc->getSCE(SC_MARIONETTE2)->val1 == src->id ) { status_change_end(src, SC_MARIONETTE); status_change_end(bl, SC_MARIONETTE2); @@ -7617,7 +7618,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case MER_INCAGI: case MER_BLESSING: clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); - if (dstsd != nullptr && tsc && tsc->data[SC_CHANGEUNDEAD]) { + if (dstsd != nullptr && tsc && tsc->getSCE(SC_CHANGEUNDEAD)) { if (tstatus->hp > 1) skill_attack(BF_MISC,src,src,bl,skill_id,skill_lv,tick,flag); break; @@ -7626,7 +7627,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case CR_REFLECTSHIELD: case MS_REFLECTSHIELD: - if (tsc && tsc->data[SC_DARKCROW]) { // SC_DARKCROW prevents using reflecting skills + if (tsc && tsc->getSCE(SC_DARKCROW)) { // SC_DARKCROW prevents using reflecting skills if (sd) clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0); break; @@ -7804,8 +7805,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui uint16 climax_lv = 0, splash_size = skill_get_splash(skill_id, skill_lv); status_change *sc = status_get_sc(src); - if (sc && sc->data[SC_CLIMAX]) - climax_lv = sc->data[SC_CLIMAX]->val1; + if (sc && sc->getSCE(SC_CLIMAX)) + climax_lv = sc->getSCE(SC_CLIMAX)->val1; if (climax_lv == 5) { // Adjusts splash AoE size depending on skill. if (skill_id == AG_DESTRUCTIVE_HURRICANE) @@ -8086,10 +8087,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if( (lv = status_get_lv(src) - dstsd->status.base_level) < 0 ) lv = -lv; if( lv > battle_config.devotion_level_difference || // Level difference requeriments - (dstsd->sc.data[type] && dstsd->sc.data[type]->val1 != src->id) || // Cannot Devote a player devoted from another source + (dstsd->sc.getSCE(type) && dstsd->sc.getSCE(type)->val1 != src->id) || // Cannot Devote a player devoted from another source (skill_id == ML_DEVOTION && (!mer || mer != dstsd->md)) || // Mercenary only can devote owner (dstsd->class_&MAPID_UPPERMASK) == MAPID_CRUSADER || // Crusader Cannot be devoted - (dstsd->sc.data[SC_HELLPOWER])) // Players affected by SC_HELLPOWER cannot be devoted. + (dstsd->sc.getSCE(SC_HELLPOWER))) // Players affected by SC_HELLPOWER cannot be devoted. { if( sd ) clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); @@ -8134,7 +8135,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; } - if (dstsd->sc.data[type] && dstsd->sc.data[type]->val2 != src->id) { // Fail if a player is in unity with another source. + if (dstsd->sc.getSCE(type) && dstsd->sc.getSCE(type)->val2 != src->id) { // Fail if a player is in unity with another source. if (sd) clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0); map_freeblock_unlock(); @@ -8173,7 +8174,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } // Check if the target is already marked by another source. - if (tsc && tsc->data[type] && tsc->data[type]->val1 != src->id) { + if (tsc && tsc->getSCE(type) && tsc->getSCE(type)->val1 != src->id) { if (sd) clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0); map_freeblock_unlock(); @@ -8207,8 +8208,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case MO_CALLSPIRITS: if(sd) { int limit = skill_lv; - if( sd->sc.data[SC_RAISINGDRAGON] ) - limit += sd->sc.data[SC_RAISINGDRAGON]->val1; + if( sd->sc.getSCE(SC_RAISINGDRAGON) ) + limit += sd->sc.getSCE(SC_RAISINGDRAGON)->val1; clif_skill_nodamage(src,bl,skill_id,skill_lv,1); pc_addspiritball(sd,skill_get_time(skill_id,skill_lv),limit); } @@ -8217,8 +8218,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case CH_SOULCOLLECT: if(sd) { int limit = 5; - if( sd->sc.data[SC_RAISINGDRAGON] ) - limit += sd->sc.data[SC_RAISINGDRAGON]->val1; + if( sd->sc.getSCE(SC_RAISINGDRAGON) ) + limit += sd->sc.getSCE(SC_RAISINGDRAGON)->val1; clif_skill_nodamage(src,bl,skill_id,skill_lv,1); for (i = 0; i < limit; i++) pc_addspiritball(sd,skill_get_time(skill_id,skill_lv),limit); @@ -8352,7 +8353,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } else sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); } - if (skill_id == SJ_STAREMPEROR && sc && sc->data[SC_DIMENSION]) { + if (skill_id == SJ_STAREMPEROR && sc && sc->getSCE(SC_DIMENSION)) { if (sd) { // Remove old shields if any exist. pc_delspiritball(sd, sd->spiritball, 0); @@ -8648,12 +8649,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SP_KAUTE: if (sd) { if (!dstsd || !( - (sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_SOULLINKER) || + (sd->sc.getSCE(SC_SPIRIT) && sd->sc.getSCE(SC_SPIRIT)->val2 == SL_SOULLINKER) || (dstsd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER || dstsd->status.char_id == sd->status.char_id || dstsd->status.char_id == sd->status.partner_id || dstsd->status.char_id == sd->status.child || - (skill_id == SP_KAUTE && dstsd->sc.data[SC_SOULUNITY]) + (skill_id == SP_KAUTE && dstsd->sc.getSCE(SC_SOULUNITY)) )) { status_change_start(src,src,SC_STUN,10000,skill_lv,0,0,0,500,SCSTART_NORATEDEF); clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); @@ -8725,7 +8726,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case CG_SPECIALSINGER: - if (tsc && tsc->data[SC_ENSEMBLEFATIGUE]) { + if (tsc && tsc->getSCE(SC_ENSEMBLEFATIGUE)) { clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); status_change_end(bl, SC_ENSEMBLEFATIGUE); } @@ -8736,7 +8737,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); #else - if(tsc && tsc->data[SC_DANCING]){ + if(tsc && tsc->getSCE(SC_DANCING)){ clif_skill_nodamage(src,bl,skill_id,skill_lv,1); status_change_end(bl, SC_DANCING); } @@ -8843,8 +8844,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui int32 brate = 0; - if (sd && sd->sc.data[SC_PETROLOGY_OPTION]) - brate = sd->sc.data[SC_PETROLOGY_OPTION]->val3; + if (sd && sd->sc.getSCE(SC_PETROLOGY_OPTION)) + brate = sd->sc.getSCE(SC_PETROLOGY_OPTION)->val3; if (sc_start2(src, bl, type, (skill_lv * 4 + 20) + brate, skill_lv, src->id, skill_get_time2(skill_id, skill_lv), skill_get_time(skill_id, skill_lv))) clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); @@ -9103,7 +9104,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui bool i; //Special message when trying to use strip on FCP [Jobbie] - if( sd && skill_id == ST_FULLSTRIP && tsc && tsc->data[SC_CP_WEAPON] && tsc->data[SC_CP_HELM] && tsc->data[SC_CP_ARMOR] && tsc->data[SC_CP_SHIELD]) + if( sd && skill_id == ST_FULLSTRIP && tsc && tsc->getSCE(SC_CP_WEAPON) && tsc->getSCE(SC_CP_HELM) && tsc->getSCE(SC_CP_ARMOR) && tsc->getSCE(SC_CP_SHIELD)) { clif_gospel_info(sd, 0x28); break; @@ -9153,7 +9154,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui potion_target = bl->id; run_script(sd->inventory_data[j]->script,0,sd->bl.id,0); potion_flag = potion_target = 0; - if( sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_ALCHEMIST ) + if( sd->sc.getSCE(SC_SPIRIT) && sd->sc.getSCE(SC_SPIRIT)->val2 == SL_ALCHEMIST ) bonus += sd->status.base_level; if( potion_per_hp > 0 || potion_per_sp > 0 ) { hp = tstatus->max_hp * potion_per_hp / 100; @@ -9216,15 +9217,15 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (tsc && tsc->count) { uint8 penalty = 0; - if (tsc->data[SC_WATER_INSIGNIA] && tsc->data[SC_WATER_INSIGNIA]->val1 == 2) { + if (tsc->getSCE(SC_WATER_INSIGNIA) && tsc->getSCE(SC_WATER_INSIGNIA)->val1 == 2) { hp += hp / 10; sp += sp / 10; } - if (tsc->data[SC_CRITICALWOUND]) - penalty += tsc->data[SC_CRITICALWOUND]->val2; - if (tsc->data[SC_DEATHHURT] && tsc->data[SC_DEATHHURT]->val3) + if (tsc->getSCE(SC_CRITICALWOUND)) + penalty += tsc->getSCE(SC_CRITICALWOUND)->val2; + if (tsc->getSCE(SC_DEATHHURT) && tsc->getSCE(SC_DEATHHURT)->val3) penalty += 20; - if (tsc->data[SC_NORECOVER_STATE]) + if (tsc->getSCE(SC_NORECOVER_STATE)) penalty = 100; if (penalty > 0) { hp -= hp * penalty / 100; @@ -9244,10 +9245,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui clif_skill_nodamage(NULL,bl,MG_SRECOVERY,sp,1); if (tsc) { #ifdef RENEWAL - if (tsc->data[SC_EXTREMITYFIST2]) + if (tsc->getSCE(SC_EXTREMITYFIST2)) sp = 0; #endif - if (tsc->data[SC_NORECOVER_STATE]) { + if (tsc->getSCE(SC_NORECOVER_STATE)) { hp = 0; sp = 0; } @@ -9314,7 +9315,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; // Outside PvP it should only affect party members and no skill fail message clif_skill_nodamage(src,bl,skill_id,skill_lv,1); if((dstsd && (dstsd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER) - || (tsc && tsc->data[SC_SPIRIT] && tsc->data[SC_SPIRIT]->val2 == SL_ROGUE) //Rogue's spirit defends againt dispel. + || (tsc && tsc->getSCE(SC_SPIRIT) && tsc->getSCE(SC_SPIRIT)->val2 == SL_ROGUE) //Rogue's spirit defends againt dispel. || rnd()%100 >= 50+10*skill_lv) { if (sd) @@ -9335,7 +9336,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui for (const auto &it : status_db) { sc_type status = static_cast(it.first); - if (!tsc->data[status]) + if (!tsc->getSCE(status)) continue; if (it.second->flag[SCF_NODISPELL]) @@ -9345,7 +9346,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SC_WHISTLE: case SC_ASSNCROS: case SC_POEMBRAGI: case SC_APPLEIDUN: case SC_HUMMING: case SC_DONTFORGETME: case SC_FORTUNE: case SC_SERVICE4U: - if (!battle_config.dispel_song || tsc->data[status]->val4 == 0) + if (!battle_config.dispel_song || tsc->getSCE(status)->val4 == 0) continue; //If in song area don't end it, even if config enabled break; case SC_ASSUMPTIO: @@ -9354,7 +9355,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; } if (i == SC_BERSERK || i == SC_SATURDAYNIGHTFEVER) - tsc->data[status]->val2 = 0; //Mark a dispelled berserk to avoid setting hp to 100 by setting hp penalty to 0. + tsc->getSCE(status)->val2 = 0; //Mark a dispelled berserk to avoid setting hp to 100 by setting hp penalty to 0. status_change_end(bl, status); } break; @@ -9433,9 +9434,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SA_SPELLBREAKER: { int sp; - if(tsc && tsc->data[SC_MAGICROD]) { + if(tsc && tsc->getSCE(SC_MAGICROD)) { sp = skill_get_sp(skill_id,skill_lv); - sp = sp * tsc->data[SC_MAGICROD]->val2 / 100; + sp = sp * tsc->getSCE(SC_MAGICROD)->val2 / 100; if(sp < 1) sp = 1; status_heal(bl,0,sp,2); status_percent_damage(bl, src, 0, -20, false); //20% max SP damage. @@ -9490,7 +9491,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if(skill_lv >= 10) { spellid = MG_FROSTDIVER; -// if (tsc && tsc->data[SC_SPIRIT] && tsc->data[SC_SPIRIT]->val2 == SA_SAGE) +// if (tsc && tsc->getSCE(SC_SPIRIT) && tsc->getSCE(SC_SPIRIT)->val2 == SA_SAGE) // maxlv = 10; // else maxlv = skill_lv - 9; @@ -9777,7 +9778,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (battle_check_undead(tstatus->race, tstatus->def_ele)) break; - if (tsc && tsc->data[SC_HELLPOWER]) + if (tsc && tsc->getSCE(SC_HELLPOWER)) break; if (map_getmapflag(bl->m, MF_PVP) && dstsd->pvp_point < 0) break; @@ -9981,10 +9982,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui #ifdef RENEWAL sp1 = sp1 / 2; sp2 = sp2 / 2; - if (tsc && tsc->data[SC_EXTREMITYFIST2]) + if (tsc && tsc->getSCE(SC_EXTREMITYFIST2)) sp1 = tstatus->sp; #endif - if (tsc && tsc->data[SC_NORECOVER_STATE]) + if (tsc && tsc->getSCE(SC_NORECOVER_STATE)) sp1 = tstatus->sp; status_set_sp(src, sp2, 3); status_set_sp(bl, sp1, 3); @@ -10010,15 +10011,15 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (tsc && tsc->count) { uint8 penalty = 0; - if (tsc->data[SC_WATER_INSIGNIA] && tsc->data[SC_WATER_INSIGNIA]->val1 == 2) { + if (tsc->getSCE(SC_WATER_INSIGNIA) && tsc->getSCE(SC_WATER_INSIGNIA)->val1 == 2) { hp += hp / 10; sp += sp / 10; } - if (tsc->data[SC_CRITICALWOUND]) - penalty += tsc->data[SC_CRITICALWOUND]->val2; - if (tsc->data[SC_DEATHHURT] && tsc->data[SC_DEATHHURT]->val3 == 1) + if (tsc->getSCE(SC_CRITICALWOUND)) + penalty += tsc->getSCE(SC_CRITICALWOUND)->val2; + if (tsc->getSCE(SC_DEATHHURT) && tsc->getSCE(SC_DEATHHURT)->val3 == 1) penalty += 20; - if (tsc->data[SC_NORECOVER_STATE]) + if (tsc->getSCE(SC_NORECOVER_STATE)) penalty = 100; if (penalty > 0) { hp -= hp * penalty / 100; @@ -10060,7 +10061,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui #ifndef RENEWAL case CG_LONGINGFREEDOM: { - if (tsc && !tsce && (tsce=tsc->data[SC_DANCING]) && tsce->val4 + if (tsc && !tsce && (tsce=tsc->getSCE(SC_DANCING)) && tsce->val4 && (tsce->val1&0xFFFF) != CG_MOONLIT) //Can't use Longing for Freedom while under Moonlight Petals. [Skotlex] { clif_skill_nodamage(src,bl,skill_id,skill_lv, @@ -10073,14 +10074,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case CG_TAROTCARD: { int card = -1; - if (tsc && tsc->data[SC_TAROTCARD]) { + if (tsc && tsc->getSCE(SC_TAROTCARD)) { //Target currently has the SUN tarot card effect and is immune to any other effect map_freeblock_unlock(); return 0; } if( rnd() % 100 > skill_lv * 8 || #ifndef RENEWAL - (tsc && tsc->data[SC_BASILICA]) || + (tsc && tsc->getSCE(SC_BASILICA)) || #endif (dstmd && ((dstmd->guardian_data && dstmd->mob_id == MOBID_EMPERIUM) || status_get_class_(bl) == CLASS_BATTLEFIELD)) ) { if( sd ) @@ -10143,7 +10144,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case SP_SOULREVOLVE: - if (!(tsc && (tsc->data[SC_SPIRIT] || tsc->data[SC_SOULGOLEM] || tsc->data[SC_SOULSHADOW] || tsc->data[SC_SOULFALCON] || tsc->data[SC_SOULFAIRY]))) { + if (!(tsc && (tsc->getSCE(SC_SPIRIT) || tsc->getSCE(SC_SOULGOLEM) || tsc->getSCE(SC_SOULSHADOW) || tsc->getSCE(SC_SOULFALCON) || tsc->getSCE(SC_SOULFAIRY)))) { if (sd) clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0); break; @@ -10580,9 +10581,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui short count = 1; skill_area_temp[2] = 0; map_foreachinrange(skill_area_sub,src,skill_get_splash(skill_id,skill_lv),BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|SD_PREAMBLE|SD_SPLASH|1,skill_castend_damage_id); - if( tsc && tsc->data[SC_ROLLINGCUTTER] ) + if( tsc && tsc->getSCE(SC_ROLLINGCUTTER) ) { // Every time the skill is casted the status change is reseted adding a counter. - count += (short)tsc->data[SC_ROLLINGCUTTER]->val1; + count += (short)tsc->getSCE(SC_ROLLINGCUTTER)->val1; if( count > 10 ) count = 10; // Max coounter status_change_end(bl, SC_ROLLINGCUTTER); @@ -10593,7 +10594,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case GC_WEAPONBLOCKING: - if( tsc && tsc->data[SC_WEAPONBLOCKING] ) + if( tsc && tsc->getSCE(SC_WEAPONBLOCKING) ) status_change_end(bl, SC_WEAPONBLOCKING); else sc_start(src,bl,SC_WEAPONBLOCKING,100,skill_lv,skill_get_time(skill_id,skill_lv)); @@ -10686,7 +10687,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case AB_CHEAL: if( !sd || sd->status.party_id == 0 || flag&1 ) { - if( sd && tstatus && !battle_check_undead(tstatus->race, tstatus->def_ele) && !tsc->data[SC_BERSERK] ) { + if( sd && tstatus && !battle_check_undead(tstatus->race, tstatus->def_ele) && !tsc->getSCE(SC_BERSERK) ) { int partycount = (sd->status.party_id ? party_foreachsamemap(party_sub_count, sd, 0) : 0); i = skill_calc_heal(src, bl, AL_HEAL, pc_checkskill(sd, AL_HEAL), true); @@ -10697,7 +10698,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui i = 0; // Should heal by 0 or won't do anything?? in iRO it breaks the healing to members.. [malufett] clif_skill_nodamage(src, bl, skill_id, i, 1); - if( tsc && tsc->data[SC_AKAITSUKI] && i ) + if( tsc && tsc->getSCE(SC_AKAITSUKI) && i ) i = ~i + 1; status_heal(bl, i, 0, 0); } @@ -10707,12 +10708,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case NPC_CHEAL: if( flag&1 ) { - if( tstatus && !battle_check_undead(tstatus->race, tstatus->def_ele) && !tsc->data[SC_BERSERK] ) { + if( tstatus && !battle_check_undead(tstatus->race, tstatus->def_ele) && !tsc->getSCE(SC_BERSERK) ) { i = skill_calc_heal(src, bl, AL_HEAL, 10, true); if (status_isimmune(bl)) i = 0; clif_skill_nodamage(src, bl, skill_id, i, 1); - if( tsc && tsc->data[SC_AKAITSUKI] && i ) + if( tsc && tsc->getSCE(SC_AKAITSUKI) && i ) i = ~i + 1; status_heal(bl, i, 0, 0); } @@ -10736,8 +10737,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case AB_LAUDAAGNUS: if( flag&1 || !sd || !sd->status.party_id ) { - if( tsc && (tsc->data[SC_FREEZE] || tsc->data[SC_STONE] || tsc->data[SC_BLIND] || - tsc->data[SC_BURNING] || tsc->data[SC_FREEZING] || tsc->data[SC_CRYSTALIZE])) { + if( tsc && (tsc->getSCE(SC_FREEZE) || tsc->getSCE(SC_STONE) || tsc->getSCE(SC_BLIND) || + tsc->getSCE(SC_BURNING) || tsc->getSCE(SC_FREEZING) || tsc->getSCE(SC_CRYSTALIZE))) { // Success Chance: (60 + 10 * Skill Level) % if( rnd()%100 > 60+10*skill_lv ) break; status_change_end(bl, SC_FREEZE); @@ -10756,7 +10757,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case AB_LAUDARAMUS: if( flag&1 || !sd || !sd->status.party_id ) { - if( tsc && (tsc->data[SC_SLEEP] || tsc->data[SC_STUN] || tsc->data[SC_MANDRAGORA] || tsc->data[SC_SILENCE] || tsc->data[SC_DEEPSLEEP]) ){ + if( tsc && (tsc->getSCE(SC_SLEEP) || tsc->getSCE(SC_STUN) || tsc->getSCE(SC_MANDRAGORA) || tsc->getSCE(SC_SILENCE) || tsc->getSCE(SC_DEEPSLEEP)) ){ // Success Chance: (60 + 10 * Skill Level) % if( rnd()%100 > 60+10*skill_lv ) break; status_change_end(bl, SC_SLEEP); @@ -10800,7 +10801,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui for (const auto &it : status_db) { sc_type status = static_cast(it.first); - if (!tsc->data[status]) + if (!tsc->getSCE(status)) continue; if (it.second->flag[SCF_NOCLEARANCE]) @@ -10810,7 +10811,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SC_WHISTLE: case SC_ASSNCROS: case SC_POEMBRAGI: case SC_APPLEIDUN: case SC_HUMMING: case SC_DONTFORGETME: case SC_FORTUNE: case SC_SERVICE4U: - if (!battle_config.dispel_song || tsc->data[status]->val4 == 0) + if (!battle_config.dispel_song || tsc->getSCE(status)->val4 == 0) continue; //If in song area don't end it, even if config enabled break; case SC_ASSUMPTIO: @@ -10819,7 +10820,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; } if (i == SC_BERSERK || i == SC_SATURDAYNIGHTFEVER) - tsc->data[status]->val2 = 0; //Mark a dispelled berserk to avoid setting hp to 100 by setting hp penalty to 0. + tsc->getSCE(status)->val2 = 0; //Mark a dispelled berserk to avoid setting hp to 100 by setting hp penalty to 0. status_change_end(bl,status); } break; @@ -10866,7 +10867,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if( sd ) skill_blockpc_start(sd,skill_id,4000); - if( !(tsc && tsc->data[type]) ){ + if( !(tsc && tsc->getSCE(type)) ){ i = sc_start2(src,bl,type,rate,skill_lv,src->id,(src == bl)?5000:(bl->type == BL_PC)?skill_get_time(skill_id,skill_lv):skill_get_time2(skill_id, skill_lv)); clif_skill_nodamage(src,bl,skill_id,skill_lv,i); if( !i ) @@ -10938,7 +10939,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sc_type sphere = SC_NONE; for (i = SC_SPHERE_1; i <= SC_SPHERE_5; i++) { - if (sc->data[i] == nullptr) { + if (sc->getSCE(i) == nullptr) { sphere = static_cast(i); // Take the free SC break; } @@ -11127,13 +11128,13 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SC_BODYPAINT: if( flag&1 ) { - if (tsc && ((tsc->option&(OPTION_HIDE|OPTION_CLOAK)) || tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_STEALTHFIELD])) { + if (tsc && ((tsc->option&(OPTION_HIDE|OPTION_CLOAK)) || tsc->getSCE(SC_CAMOUFLAGE) || tsc->getSCE(SC_STEALTHFIELD))) { status_change_end(bl,SC_HIDING); status_change_end(bl,SC_CLOAKING); status_change_end(bl,SC_CLOAKINGEXCEED); status_change_end(bl,SC_CAMOUFLAGE); status_change_end(bl,SC_NEWMOON); - if (tsc && tsc->data[SC__SHADOWFORM] && rnd() % 100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] % + if (tsc && tsc->getSCE(SC__SHADOWFORM) && rnd() % 100 < 100 - tsc->getSCE(SC__SHADOWFORM)->val1 * 10) // [100 - (Skill Level x 10)] % status_change_end(bl, SC__SHADOWFORM); } // Attack Speed decrease and Blind happen to everyone around caster, not just hidden targets. @@ -11151,7 +11152,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SC_LAZINESS: case SC_UNLUCKY: case SC_WEAKNESS: - if( !(tsc && tsc->data[type]) ) { + if( !(tsc && tsc->getSCE(type)) ) { int rate; if (status_get_class_(bl) == CLASS_BOSS) @@ -11165,7 +11166,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case SC_IGNORANCE: - if( !(tsc && tsc->data[type]) ) { + if( !(tsc && tsc->getSCE(type)) ) { int rate; if (status_get_class_(bl) == CLASS_BOSS) @@ -11196,7 +11197,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case LG_REFLECTDAMAGE: - if( tsc && tsc->data[type] ) + if( tsc && tsc->getSCE(type) ) status_change_end(bl,type); else sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)); @@ -11424,7 +11425,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case WM_UNLIMITED_HUMMING_VOICE: if( flag&1 ) { // These affect to to all party members near the caster. struct status_change *sc = status_get_sc(src); - if( sc && sc->data[type] ) { + if( sc && sc->getSCE(type) ) { sc_start2(src,bl,type,100,skill_lv,pc_checkskill(sd, WM_LESSON),skill_get_time(skill_id,skill_lv)); } } else if( sd ) { @@ -11701,7 +11702,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (rate < 10) rate = 10; - if (bl->type == BL_MOB || (tsc && tsc->data[type])) + if (bl->type == BL_MOB || (tsc && tsc->getSCE(type))) break; // Don't activate if target is a monster or zap SP if target already has Mandragora active. if (rnd()%100 < rate) { sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)); @@ -11814,7 +11815,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sc_type type2 = (sc_type)(type-1); struct status_change *sc = status_get_sc(&ele->bl); - if( (sc && sc->data[type2]) || (tsc && tsc->data[type]) ) { + if( (sc && sc->getSCE(type2)) || (tsc && tsc->getSCE(type)) ) { status_change_end(src,type); status_change_end(bl,type2); } else { @@ -11843,7 +11844,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sc_type type2 = (sc_type)(type-1); clif_skill_nodamage(src,src,skill_id,skill_lv,1); - if( (sc && sc->data[type2]) || (tsc && tsc->data[type]) ) { + if( (sc && sc->getSCE(type2)) || (tsc && tsc->getSCE(type)) ) { status_change_end(bl,type); status_change_end(src,type2); } else { @@ -11887,14 +11888,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case KO_KYOUGAKU: - if( dstsd && tsc && !tsc->data[type] && rnd()%100 < tstatus->int_/2 ){ + if( dstsd && tsc && !tsc->getSCE(type) && rnd()%100 < tstatus->int_/2 ){ clif_skill_nodamage(src,bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); }else if( sd ) clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); break; case KO_JYUSATSU: - if( dstsd && tsc && !tsc->data[type] && + if( dstsd && tsc && !tsc->getSCE(type) && rnd()%100 < ((45+5*skill_lv) + skill_lv*5 - status_get_int(bl)/2) ){//[(Base chance of success) + (Skill Level x 5) - (int / 2)]%. clif_skill_nodamage(src,bl,skill_id,skill_lv, status_change_start(src,bl,type,10000,skill_lv,0,0,0,skill_get_time(skill_id,skill_lv),SCSTART_NOAVOID|SCSTART_NOTICKDEF)); @@ -11957,13 +11958,13 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if( flag&1 ){ if (bl->type != BL_PC) break; - if (tsc && (tsc->option & (OPTION_CLOAK | OPTION_HIDE) || tsc->data[SC_CAMOUFLAGE] || tsc->data[SC__SHADOWFORM] || tsc->data[SC_MARIONETTE] || tsc->data[SC_HARMONIZE])) { + if (tsc && (tsc->option & (OPTION_CLOAK | OPTION_HIDE) || tsc->getSCE(SC_CAMOUFLAGE) || tsc->getSCE(SC__SHADOWFORM) || tsc->getSCE(SC_MARIONETTE) || tsc->getSCE(SC_HARMONIZE))) { status_change_end(bl, SC_HIDING); status_change_end(bl, SC_CLOAKING); status_change_end(bl, SC_CLOAKINGEXCEED); status_change_end(bl, SC_CAMOUFLAGE); status_change_end(bl, SC_NEWMOON); - if (tsc && tsc->data[SC__SHADOWFORM] && rnd() % 100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] % + if (tsc && tsc->getSCE(SC__SHADOWFORM) && rnd() % 100 < 100 - tsc->getSCE(SC__SHADOWFORM)->val1 * 10) // [100 - (Skill Level x 10)] % status_change_end(bl, SC__SHADOWFORM); status_change_end(bl, SC_MARIONETTE); status_change_end(bl, SC_HARMONIZE); @@ -11997,7 +11998,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui SC_MANDRAGORA, SC_HARMONIZE, SC_DEEPSLEEP, SC_VOICEOFSIREN, SC_SLEEP, SC_CONFUSION, SC_HALLUCINATION }; for (i = 0; i < ARRAYLENGTH(scs); i++) - if (tsc->data[scs[i]]) status_change_end(bl, scs[i]); + if (tsc->getSCE(scs[i])) status_change_end(bl, scs[i]); } if (hd) skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv)); @@ -12030,10 +12031,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case MH_STYLE_CHANGE: if(hd){ struct status_change_entry *sce; - if((sce=hd->sc.data[SC_STYLE_CHANGE])!=NULL){ //in preparation for other bl usage + if((sce=hd->sc.getSCE(SC_STYLE_CHANGE))!=NULL){ //in preparation for other bl usage if(sce->val1 == MH_MD_FIGHTING) sce->val1 = MH_MD_GRAPPLING; else sce->val1 = MH_MD_FIGHTING; - //if(hd->master && hd->sc.data[SC_STYLE_CHANGE]) { // Aegis does not show any message when switching fighting style + //if(hd->master && hd->sc.getSCE(SC_STYLE_CHANGE)) { // Aegis does not show any message when switching fighting style // char output[128]; // safesnprintf(output,sizeof(output),msg_txt(sd,378),(sce->val1==MH_MD_FIGHTING?"fighthing":"grappling")); // clif_messagecolor(&hd->master->bl, color_table[COLOR_RED], output, false, SELF); @@ -12192,7 +12193,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui clif_skill_fail(sd, skill_id, USESKILL_FAIL_TOTARGET, 0); break; } - if (tsc && tsc->count && tsc->data[type]) // Refresh the status only if it's already active. + if (tsc && tsc->count && tsc->getSCE(type)) // Refresh the status only if it's already active. sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); else { sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); @@ -12553,7 +12554,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (skill_id != SR_CURSEDCIRCLE && skill_id != NPC_SR_CURSEDCIRCLE) { struct status_change *sc = status_get_sc(src); - if (sc && sc->data[SC_CURSEDCIRCLE_ATKER]) // Should only remove after the skill had been casted. + if (sc && sc->getSCE(SC_CURSEDCIRCLE_ATKER)) // Should only remove after the skill had been casted. status_change_end(src,SC_CURSEDCIRCLE_ATKER); } @@ -12629,7 +12630,7 @@ static int8 skill_castend_id_check(struct block_list *src, struct block_list *ta case MER_LEXDIVINA: { //If it's not an enemy, and not silenced, you can't use the skill on them. [Skotlex] - if (battle_check_target(src,target, BCT_ENEMY) <= 0 && (!tsc || !tsc->data[SC_SILENCE])) + if (battle_check_target(src,target, BCT_ENEMY) <= 0 && (!tsc || !tsc->getSCE(SC_SILENCE))) return USESKILL_FAIL_LEVEL; else return -1; //Works on silenced allies @@ -12659,13 +12660,13 @@ static int8 skill_castend_id_check(struct block_list *src, struct block_list *ta case IQ_SECOND_FLAME: case IQ_SECOND_FAITH: case IQ_SECOND_JUDGEMENT: - if (!tsc || !(tsc->data[SC_FIRST_BRAND] || tsc->data[SC_SECOND_BRAND])) + if (!tsc || !(tsc->getSCE(SC_FIRST_BRAND) || tsc->getSCE(SC_SECOND_BRAND))) return USESKILL_FAIL_LEVEL; break; case IQ_THIRD_PUNISH: case IQ_THIRD_FLAME_BOMB: case IQ_THIRD_CONSECRATION: - if (!tsc || !tsc->data[SC_SECOND_BRAND]) + if (!tsc || !tsc->getSCE(SC_SECOND_BRAND)) return USESKILL_FAIL_LEVEL; break; } @@ -12712,7 +12713,7 @@ static int8 skill_castend_id_check(struct block_list *src, struct block_list *ta // Fogwall makes all offensive-type targetted skills fail at 75% // Jump Kick can still fail even though you can jump to friendly targets. - if ((inf&BCT_ENEMY || skill_id == TK_JUMPKICK) && tsc && tsc->data[SC_FOGWALL] && rnd() % 100 < 75) + if ((inf&BCT_ENEMY || skill_id == TK_JUMPKICK) && tsc && tsc->getSCE(SC_FOGWALL) && rnd() % 100 < 75) return USESKILL_FAIL_LEVEL; return -1; @@ -12971,8 +12972,8 @@ TIMER_FUNC(skill_castend_id){ else type = SC_STRIPSHIELD; - if ((sc = status_get_sc(src)) && sc->data[type]) { - const struct TimerData* timer = get_timer(sc->data[type]->timer); + if ((sc = status_get_sc(src)) && sc->getSCE(type)) { + const struct TimerData* timer = get_timer(sc->getSCE(type)->timer); if (timer && timer->func == status_change_timer && DIFF_TICK(timer->tick, gettick() + skill_get_time(ud->skill_id, ud->skill_lv)) > 0) break; @@ -13005,13 +13006,13 @@ TIMER_FUNC(skill_castend_id){ if (ud->skill_id != RA_CAMOUFLAGE) status_change_end(src, SC_CAMOUFLAGE); // Applies to the first skill if active - if(sc->data[SC_SPIRIT] && - sc->data[SC_SPIRIT]->val2 == SL_WIZARD && - sc->data[SC_SPIRIT]->val3 == ud->skill_id && + if(sc->getSCE(SC_SPIRIT) && + sc->getSCE(SC_SPIRIT)->val2 == SL_WIZARD && + sc->getSCE(SC_SPIRIT)->val3 == ud->skill_id && ud->skill_id != WZ_WATERBALL) - sc->data[SC_SPIRIT]->val3 = 0; //Clear bounced spell check. + sc->getSCE(SC_SPIRIT)->val3 = 0; //Clear bounced spell check. #ifndef RENEWAL - if( sc->data[SC_DANCING] && sd && skill_get_inf2(ud->skill_id, INF2_ISSONG) ) + if( sc->getSCE(SC_DANCING) && sd && skill_get_inf2(ud->skill_id, INF2_ISSONG) ) skill_blockpc_start(sd,BD_ADAPTATION,3000); #endif } @@ -13029,7 +13030,7 @@ TIMER_FUNC(skill_castend_id){ } while(0); //Skill failed. - if (ud->skill_id == MO_EXTREMITYFIST && sd && !(sc && sc->data[SC_FOGWALL])) + if (ud->skill_id == MO_EXTREMITYFIST && sd && !(sc && sc->getSCE(SC_FOGWALL))) { //When Asura fails... (except when it fails from Wall of Fog) //Consume SP/spheres skill_consume_requirement(sd,ud->skill_id, ud->skill_lv,1); @@ -13262,7 +13263,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui sc = status_get_sc(src); type = skill_get_sc(skill_id); - sce = (sc && type != SC_NONE)?sc->data[type]:NULL; + sce = (sc && type != SC_NONE)?sc->getSCE(type):NULL; switch (skill_id) { //Skill effect. case WZ_METEOR: @@ -13504,7 +13505,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui break; #ifndef RENEWAL case HP_BASILICA: - if( sc->data[SC_BASILICA] ) { + if( sc->getSCE(SC_BASILICA) ) { status_change_end(src, SC_BASILICA); // Cancel Basilica and return so requirement isn't consumed again return 0; } else { // Create Basilica. Start SC on caster. Unit timer start SC on others. @@ -13582,7 +13583,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui (skill_lv >= 4) ? sd->status.memo_point[2].map : 0 ); } - if( sc && sc->data[SC_CURSEDCIRCLE_ATKER] ) //Should only remove after the skill has been casted. + if( sc && sc->getSCE(SC_CURSEDCIRCLE_ATKER) ) //Should only remove after the skill has been casted. status_change_end(src,SC_CURSEDCIRCLE_ATKER); return 0; // not to consume item. @@ -13820,7 +13821,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui break; case GC_POISONSMOKE: - if( !(sc && sc->data[SC_POISONINGWEAPON]) ) { + if( !(sc && sc->getSCE(SC_POISONINGWEAPON)) ) { if( sd ) clif_skill_fail(sd,skill_id,USESKILL_FAIL_GC_POISONINGWEAPON,0); return 0; @@ -13862,7 +13863,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui case NC_NEUTRALBARRIER: case NC_STEALTHFIELD: - if( (sc->data[SC_NEUTRALBARRIER_MASTER] && skill_id == NC_NEUTRALBARRIER) || (sc->data[SC_STEALTHFIELD_MASTER] && skill_id == NC_STEALTHFIELD) ) { + if( (sc->getSCE(SC_NEUTRALBARRIER_MASTER) && skill_id == NC_NEUTRALBARRIER) || (sc->getSCE(SC_STEALTHFIELD_MASTER) && skill_id == NC_STEALTHFIELD) ) { skill_clear_unitgroup(src); return 0; } @@ -13914,7 +13915,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui break; case LG_BANDING: - if( sc && sc->data[SC_BANDING] ) + if( sc && sc->getSCE(SC_BANDING) ) status_change_end(src,SC_BANDING); else if( (sg = skill_unitsetting(src,skill_id,skill_lv,src->x,src->y,0)) != NULL ) sc_start4(src,src,SC_BANDING,100,skill_lv,0,0,sg->group_id,skill_get_time(skill_id,skill_lv)); @@ -14002,7 +14003,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui case SO_ELECTRICWALK: case NPC_FIREWALK: case NPC_ELECTRICWALK: - if( sc && sc->data[type] ) + if( sc && sc->getSCE(type) ) status_change_end(src,type); sc_start2(src, src, type, 100, skill_id, skill_lv, skill_get_time(skill_id, skill_lv)); break; @@ -14107,8 +14108,8 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui // Grab Climax's effect level if active. // This affects the behavior of certain skills in certain ways. - if (sc && sc->data[SC_CLIMAX]) - climax_lv = sc->data[SC_CLIMAX]->val1; + if (sc && sc->getSCE(SC_CLIMAX)) + climax_lv = sc->getSCE(SC_CLIMAX)->val1; if (skill_id == AG_VIOLENT_QUAKE) { sub_skill = AG_VIOLENT_QUAKE_ATK; @@ -14155,7 +14156,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui return 1; } - if( sc && sc->data[SC_CURSEDCIRCLE_ATKER] ) //Should only remove after the skill has been casted. + if( sc && sc->getSCE(SC_CURSEDCIRCLE_ATKER) ) //Should only remove after the skill has been casted. status_change_end(src,SC_CURSEDCIRCLE_ATKER); if( sd ) @@ -14456,7 +14457,7 @@ std::shared_ptr skill_unitsetting(struct block_list *src, ui #endif break; case MG_FIREWALL: - if(sc && sc->data[SC_VIOLENTGALE]) + if(sc && sc->getSCE(SC_VIOLENTGALE)) limit = limit*3/2; val2 = 4+skill_lv; break; @@ -14672,8 +14673,8 @@ std::shared_ptr skill_unitsetting(struct block_list *src, ui val1 = status_get_attack_sc_element(src,sc); else if (ele == ELE_WEAPON) { val1 = status->rhw.ele; - if (sc && sc->data[SC_ENCHANTARMS]) - val1 = sc->data[SC_ENCHANTARMS]->val1; + if (sc && sc->getSCE(SC_ENCHANTARMS)) + val1 = sc->getSCE(SC_ENCHANTARMS)->val1; } switch (val1) { @@ -14695,10 +14696,10 @@ std::shared_ptr skill_unitsetting(struct block_list *src, ui break; } case GC_POISONSMOKE: - if( !(sc && sc->data[SC_POISONINGWEAPON]) ) + if( !(sc && sc->getSCE(SC_POISONINGWEAPON)) ) return nullptr; - val2 = sc->data[SC_POISONINGWEAPON]->val2; // Type of Poison - val3 = sc->data[SC_POISONINGWEAPON]->val1; + val2 = sc->getSCE(SC_POISONINGWEAPON)->val2; // Type of Poison + val3 = sc->getSCE(SC_POISONINGWEAPON)->val1; limit = skill_get_time(skill_id, skill_lv); break; case NPC_COMET: @@ -14766,8 +14767,8 @@ std::shared_ptr skill_unitsetting(struct block_list *src, ui break; #ifndef RENEWAL case HW_GRAVITATION: - if(sc && sc->data[SC_GRAVITATION] && sc->data[SC_GRAVITATION]->val3 == BCT_SELF) - link_group_id = sc->data[SC_GRAVITATION]->val4; + if(sc && sc->getSCE(SC_GRAVITATION) && sc->getSCE(SC_GRAVITATION)->val3 == BCT_SELF) + link_group_id = sc->getSCE(SC_GRAVITATION)->val4; break; #endif case SO_VACUUM_EXTREME: @@ -14786,10 +14787,10 @@ std::shared_ptr skill_unitsetting(struct block_list *src, ui break; case AG_VIOLENT_QUAKE: case AG_ALL_BLOOM: - if (sc && sc->data[SC_CLIMAX]) { - if (skill_id == AG_ALL_BLOOM && sc->data[SC_CLIMAX]->val1 == 1) + if (sc && sc->getSCE(SC_CLIMAX)) { + if (skill_id == AG_ALL_BLOOM && sc->getSCE(SC_CLIMAX)->val1 == 1) limit /= 2; // Rose buds spawn at double the speed, so rose garden duration must be halved. - else if (sc->data[SC_CLIMAX]->val1 == 4) + else if (sc->getSCE(SC_CLIMAX)->val1 == 4) limit = 3000; // Show main AoE for fixed duration on status giving effect. } break; @@ -14798,7 +14799,7 @@ std::shared_ptr skill_unitsetting(struct block_list *src, ui case AG_ALL_BLOOM_ATK2: limit = flag; flag = 0; - if (skill_id == AG_VIOLENT_QUAKE_ATK && sc && sc->data[SC_CLIMAX] && sc->data[SC_CLIMAX]->val1 == 2) + if (skill_id == AG_VIOLENT_QUAKE_ATK && sc && sc->getSCE(SC_CLIMAX) && sc->getSCE(SC_CLIMAX)->val1 == 2) range = 4; // Rising rocks splash is increased to 9x9. break; case WH_DEEPBLINDTRAP: @@ -15040,14 +15041,14 @@ static int skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, t_ if (sc && sc->option&OPTION_HIDE && !skill->inf2[INF2_TARGETHIDDEN]) return 0; //Hidden characters are immune to AoE skills except to these. [Skotlex] - if (sc && sc->data[SC_VACUUM_EXTREME] && map_getcell(bl->m, bl->x, bl->y, CELL_CHKLANDPROTECTOR)) + if (sc && sc->getSCE(SC_VACUUM_EXTREME) && map_getcell(bl->m, bl->x, bl->y, CELL_CHKLANDPROTECTOR)) status_change_end(bl, SC_VACUUM_EXTREME); - if (sc && sc->data[SC_HOVERING] && skill->inf2[INF2_IGNOREHOVERING]) + if (sc && sc->getSCE(SC_HOVERING) && skill->inf2[INF2_IGNOREHOVERING]) return 0; // Under Hovering characters are immune to select trap and ground target skills. type = skill_get_sc(sg->skill_id); - sce = (sc && type != SC_NONE) ? sc->data[type] : NULL; + sce = (sc && type != SC_NONE) ? sc->getSCE(type) : NULL; skill_id = sg->skill_id; //In case the group is deleted, we need to return the correct skill id, still. switch (sg->unit_id) { case UNT_SPIDERWEB: @@ -15060,32 +15061,32 @@ static int skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, t_ if (mapdata_flag_vs(mapdata)) sec /= 2; - if (sc->data[type]) { - if (sc->data[type]->val2 && sc->data[type]->val3 && sc->data[type]->val4) { + if (sc->getSCE(type)) { + if (sc->getSCE(type)->val2 && sc->getSCE(type)->val3 && sc->getSCE(type)->val4) { //Already triple affected, immune sg->limit = DIFF_TICK(tick, sg->tick); break; } //Don't increase val1 here, we need a higher val in status_change_start so it overwrites the old one - if (mapdata_flag_vs(mapdata) && sc->data[type]->val1 < 3) - sec *= (sc->data[type]->val1 + 1); - else if(!mapdata_flag_vs(mapdata) && sc->data[type]->val1 < 2) - sec *= (sc->data[type]->val1 + 1); + if (mapdata_flag_vs(mapdata) && sc->getSCE(type)->val1 < 3) + sec *= (sc->getSCE(type)->val1 + 1); + else if(!mapdata_flag_vs(mapdata) && sc->getSCE(type)->val1 < 2) + sec *= (sc->getSCE(type)->val1 + 1); //Add group id to status change - if (sc->data[type]->val2 == 0) - sc->data[type]->val2 = sg->group_id; - else if (sc->data[type]->val3 == 0) - sc->data[type]->val3 = sg->group_id; - else if (sc->data[type]->val4 == 0) - sc->data[type]->val4 = sg->group_id; + if (sc->getSCE(type)->val2 == 0) + sc->getSCE(type)->val2 = sg->group_id; + else if (sc->getSCE(type)->val3 == 0) + sc->getSCE(type)->val3 = sg->group_id; + else if (sc->getSCE(type)->val4 == 0) + sc->getSCE(type)->val4 = sg->group_id; //Overwrite status change with new duration - if ((td = get_timer(sc->data[type]->timer))!=NULL) - status_change_start(ss, bl, type, 10000, sc->data[type]->val1 + 1, sc->data[type]->val2, sc->data[type]->val3, sc->data[type]->val4, + if ((td = get_timer(sc->getSCE(type)->timer))!=NULL) + status_change_start(ss, bl, type, 10000, sc->getSCE(type)->val1 + 1, sc->getSCE(type)->val2, sc->getSCE(type)->val3, sc->getSCE(type)->val4, i64max(DIFF_TICK(td->tick, tick), sec), SCSTART_NORATEDEF); } else { if (status_change_start(ss, bl, type, 10000, 1, sg->group_id, 0, 0, sec, SCSTART_NORATEDEF)) { - td = sc->data[type] ? get_timer(sc->data[type]->timer) : NULL; + td = sc->getSCE(type) ? get_timer(sc->getSCE(type)->timer) : NULL; if (td) sec = DIFF_TICK(td->tick, tick); map_moveblock(bl, unit->bl.x, unit->bl.y, tick); @@ -15196,7 +15197,7 @@ static int skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, t_ case UNT_INTOABYSS: case UNT_SIEGFRIED: //Needed to check when a dancer/bard leaves their ensemble area. - if (sg->src_id==bl->id && !(sc && sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_BARDDANCER)) + if (sg->src_id==bl->id && !(sc && sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_BARDDANCER)) return skill_id; if (!sce) sc_start4(ss, bl,type,100,sg->skill_lv,sg->val1,sg->val2,0,sg->limit); @@ -15209,7 +15210,7 @@ static int skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, t_ case UNT_DONTFORGETME: case UNT_FORTUNEKISS: case UNT_SERVICEFORYOU: - if (sg->src_id==bl->id && !(sc && sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_BARDDANCER)) + if (sg->src_id==bl->id && !(sc && sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_BARDDANCER)) return 0; if (!sc) return 0; @@ -15253,7 +15254,7 @@ static int skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, t_ case UNT_MOONLIT: //Knockback out of area if affected char isn't in Moonlit effect - if (sc && sc->data[SC_DANCING] && (sc->data[SC_DANCING]->val1&0xFFFF) == CG_MOONLIT) + if (sc && sc->getSCE(SC_DANCING) && (sc->getSCE(SC_DANCING)->val1&0xFFFF) == CG_MOONLIT) break; if (ss == bl) //Also needed to prevent infinite loop crash. break; @@ -15380,10 +15381,10 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t std::bitset inf2 = skill_db.find(skill_id)->inf2; - if (sc && sc->data[SC_VOICEOFSIREN] && sc->data[SC_VOICEOFSIREN]->val2 == bl->id && inf2[INF2_ISTRAP]) + if (sc && sc->getSCE(SC_VOICEOFSIREN) && sc->getSCE(SC_VOICEOFSIREN)->val2 == bl->id && inf2[INF2_ISTRAP]) return 0; // Traps cannot be activated by the Maestro or Wanderer that enticed the trapper with this skill. - if (tsc && tsc->data[SC_HOVERING] && inf2[INF2_IGNOREHOVERING]) + if (tsc && tsc->getSCE(SC_HOVERING) && inf2[INF2_IGNOREHOVERING]) return 0; // Under Hovering characters are immune to trap and ground target skills. if (sg->interval == -1) { @@ -15549,7 +15550,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t if( status_isimmune(bl) ) heal = 0; clif_skill_nodamage(&unit->bl, bl, AL_HEAL, heal, 1); - if( tsc && tsc->data[SC_AKAITSUKI] && heal ) + if( tsc && tsc->getSCE(SC_AKAITSUKI) && heal ) heal = ~heal + 1; status_heal(bl, heal, 0, 0); } @@ -15604,7 +15605,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t t_tick sec = skill_get_time2(sg->skill_id,sg->skill_lv); if( status_change_start(ss, bl,type,10000,sg->skill_lv,sg->group_id,0,0,sec, SCSTART_NORATEDEF) ) { - const struct TimerData* td = tsc->data[type]?get_timer(tsc->data[type]->timer):NULL; + const struct TimerData* td = tsc->getSCE(type)?get_timer(tsc->getSCE(type)->timer):NULL; if( td ) sec = DIFF_TICK(td->tick, tick); @@ -15649,7 +15650,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t break; case UNT_VENOMDUST: - if(tsc && !tsc->data[type]) + if(tsc && !tsc->getSCE(type)) status_change_start(ss,bl,type,10000,sg->skill_lv,sg->src_id,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),SCSTART_NONE); break; @@ -15679,7 +15680,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t case UNT_CLAYMORETRAP: { int bl_flag = sg->bl_flag; - if (tsc && tsc->data[SC__MANHOLE]) + if (tsc && tsc->getSCE(SC__MANHOLE)) break; if (sg->unit_id == UNT_FIRINGTRAP || sg->unit_id == UNT_ICEBOUNDTRAP || sg->unit_id == UNT_CLAYMORETRAP) bl_flag = bl_flag|BL_SKILL|~BCT_SELF; @@ -15728,10 +15729,10 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t if (md && md->mob_id == MOBID_EMPERIUM) break; #endif - if (sg->src_id == bl->id && !(tsc && tsc->data[SC_SPIRIT] && tsc->data[SC_SPIRIT]->val2 == SL_BARDDANCER)) + if (sg->src_id == bl->id && !(tsc && tsc->getSCE(SC_SPIRIT) && tsc->getSCE(SC_SPIRIT)->val2 == SL_BARDDANCER)) break; // affects self only when soullinked heal = skill_calc_heal(ss,bl,sg->skill_id, sg->skill_lv, true); - if (tsc->data[SC_AKAITSUKI] && heal) + if (tsc->getSCE(SC_AKAITSUKI) && heal) heal = ~heal + 1; clif_skill_nodamage(&unit->bl, bl, AL_HEAL, heal, 1); status_heal(bl, heal, 0, 0); @@ -15853,7 +15854,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t skill_blown(&unit->bl, bl, skill_get_blewcount(skill_id, sg->skill_lv), unit_getdir(bl), BLOWN_NONE); break; } - if (i <= 0 && (!tsc || !tsc->data[SC_BASILICA])) + if (i <= 0 && (!tsc || !tsc->getSCE(SC_BASILICA))) sc_start4(ss, bl, type, 100, 0, 0, sg->group_id, ss->id, sg->limit); } break; @@ -15873,7 +15874,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t break; case UNT_POISONSMOKE: - if( battle_check_target(ss,bl,BCT_ENEMY) > 0 && !(tsc && tsc->data[sg->val2]) && rnd()%100 < 50 ) + if( battle_check_target(ss,bl,BCT_ENEMY) > 0 && !(tsc && tsc->getSCE(sg->val2)) && rnd()%100 < 50 ) sc_start4(ss,bl,(sc_type)sg->val2,100,sg->val3,0,1,0,skill_get_time2(GC_POISONINGWEAPON, 1)); break; @@ -15894,7 +15895,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t clif_skill_nodamage(&unit->bl, bl, AL_HEAL, hp, 1); if (tstatus->sp < tstatus->max_sp) clif_skill_nodamage(&unit->bl, bl, MG_SRECOVERY, sp, 1); - if (tsc && tsc->data[SC_AKAITSUKI] && hp) + if (tsc && tsc->getSCE(SC_AKAITSUKI) && hp) hp = ~hp + 1; status_heal(bl, hp, sp, 3); } @@ -15905,7 +15906,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t status_change_end(bl,SC_CLOAKINGEXCEED); status_change_end(bl,SC_CAMOUFLAGE); status_change_end(bl,SC_NEWMOON); - if (tsc && tsc->data[SC__SHADOWFORM] && rnd() % 100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] % + if (tsc && tsc->getSCE(SC__SHADOWFORM) && rnd() % 100 < 100 - tsc->getSCE(SC__SHADOWFORM)->val1 * 10) // [100 - (Skill Level x 10)] % status_change_end(bl, SC__SHADOWFORM); } sc_start(ss, bl, type, 100, sg->skill_lv, sg->interval + 100); @@ -15935,7 +15936,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t break; case UNT_NETHERWORLD: if (!status_bl_has_mode(bl,MD_STATUSIMMUNE) || (!map_flag_gvg2(ss->m) && battle_check_target(&unit->bl,bl,BCT_PARTY) < 0)) { - if (!(tsc && tsc->data[type])) { + if (!(tsc && tsc->getSCE(type))) { sc_start(ss, bl, type, 100, sg->skill_lv, skill_get_time2(sg->skill_id,sg->skill_lv)); sg->limit = DIFF_TICK(tick,sg->tick); sg->unit_id = UNT_USED_TRAPS; @@ -15947,7 +15948,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t if( !sg->val2 ) { t_tick sec = skill_get_time2(sg->skill_id, sg->skill_lv); if( sc_start(ss, bl, type, 100, sg->skill_lv, sec) ) { - const struct TimerData* td = tsc->data[type]?get_timer(tsc->data[type]->timer):NULL; + const struct TimerData* td = tsc->getSCE(type)?get_timer(tsc->getSCE(type)->timer):NULL; if( td ) sec = DIFF_TICK(td->tick, tick); ///map_moveblock(bl, src->bl.x, src->bl.y, tick); // in official server it doesn't behave like this. [malufett] @@ -15956,7 +15957,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t } else sec = 3000; // Couldn't trap it? sg->limit = DIFF_TICK(tick, sg->tick) + sec; - } else if( tsc->data[SC_THORNSTRAP] && bl->id == sg->val2 ) + } else if( tsc->getSCE(SC_THORNSTRAP) && bl->id == sg->val2 ) skill_attack(skill_get_type(GN_THORNS_TRAP), ss, ss, bl, sg->skill_id, sg->skill_lv, tick, SD_LEVEL|SD_ANIMATION); } break; @@ -15987,14 +15988,14 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t break; case UNT_CLOUD_KILL: - if (tsc && !tsc->data[type]) + if (tsc && !tsc->getSCE(type)) status_change_start(ss, bl, type, 10000, sg->skill_lv, ss->id, 0, 0, skill_get_time(sg->skill_id, sg->skill_lv), SCSTART_NOTICKDEF); skill_attack(skill_get_type(sg->skill_id), ss, &unit->bl, bl, sg->skill_id, sg->skill_lv, tick, 0); break; case UNT_VACUUM_EXTREME: - if (tsc && (tsc->data[SC_HALLUCINATIONWALK] || tsc->data[SC_NPC_HALLUCINATIONWALK] || tsc->data[SC_HOVERING] || tsc->data[SC_VACUUM_EXTREME] || - (tsc->data[SC_VACUUM_EXTREME_POSTDELAY] && tsc->data[SC_VACUUM_EXTREME_POSTDELAY]->val2 == sg->group_id))) // Ignore post delay from other vacuum (this will make stack effect enabled) + if (tsc && (tsc->getSCE(SC_HALLUCINATIONWALK) || tsc->getSCE(SC_NPC_HALLUCINATIONWALK) || tsc->getSCE(SC_HOVERING) || tsc->getSCE(SC_VACUUM_EXTREME) || + (tsc->getSCE(SC_VACUUM_EXTREME_POSTDELAY) && tsc->getSCE(SC_VACUUM_EXTREME_POSTDELAY)->val2 == sg->group_id))) // Ignore post delay from other vacuum (this will make stack effect enabled) return 0; // Apply effect and suck targets one-by-one each n seconds @@ -16002,7 +16003,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t break; case UNT_BANDING: - if( battle_check_target(&unit->bl, bl, BCT_ENEMY) > 0 && !(tsc && tsc->data[SC_BANDING_DEFENCE]) ) + if( battle_check_target(&unit->bl, bl, BCT_ENEMY) > 0 && !(tsc && tsc->getSCE(SC_BANDING_DEFENCE)) ) sc_start(ss, bl, SC_BANDING_DEFENCE, (status_get_lv(&unit->bl) / 5) + (sg->skill_lv * 5) - (status_get_agi(bl) / 10), 90, skill_get_time2(sg->skill_id, sg->skill_lv)); break; @@ -16064,13 +16065,13 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t break; case UNT_CHAOSPANIC: - if (tsc && tsc->data[type]) + if (tsc && tsc->getSCE(type)) break; status_change_start(ss, bl, type, 3500 + (sg->skill_lv * 1500), sg->skill_lv, 0, 0, 1, skill_get_time2(sg->skill_id, sg->skill_lv), SCSTART_NOAVOID|SCSTART_NORATEDEF|SCSTART_NOTICKDEF); break; case UNT_B_TRAP: - if (tsc && tsc->data[type]) + if (tsc && tsc->getSCE(type)) break; sc_start(ss, bl, type, 100, sg->skill_lv, skill_get_time2(sg->skill_id,sg->skill_lv)); unit->val2++; // Mark as ever been used @@ -16150,7 +16151,7 @@ int skill_unit_onout(struct skill_unit *src, struct block_list *bl, t_tick tick) sc = status_get_sc(bl); type = skill_get_sc(sg->skill_id); - sce = (sc && type != SC_NONE)?sc->data[type]:NULL; + sce = (sc && type != SC_NONE)?sc->getSCE(type):NULL; if (bl->prev == NULL || (status_isdead(bl) && sg->unit_id != UNT_ANKLESNARE)) //Need to delete the trap if the source died. return 0; @@ -16181,7 +16182,7 @@ int skill_unit_onout(struct skill_unit *src, struct block_list *bl, t_tick tick) for(uint16 i = BA_WHISTLE; i <= DC_SERVICEFORYOU; i++) { if(skill_get_inf2(i, INF2_ISSONG)) { type = skill_get_sc(i); - sce = (sc && type != SC_NONE)?sc->data[type]:NULL; + sce = (sc && type != SC_NONE)?sc->getSCE(type):NULL; if(sce) return i; } @@ -16195,7 +16196,7 @@ int skill_unit_onout(struct skill_unit *src, struct block_list *bl, t_tick tick) case UNT_DONTFORGETME: case UNT_FORTUNEKISS: case UNT_SERVICEFORYOU: - if (sg->src_id==bl->id && !(sc && sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_BARDDANCER)) + if (sg->src_id==bl->id && !(sc && sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_BARDDANCER)) return -1; } return sg->skill_id; @@ -16218,7 +16219,7 @@ int skill_unit_onleft(uint16 skill_id, struct block_list *bl, t_tick tick) sc = NULL; type = skill_get_sc(skill_id); - sce = (sc && type != SC_NONE)?sc->data[type]:NULL; + sce = (sc && type != SC_NONE)?sc->getSCE(type):NULL; switch (skill_id) { @@ -16237,7 +16238,7 @@ int skill_unit_onleft(uint16 skill_id, struct block_list *bl, t_tick tick) case BD_ROKISWEIL: case BD_INTOABYSS: case BD_SIEGFRIED: - if(sc && sc->data[SC_DANCING] && (sc->data[SC_DANCING]->val1&0xFFFF) == skill_id) + if(sc && sc->getSCE(SC_DANCING) && (sc->getSCE(SC_DANCING)->val1&0xFFFF) == skill_id) { //Check if you just stepped out of your ensemble skill to cancel dancing. [Skotlex] //We don't check for SC_LONGING because someone could always have knocked you back and out of the song/dance. //FIXME: This code is not perfect, it doesn't checks for the real ensemble's owner, @@ -16284,7 +16285,7 @@ int skill_unit_onleft(uint16 skill_id, struct block_list *bl, t_tick tick) for(uint16 i = BA_WHISTLE; i <= DC_SERVICEFORYOU; i++){ if(skill_get_inf2(i, INF2_ISSONG)){ type = skill_get_sc(i); - sce = (sc && type != SC_NONE)?sc->data[type]:NULL; + sce = (sc && type != SC_NONE)?sc->getSCE(type):NULL; if(sce && !sce->val4){ //We don't want dissonance updating this anymore delete_timer(sce->timer, status_change_timer); sce->val4 = 1; //Store the fact that this is a "reduced" duration effect. @@ -16315,7 +16316,7 @@ int skill_unit_onleft(uint16 skill_id, struct block_list *bl, t_tick tick) if (sce) { status_change_end(bl, type); - if ((sce=sc->data[SC_BLIND])) + if ((sce=sc->getSCE(SC_BLIND))) { if (bl->type == BL_PC) //Players get blind ended inmediately, others have it still for 30 secs. [Skotlex] status_change_end(bl, SC_BLIND); @@ -16522,7 +16523,7 @@ int skill_check_condition_char_sub (struct block_list *bl, va_list ap) (tsd->weapontype1==W_MUSICAL || tsd->weapontype1==W_WHIP) && sd->status.party_id && tsd->status.party_id && sd->status.party_id == tsd->status.party_id && - !tsd->sc.data[SC_DANCING]) + !tsd->sc.getSCE(SC_DANCING)) { p_sd[(*c)++]=tsd->bl.id; return skill_lv; @@ -16577,9 +16578,9 @@ int skill_check_pc_partner(struct map_session_data *sd, uint16 skill_id, uint16 if( is_chorus ) break;//Chorus skills are not to be parsed as ensembles if (skill_get_inf2(skill_id, INF2_ISENSEMBLE)) { - if (c > 0 && sd->sc.data[SC_DANCING] && (tsd = map_id2sd(p_sd[0])) != NULL) { - sd->sc.data[SC_DANCING]->val4 = tsd->bl.id; - sc_start4(&sd->bl,&tsd->bl,SC_DANCING,100,skill_id,sd->sc.data[SC_DANCING]->val2,*skill_lv,sd->bl.id,skill_get_time(skill_id,*skill_lv)+1000); + if (c > 0 && sd->sc.getSCE(SC_DANCING) && (tsd = map_id2sd(p_sd[0])) != NULL) { + sd->sc.getSCE(SC_DANCING)->val4 = tsd->bl.id; + sc_start4(&sd->bl,&tsd->bl,SC_DANCING,100,skill_id,sd->sc.getSCE(SC_DANCING)->val2,*skill_lv,sd->bl.id,skill_get_time(skill_id,*skill_lv)+1000); clif_skill_nodamage(&tsd->bl, &sd->bl, skill_id, *skill_lv, 1); tsd->skill_id_dance = skill_id; tsd->skill_lv_dance = *skill_lv; @@ -16730,7 +16731,7 @@ static bool skill_check_condition_sc_required(struct map_session_data *sd, unsig break; } - if (!sc->data[reqStatus]) { + if (!sc->getSCE(reqStatus)) { clif_skill_fail(sd, skill_id, cause, 0); return false; } @@ -16817,7 +16818,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i //Consume sd->itemid = 0; sd->itemindex = -1; - if( (skill_id == WZ_EARTHSPIKE && sc && sc->data[SC_EARTHSCROLL] && rnd()%100 > sc->data[SC_EARTHSCROLL]->val2) || sd->inventory_data[i]->flag.delay_consume & DELAYCONSUME_NOCONSUME ) // [marquis007] + if( (skill_id == WZ_EARTHSPIKE && sc && sc->getSCE(SC_EARTHSCROLL) && rnd()%100 > sc->getSCE(SC_EARTHSCROLL)->val2) || sd->inventory_data[i]->flag.delay_consume & DELAYCONSUME_NOCONSUME ) // [marquis007] ; //Do not consume item. else if( sd->inventory.u.items_inventory[i].expire_time == 0 ) pc_delitem(sd,i,1,0,0,LOG_TYPE_CONSUME); // Rental usable items are not consumed until expiration @@ -16831,7 +16832,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i return false; } - if( sc && ( sc->data[SC__SHADOWFORM] || sc->data[SC__IGNORANCE] ) ) + if( sc && ( sc->getSCE(SC__SHADOWFORM) || sc->getSCE(SC__IGNORANCE) ) ) return false; //Checks if disabling skill - in which case no SP requirements are necessary @@ -16869,7 +16870,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i } } else if(inf2[INF2_ISENSEMBLE]) { - if (skill_check_pc_partner(sd, skill_id, &skill_lv, 1, 0) < 1 && !(sc && sc->data[SC_KVASIR_SONATA])) { + if (skill_check_pc_partner(sd, skill_id, &skill_lv, 1, 0) < 1 && !(sc && sc->getSCE(SC_KVASIR_SONATA))) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return false; } @@ -16922,8 +16923,8 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i } break; case MO_CALLSPIRITS: - if(sc && sc->data[SC_RAISINGDRAGON]) - skill_lv += sc->data[SC_RAISINGDRAGON]->val1; + if(sc && sc->getSCE(SC_RAISINGDRAGON)) + skill_lv += sc->getSCE(SC_RAISINGDRAGON)->val1; if(sd->spiritball >= skill_lv) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return false; @@ -16940,36 +16941,36 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i case MO_CHAINCOMBO: if(!sc) return false; - if(sc->data[SC_BLADESTOP]) + if(sc->getSCE(SC_BLADESTOP)) break; - if(sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == MO_TRIPLEATTACK) + if(sc->getSCE(SC_COMBO) && sc->getSCE(SC_COMBO)->val1 == MO_TRIPLEATTACK) break; return false; case MO_COMBOFINISH: - if(!(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == MO_CHAINCOMBO)) + if(!(sc && sc->getSCE(SC_COMBO) && sc->getSCE(SC_COMBO)->val1 == MO_CHAINCOMBO)) return false; break; case CH_TIGERFIST: - if(!(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == MO_COMBOFINISH)) + if(!(sc && sc->getSCE(SC_COMBO) && sc->getSCE(SC_COMBO)->val1 == MO_COMBOFINISH)) return false; break; case CH_CHAINCRUSH: - if(!(sc && sc->data[SC_COMBO])) + if(!(sc && sc->getSCE(SC_COMBO))) return false; - if(sc->data[SC_COMBO]->val1 != MO_COMBOFINISH && sc->data[SC_COMBO]->val1 != CH_TIGERFIST) + if(sc->getSCE(SC_COMBO)->val1 != MO_COMBOFINISH && sc->getSCE(SC_COMBO)->val1 != CH_TIGERFIST) return false; break; case SJ_SOLARBURST: - if (!(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SJ_PROMINENCEKICK)) + if (!(sc && sc->getSCE(SC_COMBO) && sc->getSCE(SC_COMBO)->val1 == SJ_PROMINENCEKICK)) return 0; break; case MO_EXTREMITYFIST: - // if(sc && sc->data[SC_EXTREMITYFIST]) //To disable Asura during the 5 min skill block uncomment this... + // if(sc && sc->getSCE(SC_EXTREMITYFIST)) //To disable Asura during the 5 min skill block uncomment this... // return false; - if( sc && (sc->data[SC_BLADESTOP] || sc->data[SC_CURSEDCIRCLE_ATKER]) ) + if( sc && (sc->getSCE(SC_BLADESTOP) || sc->getSCE(SC_CURSEDCIRCLE_ATKER)) ) break; - if( sc && sc->data[SC_COMBO] ) { - switch(sc->data[SC_COMBO]->val1) { + if( sc && sc->getSCE(SC_COMBO) ) { + switch(sc->getSCE(SC_COMBO)->val1) { case MO_COMBOFINISH: case CH_TIGERFIST: case CH_CHAINCRUSH: @@ -17018,17 +17019,17 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i case TK_COUNTER: if ((sd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER) return false; //Anti-Soul Linker check in case you job-changed with Stances active. - if(!(sc && sc->data[SC_COMBO]) || sc->data[SC_COMBO]->val1 == TK_JUMPKICK) + if(!(sc && sc->getSCE(SC_COMBO)) || sc->getSCE(SC_COMBO)->val1 == TK_JUMPKICK) return false; //Combo needs to be ready - if (sc->data[SC_COMBO]->val3) { //Kick chain + if (sc->getSCE(SC_COMBO)->val3) { //Kick chain //Do not repeat a kick. - if (sc->data[SC_COMBO]->val3 != skill_id) + if (sc->getSCE(SC_COMBO)->val3 != skill_id) break; status_change_end(&sd->bl, SC_COMBO); return false; } - if(sc->data[SC_COMBO]->val1 != skill_id && !pc_is_taekwon_ranker(sd)) { //Cancel combo wait. + if(sc->getSCE(SC_COMBO)->val1 != skill_id && !pc_is_taekwon_ranker(sd)) { //Cancel combo wait. unit_cancel_combo(&sd->bl); return false; } @@ -17037,14 +17038,14 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i case BD_ADAPTATION: { int time; - if(!(sc && sc->data[SC_DANCING])) { + if(!(sc && sc->getSCE(SC_DANCING))) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return false; } - time = 1000*(sc->data[SC_DANCING]->val3>>16); + time = 1000*(sc->getSCE(SC_DANCING)->val3>>16); if (skill_get_time( - (sc->data[SC_DANCING]->val1&0xFFFF), //Dance Skill ID - (sc->data[SC_DANCING]->val1>>16)) //Dance Skill LV + (sc->getSCE(SC_DANCING)->val1&0xFFFF), //Dance Skill ID + (sc->getSCE(SC_DANCING)->val1>>16)) //Dance Skill LV - time < skill_get_time2(skill_id,skill_lv)) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); @@ -17060,11 +17061,11 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i } break; case SL_SMA: - if(!sc || !(sc->data[SC_SMA] || sc->data[SC_USE_SKILL_SP_SHA])) + if(!sc || !(sc->getSCE(SC_SMA) || sc->getSCE(SC_USE_SKILL_SP_SHA))) return false; break; case HT_POWER: - if(!(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == AC_DOUBLE)) + if(!(sc && sc->getSCE(SC_COMBO) && sc->getSCE(SC_COMBO)->val1 == AC_DOUBLE)) return false; break; #ifndef RENEWAL @@ -17102,7 +17103,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i break; } case HP_BASILICA: - if( !sc || (sc && !sc->data[SC_BASILICA])) { + if( !sc || (sc && !sc->getSCE(SC_BASILICA))) { if( sd ) { // When castbegin, needs 7x7 clear area int s,range = skill_get_unit_layout_type(skill_id,skill_lv)+1; @@ -17133,7 +17134,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i case SG_SUN_WARM: case SG_MOON_WARM: case SG_STAR_WARM: - if (sc && sc->data[SC_MIRACLE]) + if (sc && sc->getSCE(SC_MIRACLE)) break; i = skill_id-SG_SUN_WARM; if (sd->bl.m == sd->feel_map[i].m) @@ -17144,7 +17145,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i case SG_SUN_COMFORT: case SG_MOON_COMFORT: case SG_STAR_COMFORT: - if (sc && sc->data[SC_MIRACLE]) + if (sc && sc->getSCE(SC_MIRACLE)) break; i = skill_id-SG_SUN_COMFORT; if (sd->bl.m == sd->feel_map[i].m && @@ -17153,7 +17154,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return false; case SG_FUSION: - if (sc && sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_STAR) + if (sc && sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_STAR) break; //Auron insists we should implement SP consumption when you are not Soul Linked. [Skotlex] //Only invoke on skill begin cast (instant cast skill). [Kevin] @@ -17198,7 +17199,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i return false; } case NJ_BUNSINJYUTSU: - if (!(sc && sc->data[SC_NEN])) { + if (!(sc && sc->getSCE(SC_NEN))) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return false; } @@ -17257,7 +17258,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i case WL_SUMMONWB: case WL_SUMMONSTONE: if (skill_lv == 1 && sc) { // Failure only happens on level 1 - ARR_FIND(SC_SPHERE_1, SC_SPHERE_5 + 1, i, !sc->data[i]); + ARR_FIND(SC_SPHERE_1, SC_SPHERE_5 + 1, i, !sc->getSCE(i)); if (i == SC_SPHERE_5 + 1) { // No more free slots clif_skill_fail(sd, skill_id, USESKILL_FAIL_SUMMON, 0); @@ -17270,7 +17271,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i int active_spheres = 0, req_spheres = 0; for (i = SC_SPHERE_1; i <= SC_SPHERE_5; i++) { - if (sc && sc->data[i]) + if (sc && sc->getSCE(i)) active_spheres++; } @@ -17287,18 +17288,18 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i } break; case GC_HALLUCINATIONWALK: - if( sc && (sc->data[SC_HALLUCINATIONWALK] || sc->data[SC_HALLUCINATIONWALK_POSTDELAY]) ) { + if( sc && (sc->getSCE(SC_HALLUCINATIONWALK) || sc->getSCE(SC_HALLUCINATIONWALK_POSTDELAY)) ) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return false; } break; case NPC_HALLUCINATIONWALK: - if( sc && sc->data[SC_NPC_HALLUCINATIONWALK] ) { + if( sc && sc->getSCE(SC_NPC_HALLUCINATIONWALK) ) { return false; } break; case RA_WUGMASTERY: - if( (pc_isfalcon(sd) && (!pc_checkskill(sd, WH_HAWK_M) && !battle_config.warg_can_falcon)) || pc_isridingwug(sd) || sd->sc.data[SC__GROOMY]) { + if( (pc_isfalcon(sd) && (!pc_checkskill(sd, WH_HAWK_M) && !battle_config.warg_can_falcon)) || pc_isridingwug(sd) || sd->sc.getSCE(SC__GROOMY)) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return false; } @@ -17342,13 +17343,13 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i break; case LG_RAYOFGENESIS: case LG_BANDING: - if( sc && sc->data[SC_INSPIRATION] ) + if( sc && sc->getSCE(SC_INSPIRATION) ) return true; // Don't check for partner. break; case LG_PRESTIGE: - if( sc && sc->data[SC_INSPIRATION] ) + if( sc && sc->getSCE(SC_INSPIRATION) ) return true; // Don't check for partner. - if( sc && sc->data[SC_BANDING] ) { + if( sc && sc->getSCE(SC_BANDING) ) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return false; } @@ -17361,12 +17362,12 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i sd->spiritball_old = require.spiritball = sd->spiritball; break; case SR_FALLENEMPIRE: - if( !(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_DRAGONCOMBO) ) + if( !(sc && sc->getSCE(SC_COMBO) && sc->getSCE(SC_COMBO)->val1 == SR_DRAGONCOMBO) ) return false; break; case SR_CRESCENTELBOW: - if( sc && sc->data[SC_CRESCENTELBOW] ) { + if( sc && sc->getSCE(SC_CRESCENTELBOW) ) { clif_skill_fail(sd, skill_id, USESKILL_FAIL_DUPLICATE, 0); return false; } @@ -17395,7 +17396,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i break; case SC_MANHOLE: case SC_DIMENSIONDOOR: - if( sc && sc->data[SC_MAGNETICFIELD] ) { + if( sc && sc->getSCE(SC_MAGNETICFIELD) ) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return false; } @@ -17417,8 +17418,8 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i case SO_ELECTRICWALK: case NPC_FIREWALK: case NPC_ELECTRICWALK: // Can't be casted until you've walked all cells. - if( sc && sc->data[SC_PROPERTYWALK] && - sc->data[SC_PROPERTYWALK]->val3 < skill_get_maxcount(sc->data[SC_PROPERTYWALK]->val1,sc->data[SC_PROPERTYWALK]->val2) ) { + if( sc && sc->getSCE(SC_PROPERTYWALK) && + sc->getSCE(SC_PROPERTYWALK)->val3 < skill_get_maxcount(sc->getSCE(SC_PROPERTYWALK)->val1,sc->getSCE(SC_PROPERTYWALK)->val2) ) { if( sd ) clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return false; @@ -17455,7 +17456,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i } break; case SJ_FULLMOONKICK: - if (!(sc && sc->data[SC_NEWMOON])) { + if (!(sc && sc->getSCE(SC_NEWMOON))) { clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0); return false; } @@ -17473,7 +17474,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i } break; case SP_SWHOO: - if (!(sc && sc->data[SC_USE_SKILL_SP_SPA])) + if (!(sc && sc->getSCE(SC_USE_SKILL_SP_SPA))) return false; break; case DK_SERVANT_W_PHANTOM: @@ -17485,17 +17486,17 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i break; case IQ_SECOND_FAITH: case IQ_THIRD_PUNISH: - if (!(sc && (sc->data[SC_FIRST_FAITH_POWER] || sc->data[SC_SECOND_JUDGE] || sc->data[SC_THIRD_EXOR_FLAME]))) + if (!(sc && (sc->getSCE(SC_FIRST_FAITH_POWER) || sc->getSCE(SC_SECOND_JUDGE) || sc->getSCE(SC_THIRD_EXOR_FLAME)))) return false; break; case IQ_SECOND_JUDGEMENT: case IQ_THIRD_CONSECRATION: - if (!(sc && (sc->data[SC_SECOND_JUDGE] || sc->data[SC_THIRD_EXOR_FLAME]))) + if (!(sc && (sc->getSCE(SC_SECOND_JUDGE) || sc->getSCE(SC_THIRD_EXOR_FLAME)))) return false; break; case IQ_SECOND_FLAME: case IQ_THIRD_FLAME_BOMB: - if (!(sc && sc->data[SC_THIRD_EXOR_FLAME])) + if (!(sc && sc->getSCE(SC_THIRD_EXOR_FLAME))) return false; break; } @@ -17543,7 +17544,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i } break; case ST_MOVE_ENABLE: - if (sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == skill_id) + if (sc && sc->getSCE(SC_COMBO) && sc->getSCE(SC_COMBO)->val1 == skill_id) sd->ud.canmove_tick = gettick(); //When using a combo, cancel the can't move delay to enable the skill. [Skotlex] if (!unit_can_move(&sd->bl)) { @@ -17552,7 +17553,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i } break; case ST_WATER: - if (sc && (sc->data[SC_DELUGE] || sc->data[SC_SUITON])) + if (sc && (sc->getSCE(SC_DELUGE) || sc->getSCE(SC_SUITON))) break; if (map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKWATER) && !map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKLANDPROTECTOR)) break; @@ -17596,25 +17597,25 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i } break; case ST_SUNSTANCE: - if (!(sc && (sc->data[SC_SUNSTANCE] || sc->data[SC_UNIVERSESTANCE]))) { + if (!(sc && (sc->getSCE(SC_SUNSTANCE) || sc->getSCE(SC_UNIVERSESTANCE)))) { clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0); return false; } break; case ST_MOONSTANCE: - if (!(sc && (sc->data[SC_LUNARSTANCE] || sc->data[SC_UNIVERSESTANCE]))) { + if (!(sc && (sc->getSCE(SC_LUNARSTANCE) || sc->getSCE(SC_UNIVERSESTANCE)))) { clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0); return false; } break; case ST_STARSTANCE: - if (!(sc && (sc->data[SC_STARSTANCE] || sc->data[SC_UNIVERSESTANCE]))) { + if (!(sc && (sc->getSCE(SC_STARSTANCE) || sc->getSCE(SC_UNIVERSESTANCE)))) { clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0); return false; } break; case ST_UNIVERSESTANCE: - if (!(sc && sc->data[SC_UNIVERSESTANCE])) { + if (!(sc && sc->getSCE(SC_UNIVERSESTANCE))) { clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0); return false; } @@ -18116,27 +18117,27 @@ void skill_consume_requirement(struct map_session_data *sd, uint16 skill_id, uin if( !require.itemid[i] ) continue; - if( itemdb_group.item_exists(IG_GEMSTONE, require.itemid[i]) && skill_id != HW_GANBANTEIN && sc && sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_WIZARD ) + if( itemdb_group.item_exists(IG_GEMSTONE, require.itemid[i]) && skill_id != HW_GANBANTEIN && sc && sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_WIZARD ) continue; //Gemstones are checked, but not substracted from inventory. switch( skill_id ){ case SA_SEISMICWEAPON: - if( sc && sc->data[SC_UPHEAVAL_OPTION] && rnd()%100 < 50 ) + if( sc && sc->getSCE(SC_UPHEAVAL_OPTION) && rnd()%100 < 50 ) continue; break; case SA_FLAMELAUNCHER: case SA_VOLCANO: - if( sc && sc->data[SC_TROPIC_OPTION] && rnd()%100 < 50 ) + if( sc && sc->getSCE(SC_TROPIC_OPTION) && rnd()%100 < 50 ) continue; break; case SA_FROSTWEAPON: case SA_DELUGE: - if( sc && sc->data[SC_CHILLY_AIR_OPTION] && rnd()%100 < 50 ) + if( sc && sc->getSCE(SC_CHILLY_AIR_OPTION) && rnd()%100 < 50 ) continue; break; case SA_LIGHTNINGLOADER: case SA_VIOLENTGALE: - if( sc && sc->data[SC_WILD_STORM_OPTION] && rnd()%100 < 50 ) + if( sc && sc->getSCE(SC_WILD_STORM_OPTION) && rnd()%100 < 50 ) continue; break; } @@ -18223,24 +18224,24 @@ struct s_skill_condition skill_get_requirement(struct map_session_data* sd, uint req.sp = cap_value(req.sp * sp_skill_rate_bonus / 100, 0, SHRT_MAX); if( sc ) { - if( sc->data[SC__LAZINESS] ) - req.sp += req.sp + sc->data[SC__LAZINESS]->val1 * 10; - if( sc->data[SC_RECOGNIZEDSPELL] ) + if( sc->getSCE(SC__LAZINESS) ) + req.sp += req.sp + sc->getSCE(SC__LAZINESS)->val1 * 10; + if( sc->getSCE(SC_RECOGNIZEDSPELL) ) req.sp += req.sp / 4; - if( sc->data[SC_OFFERTORIUM]) - req.sp += req.sp * sc->data[SC_OFFERTORIUM]->val3 / 100; - if( sc->data[SC_TELEKINESIS_INTENSE] && skill_get_ele(skill_id, skill_lv) == ELE_GHOST) - req.sp -= req.sp * sc->data[SC_TELEKINESIS_INTENSE]->val2 / 100; + if( sc->getSCE(SC_OFFERTORIUM)) + req.sp += req.sp * sc->getSCE(SC_OFFERTORIUM)->val3 / 100; + if( sc->getSCE(SC_TELEKINESIS_INTENSE) && skill_get_ele(skill_id, skill_lv) == ELE_GHOST) + req.sp -= req.sp * sc->getSCE(SC_TELEKINESIS_INTENSE)->val2 / 100; #ifdef RENEWAL - if (sc->data[SC_ADAPTATION] && (skill_get_inf2(skill_id, INF2_ISSONG))) + if (sc->getSCE(SC_ADAPTATION) && (skill_get_inf2(skill_id, INF2_ISSONG))) req.sp -= req.sp * 20 / 100; - if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_SPCONSUM) + if (sc->getSCE(SC_NIBELUNGEN) && sc->getSCE(SC_NIBELUNGEN)->val2 == RINGNBL_SPCONSUM) req.sp -= req.sp * 30 / 100; #endif - if (sc->data[SC_GLOOMYDAY]) + if (sc->getSCE(SC_GLOOMYDAY)) req.sp += req.sp * (skill_lv * 10) / 100; - if (sc->data[SC_CRESCIVEBOLT]) - req.sp += req.sp * (20 * sc->data[SC_CRESCIVEBOLT]->val1) / 100; + if (sc->getSCE(SC_CRESCIVEBOLT)) + req.sp += req.sp * (20 * sc->getSCE(SC_CRESCIVEBOLT)->val1) / 100; } req.ap = skill->require.ap[skill_lv - 1]; @@ -18252,9 +18253,9 @@ struct s_skill_condition skill_get_requirement(struct map_session_data* sd, uint req.zeny = skill->require.zeny[skill_lv-1]; - if( sc && sc->data[SC__UNLUCKY] ) { - if(sc->data[SC__UNLUCKY]->val1 < 3) - req.zeny += sc->data[SC__UNLUCKY]->val1 * 250; + if( sc && sc->getSCE(SC__UNLUCKY) ) { + if(sc->getSCE(SC__UNLUCKY)->val1 < 3) + req.zeny += sc->getSCE(SC__UNLUCKY)->val1 * 250; else req.zeny += 1000; } @@ -18359,7 +18360,7 @@ struct s_skill_condition skill_get_requirement(struct map_session_data* sd, uint if( sd->special_state.no_gemstone == 2 ) // Remove all Magic Stone required for all skills for VIP. req.itemid[i] = req.amount[i] = 0; else { - if( sd->special_state.no_gemstone || (sc && sc->data[SC_INTOABYSS]) ) + if( sd->special_state.no_gemstone || (sc && sc->getSCE(SC_INTOABYSS)) ) { // All gem skills except Hocus Pocus and Ganbantein can cast for free with Mistress card -helvetica if (skill_id != SA_ABRACADABRA && skill_id != HW_GANBANTEIN) req.itemid[i] = req.amount[i] = 0; @@ -18389,7 +18390,7 @@ struct s_skill_condition skill_get_requirement(struct map_session_data* sd, uint #endif break; case AL_HOLYLIGHT: - if(sc && sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_PRIEST) + if(sc && sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_PRIEST) req.sp *= 5; break; case SL_SMA: @@ -18412,20 +18413,20 @@ struct s_skill_condition skill_get_requirement(struct map_session_data* sd, uint case MO_COMBOFINISH: case CH_TIGERFIST: case CH_CHAINCRUSH: - if(sc && sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_MONK) + if(sc && sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_MONK) req.sp = 2; //Monk Spirit makes monk/champion combo skills cost 2 SP regardless of original cost break; case MO_BODYRELOCATION: - if( sc && sc->data[SC_EXPLOSIONSPIRITS] ) + if( sc && sc->getSCE(SC_EXPLOSIONSPIRITS) ) req.spiritball = 0; break; case MO_EXTREMITYFIST: if( sc ) { - if( sc->data[SC_BLADESTOP] ) + if( sc->getSCE(SC_BLADESTOP) ) req.spiritball--; - else if( sc->data[SC_COMBO] ) { + else if( sc->getSCE(SC_COMBO) ) { #ifndef RENEWAL - switch( sc->data[SC_COMBO]->val1 ) { + switch( sc->getSCE(SC_COMBO)->val1 ) { case MO_COMBOFINISH: req.spiritball = 4; break; @@ -18439,7 +18440,7 @@ struct s_skill_condition skill_get_requirement(struct map_session_data* sd, uint #else req.spiritball = sd->spiritball ? sd->spiritball : 1; #endif - } else if( sc->data[SC_RAISINGDRAGON] && sd->spiritball > 5) + } else if( sc->getSCE(SC_RAISINGDRAGON) && sd->spiritball > 5) req.spiritball = sd->spiritball; // must consume all regardless of the amount required } break; @@ -18447,24 +18448,24 @@ struct s_skill_condition skill_get_requirement(struct map_session_data* sd, uint req.spiritball = sd->spiritball?sd->spiritball:1; break; case SR_FALLENEMPIRE: - if (sc && (sc->data[SC_FIRST_FAITH_POWER] || sc->data[SC_SECOND_JUDGE] || sc->data[SC_THIRD_EXOR_FLAME])) + if (sc && (sc->getSCE(SC_FIRST_FAITH_POWER) || sc->getSCE(SC_SECOND_JUDGE) || sc->getSCE(SC_THIRD_EXOR_FLAME))) req.spiritball = 0; break; case SR_TIGERCANNON: - if (sc && sc->data[SC_THIRD_EXOR_FLAME]) + if (sc && sc->getSCE(SC_THIRD_EXOR_FLAME)) req.spiritball = 0; break; case SR_RAMPAGEBLASTER: case SR_RIDEINLIGHTNING: - if (sc && sc->data[SC_MASSIVE_F_BLASTER]) + if (sc && sc->getSCE(SC_MASSIVE_F_BLASTER)) req.spiritball = 0; break; case SR_GATEOFHELL: - if( sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE ) + if( sc && sc->getSCE(SC_COMBO) && sc->getSCE(SC_COMBO)->val1 == SR_FALLENEMPIRE ) req.sp -= req.sp * 10 / 100; break; case SR_FLASHCOMBO: - if (sc && (sc->data[SC_SECOND_JUDGE] || sc->data[SC_THIRD_EXOR_FLAME])) + if (sc && (sc->getSCE(SC_SECOND_JUDGE) || sc->getSCE(SC_THIRD_EXOR_FLAME))) req.spiritball = 0; break; case SO_SUMMON_AGNI: @@ -18479,7 +18480,7 @@ struct s_skill_condition skill_get_requirement(struct map_session_data* sd, uint break; case NPC_PSYCHIC_WAVE: case SO_PSYCHIC_WAVE: - if( sc && (sc->data[SC_HEATER_OPTION] || sc->data[SC_COOLER_OPTION] || sc->data[SC_CURSED_SOIL_OPTION] || sc->data[SC_BLAST_OPTION]) ) + if( sc && (sc->getSCE(SC_HEATER_OPTION) || sc->getSCE(SC_COOLER_OPTION) || sc->getSCE(SC_CURSED_SOIL_OPTION) || sc->getSCE(SC_BLAST_OPTION)) ) req.sp += req.sp / 2; // 1.5x SP cost break; } @@ -18584,15 +18585,15 @@ int skill_castfix(struct block_list *bl, uint16 skill_id, uint16 skill_lv) { // These cast time reductions are processed even if the skill fails if (sc && sc->count) { // Magic Strings stacks additively with item bonuses - if (!(flag&2) && sc->data[SC_POEMBRAGI]) - reduce_cast_rate += sc->data[SC_POEMBRAGI]->val2; + if (!(flag&2) && sc->getSCE(SC_POEMBRAGI)) + reduce_cast_rate += sc->getSCE(SC_POEMBRAGI)->val2; // Foresight halves the cast time, it does not stack additively - if (sc->data[SC_MEMORIZE]) { + if (sc->getSCE(SC_MEMORIZE)) { if (!sd || pc_checkskill(sd, skill_id) > 0) { // Foresight only decreases cast times from learned skills, not skills granted by items if(!(flag&2)) time -= time * 50 / 100; // Foresight counter gets reduced even if the skill is not affected by it - if ((--sc->data[SC_MEMORIZE]->val2) <= 0) + if ((--sc->getSCE(SC_MEMORIZE)->val2) <= 0) status_change_end(bl, SC_MEMORIZE); } } @@ -18631,18 +18632,18 @@ int skill_castfix_sc(struct block_list *bl, double time, uint8 flag) if (sc && sc->count) { if (!(flag&2)) { - if (sc->data[SC_SLOWCAST]) - time += time * sc->data[SC_SLOWCAST]->val2 / 100; - if (sc->data[SC_PARALYSIS]) - time += sc->data[SC_PARALYSIS]->val3; - if (sc->data[SC_IZAYOI]) + if (sc->getSCE(SC_SLOWCAST)) + time += time * sc->getSCE(SC_SLOWCAST)->val2 / 100; + if (sc->getSCE(SC_PARALYSIS)) + time += sc->getSCE(SC_PARALYSIS)->val3; + if (sc->getSCE(SC_IZAYOI)) time -= time * 50 / 100; - if (sc->data[SC_2011RWC_SCROLL]) + if (sc->getSCE(SC_2011RWC_SCROLL)) time -= time * 5 / 100; } - if (sc->data[SC_SUFFRAGIUM]) { + if (sc->getSCE(SC_SUFFRAGIUM)) { if(!(flag&2)) - time -= time * sc->data[SC_SUFFRAGIUM]->val2 / 100; + time -= time * sc->getSCE(SC_SUFFRAGIUM)->val2 / 100; //Suffragium ends even if the skill is not affected by it status_change_end(bl, SC_SUFFRAGIUM); } @@ -18731,62 +18732,62 @@ int skill_vfcastfix(struct block_list *bl, double time, uint16 skill_id, uint16 // Adjusted by active statuses if (sc && sc->count && !(flag&2)) { // Multiplicative Variable CastTime values - if (sc->data[SC_SLOWCAST]) - VARCAST_REDUCTION(-sc->data[SC_SLOWCAST]->val2); - if (sc->data[SC__LAZINESS]) - VARCAST_REDUCTION(-sc->data[SC__LAZINESS]->val2); - if (sc->data[SC_SUFFRAGIUM]) { - VARCAST_REDUCTION(sc->data[SC_SUFFRAGIUM]->val2); + if (sc->getSCE(SC_SLOWCAST)) + VARCAST_REDUCTION(-sc->getSCE(SC_SLOWCAST)->val2); + if (sc->getSCE(SC__LAZINESS)) + VARCAST_REDUCTION(-sc->getSCE(SC__LAZINESS)->val2); + if (sc->getSCE(SC_SUFFRAGIUM)) { + VARCAST_REDUCTION(sc->getSCE(SC_SUFFRAGIUM)->val2); #ifndef RENEWAL status_change_end(bl, SC_SUFFRAGIUM, INVALID_TIMER); #endif } - if (sc->data[SC_MEMORIZE]) { + if (sc->getSCE(SC_MEMORIZE)) { if (!sd || pc_checkskill(sd, skill_id) > 0) { // Foresight only decreases cast times from learned skills, not skills granted by items reduce_cast_rate += 50; - if ((--sc->data[SC_MEMORIZE]->val2) <= 0) + if ((--sc->getSCE(SC_MEMORIZE)->val2) <= 0) status_change_end(bl, SC_MEMORIZE); } } - if (sc->data[SC_POEMBRAGI]) - reduce_cast_rate += sc->data[SC_POEMBRAGI]->val2; - if (sc->data[SC_IZAYOI]) + if (sc->getSCE(SC_POEMBRAGI)) + reduce_cast_rate += sc->getSCE(SC_POEMBRAGI)->val2; + if (sc->getSCE(SC_IZAYOI)) VARCAST_REDUCTION(50); - if (sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 3 && skill_get_type(skill_id) == BF_MAGIC && skill_get_ele(skill_id, skill_lv) == ELE_WATER) + if (sc->getSCE(SC_WATER_INSIGNIA) && sc->getSCE(SC_WATER_INSIGNIA)->val1 == 3 && skill_get_type(skill_id) == BF_MAGIC && skill_get_ele(skill_id, skill_lv) == ELE_WATER) VARCAST_REDUCTION(30); //Reduces 30% Variable Cast Time of magic Water spells. - if (sc->data[SC_TELEKINESIS_INTENSE]) - VARCAST_REDUCTION(sc->data[SC_TELEKINESIS_INTENSE]->val2); - if (sc->data[SC_SOULFAIRY]) - VARCAST_REDUCTION(sc->data[SC_SOULFAIRY]->val3); - if (sc->data[SC_EP16_2_BUFF_AC]) + if (sc->getSCE(SC_TELEKINESIS_INTENSE)) + VARCAST_REDUCTION(sc->getSCE(SC_TELEKINESIS_INTENSE)->val2); + if (sc->getSCE(SC_SOULFAIRY)) + VARCAST_REDUCTION(sc->getSCE(SC_SOULFAIRY)->val3); + if (sc->getSCE(SC_EP16_2_BUFF_AC)) VARCAST_REDUCTION(80); // Multiplicative Fixed CastTime values - if (sc->data[SC_SECRAMENT]) - fixcast_r = max(fixcast_r, sc->data[SC_SECRAMENT]->val2); + if (sc->getSCE(SC_SECRAMENT)) + fixcast_r = max(fixcast_r, sc->getSCE(SC_SECRAMENT)->val2); if (sd && (skill_lv = pc_checkskill(sd, WL_RADIUS) ) && skill_id >= WL_WHITEIMPRISON && skill_id <= WL_FREEZE_SP) fixcast_r = max(fixcast_r, ((status_get_int(bl) + status_get_lv(bl)) / 15 + skill_lv * 5)); - if (sc->data[SC_DANCEWITHWUG]) - fixcast_r = max(fixcast_r, sc->data[SC_DANCEWITHWUG]->val4); - if (sc->data[SC_HEAT_BARREL]) - fixcast_r = max(fixcast_r, sc->data[SC_HEAT_BARREL]->val2); - if (sc->data[SC_FREEZING]) + if (sc->getSCE(SC_DANCEWITHWUG)) + fixcast_r = max(fixcast_r, sc->getSCE(SC_DANCEWITHWUG)->val4); + if (sc->getSCE(SC_HEAT_BARREL)) + fixcast_r = max(fixcast_r, sc->getSCE(SC_HEAT_BARREL)->val2); + if (sc->getSCE(SC_FREEZING)) fixcast_r -= 50; - if (sc->data[SC_SWINGDANCE]) + if (sc->getSCE(SC_SWINGDANCE)) fixcast_r = max(fixcast_r, skill_lv * 6); // Additive Fixed CastTime values - if (sc->data[SC_MANDRAGORA]) - fixed += sc->data[SC_MANDRAGORA]->val1 * 500; - if (sc->data[SC_GUST_OPTION] || sc->data[SC_BLAST_OPTION] || sc->data[SC_WILD_STORM_OPTION]) + if (sc->getSCE(SC_MANDRAGORA)) + fixed += sc->getSCE(SC_MANDRAGORA)->val1 * 500; + if (sc->getSCE(SC_GUST_OPTION) || sc->getSCE(SC_BLAST_OPTION) || sc->getSCE(SC_WILD_STORM_OPTION)) fixed -= 1000; - if (sc->data[SC_IZAYOI]) + if (sc->getSCE(SC_IZAYOI)) fixed = 0; - if (sc->data[SC_GLOOMYDAY]) + if (sc->getSCE(SC_GLOOMYDAY)) fixed += skill_lv * 500; - if (sc->data[SC_2011RWC_SCROLL]) + if (sc->getSCE(SC_2011RWC_SCROLL)) VARCAST_REDUCTION(5); } - if (sc && sc->data[SC_SECRAMENT] && skill_id == HW_MAGICPOWER && (flag&2)) // Sacrament lowers Mystical Amplification cast time - fixcast_r = max(fixcast_r, sc->data[SC_SECRAMENT]->val2); + if (sc && sc->getSCE(SC_SECRAMENT) && skill_id == HW_MAGICPOWER && (flag&2)) // Sacrament lowers Mystical Amplification cast time + fixcast_r = max(fixcast_r, sc->getSCE(SC_SECRAMENT)->val2); if (varcast_r < 0) time = time * (1 - (float)min(varcast_r, 100) / 100); @@ -18840,7 +18841,7 @@ int skill_delayfix(struct block_list *bl, uint16 skill_id, uint16 skill_lv) break; #ifndef RENEWAL case HP_BASILICA: - if (sc && !sc->data[SC_BASILICA]) + if (sc && !sc->getSCE(SC_BASILICA)) time = 0; // There is no Delay on Basilica creation, only on cancel break; #endif @@ -18864,14 +18865,14 @@ int skill_delayfix(struct block_list *bl, uint16 skill_id, uint16 skill_lv) } if (sc && sc->count) { - if (sc->data[SC_SPIRIT]) { + if (sc->getSCE(SC_SPIRIT)) { switch (skill_id) { case CR_SHIELDBOOMERANG: - if (sc->data[SC_SPIRIT]->val2 == SL_CRUSADER) + if (sc->getSCE(SC_SPIRIT)->val2 == SL_CRUSADER) time /= 2; break; case AS_SONICBLOW: - if (!map_flag_gvg2(bl->m) && !map_getmapflag(bl->m, MF_BATTLEGROUND) && sc->data[SC_SPIRIT]->val2 == SL_ASSASIN) + if (!map_flag_gvg2(bl->m) && !map_getmapflag(bl->m, MF_BATTLEGROUND) && sc->getSCE(SC_SPIRIT)->val2 == SL_ASSASIN) time /= 2; break; } @@ -18882,12 +18883,12 @@ int skill_delayfix(struct block_list *bl, uint16 skill_id, uint16 skill_lv) if (!(delaynodex&2)) { if (sc && sc->count) { - if (sc->data[SC_POEMBRAGI]) - delay += sc->data[SC_POEMBRAGI]->val3; - if (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 3 && skill_get_type(skill_id) == BF_MAGIC && skill_get_ele(skill_id, skill_lv) == ELE_WIND) + if (sc->getSCE(SC_POEMBRAGI)) + delay += sc->getSCE(SC_POEMBRAGI)->val3; + if (sc->getSCE(SC_WIND_INSIGNIA) && sc->getSCE(SC_WIND_INSIGNIA)->val1 == 3 && skill_get_type(skill_id) == BF_MAGIC && skill_get_ele(skill_id, skill_lv) == ELE_WIND) delay += 50; // After Delay of Wind element spells reduced by 50%. - if (sc->data[SC_MAGICMUSHROOM] && sc->data[SC_MAGICMUSHROOM]->val3 == 0) - delay += sc->data[SC_MAGICMUSHROOM]->val2; + if (sc->getSCE(SC_MAGICMUSHROOM) && sc->getSCE(SC_MAGICMUSHROOM)->val3 == 0) + delay += sc->getSCE(SC_MAGICMUSHROOM)->val2; } } @@ -19141,14 +19142,14 @@ int skill_autospell(struct map_session_data *sd, uint16 skill_id) return 0; // Player must learn the skill before doing auto-spell [Lance] #ifdef RENEWAL - if ((skill_id == MG_COLDBOLT || skill_id == MG_FIREBOLT || skill_id == MG_LIGHTNINGBOLT) && sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_SAGE) + if ((skill_id == MG_COLDBOLT || skill_id == MG_FIREBOLT || skill_id == MG_LIGHTNINGBOLT) && sd->sc.getSCE(SC_SPIRIT) && sd->sc.getSCE(SC_SPIRIT)->val2 == SL_SAGE) maxlv = 10; //Soul Linker bonus. [Skotlex] else maxlv = skill_lv / 2; // Half of Autospell's level unless player learned a lower level (capped below) #else if(skill_id==MG_NAPALMBEAT) maxlv=3; else if(skill_id==MG_COLDBOLT || skill_id==MG_FIREBOLT || skill_id==MG_LIGHTNINGBOLT){ - if (sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_SAGE) + if (sd->sc.getSCE(SC_SPIRIT) && sd->sc.getSCE(SC_SPIRIT)->val2 == SL_SAGE) maxlv = 10; //Soul Linker bonus. [Skotlex] else if(skill_lv==2) maxlv=1; else if(skill_lv==3) maxlv=2; @@ -19973,8 +19974,8 @@ bool skill_check_shadowform(struct block_list *bl, int64 damage, int hit) sc = status_get_sc(bl); - if( sc && sc->data[SC__SHADOWFORM] ) { - struct block_list *src = map_id2bl(sc->data[SC__SHADOWFORM]->val2); + if( sc && sc->getSCE(SC__SHADOWFORM) ) { + struct block_list *src = map_id2bl(sc->getSCE(SC__SHADOWFORM)->val2); if( !src || src->m != bl->m ) { status_change_end(bl, SC__SHADOWFORM); @@ -19989,7 +19990,7 @@ bool skill_check_shadowform(struct block_list *bl, int64 damage, int hit) } status_damage(bl, src, damage, 0, clif_damage(src, src, gettick(), 500, 500, damage, hit, (hit > 1 ? DMG_MULTI_HIT : DMG_NORMAL), 0, false), 0, SC__SHADOWFORM); - if( sc && sc->data[SC__SHADOWFORM] && (--sc->data[SC__SHADOWFORM]->val3) <= 0 ) { + if( sc && sc->getSCE(SC__SHADOWFORM) && (--sc->getSCE(SC__SHADOWFORM)->val3) <= 0 ) { status_change_end(bl, SC__SHADOWFORM); if( src->type == BL_PC ) ((TBL_PC*)src)->shadowform_id = 0; @@ -20232,8 +20233,8 @@ int skill_delunit(struct skill_unit* unit) case SC_MANHOLE: // Note : Removing the unit don't remove the status (official info) if( group->val2 ) { // Someone Traped struct status_change *tsc = status_get_sc( map_id2bl(group->val2)); - if( tsc && tsc->data[SC__MANHOLE] ) - tsc->data[SC__MANHOLE]->val4 = 0; // Remove the Unit ID + if( tsc && tsc->getSCE(SC__MANHOLE) ) + tsc->getSCE(SC__MANHOLE)->val4 = 0; // Remove the Unit ID } break; } @@ -20383,8 +20384,8 @@ int skill_delunitgroup_(std::shared_ptr group, const char* f if (skill_get_unit_flag_(group->skill_id, { UF_DANCE, UF_SONG, UF_ENSEMBLE })) { struct status_change* sc = status_get_sc(src); - if (sc && sc->data[SC_DANCING]) { - sc->data[SC_DANCING]->val2 = 0 ; //This prevents status_change_end attempting to redelete the group. [Skotlex] + if (sc && sc->getSCE(SC_DANCING)) { + sc->getSCE(SC_DANCING)->val2 = 0 ; //This prevents status_change_end attempting to redelete the group. [Skotlex] status_change_end(src, SC_DANCING); } } @@ -20399,8 +20400,8 @@ int skill_delunitgroup_(std::shared_ptr group, const char* f } if (i != SC_NONE) { struct status_change *sc = status_get_sc(src); - if (sc && sc->data[i]) { - sc->data[i]->val3 = 0; //Remove reference to this group. [Skotlex] + if (sc && sc->getSCE(i)) { + sc->getSCE(i)->val3 = 0; //Remove reference to this group. [Skotlex] status_change_end(src, (sc_type)i); } } @@ -20412,18 +20413,18 @@ int skill_delunitgroup_(std::shared_ptr group, const char* f struct status_change *sc; bool removed = true; //Clear group id from status change - if (target && (sc = status_get_sc(target)) != NULL && sc->data[SC_SPIDERWEB]) { - if (sc->data[SC_SPIDERWEB]->val2 == group->group_id) - sc->data[SC_SPIDERWEB]->val2 = 0; - else if (sc->data[SC_SPIDERWEB]->val3 == group->group_id) - sc->data[SC_SPIDERWEB]->val3 = 0; - else if (sc->data[SC_SPIDERWEB]->val4 == group->group_id) - sc->data[SC_SPIDERWEB]->val4 = 0; + if (target && (sc = status_get_sc(target)) != NULL && sc->getSCE(SC_SPIDERWEB)) { + if (sc->getSCE(SC_SPIDERWEB)->val2 == group->group_id) + sc->getSCE(SC_SPIDERWEB)->val2 = 0; + else if (sc->getSCE(SC_SPIDERWEB)->val3 == group->group_id) + sc->getSCE(SC_SPIDERWEB)->val3 = 0; + else if (sc->getSCE(SC_SPIDERWEB)->val4 == group->group_id) + sc->getSCE(SC_SPIDERWEB)->val4 = 0; else //Group was already removed in status_change_end, don't call it again! removed = false; //The last group was cleared, end status change - if(removed && sc->data[SC_SPIDERWEB]->val2 == 0 && sc->data[SC_SPIDERWEB]->val3 == 0 && sc->data[SC_SPIDERWEB]->val4 == 0) + if(removed && sc->getSCE(SC_SPIDERWEB)->val2 == 0 && sc->getSCE(SC_SPIDERWEB)->val3 == 0 && sc->getSCE(SC_SPIDERWEB)->val4 == 0) status_change_end(target, SC_SPIDERWEB); } } @@ -20433,8 +20434,8 @@ int skill_delunitgroup_(std::shared_ptr group, const char* f case SG_STAR_WARM: { status_change *sc = status_get_sc(src); - if (sc && sc->data[SC_WARM]) { - sc->data[SC_WARM]->val4 = 0; + if (sc && sc->getSCE(SC_WARM)) { + sc->getSCE(SC_WARM)->val4 = 0; status_change_end(src, SC_WARM); } } @@ -20442,8 +20443,8 @@ int skill_delunitgroup_(std::shared_ptr group, const char* f case LG_BANDING: { status_change *sc = status_get_sc(src); - if (sc && sc->data[SC_BANDING]) { - sc->data[SC_BANDING]->val4 = 0; + if (sc && sc->getSCE(SC_BANDING)) { + sc->getSCE(SC_BANDING)->val4 = 0; status_change_end(src, SC_BANDING); } } @@ -20452,9 +20453,9 @@ int skill_delunitgroup_(std::shared_ptr group, const char* f { struct status_change *sc = NULL; if( (sc = status_get_sc(src)) != NULL ) { - if ( sc->data[SC_NEUTRALBARRIER_MASTER] ) + if ( sc->getSCE(SC_NEUTRALBARRIER_MASTER) ) { - sc->data[SC_NEUTRALBARRIER_MASTER]->val2 = 0; + sc->getSCE(SC_NEUTRALBARRIER_MASTER)->val2 = 0; status_change_end(src,SC_NEUTRALBARRIER_MASTER); } status_change_end(src,SC_NEUTRALBARRIER); @@ -20464,8 +20465,8 @@ int skill_delunitgroup_(std::shared_ptr group, const char* f case NC_STEALTHFIELD: { struct status_change *sc = NULL; - if( (sc = status_get_sc(src)) != NULL && sc->data[SC_STEALTHFIELD_MASTER] ) { - sc->data[SC_STEALTHFIELD_MASTER]->val2 = 0; + if( (sc = status_get_sc(src)) != NULL && sc->getSCE(SC_STEALTHFIELD_MASTER) ) { + sc->getSCE(SC_STEALTHFIELD_MASTER)->val2 = 0; status_change_end(src,SC_STEALTHFIELD_MASTER); } } @@ -20741,7 +20742,7 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap) { struct block_list *src = map_id2bl(group->src_id); struct status_change *sc; - if( !src || (sc = status_get_sc(src)) == NULL || !sc->data[SC_BANDING] ) { + if( !src || (sc = status_get_sc(src)) == NULL || !sc->getSCE(SC_BANDING) ) { skill_delunit(unit); break; } @@ -22021,11 +22022,11 @@ void skill_toggle_magicpower(struct block_list *bl, uint16 skill_id) if (skill_get_nk(skill_id, NK_NODAMAGE) || !(skill_get_type(skill_id)&BF_MAGIC)) return; - if (sc && sc->count && sc->data[SC_MAGICPOWER]) { - if (sc->data[SC_MAGICPOWER]->val4) { + if (sc && sc->count && sc->getSCE(SC_MAGICPOWER)) { + if (sc->getSCE(SC_MAGICPOWER)->val4) { status_change_end(bl, SC_MAGICPOWER); } else { - sc->data[SC_MAGICPOWER]->val4 = 1; + sc->getSCE(SC_MAGICPOWER)->val4 = 1; status_calc_bl_(bl, status_db.getCalcFlag(SC_MAGICPOWER)); if(bl->type == BL_PC){// update current display. clif_updatestatus(((TBL_PC *)bl),SP_MATK1); @@ -22096,7 +22097,7 @@ void skill_spellbook(map_session_data &sd, t_itemid nameid) { status_change *sc = status_get_sc(&sd.bl); for (int i = SC_SPELLBOOK1; i <= SC_MAXSPELLBOOK; i++) { - if (sc == nullptr || sc->data[i] == nullptr) + if (sc == nullptr || sc->getSCE(i) == nullptr) break; if (i == SC_MAXSPELLBOOK) { clif_skill_fail(&sd, WL_READING_SB, USESKILL_FAIL_SPELLBOOK_READING, 0); @@ -22119,14 +22120,14 @@ void skill_spellbook(map_session_data &sd, t_itemid nameid) { uint16 points = spell->points; - if (sc && sc->data[SC_FREEZE_SP]) { - if ((sc->data[SC_FREEZE_SP]->val2 + points) > 8 * pc_checkskill(&sd, WL_FREEZE_SP) + status_get_int(&sd.bl) / 10 + sd.status.base_level / 10) { + if (sc && sc->getSCE(SC_FREEZE_SP)) { + if ((sc->getSCE(SC_FREEZE_SP)->val2 + points) > 8 * pc_checkskill(&sd, WL_FREEZE_SP) + status_get_int(&sd.bl) / 10 + sd.status.base_level / 10) { clif_skill_fail(&sd, WL_READING_SB, USESKILL_FAIL_SPELLBOOK_PRESERVATION_POINT, 0); return; } for (int i = SC_MAXSPELLBOOK; i >= SC_SPELLBOOK1; i--) { // This is how official saves spellbook. [malufett] - if (!sc->data[i]) { - sc->data[SC_FREEZE_SP]->val2 += points; // increase points + if (!sc->getSCE(i)) { + sc->getSCE(SC_FREEZE_SP)->val2 += points; // increase points sc_start4(&sd.bl, &sd.bl, (sc_type)i, 100, skill_id, skill_lv, points, 0, INFINITE_TICK); break; } @@ -22145,8 +22146,8 @@ int skill_select_menu(struct map_session_data *sd,uint16 skill_id) { uint16 id, sk_idx = 0; nullpo_ret(sd); - if (sd->sc.data[SC_STOP]) { - aslvl = sd->sc.data[SC_STOP]->val1; + if (sd->sc.getSCE(SC_STOP)) { + aslvl = sd->sc.getSCE(SC_STOP)->val1; status_change_end(&sd->bl,SC_STOP); } @@ -23052,12 +23053,12 @@ bool skill_disable_check(status_change &sc, uint16 skill_id) { return false; if (skill->inf2[INF2_TOGGLEABLE]) { - if (sc.data[skill->sc]) + if (sc.getSCE(skill->sc)) return true; // These 2 skills contain a master and are not correctly pulled using skill_get_sc - if (skill->nameid == NC_NEUTRALBARRIER && sc.data[SC_NEUTRALBARRIER_MASTER]) + if (skill->nameid == NC_NEUTRALBARRIER && sc.getSCE(SC_NEUTRALBARRIER_MASTER)) return true; - if (skill->nameid == NC_STEALTHFIELD && sc.data[SC_STEALTHFIELD_MASTER]) + if (skill->nameid == NC_STEALTHFIELD && sc.getSCE(SC_STEALTHFIELD_MASTER)) return true; } @@ -23099,7 +23100,7 @@ static bool skill_check_unit_movepos(uint8 check_flag, struct block_list *bl, sh return false; sc = status_get_sc(bl); - if (sc && sc->data[SC_SV_ROOTTWIST]) + if (sc && sc->getSCE(SC_SV_ROOTTWIST)) return false; return unit_movepos(bl, dst_x, dst_y, easy, checkpath); diff --git a/src/map/status.cpp b/src/map/status.cpp index 78feb15c4d..2216613458 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -1059,7 +1059,7 @@ bool StatusDatabase::hasSCF(status_change *sc, e_status_change_flag flag) { for (const auto &status_it : *this) { std::shared_ptr status = status_it.second; - if (sc->data[status->type] && status->flag[flag]) + if (sc->getSCE(status->type) && status->flag[flag]) return true; } @@ -1099,7 +1099,7 @@ void StatusDatabase::changeSkillTree(map_session_data *sd, int32 class_) { uint16 skill_id = it.first; sc_type sc = skill_get_sc(skill_id); - if (sc > SC_COMMON_MAX && sc < SC_MAX && sd->sc.data[sc]) + if (sc > SC_COMMON_MAX && sc < SC_MAX && sd->sc.getSCE(sc)) status_change_end(&sd->bl, sc); } } @@ -1134,7 +1134,7 @@ void StatusDatabase::removeByStatusFlag(block_list *bl, std::vector status = status_it.second; sc_type type = status->type; - if (sc->data[type]) { + if (sc->getSCE(type)) { for (const auto &flag_it : flag) { if (status->flag[flag_it]) status_change_end(bl, type); @@ -1142,6 +1142,44 @@ void StatusDatabase::removeByStatusFlag(block_list *bl, std::vector(type)); +} + +status_change_entry * status_change::createSCE(enum sc_type type) { + data[type] = ers_alloc(sc_data_ers, struct status_change_entry); + lastStatus = {type, data[type]}; + return data[type]; +} + +/** + * free the sce, then clear it + */ +void status_change::deleteSCE(enum sc_type type) { + ers_free(sc_data_ers, data[type]); + data[type] = nullptr; + lastStatus = {type, data[type]}; +} + +/** + * For when we only want to clear the sce without freeing. + */ +void status_change::clearSCE(enum sc_type type) { + data[type] = nullptr; + lastStatus = {type, data[type]}; +} /** Creates dummy status */ static void initDummyData(void) { @@ -1436,7 +1474,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in flag |= 8; sc = status_get_sc(target); - if( hp && battle_config.invincible_nodamage && src && sc && sc->data[SC_INVINCIBLE] && !sc->data[SC_INVINCIBLEOFF] ) + if( hp && battle_config.invincible_nodamage && src && sc && sc->getSCE(SC_INVINCIBLE) && !sc->getSCE(SC_INVINCIBLEOFF) ) hp = 1; if( hp && !(flag&1) ) { @@ -1446,7 +1484,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in for (const auto &it : status_db) { sc_type type = static_cast(it.first); - if (sc->data[type] && it.second->flag[SCF_REMOVEONDAMAGED]) { + if (sc->getSCE(type) && it.second->flag[SCF_REMOVEONDAMAGED]) { // A status change that gets broken by damage should still be considered when calculating if a status change can be applied or not (for the same attack). // !TODO: This is a temporary solution until we refactor the code so that the calculation of an SC is done at the start of an attack rather than after the damage was applied. if (sc->opt1 > OPT1_NONE && sc->lastEffectTimer == INVALID_TIMER) { @@ -1456,7 +1494,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in status_change_end(target, type); } } - if ((sce=sc->data[SC_ENDURE]) && !sce->val4) { + if ((sce=sc->getSCE(SC_ENDURE)) && !sce->val4) { /** [Skotlex] * Endure count is only reduced by non-players on non-gvg maps. * val4 signals infinite endure. @@ -1465,7 +1503,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in status_change_end(target, SC_ENDURE); } #ifndef RENEWAL - if ((sce=sc->data[SC_GRAVITATION]) && sce->val3 == BCT_SELF) { + if ((sce=sc->getSCE(SC_GRAVITATION)) && sce->val3 == BCT_SELF) { std::shared_ptr sg = skill_id2group(sce->val4); if (sg) { @@ -1475,11 +1513,11 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in } } #endif - if(sc->data[SC_DANCING] && (unsigned int)hp > status->max_hp>>2) + if(sc->getSCE(SC_DANCING) && (unsigned int)hp > status->max_hp>>2) status_change_end(target, SC_DANCING); - if(sc->data[SC_CLOAKINGEXCEED] && --(sc->data[SC_CLOAKINGEXCEED]->val2) <= 0) + if(sc->getSCE(SC_CLOAKINGEXCEED) && --(sc->getSCE(SC_CLOAKINGEXCEED)->val2) <= 0) status_change_end(target, SC_CLOAKINGEXCEED); - if(sc->data[SC_KAGEMUSYA] && --(sc->data[SC_KAGEMUSYA]->val3) <= 0) + if(sc->getSCE(SC_KAGEMUSYA) && --(sc->getSCE(SC_KAGEMUSYA)->val3) <= 0) status_change_end(target, SC_KAGEMUSYA); } @@ -1493,15 +1531,15 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in status->ap-= ap; if (sc && hp && status->hp) { - if (sc->data[SC_AUTOBERSERK] && - (!sc->data[SC_PROVOKE] || !sc->data[SC_PROVOKE]->val4) && + if (sc->getSCE(SC_AUTOBERSERK) && + (!sc->getSCE(SC_PROVOKE) || !sc->getSCE(SC_PROVOKE)->val4) && status->hp < status->max_hp>>2) sc_start4(src,target,SC_PROVOKE,100,10,0,0,1,0); - if (sc->data[SC_BERSERK] && status->hp <= 100) + if (sc->getSCE(SC_BERSERK) && status->hp <= 100) status_change_end(target, SC_BERSERK); - if( sc->data[SC_RAISINGDRAGON] && status->hp <= 1000 ) + if( sc->getSCE(SC_RAISINGDRAGON) && status->hp <= 1000 ) status_change_end(target, SC_RAISINGDRAGON); - if (sc->data[SC_SATURDAYNIGHTFEVER] && status->hp <= 100) + if (sc->getSCE(SC_SATURDAYNIGHTFEVER) && status->hp <= 100) status_change_end(target, SC_SATURDAYNIGHTFEVER); } @@ -1561,13 +1599,13 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in } } - if( sc && sc->data[SC_KAIZEL] && !map_flag_gvg2(target->m) ) { // flag&8 = disable Kaizel - int time = skill_get_time2(SL_KAIZEL,sc->data[SC_KAIZEL]->val1); + if( sc && sc->getSCE(SC_KAIZEL) && !map_flag_gvg2(target->m) ) { // flag&8 = disable Kaizel + int time = skill_get_time2(SL_KAIZEL,sc->getSCE(SC_KAIZEL)->val1); // Look for Osiris Card's bonus effect on the character and revive 100% or revive normally if ( target->type == BL_PC && BL_CAST(BL_PC,target)->special_state.restart_full_recover ) status_revive(target, 100, 100); else - status_revive(target, sc->data[SC_KAIZEL]->val2, 0); + status_revive(target, sc->getSCE(SC_KAIZEL)->val2, 0); status_change_clear(target,0); clif_skill_nodamage(target,target,ALL_RESURRECTION,1,1); sc_start(src,target,SC_KYRIE,100,10,time); @@ -1579,7 +1617,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in } // Disable Ultimate Sacrifice on GVG maps - if (sc && sc->data[SC_ULTIMATE_S] && !map_flag_gvg2(target->m)) { + if (sc && sc->getSCE(SC_ULTIMATE_S) && !map_flag_gvg2(target->m)) { status_revive(target, 100, 100); status_change_clear(target, 0); clif_skill_nodamage(target, target, ALL_RESURRECTION, 1, 1); @@ -1590,8 +1628,8 @@ int status_damage(struct block_list *src,struct block_list *target,int64 dhp, in return (int)(hp+sp+ap); } - if (target->type == BL_MOB && sc && sc->data[SC_REBIRTH] && !((TBL_MOB*) target)->state.rebirth) { // Ensure the monster has not already rebirthed before doing so. - status_revive(target, sc->data[SC_REBIRTH]->val2, 0); + if (target->type == BL_MOB && sc && sc->getSCE(SC_REBIRTH) && !((TBL_MOB*) target)->state.rebirth) { // Ensure the monster has not already rebirthed before doing so. + status_revive(target, sc->getSCE(SC_REBIRTH)->val2, 0); status_change_clear(target,0); ((TBL_MOB*)target)->state.rebirth = 1; @@ -1667,7 +1705,7 @@ int status_heal(struct block_list *bl,int64 hhp,int64 hsp, int64 hap, int flag) } if(hp) { - if( sc && (sc->data[SC_BERSERK]) ) { + if( sc && (sc->getSCE(SC_BERSERK)) ) { if( flag&1 ) flag &= ~2; else @@ -1710,9 +1748,9 @@ int status_heal(struct block_list *bl,int64 hhp,int64 hsp, int64 hap, int flag) status->ap += ap; if(hp && sc && - sc->data[SC_AUTOBERSERK] && - sc->data[SC_PROVOKE] && - sc->data[SC_PROVOKE]->val4==1 && + sc->getSCE(SC_AUTOBERSERK) && + sc->getSCE(SC_PROVOKE) && + sc->getSCE(SC_PROVOKE)->val4==1 && status->hp>=status->max_hp>>2 ) // End auto berserk. status_change_end(bl, SC_PROVOKE); @@ -1938,12 +1976,12 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui sc = status_get_sc(src); if( sc && sc->count ) { - if (sc->data[SC_ALL_RIDING]) + if (sc->getSCE(SC_ALL_RIDING)) return false; //You can't use skills while in the new mounts (The client doesn't let you, this is to make cheat-safe) if (flag == 1 && !status_has_mode(status,MD_STATUSIMMUNE) && ( // Applies to after cast completion only and doesn't apply to Boss monsters. - (sc->data[SC_ASH] && rnd()%2) || // Volcanic Ash has a 50% chance of causing skills to fail. - (sc->data[SC_KYOMU] && rnd()%100 < 25) // Kyomu has a 25% chance of causing skills fail. + (sc->getSCE(SC_ASH) && rnd()%2) || // Volcanic Ash has a 50% chance of causing skills to fail. + (sc->getSCE(SC_KYOMU) && rnd()%100 < 25) // Kyomu has a 25% chance of causing skills fail. )) { if (src->type == BL_PC) clif_skill_fail((TBL_PC*)src,skill_id,USESKILL_FAIL_LEVEL,0); @@ -1958,15 +1996,15 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui } if ( - (sc->data[SC_TRICKDEAD] && skill_id != NV_TRICKDEAD) - || (sc->data[SC_AUTOCOUNTER] && !flag && skill_id) - || (sc->data[SC_GOSPEL] && sc->data[SC_GOSPEL]->val4 == BCT_SELF && skill_id != PA_GOSPEL) - || (sc->data[SC_SUHIDE] && skill_id != SU_HIDE) + (sc->getSCE(SC_TRICKDEAD) && skill_id != NV_TRICKDEAD) + || (sc->getSCE(SC_AUTOCOUNTER) && !flag && skill_id) + || (sc->getSCE(SC_GOSPEL) && sc->getSCE(SC_GOSPEL)->val4 == BCT_SELF && skill_id != PA_GOSPEL) + || (sc->getSCE(SC_SUHIDE) && skill_id != SU_HIDE) ) return false; - if (sc->data[SC_WINKCHARM] && target && !flag) { // Prevents skill usage - block_list *wink_target = map_id2bl(sc->data[SC_WINKCHARM]->val2); + if (sc->getSCE(SC_WINKCHARM) && target && !flag) { // Prevents skill usage + block_list *wink_target = map_id2bl(sc->getSCE(SC_WINKCHARM)->val2); if (wink_target != nullptr) { unit_data *wink_ud = unit_bl2ud(src); @@ -1977,8 +2015,8 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui status_change_end(src, SC_WINKCHARM); } - if (sc->data[SC_BLADESTOP]) { - switch (sc->data[SC_BLADESTOP]->val1) { + if (sc->getSCE(SC_BLADESTOP)) { + switch (sc->getSCE(SC_BLADESTOP)->val1) { case 5: if (skill_id == MO_EXTREMITYFIST) break; case 4: if (skill_id == MO_CHAINCOMBO) break; case 3: if (skill_id == MO_INVESTIGATE) break; @@ -1987,7 +2025,7 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui } } - if (sc->data[SC_DANCING] && flag!=2) { + if (sc->getSCE(SC_DANCING) && flag!=2) { std::shared_ptr skill = skill_db.find(skill_id); if (!skill) @@ -1999,14 +2037,14 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui if( pc_checkskill((TBL_PC*)src,WM_LESSON) < 5 ) return false; #ifndef RENEWAL - } else if(sc->data[SC_LONGING]) { // Allow everything except dancing/re-dancing. [Skotlex] + } else if(sc->getSCE(SC_LONGING)) { // Allow everything except dancing/re-dancing. [Skotlex] if (skill_id == BD_ENCORE || skill->inf2[INF2_ISSONG] || skill->inf2[INF2_ISENSEMBLE]) return false; #endif } else if(!skill->inf2[INF2_ALLOWWHENPERFORMING]) // Skills that can be used in dancing state return false; #ifndef RENEWAL - if ((sc->data[SC_DANCING]->val1&0xFFFF) == CG_HERMODE && skill_id == BD_ADAPTATION) + if ((sc->getSCE(SC_DANCING)->val1&0xFFFF) == CG_HERMODE && skill_id == BD_ADAPTATION) return false; // Can't amp out of Wand of Hermode :/ [Skotlex] #endif } @@ -2017,30 +2055,30 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui if (!flag && ( // Blocked only from using the skill (stuff like autospell may still go through ( sc->cant.cast && skill_id != RK_REFRESH && skill_id != SU_GROOMING && skill_id != SR_GENTLETOUCH_CURE ) || #ifndef RENEWAL - (sc->data[SC_BASILICA] && (sc->data[SC_BASILICA]->val4 != src->id || skill_id != HP_BASILICA)) || // Only Basilica caster that can cast, and only Basilica to cancel it + (sc->getSCE(SC_BASILICA) && (sc->getSCE(SC_BASILICA)->val4 != src->id || skill_id != HP_BASILICA)) || // Only Basilica caster that can cast, and only Basilica to cancel it #endif - (sc->data[SC_MARIONETTE] && skill_id != CG_MARIONETTE) || // Only skill you can use is marionette again to cancel it - (sc->data[SC_MARIONETTE2] && skill_id == CG_MARIONETTE) || // Cannot use marionette if you are being buffed by another - (sc->data[SC_ANKLE] && skill_block_check(src, SC_ANKLE, skill_id)) || - (sc->data[SC_STASIS] && skill_block_check(src, SC_STASIS, skill_id)) || - (sc->data[SC_BITE] && skill_block_check(src, SC_BITE, skill_id)) || - (sc->data[SC_NOVAEXPLOSING] && skill_block_check(src, SC_NOVAEXPLOSING, skill_id)) || - (sc->data[SC_GRAVITYCONTROL] && skill_block_check(src, SC_GRAVITYCONTROL, skill_id)) || - (sc->data[SC_KAGEHUMI] && skill_block_check(src, SC_KAGEHUMI, skill_id)) + (sc->getSCE(SC_MARIONETTE) && skill_id != CG_MARIONETTE) || // Only skill you can use is marionette again to cancel it + (sc->getSCE(SC_MARIONETTE2) && skill_id == CG_MARIONETTE) || // Cannot use marionette if you are being buffed by another + (sc->getSCE(SC_ANKLE) && skill_block_check(src, SC_ANKLE, skill_id)) || + (sc->getSCE(SC_STASIS) && skill_block_check(src, SC_STASIS, skill_id)) || + (sc->getSCE(SC_BITE) && skill_block_check(src, SC_BITE, skill_id)) || + (sc->getSCE(SC_NOVAEXPLOSING) && skill_block_check(src, SC_NOVAEXPLOSING, skill_id)) || + (sc->getSCE(SC_GRAVITYCONTROL) && skill_block_check(src, SC_GRAVITYCONTROL, skill_id)) || + (sc->getSCE(SC_KAGEHUMI) && skill_block_check(src, SC_KAGEHUMI, skill_id)) #ifdef RENEWAL - || (sc->data[SC_ENSEMBLEFATIGUE] && skill_id != CG_SPECIALSINGER) + || (sc->getSCE(SC_ENSEMBLEFATIGUE) && skill_id != CG_SPECIALSINGER) #endif )) return false; // Skill blocking. if ( - (sc->data[SC_VOLCANO] && skill_id == WZ_ICEWALL) || + (sc->getSCE(SC_VOLCANO) && skill_id == WZ_ICEWALL) || #ifndef RENEWAL - (sc->data[SC_ROKISWEIL] && skill_id != BD_ADAPTATION) || + (sc->getSCE(SC_ROKISWEIL) && skill_id != BD_ADAPTATION) || #endif - (sc->data[SC_HERMODE] && skill_get_inf(skill_id) & INF_SUPPORT_SKILL) || - (sc->data[SC_NOCHAT] && sc->data[SC_NOCHAT]->val1&MANNER_NOSKILL) + (sc->getSCE(SC_HERMODE) && skill_get_inf(skill_id) & INF_SUPPORT_SKILL) || + (sc->getSCE(SC_NOCHAT) && sc->getSCE(SC_NOCHAT)->val1&MANNER_NOSKILL) ) return false; } @@ -2065,16 +2103,16 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui * Attacks in invincible are capped to 1 damage and handled in battle.cpp. * Allow spell break and eske for sealed shrine GDB when in INVINCIBLE state. **/ - if( tsc->data[SC_INVINCIBLE] && !tsc->data[SC_INVINCIBLEOFF] && skill_id && !(skill_id&(SA_SPELLBREAKER|SL_SKE)) ) + if( tsc->getSCE(SC_INVINCIBLE) && !tsc->getSCE(SC_INVINCIBLEOFF) && skill_id && !(skill_id&(SA_SPELLBREAKER|SL_SKE)) ) return false; - if(!skill_id && tsc->data[SC_TRICKDEAD]) + if(!skill_id && tsc->getSCE(SC_TRICKDEAD)) return false; if((skill_id == WZ_STORMGUST || skill_id == WZ_FROSTNOVA || skill_id == NJ_HYOUSYOURAKU || skill_id == NPC_STORMGUST2) - && tsc->data[SC_FREEZE]) + && tsc->getSCE(SC_FREEZE)) return false; - if(skill_id == PR_LEXAETERNA && (tsc->data[SC_FREEZE] || tsc->data[SC_STONE])) + if(skill_id == PR_LEXAETERNA && (tsc->getSCE(SC_FREEZE) || tsc->getSCE(SC_STONE))) return false; - if (tsc->data[SC__MANHOLE] && !skill_get_inf2(skill_id, INF2_TARGETMANHOLE)) + if (tsc->getSCE(SC__MANHOLE) && !skill_get_inf2(skill_id, INF2_TARGETMANHOLE)) return false; } @@ -2096,11 +2134,11 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui if (tsc) { if ((tsc->option&hide_flag) && !is_boss && (tsd->special_state.perfect_hiding || !is_detect)) return false; - if ((tsc->data[SC_CLOAKINGEXCEED] || tsc->data[SC_NEWMOON]) && !is_boss && (tsd->special_state.perfect_hiding || is_detect)) + if ((tsc->getSCE(SC_CLOAKINGEXCEED) || tsc->getSCE(SC_NEWMOON)) && !is_boss && (tsd->special_state.perfect_hiding || is_detect)) return false; // Works against insect and demon but not against bosses - if (tsc->data[SC__FEINTBOMB] && (is_boss || is_detect)) + if (tsc->getSCE(SC__FEINTBOMB) && (is_boss || is_detect)) return false; // Works against all - if ((tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_STEALTHFIELD] || tsc->data[SC_SUHIDE]) && !(is_boss || is_detect) && (!skill_id || (!flag && src))) + if ((tsc->getSCE(SC_CAMOUFLAGE) || tsc->getSCE(SC_STEALTHFIELD) || tsc->getSCE(SC_SUHIDE)) && !(is_boss || is_detect) && (!skill_id || (!flag && src))) return false; // Insect, demon, and boss can detect } } @@ -2119,7 +2157,7 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui return false; // Can't use Weapon endow skills on Mercenary (only Master) if( skill_id == AM_POTIONPITCHER && ( target->type == BL_MER || target->type == BL_ELEM) ) return false; // Can't use Potion Pitcher on Mercenaries - if (tsc && tsc->data[SC_ELEMENTAL_VEIL] && !(src && status_get_class_(src) == CLASS_BOSS) && !status_has_mode(status, MD_DETECTOR)) + if (tsc && tsc->getSCE(SC_ELEMENTAL_VEIL) && !(src && status_get_class_(src) == CLASS_BOSS) && !status_has_mode(status, MD_DETECTOR)) return false; default: // Check for chase-walk/hiding/cloaking opponents. @@ -2168,20 +2206,20 @@ int status_check_visibility(struct block_list *src, struct block_list *target) case BL_PC: { struct map_session_data *tsd = (TBL_PC*)target; - if (((tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK)) || tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_STEALTHFIELD] || tsc->data[SC_SUHIDE]) && !is_boss && (tsd->special_state.perfect_hiding || !is_detector)) + if (((tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK)) || tsc->getSCE(SC_CAMOUFLAGE) || tsc->getSCE(SC_STEALTHFIELD) || tsc->getSCE(SC_SUHIDE)) && !is_boss && (tsd->special_state.perfect_hiding || !is_detector)) return 0; - if ((tsc->data[SC_CLOAKINGEXCEED] || tsc->data[SC_NEWMOON]) && !is_boss && ((tsd && tsd->special_state.perfect_hiding) || is_detector)) + if ((tsc->getSCE(SC_CLOAKINGEXCEED) || tsc->getSCE(SC_NEWMOON)) && !is_boss && ((tsd && tsd->special_state.perfect_hiding) || is_detector)) return 0; - if (tsc->data[SC__FEINTBOMB] && !is_boss && !is_detector) + if (tsc->getSCE(SC__FEINTBOMB) && !is_boss && !is_detector) return 0; } break; case BL_ELEM: - if (tsc->data[SC_ELEMENTAL_VEIL] && !is_boss && !is_detector) + if (tsc->getSCE(SC_ELEMENTAL_VEIL) && !is_boss && !is_detector) return 0; break; default: - if (((tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK)) || tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_STEALTHFIELD] || tsc->data[SC_SUHIDE]) && !is_boss && !is_detector) + if (((tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK)) || tsc->getSCE(SC_CAMOUFLAGE) || tsc->getSCE(SC_STEALTHFIELD) || tsc->getSCE(SC_SUHIDE)) && !is_boss && !is_detector) return 0; } } @@ -3004,29 +3042,29 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) { //Bonus by SC if (sc) { - if(sc->data[SC_INCMHP]) - bonus += sc->data[SC_INCMHP]->val1; - if(sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 2) + if(sc->getSCE(SC_INCMHP)) + bonus += sc->getSCE(SC_INCMHP)->val1; + if(sc->getSCE(SC_EARTH_INSIGNIA) && sc->getSCE(SC_EARTH_INSIGNIA)->val1 == 2) bonus += 500; - if (sc->data[SC_PROMOTE_HEALTH_RESERCH]) - bonus += sc->data[SC_PROMOTE_HEALTH_RESERCH]->val3; - if(sc->data[SC_SOLID_SKIN_OPTION]) + if (sc->getSCE(SC_PROMOTE_HEALTH_RESERCH)) + bonus += sc->getSCE(SC_PROMOTE_HEALTH_RESERCH)->val3; + if(sc->getSCE(SC_SOLID_SKIN_OPTION)) bonus += 2000; - if(sc->data[SC_MARIONETTE]) + if(sc->getSCE(SC_MARIONETTE)) bonus -= 1000; - if(sc->data[SC_SWORDCLAN]) + if(sc->getSCE(SC_SWORDCLAN)) bonus += 30; - if(sc->data[SC_ARCWANDCLAN]) + if(sc->getSCE(SC_ARCWANDCLAN)) bonus += 30; - if(sc->data[SC_GOLDENMACECLAN]) + if(sc->getSCE(SC_GOLDENMACECLAN)) bonus += 30; - if(sc->data[SC_CROSSBOWCLAN]) + if(sc->getSCE(SC_CROSSBOWCLAN)) bonus += 30; - if(sc->data[SC_GLASTHEIM_HPSP]) - bonus += sc->data[SC_GLASTHEIM_HPSP]->val1; + if(sc->getSCE(SC_GLASTHEIM_HPSP)) + bonus += sc->getSCE(SC_GLASTHEIM_HPSP)->val1; #ifdef RENEWAL - if (sc->data[SC_ANGELUS]) - bonus += sc->data[SC_ANGELUS]->val1 * 50; + if (sc->getSCE(SC_ANGELUS)) + bonus += sc->getSCE(SC_ANGELUS)->val1 * 50; #endif } } else if (type == STATUS_BONUS_RATE) { @@ -3035,73 +3073,73 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) { //Bonus by SC if (sc) { //Increasing - if(sc->data[SC_INCMHPRATE]) - bonus += sc->data[SC_INCMHPRATE]->val1; - if(sc->data[SC_APPLEIDUN]) - bonus += sc->data[SC_APPLEIDUN]->val2; - if(sc->data[SC_DELUGE]) - bonus += sc->data[SC_DELUGE]->val2; - if(sc->data[SC_BERSERK]) + if(sc->getSCE(SC_INCMHPRATE)) + bonus += sc->getSCE(SC_INCMHPRATE)->val1; + if(sc->getSCE(SC_APPLEIDUN)) + bonus += sc->getSCE(SC_APPLEIDUN)->val2; + if(sc->getSCE(SC_DELUGE)) + bonus += sc->getSCE(SC_DELUGE)->val2; + if(sc->getSCE(SC_BERSERK)) bonus += 200; //+200% - if(sc->data[SC_MERC_HPUP]) - bonus += sc->data[SC_MERC_HPUP]->val2; - if(sc->data[SC_EPICLESIS]) - bonus += sc->data[SC_EPICLESIS]->val2; - if(sc->data[SC_FRIGG_SONG]) - bonus += sc->data[SC_FRIGG_SONG]->val2; - if(sc->data[SC_LERADSDEW]) - bonus += sc->data[SC_LERADSDEW]->val3; - if(sc->data[SC_FORCEOFVANGUARD]) - bonus += (3 * sc->data[SC_FORCEOFVANGUARD]->val1); - if(sc->data[SC_INSPIRATION]) - bonus += (4 * sc->data[SC_INSPIRATION]->val1); - if(sc->data[SC_RAISINGDRAGON]) - bonus += sc->data[SC_RAISINGDRAGON]->val1; - if(sc->data[SC_GT_REVITALIZE]) - bonus += sc->data[SC_GT_REVITALIZE]->val2; - if(sc->data[SC_ANGRIFFS_MODUS]) - bonus += (5 * sc->data[SC_ANGRIFFS_MODUS]->val1); - if(sc->data[SC_PETROLOGY_OPTION]) - bonus += sc->data[SC_PETROLOGY_OPTION]->val2; - if(sc->data[SC_POWER_OF_GAIA]) - bonus += sc->data[SC_POWER_OF_GAIA]->val3; - if(sc->data[SC_CURSED_SOIL_OPTION]) - bonus += sc->data[SC_CURSED_SOIL_OPTION]->val2; - if(sc->data[SC_UPHEAVAL_OPTION]) - bonus += sc->data[SC_UPHEAVAL_OPTION]->val2; - if(sc->data[SC_LAUDAAGNUS]) - bonus += 2 + (sc->data[SC_LAUDAAGNUS]->val1 * 2); + if(sc->getSCE(SC_MERC_HPUP)) + bonus += sc->getSCE(SC_MERC_HPUP)->val2; + if(sc->getSCE(SC_EPICLESIS)) + bonus += sc->getSCE(SC_EPICLESIS)->val2; + if(sc->getSCE(SC_FRIGG_SONG)) + bonus += sc->getSCE(SC_FRIGG_SONG)->val2; + if(sc->getSCE(SC_LERADSDEW)) + bonus += sc->getSCE(SC_LERADSDEW)->val3; + if(sc->getSCE(SC_FORCEOFVANGUARD)) + bonus += (3 * sc->getSCE(SC_FORCEOFVANGUARD)->val1); + if(sc->getSCE(SC_INSPIRATION)) + bonus += (4 * sc->getSCE(SC_INSPIRATION)->val1); + if(sc->getSCE(SC_RAISINGDRAGON)) + bonus += sc->getSCE(SC_RAISINGDRAGON)->val1; + if(sc->getSCE(SC_GT_REVITALIZE)) + bonus += sc->getSCE(SC_GT_REVITALIZE)->val2; + if(sc->getSCE(SC_ANGRIFFS_MODUS)) + bonus += (5 * sc->getSCE(SC_ANGRIFFS_MODUS)->val1); + if(sc->getSCE(SC_PETROLOGY_OPTION)) + bonus += sc->getSCE(SC_PETROLOGY_OPTION)->val2; + if(sc->getSCE(SC_POWER_OF_GAIA)) + bonus += sc->getSCE(SC_POWER_OF_GAIA)->val3; + if(sc->getSCE(SC_CURSED_SOIL_OPTION)) + bonus += sc->getSCE(SC_CURSED_SOIL_OPTION)->val2; + if(sc->getSCE(SC_UPHEAVAL_OPTION)) + bonus += sc->getSCE(SC_UPHEAVAL_OPTION)->val2; + if(sc->getSCE(SC_LAUDAAGNUS)) + bonus += 2 + (sc->getSCE(SC_LAUDAAGNUS)->val1 * 2); #ifdef RENEWAL - if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_HPRATE) + if (sc->getSCE(SC_NIBELUNGEN) && sc->getSCE(SC_NIBELUNGEN)->val2 == RINGNBL_HPRATE) bonus += 30; #endif - if(sc->data[SC_LUNARSTANCE]) - bonus += sc->data[SC_LUNARSTANCE]->val2; - if (sc->data[SC_LUXANIMA]) - bonus += sc->data[SC_LUXANIMA]->val3; - if (sc->data[SC_MTF_MHP]) - bonus += sc->data[SC_MTF_MHP]->val1; - if (sc->data[SC_FIRM_FAITH]) - bonus += sc->data[SC_FIRM_FAITH]->val2; + if(sc->getSCE(SC_LUNARSTANCE)) + bonus += sc->getSCE(SC_LUNARSTANCE)->val2; + if (sc->getSCE(SC_LUXANIMA)) + bonus += sc->getSCE(SC_LUXANIMA)->val3; + if (sc->getSCE(SC_MTF_MHP)) + bonus += sc->getSCE(SC_MTF_MHP)->val1; + if (sc->getSCE(SC_FIRM_FAITH)) + bonus += sc->getSCE(SC_FIRM_FAITH)->val2; //Decreasing - if (sc->data[SC_VENOMBLEED] && sc->data[SC_VENOMBLEED]->val3 == 1) + if (sc->getSCE(SC_VENOMBLEED) && sc->getSCE(SC_VENOMBLEED)->val3 == 1) bonus -= 15; - if(sc->data[SC_BEYONDOFWARCRY]) - bonus -= sc->data[SC_BEYONDOFWARCRY]->val3; - if(sc->data[SC__WEAKNESS]) - bonus -= sc->data[SC__WEAKNESS]->val2; - if(sc->data[SC_EQC]) - bonus -= sc->data[SC_EQC]->val3; - if(sc->data[SC_PACKING_ENVELOPE3]) - bonus += sc->data[SC_PACKING_ENVELOPE3]->val1; - if(sc->data[SC_2011RWC_SCROLL]) + if(sc->getSCE(SC_BEYONDOFWARCRY)) + bonus -= sc->getSCE(SC_BEYONDOFWARCRY)->val3; + if(sc->getSCE(SC__WEAKNESS)) + bonus -= sc->getSCE(SC__WEAKNESS)->val2; + if(sc->getSCE(SC_EQC)) + bonus -= sc->getSCE(SC_EQC)->val3; + if(sc->getSCE(SC_PACKING_ENVELOPE3)) + bonus += sc->getSCE(SC_PACKING_ENVELOPE3)->val1; + if(sc->getSCE(SC_2011RWC_SCROLL)) bonus -= 10; - if(sc->data[SC_INFINITY_DRINK]) + if(sc->getSCE(SC_INFINITY_DRINK)) bonus += 5; - if(sc->data[SC_COMBAT_PILL]) + if(sc->getSCE(SC_COMBAT_PILL)) bonus -= 3; - if(sc->data[SC_COMBAT_PILL2]) + if(sc->getSCE(SC_COMBAT_PILL2)) bonus -= 5; } // Max rate reduce is -100% @@ -3132,13 +3170,13 @@ static int status_get_hpbonus_item(block_list *bl) { //Bonus by SC if (sc) { - if (sc->data[SC_INCREASE_MAXHP]) - bonus += sc->data[SC_INCREASE_MAXHP]->val1; - if (sc->data[SC_MUSTLE_M]) - bonus += sc->data[SC_MUSTLE_M]->val1; + if (sc->getSCE(SC_INCREASE_MAXHP)) + bonus += sc->getSCE(SC_INCREASE_MAXHP)->val1; + if (sc->getSCE(SC_MUSTLE_M)) + bonus += sc->getSCE(SC_MUSTLE_M)->val1; - if (sc->data[SC_MYSTERIOUS_POWDER]) - bonus -= sc->data[SC_MYSTERIOUS_POWDER]->val1; + if (sc->getSCE(SC_MYSTERIOUS_POWDER)) + bonus -= sc->getSCE(SC_MYSTERIOUS_POWDER)->val1; } // Max rate reduce is -100% @@ -3185,20 +3223,20 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) { //Bonus by SC if (sc) { - if(sc->data[SC_INCMSP]) - bonus += sc->data[SC_INCMSP]->val1; - if(sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 3) + if(sc->getSCE(SC_INCMSP)) + bonus += sc->getSCE(SC_INCMSP)->val1; + if(sc->getSCE(SC_EARTH_INSIGNIA) && sc->getSCE(SC_EARTH_INSIGNIA)->val1 == 3) bonus += 50; - if(sc->data[SC_SWORDCLAN]) + if(sc->getSCE(SC_SWORDCLAN)) bonus += 10; - if(sc->data[SC_ARCWANDCLAN]) + if(sc->getSCE(SC_ARCWANDCLAN)) bonus += 10; - if(sc->data[SC_GOLDENMACECLAN]) + if(sc->getSCE(SC_GOLDENMACECLAN)) bonus += 10; - if(sc->data[SC_CROSSBOWCLAN]) + if(sc->getSCE(SC_CROSSBOWCLAN)) bonus += 10; - if(sc->data[SC_GLASTHEIM_HPSP]) - bonus += sc->data[SC_GLASTHEIM_HPSP]->val2; + if(sc->getSCE(SC_GLASTHEIM_HPSP)) + bonus += sc->getSCE(SC_GLASTHEIM_HPSP)->val2; } } else if (type == STATUS_BONUS_RATE) { struct status_change *sc = status_get_sc(bl); @@ -3215,7 +3253,7 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) { #ifdef RENEWAL if ((i = pc_checkskill(sd, (sd->status.sex ? BA_MUSICALLESSON : DC_DANCINGLESSON))) > 0) bonus += i; - if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_SPRATE) + if (sc->getSCE(SC_NIBELUNGEN) && sc->getSCE(SC_NIBELUNGEN)->val2 == RINGNBL_SPRATE) bonus += 30; #endif } @@ -3223,33 +3261,33 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) { //Bonus by SC if (sc) { //Increasing - if(sc->data[SC_INCMSPRATE]) - bonus += sc->data[SC_INCMSPRATE]->val1; - if(sc->data[SC_RAISINGDRAGON]) - bonus += sc->data[SC_RAISINGDRAGON]->val1; - if(sc->data[SC_SERVICE4U]) - bonus += sc->data[SC_SERVICE4U]->val2; - if(sc->data[SC_MERC_SPUP]) - bonus += sc->data[SC_MERC_SPUP]->val2; - if (sc->data[SC_LUXANIMA]) - bonus += sc->data[SC_LUXANIMA]->val3; - if (sc->data[SC_MTF_MSP]) - bonus += sc->data[SC_MTF_MSP]->val1; - if(sc->data[SC_PACKING_ENVELOPE4]) - bonus += sc->data[SC_PACKING_ENVELOPE4]->val1; + if(sc->getSCE(SC_INCMSPRATE)) + bonus += sc->getSCE(SC_INCMSPRATE)->val1; + if(sc->getSCE(SC_RAISINGDRAGON)) + bonus += sc->getSCE(SC_RAISINGDRAGON)->val1; + if(sc->getSCE(SC_SERVICE4U)) + bonus += sc->getSCE(SC_SERVICE4U)->val2; + if(sc->getSCE(SC_MERC_SPUP)) + bonus += sc->getSCE(SC_MERC_SPUP)->val2; + if (sc->getSCE(SC_LUXANIMA)) + bonus += sc->getSCE(SC_LUXANIMA)->val3; + if (sc->getSCE(SC_MTF_MSP)) + bonus += sc->getSCE(SC_MTF_MSP)->val1; + if(sc->getSCE(SC_PACKING_ENVELOPE4)) + bonus += sc->getSCE(SC_PACKING_ENVELOPE4)->val1; //Decreasing - if (sc->data[SC_MELODYOFSINK]) - bonus -= sc->data[SC_MELODYOFSINK]->val3; - if (sc->data[SC_2011RWC_SCROLL]) + if (sc->getSCE(SC_MELODYOFSINK)) + bonus -= sc->getSCE(SC_MELODYOFSINK)->val3; + if (sc->getSCE(SC_2011RWC_SCROLL)) bonus -= 10; - if (sc->data[SC_INFINITY_DRINK]) + if (sc->getSCE(SC_INFINITY_DRINK)) bonus += 5; - if (sc->data[SC_MENTAL_POTION]) - bonus += sc->data[SC_MENTAL_POTION]->val1; - if(sc->data[SC_COMBAT_PILL]) + if (sc->getSCE(SC_MENTAL_POTION)) + bonus += sc->getSCE(SC_MENTAL_POTION)->val1; + if(sc->getSCE(SC_COMBAT_PILL)) bonus -= 3; - if(sc->data[SC_COMBAT_PILL2]) + if(sc->getSCE(SC_COMBAT_PILL2)) bonus -= 5; } // Max rate reduce is -100% @@ -3280,14 +3318,14 @@ static int status_get_spbonus_item(block_list *bl) { //Bonus by SC if (sc) { - if (sc->data[SC_INCREASE_MAXSP]) - bonus += sc->data[SC_INCREASE_MAXSP]->val1; - if (sc->data[SC_LIFE_FORCE_F]) - bonus += sc->data[SC_LIFE_FORCE_F]->val1; - if (sc->data[SC_VITATA_500]) - bonus += sc->data[SC_VITATA_500]->val2; - if (sc->data[SC_ENERGY_DRINK_RESERCH]) - bonus += sc->data[SC_ENERGY_DRINK_RESERCH]->val3; + if (sc->getSCE(SC_INCREASE_MAXSP)) + bonus += sc->getSCE(SC_INCREASE_MAXSP)->val1; + if (sc->getSCE(SC_LIFE_FORCE_F)) + bonus += sc->getSCE(SC_LIFE_FORCE_F)->val1; + if (sc->getSCE(SC_VITATA_500)) + bonus += sc->getSCE(SC_VITATA_500)->val2; + if (sc->getSCE(SC_ENERGY_DRINK_RESERCH)) + bonus += sc->getSCE(SC_ENERGY_DRINK_RESERCH)->val3; } // Max rate reduce is -100% @@ -3318,8 +3356,8 @@ static int status_get_apbonus(struct block_list *bl, enum e_status_bonus type) { //Bonus by SC if (sc) { - //if (sc->data[SC_NONE]) - // bonus += sc->data[SC_NONE]->val1; + //if (sc->getSCE(SC_NONE)) + // bonus += sc->getSCE(SC_NONE)->val1; } } else if (type == STATUS_BONUS_RATE) { struct status_change *sc = status_get_sc(bl); @@ -3335,8 +3373,8 @@ static int status_get_apbonus(struct block_list *bl, enum e_status_bonus type) { //Bonus by SC if (sc) { - //if (sc->data[SC_NONE]) - // bonus += sc->data[SC_NONE]->val1; + //if (sc->getSCE(SC_NONE)) + // bonus += sc->getSCE(SC_NONE)->val1; } // Max rate reduce is -100% bonus = cap_value(bonus, -100, INT_MAX); @@ -3370,8 +3408,8 @@ static int status_get_apbonus_item(block_list *bl) { //Bonus by SC if (sc) { - //if (sc->data[SC_NONE]) - // bonus += sc->data[SC_NONE]->val1; + //if (sc->getSCE(SC_NONE)) + // bonus += sc->getSCE(SC_NONE)->val1; } // Max rate reduce is -100% @@ -3485,8 +3523,8 @@ bool status_calc_weight(struct map_session_data *sd, enum e_status_calc_weight_o sd->max_weight += 10000; else if (pc_isridingdragon(sd)) sd->max_weight += 5000 + 2000 * pc_checkskill(sd, RK_DRAGONTRAINING); - if (sc->data[SC_KNOWLEDGE]) - sd->max_weight += sd->max_weight * sc->data[SC_KNOWLEDGE]->val1 / 10; + if (sc->getSCE(SC_KNOWLEDGE)) + sd->max_weight += sd->max_weight * sc->getSCE(SC_KNOWLEDGE)->val1 / 10; if ((skill = pc_checkskill(sd, ALL_INCCARRY)) > 0) sd->max_weight += 2000 * skill; if (pc_ismadogear(sd)) @@ -3559,7 +3597,7 @@ int status_calc_pc_sub(struct map_session_data* sd, uint8 opt) { static int calculating = 0; ///< Check for recursive call preemption. [Skotlex] struct status_data *base_status; ///< Pointer to the player's base status - const struct status_change *sc = &sd->sc; + struct status_change *sc = &sd->sc; struct s_skill b_skill[MAX_SKILL]; ///< Previous skill tree int i, skill, refinedef = 0; short index = -1; @@ -3988,8 +4026,8 @@ int status_calc_pc_sub(struct map_session_data* sd, uint8 opt) current_equip_opt_index = -1; } - if (sc->count && sc->data[SC_ITEMSCRIPT]) { - std::shared_ptr data = item_db.find(sc->data[SC_ITEMSCRIPT]->val1); + if (sc->count && sc->getSCE(SC_ITEMSCRIPT)) { + std::shared_ptr data = item_db.find(sc->getSCE(SC_ITEMSCRIPT)->val1); if (data && data->script) run_script(data->script, 0, sd->bl.id, 0); @@ -4107,9 +4145,9 @@ int status_calc_pc_sub(struct map_session_data* sd, uint8 opt) base_status->crt = cap_value(i, 0, USHRT_MAX); if (sd->special_state.no_walk_delay) { - if (sc->data[SC_ENDURE]) { - if (sc->data[SC_ENDURE]->val4) - sc->data[SC_ENDURE]->val4 = 0; + if (sc->getSCE(SC_ENDURE)) { + if (sc->getSCE(SC_ENDURE)->val4) + sc->getSCE(SC_ENDURE)->val4 = 0; status_change_end(&sd->bl, SC_ENDURE); } clif_status_load(&sd->bl, EFST_ENDURE, 1); @@ -4416,11 +4454,11 @@ int status_calc_pc_sub(struct map_session_data* sd, uint8 opt) if((skill=pc_checkskill(sd,HP_MANARECHARGE))>0 ) sd->dsprate -= 4*skill; - if(sc->data[SC_SERVICE4U]) - sd->dsprate -= sc->data[SC_SERVICE4U]->val3; + if(sc->getSCE(SC_SERVICE4U)) + sd->dsprate -= sc->getSCE(SC_SERVICE4U)->val3; - if(sc->data[SC_SPCOST_RATE]) - sd->dsprate -= sc->data[SC_SPCOST_RATE]->val1; + if(sc->getSCE(SC_SPCOST_RATE)) + sd->dsprate -= sc->getSCE(SC_SPCOST_RATE)->val1; // Underflow protections. if(sd->dsprate < 0) @@ -4546,12 +4584,12 @@ int status_calc_pc_sub(struct map_session_data* sd, uint8 opt) } if(sc->count) { - if(sc->data[SC_CONCENTRATE]) { // Update the card-bonus data - sc->data[SC_CONCENTRATE]->val3 = sd->indexed_bonus.param_bonus[1]; // Agi - sc->data[SC_CONCENTRATE]->val4 = sd->indexed_bonus.param_bonus[4]; // Dex + if(sc->getSCE(SC_CONCENTRATE)) { // Update the card-bonus data + sc->getSCE(SC_CONCENTRATE)->val3 = sd->indexed_bonus.param_bonus[1]; // Agi + sc->getSCE(SC_CONCENTRATE)->val4 = sd->indexed_bonus.param_bonus[4]; // Dex } - if(sc->data[SC_SIEGFRIED]) { - i = sc->data[SC_SIEGFRIED]->val2; + if(sc->getSCE(SC_SIEGFRIED)) { + i = sc->getSCE(SC_SIEGFRIED)->val2; sd->indexed_bonus.subele[ELE_WATER] += i; sd->indexed_bonus.subele[ELE_EARTH] += i; sd->indexed_bonus.subele[ELE_FIRE] += i; @@ -4565,221 +4603,221 @@ int status_calc_pc_sub(struct map_session_data* sd, uint8 opt) #endif } #ifdef RENEWAL - if (sc->data[SC_BASILICA]) { - i = sc->data[SC_BASILICA]->val1 * 5; + if (sc->getSCE(SC_BASILICA)) { + i = sc->getSCE(SC_BASILICA)->val1 * 5; sd->right_weapon.addele[ELE_DARK] += i; sd->right_weapon.addele[ELE_UNDEAD] += i; sd->left_weapon.addele[ELE_DARK] += i; sd->left_weapon.addele[ELE_UNDEAD] += i; - sd->indexed_bonus.magic_atk_ele[ELE_HOLY] += sc->data[SC_BASILICA]->val1 * 3; + sd->indexed_bonus.magic_atk_ele[ELE_HOLY] += sc->getSCE(SC_BASILICA)->val1 * 3; } - if (sc->data[SC_FIREWEAPON]) - sd->indexed_bonus.magic_atk_ele[ELE_FIRE] += sc->data[SC_FIREWEAPON]->val1; - if (sc->data[SC_WINDWEAPON]) - sd->indexed_bonus.magic_atk_ele[ELE_WIND] += sc->data[SC_WINDWEAPON]->val1; - if (sc->data[SC_WATERWEAPON]) - sd->indexed_bonus.magic_atk_ele[ELE_WATER] += sc->data[SC_WATERWEAPON]->val1; - if (sc->data[SC_EARTHWEAPON]) - sd->indexed_bonus.magic_atk_ele[ELE_EARTH] += sc->data[SC_EARTHWEAPON]->val1; + if (sc->getSCE(SC_FIREWEAPON)) + sd->indexed_bonus.magic_atk_ele[ELE_FIRE] += sc->getSCE(SC_FIREWEAPON)->val1; + if (sc->getSCE(SC_WINDWEAPON)) + sd->indexed_bonus.magic_atk_ele[ELE_WIND] += sc->getSCE(SC_WINDWEAPON)->val1; + if (sc->getSCE(SC_WATERWEAPON)) + sd->indexed_bonus.magic_atk_ele[ELE_WATER] += sc->getSCE(SC_WATERWEAPON)->val1; + if (sc->getSCE(SC_EARTHWEAPON)) + sd->indexed_bonus.magic_atk_ele[ELE_EARTH] += sc->getSCE(SC_EARTHWEAPON)->val1; #endif - if(sc->data[SC_PROVIDENCE]) { - sd->indexed_bonus.subele[ELE_HOLY] += sc->data[SC_PROVIDENCE]->val2; - sd->indexed_bonus.subrace[RC_DEMON] += sc->data[SC_PROVIDENCE]->val2; + if(sc->getSCE(SC_PROVIDENCE)) { + sd->indexed_bonus.subele[ELE_HOLY] += sc->getSCE(SC_PROVIDENCE)->val2; + sd->indexed_bonus.subrace[RC_DEMON] += sc->getSCE(SC_PROVIDENCE)->val2; } - if (sc->data[SC_GEFFEN_MAGIC1]) { - sd->right_weapon.addrace[RC_PLAYER_HUMAN] += sc->data[SC_GEFFEN_MAGIC1]->val1; - sd->right_weapon.addrace[RC_DEMIHUMAN] += sc->data[SC_GEFFEN_MAGIC1]->val1; - sd->left_weapon.addrace[RC_PLAYER_HUMAN] += sc->data[SC_GEFFEN_MAGIC1]->val1; - sd->left_weapon.addrace[RC_DEMIHUMAN] += sc->data[SC_GEFFEN_MAGIC1]->val1; + if (sc->getSCE(SC_GEFFEN_MAGIC1)) { + sd->right_weapon.addrace[RC_PLAYER_HUMAN] += sc->getSCE(SC_GEFFEN_MAGIC1)->val1; + sd->right_weapon.addrace[RC_DEMIHUMAN] += sc->getSCE(SC_GEFFEN_MAGIC1)->val1; + sd->left_weapon.addrace[RC_PLAYER_HUMAN] += sc->getSCE(SC_GEFFEN_MAGIC1)->val1; + sd->left_weapon.addrace[RC_DEMIHUMAN] += sc->getSCE(SC_GEFFEN_MAGIC1)->val1; } - if (sc->data[SC_GEFFEN_MAGIC2]) { - sd->indexed_bonus.magic_addrace[RC_PLAYER_HUMAN] += sc->data[SC_GEFFEN_MAGIC2]->val1; - sd->indexed_bonus.magic_addrace[RC_DEMIHUMAN] += sc->data[SC_GEFFEN_MAGIC2]->val1; + if (sc->getSCE(SC_GEFFEN_MAGIC2)) { + sd->indexed_bonus.magic_addrace[RC_PLAYER_HUMAN] += sc->getSCE(SC_GEFFEN_MAGIC2)->val1; + sd->indexed_bonus.magic_addrace[RC_DEMIHUMAN] += sc->getSCE(SC_GEFFEN_MAGIC2)->val1; } - if(sc->data[SC_GEFFEN_MAGIC3]) { - sd->indexed_bonus.subrace[RC_PLAYER_HUMAN] += sc->data[SC_GEFFEN_MAGIC3]->val1; - sd->indexed_bonus.subrace[RC_DEMIHUMAN] += sc->data[SC_GEFFEN_MAGIC3]->val1; + if(sc->getSCE(SC_GEFFEN_MAGIC3)) { + sd->indexed_bonus.subrace[RC_PLAYER_HUMAN] += sc->getSCE(SC_GEFFEN_MAGIC3)->val1; + sd->indexed_bonus.subrace[RC_DEMIHUMAN] += sc->getSCE(SC_GEFFEN_MAGIC3)->val1; } - if(sc->data[SC_ARMOR_ELEMENT_WATER]) { // This status change should grant card-type elemental resist. - sd->indexed_bonus.subele[ELE_WATER] += sc->data[SC_ARMOR_ELEMENT_WATER]->val1; - sd->indexed_bonus.subele[ELE_EARTH] += sc->data[SC_ARMOR_ELEMENT_WATER]->val2; - sd->indexed_bonus.subele[ELE_FIRE] += sc->data[SC_ARMOR_ELEMENT_WATER]->val3; - sd->indexed_bonus.subele[ELE_WIND] += sc->data[SC_ARMOR_ELEMENT_WATER]->val4; + if(sc->getSCE(SC_ARMOR_ELEMENT_WATER)) { // This status change should grant card-type elemental resist. + sd->indexed_bonus.subele[ELE_WATER] += sc->getSCE(SC_ARMOR_ELEMENT_WATER)->val1; + sd->indexed_bonus.subele[ELE_EARTH] += sc->getSCE(SC_ARMOR_ELEMENT_WATER)->val2; + sd->indexed_bonus.subele[ELE_FIRE] += sc->getSCE(SC_ARMOR_ELEMENT_WATER)->val3; + sd->indexed_bonus.subele[ELE_WIND] += sc->getSCE(SC_ARMOR_ELEMENT_WATER)->val4; } - if(sc->data[SC_ARMOR_ELEMENT_EARTH]) { // This status change should grant card-type elemental resist. - sd->indexed_bonus.subele[ELE_WATER] += sc->data[SC_ARMOR_ELEMENT_EARTH]->val1; - sd->indexed_bonus.subele[ELE_EARTH] += sc->data[SC_ARMOR_ELEMENT_EARTH]->val2; - sd->indexed_bonus.subele[ELE_FIRE] += sc->data[SC_ARMOR_ELEMENT_EARTH]->val3; - sd->indexed_bonus.subele[ELE_WIND] += sc->data[SC_ARMOR_ELEMENT_EARTH]->val4; + if(sc->getSCE(SC_ARMOR_ELEMENT_EARTH)) { // This status change should grant card-type elemental resist. + sd->indexed_bonus.subele[ELE_WATER] += sc->getSCE(SC_ARMOR_ELEMENT_EARTH)->val1; + sd->indexed_bonus.subele[ELE_EARTH] += sc->getSCE(SC_ARMOR_ELEMENT_EARTH)->val2; + sd->indexed_bonus.subele[ELE_FIRE] += sc->getSCE(SC_ARMOR_ELEMENT_EARTH)->val3; + sd->indexed_bonus.subele[ELE_WIND] += sc->getSCE(SC_ARMOR_ELEMENT_EARTH)->val4; } - if(sc->data[SC_ARMOR_ELEMENT_FIRE]) { // This status change should grant card-type elemental resist. - sd->indexed_bonus.subele[ELE_WATER] += sc->data[SC_ARMOR_ELEMENT_FIRE]->val1; - sd->indexed_bonus.subele[ELE_EARTH] += sc->data[SC_ARMOR_ELEMENT_FIRE]->val2; - sd->indexed_bonus.subele[ELE_FIRE] += sc->data[SC_ARMOR_ELEMENT_FIRE]->val3; - sd->indexed_bonus.subele[ELE_WIND] += sc->data[SC_ARMOR_ELEMENT_FIRE]->val4; + if(sc->getSCE(SC_ARMOR_ELEMENT_FIRE)) { // This status change should grant card-type elemental resist. + sd->indexed_bonus.subele[ELE_WATER] += sc->getSCE(SC_ARMOR_ELEMENT_FIRE)->val1; + sd->indexed_bonus.subele[ELE_EARTH] += sc->getSCE(SC_ARMOR_ELEMENT_FIRE)->val2; + sd->indexed_bonus.subele[ELE_FIRE] += sc->getSCE(SC_ARMOR_ELEMENT_FIRE)->val3; + sd->indexed_bonus.subele[ELE_WIND] += sc->getSCE(SC_ARMOR_ELEMENT_FIRE)->val4; } - if(sc->data[SC_ARMOR_ELEMENT_WIND]) { // This status change should grant card-type elemental resist. - sd->indexed_bonus.subele[ELE_WATER] += sc->data[SC_ARMOR_ELEMENT_WIND]->val1; - sd->indexed_bonus.subele[ELE_EARTH] += sc->data[SC_ARMOR_ELEMENT_WIND]->val2; - sd->indexed_bonus.subele[ELE_FIRE] += sc->data[SC_ARMOR_ELEMENT_WIND]->val3; - sd->indexed_bonus.subele[ELE_WIND] += sc->data[SC_ARMOR_ELEMENT_WIND]->val4; + if(sc->getSCE(SC_ARMOR_ELEMENT_WIND)) { // This status change should grant card-type elemental resist. + sd->indexed_bonus.subele[ELE_WATER] += sc->getSCE(SC_ARMOR_ELEMENT_WIND)->val1; + sd->indexed_bonus.subele[ELE_EARTH] += sc->getSCE(SC_ARMOR_ELEMENT_WIND)->val2; + sd->indexed_bonus.subele[ELE_FIRE] += sc->getSCE(SC_ARMOR_ELEMENT_WIND)->val3; + sd->indexed_bonus.subele[ELE_WIND] += sc->getSCE(SC_ARMOR_ELEMENT_WIND)->val4; } - if(sc->data[SC_ARMOR_RESIST]) { // Undead Scroll - sd->indexed_bonus.subele[ELE_WATER] += sc->data[SC_ARMOR_RESIST]->val1; - sd->indexed_bonus.subele[ELE_EARTH] += sc->data[SC_ARMOR_RESIST]->val2; - sd->indexed_bonus.subele[ELE_FIRE] += sc->data[SC_ARMOR_RESIST]->val3; - sd->indexed_bonus.subele[ELE_WIND] += sc->data[SC_ARMOR_RESIST]->val4; + if(sc->getSCE(SC_ARMOR_RESIST)) { // Undead Scroll + sd->indexed_bonus.subele[ELE_WATER] += sc->getSCE(SC_ARMOR_RESIST)->val1; + sd->indexed_bonus.subele[ELE_EARTH] += sc->getSCE(SC_ARMOR_RESIST)->val2; + sd->indexed_bonus.subele[ELE_FIRE] += sc->getSCE(SC_ARMOR_RESIST)->val3; + sd->indexed_bonus.subele[ELE_WIND] += sc->getSCE(SC_ARMOR_RESIST)->val4; } - if( sc->data[SC_FIRE_CLOAK_OPTION] ) { - i = sc->data[SC_FIRE_CLOAK_OPTION]->val2; + if( sc->getSCE(SC_FIRE_CLOAK_OPTION) ) { + i = sc->getSCE(SC_FIRE_CLOAK_OPTION)->val2; sd->indexed_bonus.subele[ELE_FIRE] += i; sd->indexed_bonus.subele[ELE_WATER] -= i; } - if( sc->data[SC_WATER_DROP_OPTION] ) { - i = sc->data[SC_WATER_DROP_OPTION]->val2; + if( sc->getSCE(SC_WATER_DROP_OPTION) ) { + i = sc->getSCE(SC_WATER_DROP_OPTION)->val2; sd->indexed_bonus.subele[ELE_WATER] += i; sd->indexed_bonus.subele[ELE_WIND] -= i; } - if( sc->data[SC_WIND_CURTAIN_OPTION] ) { - i = sc->data[SC_WIND_CURTAIN_OPTION]->val2; + if( sc->getSCE(SC_WIND_CURTAIN_OPTION) ) { + i = sc->getSCE(SC_WIND_CURTAIN_OPTION)->val2; sd->indexed_bonus.subele[ELE_WIND] += i; sd->indexed_bonus.subele[ELE_EARTH] -= i; } - if( sc->data[SC_STONE_SHIELD_OPTION] ) { - i = sc->data[SC_STONE_SHIELD_OPTION]->val2; + if( sc->getSCE(SC_STONE_SHIELD_OPTION) ) { + i = sc->getSCE(SC_STONE_SHIELD_OPTION)->val2; sd->indexed_bonus.subele[ELE_EARTH] += i; sd->indexed_bonus.subele[ELE_FIRE] -= i; } - if (sc->data[SC_MTF_MLEATKED] ) - sd->indexed_bonus.subele[ELE_NEUTRAL] += sc->data[SC_MTF_MLEATKED]->val3; - if (sc->data[SC_MTF_CRIDAMAGE]) - sd->bonus.crit_atk_rate += sc->data[SC_MTF_CRIDAMAGE]->val1; - if (sc->data[SC_GLASTHEIM_ATK]) { - sd->indexed_bonus.ignore_mdef_by_race[RC_UNDEAD] += sc->data[SC_GLASTHEIM_ATK]->val1; - sd->indexed_bonus.ignore_mdef_by_race[RC_DEMON] += sc->data[SC_GLASTHEIM_ATK]->val1; + if (sc->getSCE(SC_MTF_MLEATKED) ) + sd->indexed_bonus.subele[ELE_NEUTRAL] += sc->getSCE(SC_MTF_MLEATKED)->val3; + if (sc->getSCE(SC_MTF_CRIDAMAGE)) + sd->bonus.crit_atk_rate += sc->getSCE(SC_MTF_CRIDAMAGE)->val1; + if (sc->getSCE(SC_GLASTHEIM_ATK)) { + sd->indexed_bonus.ignore_mdef_by_race[RC_UNDEAD] += sc->getSCE(SC_GLASTHEIM_ATK)->val1; + sd->indexed_bonus.ignore_mdef_by_race[RC_DEMON] += sc->getSCE(SC_GLASTHEIM_ATK)->val1; } - if (sc->data[SC_LAUDARAMUS]) - sd->bonus.crit_atk_rate += 5 * sc->data[SC_LAUDARAMUS]->val1; + if (sc->getSCE(SC_LAUDARAMUS)) + sd->bonus.crit_atk_rate += 5 * sc->getSCE(SC_LAUDARAMUS)->val1; #ifdef RENEWAL - if (sc->data[SC_FORTUNE]) - sd->bonus.crit_atk_rate += 2 * sc->data[SC_FORTUNE]->val1; + if (sc->getSCE(SC_FORTUNE)) + sd->bonus.crit_atk_rate += 2 * sc->getSCE(SC_FORTUNE)->val1; #endif - if (sc->data[SC_SYMPHONYOFLOVER]) { - sd->indexed_bonus.subele[ELE_GHOST] += sc->data[SC_SYMPHONYOFLOVER]->val1 * 3; - sd->indexed_bonus.subele[ELE_HOLY] += sc->data[SC_SYMPHONYOFLOVER]->val1 * 3; + if (sc->getSCE(SC_SYMPHONYOFLOVER)) { + sd->indexed_bonus.subele[ELE_GHOST] += sc->getSCE(SC_SYMPHONYOFLOVER)->val1 * 3; + sd->indexed_bonus.subele[ELE_HOLY] += sc->getSCE(SC_SYMPHONYOFLOVER)->val1 * 3; } - if (sc->data[SC_PYREXIA] && sc->data[SC_PYREXIA]->val3 == 0) - sd->bonus.crit_atk_rate += sc->data[SC_PYREXIA]->val2; - if (sc->data[SC_LUXANIMA]) { - pc_bonus2(sd, SP_ADDSIZE, SZ_ALL, sc->data[SC_LUXANIMA]->val3); - sd->bonus.crit_atk_rate += sc->data[SC_LUXANIMA]->val3; - sd->bonus.short_attack_atk_rate += sc->data[SC_LUXANIMA]->val3; - sd->bonus.long_attack_atk_rate += sc->data[SC_LUXANIMA]->val3; + if (sc->getSCE(SC_PYREXIA) && sc->getSCE(SC_PYREXIA)->val3 == 0) + sd->bonus.crit_atk_rate += sc->getSCE(SC_PYREXIA)->val2; + if (sc->getSCE(SC_LUXANIMA)) { + pc_bonus2(sd, SP_ADDSIZE, SZ_ALL, sc->getSCE(SC_LUXANIMA)->val3); + sd->bonus.crit_atk_rate += sc->getSCE(SC_LUXANIMA)->val3; + sd->bonus.short_attack_atk_rate += sc->getSCE(SC_LUXANIMA)->val3; + sd->bonus.long_attack_atk_rate += sc->getSCE(SC_LUXANIMA)->val3; } - if (sc->data[SC_STRIKING]) + if (sc->getSCE(SC_STRIKING)) sd->bonus.perfect_hit += 20 + 10 * pc_checkskill(sd, SO_STRIKING); - if (sc->data[SC_VIGOR]) { + if (sc->getSCE(SC_VIGOR)) { // Skill desc says increases physical damage. Supposed to affect damage from base ATK right??? // Because this is only boosting the ATK from the equipped weapon and not from base ATK. [Rytech] sd->right_weapon.addrace[RC_DEMIHUMAN] += 50; sd->left_weapon.addrace[RC_ANGEL] += 50; } - if (sc->data[SC_DEADLY_DEFEASANCE]) + if (sc->getSCE(SC_DEADLY_DEFEASANCE)) sd->special_state.no_magic_damage = 0; - if (sc->data[SC_CLIMAX_DES_HU]) + if (sc->getSCE(SC_CLIMAX_DES_HU)) sd->indexed_bonus.magic_atk_ele[ELE_WIND] += 30; - if (sc->data[SC_CLIMAX_EARTH]) + if (sc->getSCE(SC_CLIMAX_EARTH)) sd->indexed_bonus.subele[ELE_EARTH] -= 100; - if (sc->data[SC_CLIMAX_BLOOM]) + if (sc->getSCE(SC_CLIMAX_BLOOM)) sd->indexed_bonus.subele[ELE_FIRE] -= 100; - if (sc->data[SC_CLIMAX_CRYIMP]) { + if (sc->getSCE(SC_CLIMAX_CRYIMP)) { sd->indexed_bonus.subele[ELE_WATER] += 30; sd->indexed_bonus.magic_atk_ele[ELE_WATER] += 30; } - if (sc->data[SC_SINCERE_FAITH]) - sd->bonus.perfect_hit += sc->data[SC_SINCERE_FAITH]->val3; - if (sc->data[SC_HOLY_S]) { - sd->indexed_bonus.subele[ELE_DARK] += sc->data[SC_HOLY_S]->val2; - sd->indexed_bonus.subele[ELE_UNDEAD] += sc->data[SC_HOLY_S]->val2; - sd->indexed_bonus.magic_atk_ele[ELE_HOLY] += sc->data[SC_HOLY_S]->val2; + if (sc->getSCE(SC_SINCERE_FAITH)) + sd->bonus.perfect_hit += sc->getSCE(SC_SINCERE_FAITH)->val3; + if (sc->getSCE(SC_HOLY_S)) { + sd->indexed_bonus.subele[ELE_DARK] += sc->getSCE(SC_HOLY_S)->val2; + sd->indexed_bonus.subele[ELE_UNDEAD] += sc->getSCE(SC_HOLY_S)->val2; + sd->indexed_bonus.magic_atk_ele[ELE_HOLY] += sc->getSCE(SC_HOLY_S)->val2; } - if (sc->data[SC_SUMMON_ELEMENTAL_ARDOR]) + if (sc->getSCE(SC_SUMMON_ELEMENTAL_ARDOR)) sd->indexed_bonus.magic_atk_ele[ELE_FIRE] += 10; - if (sc->data[SC_SUMMON_ELEMENTAL_DILUVIO]) + if (sc->getSCE(SC_SUMMON_ELEMENTAL_DILUVIO)) sd->indexed_bonus.magic_atk_ele[ELE_WATER] += 10; - if (sc->data[SC_SUMMON_ELEMENTAL_PROCELLA]) + if (sc->getSCE(SC_SUMMON_ELEMENTAL_PROCELLA)) sd->indexed_bonus.magic_atk_ele[ELE_WIND] += 10; - if (sc->data[SC_SUMMON_ELEMENTAL_TERREMOTUS]) + if (sc->getSCE(SC_SUMMON_ELEMENTAL_TERREMOTUS)) sd->indexed_bonus.magic_atk_ele[ELE_EARTH] += 10; - if (sc->data[SC_SUMMON_ELEMENTAL_SERPENS]) + if (sc->getSCE(SC_SUMMON_ELEMENTAL_SERPENS)) sd->indexed_bonus.magic_atk_ele[ELE_POISON] += 10; - if (sc->data[SC_FLAMEARMOR_OPTION]) { + if (sc->getSCE(SC_FLAMEARMOR_OPTION)) { sd->indexed_bonus.subele[ELE_FIRE] += 100; sd->indexed_bonus.subele[ELE_WATER] -= 30; } - if (sc->data[SC_CRYSTAL_ARMOR_OPTION]) { + if (sc->getSCE(SC_CRYSTAL_ARMOR_OPTION)) { sd->indexed_bonus.subele[ELE_WATER] += 100; sd->indexed_bonus.subele[ELE_WIND] -= 30; } - if (sc->data[SC_EYES_OF_STORM_OPTION]) { + if (sc->getSCE(SC_EYES_OF_STORM_OPTION)) { sd->indexed_bonus.subele[ELE_WIND] += 100; sd->indexed_bonus.subele[ELE_EARTH] -= 30; } - if (sc->data[SC_STRONG_PROTECTION_OPTION]) { + if (sc->getSCE(SC_STRONG_PROTECTION_OPTION)) { sd->indexed_bonus.subele[ELE_EARTH] += 100; sd->indexed_bonus.subele[ELE_FIRE] -= 30; } - if (sc->data[SC_POISON_SHIELD_OPTION]) { + if (sc->getSCE(SC_POISON_SHIELD_OPTION)) { sd->indexed_bonus.subele[ELE_POISON] += 100; sd->indexed_bonus.subele[ELE_HOLY] -= 30; } - if (sc->data[SC_INFINITY_DRINK]) { + if (sc->getSCE(SC_INFINITY_DRINK)) { sd->bonus.crit_atk_rate += 5; sd->bonus.long_attack_atk_rate += 5; sd->indexed_bonus.magic_atk_ele[ELE_ALL] += 5; sd->special_state.no_castcancel = 1; } - if(sc->data[SC_MENTAL_POTION]) - sd->dsprate -= sc->data[SC_MENTAL_POTION]->val1; - if (sc->data[SC_LIMIT_POWER_BOOSTER]) { + if(sc->getSCE(SC_MENTAL_POTION)) + sd->dsprate -= sc->getSCE(SC_MENTAL_POTION)->val1; + if (sc->getSCE(SC_LIMIT_POWER_BOOSTER)) { pc_bonus(sd, SP_ATK_RATE, 1); pc_bonus(sd, SP_MATK_RATE, 1); sd->dsprate -= 5; - sd->bonus.fixcastrate -= sc->data[SC_LIMIT_POWER_BOOSTER]->val1; + sd->bonus.fixcastrate -= sc->getSCE(SC_LIMIT_POWER_BOOSTER)->val1; } - if (sc->data[SC_COMBAT_PILL]) { - pc_bonus(sd, SP_ATK_RATE, sc->data[SC_COMBAT_PILL]->val1); - pc_bonus(sd, SP_MATK_RATE, sc->data[SC_COMBAT_PILL]->val1); + if (sc->getSCE(SC_COMBAT_PILL)) { + pc_bonus(sd, SP_ATK_RATE, sc->getSCE(SC_COMBAT_PILL)->val1); + pc_bonus(sd, SP_MATK_RATE, sc->getSCE(SC_COMBAT_PILL)->val1); } - if (sc->data[SC_COMBAT_PILL2]) { - pc_bonus(sd, SP_ATK_RATE, sc->data[SC_COMBAT_PILL2]->val1); - pc_bonus(sd, SP_MATK_RATE, sc->data[SC_COMBAT_PILL2]->val1); + if (sc->getSCE(SC_COMBAT_PILL2)) { + pc_bonus(sd, SP_ATK_RATE, sc->getSCE(SC_COMBAT_PILL2)->val1); + pc_bonus(sd, SP_MATK_RATE, sc->getSCE(SC_COMBAT_PILL2)->val1); } - if (sc->data[SC_SPARKCANDY]) + if (sc->getSCE(SC_SPARKCANDY)) pc_bonus2(sd, SP_HP_LOSS_RATE, 100, 10000); - if (sc->data[SC_MAGICCANDY]) { + if (sc->getSCE(SC_MAGICCANDY)) { sd->bonus.fixcastrate -= 70; sd->special_state.no_castcancel = 1; pc_bonus2(sd, SP_SP_LOSS_RATE, 90, 10000); } - if (sc->data[SC_POPECOOKIE]) { - pc_bonus(sd, SP_ATK_RATE, sc->data[SC_POPECOOKIE]->val1); - pc_bonus(sd, SP_MATK_RATE, sc->data[SC_POPECOOKIE]->val1); - sd->indexed_bonus.subele[ELE_ALL] -= sc->data[SC_POPECOOKIE]->val1; + if (sc->getSCE(SC_POPECOOKIE)) { + pc_bonus(sd, SP_ATK_RATE, sc->getSCE(SC_POPECOOKIE)->val1); + pc_bonus(sd, SP_MATK_RATE, sc->getSCE(SC_POPECOOKIE)->val1); + sd->indexed_bonus.subele[ELE_ALL] -= sc->getSCE(SC_POPECOOKIE)->val1; } - if (sc->data[SC_VITALIZE_POTION]) { - pc_bonus(sd, SP_ATK_RATE, sc->data[SC_VITALIZE_POTION]->val1); - pc_bonus(sd, SP_MATK_RATE, sc->data[SC_VITALIZE_POTION]->val1); + if (sc->getSCE(SC_VITALIZE_POTION)) { + pc_bonus(sd, SP_ATK_RATE, sc->getSCE(SC_VITALIZE_POTION)->val1); + pc_bonus(sd, SP_MATK_RATE, sc->getSCE(SC_VITALIZE_POTION)->val1); } - if (sc->data[SC_CUP_OF_BOZA]) + if (sc->getSCE(SC_CUP_OF_BOZA)) sd->indexed_bonus.subele[ELE_FIRE] -= 5; - if (sc->data[SC_SKF_CAST]) - sd->bonus.varcastrate -= sc->data[SC_SKF_CAST]->val1; - if (sc->data[SC_BEEF_RIB_STEW]) { + if (sc->getSCE(SC_SKF_CAST)) + sd->bonus.varcastrate -= sc->getSCE(SC_SKF_CAST)->val1; + if (sc->getSCE(SC_BEEF_RIB_STEW)) { sd->bonus.varcastrate -= 5; sd->dsprate -= 3; } - if (sc->data[SC_PORK_RIB_STEW]) + if (sc->getSCE(SC_PORK_RIB_STEW)) sd->dsprate -= 2; } status_cpy(&sd->battle_status, base_status); @@ -4794,9 +4832,9 @@ int status_calc_pc_sub(struct map_session_data* sd, uint8 opt) clif_skillinfoblock(sd); // If the skill is learned, the status is infinite. - if (pc_checkskill(sd, SU_SPRITEMABLE) > 0 && !sd->sc.data[SC_SPRITEMABLE]) + if (pc_checkskill(sd, SU_SPRITEMABLE) > 0 && !sd->sc.getSCE(SC_SPRITEMABLE)) sc_start(&sd->bl, &sd->bl, SC_SPRITEMABLE, 100, 1, INFINITE_TICK); - if (pc_checkskill(sd, SU_SOULATTACK) > 0 && !sd->sc.data[SC_SOULATTACK]) + if (pc_checkskill(sd, SU_SOULATTACK) > 0 && !sd->sc.getSCE(SC_SOULATTACK)) sc_start(&sd->bl, &sd->bl, SC_SOULATTACK, 100, 1, INFINITE_TICK); calculating = 0; @@ -5088,8 +5126,8 @@ void status_calc_regen(struct block_list *bl, struct status_data *status, struct val += skill*5 + skill*status->max_hp/500; if (sc && sc->count) { - if (sc->data[SC_INCREASE_MAXHP]) - val += val * sc->data[SC_INCREASE_MAXHP]->val2 / 100; + if (sc->getSCE(SC_INCREASE_MAXHP)) + val += val * sc->getSCE(SC_INCREASE_MAXHP)->val2 / 100; } sregen->hp = cap_value(val, 0, SHRT_MAX); @@ -5103,10 +5141,10 @@ void status_calc_regen(struct block_list *bl, struct status_data *status, struct val += 3 + 3 * skill; if (sc && sc->count) { - if (sc->data[SC_ANCILLA]) - val += sc->data[SC_ANCILLA]->val2 / 100; - if (sc->data[SC_INCREASE_MAXSP]) - val += val * sc->data[SC_INCREASE_MAXSP]->val2 / 100; + if (sc->getSCE(SC_ANCILLA)) + val += sc->getSCE(SC_ANCILLA)->val2 / 100; + if (sc->getSCE(SC_INCREASE_MAXSP)) + val += val * sc->getSCE(SC_INCREASE_MAXSP)->val2 / 100; } sregen->sp = cap_value(val, 0, SHRT_MAX); @@ -5192,33 +5230,33 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str return; // No HP or SP regen - if ((sc->data[SC_POISON] && !sc->data[SC_SLOWPOISON]) - || (sc->data[SC_DPOISON] && !sc->data[SC_SLOWPOISON]) - || sc->data[SC_BERSERK] - || sc->data[SC_TRICKDEAD] - || sc->data[SC_BLEEDING] - || (sc->data[SC_MAGICMUSHROOM] && sc->data[SC_MAGICMUSHROOM]->val3 == 1) - || sc->data[SC_SATURDAYNIGHTFEVER] - || sc->data[SC_REBOUND]) + if ((sc->getSCE(SC_POISON) && !sc->getSCE(SC_SLOWPOISON)) + || (sc->getSCE(SC_DPOISON) && !sc->getSCE(SC_SLOWPOISON)) + || sc->getSCE(SC_BERSERK) + || sc->getSCE(SC_TRICKDEAD) + || sc->getSCE(SC_BLEEDING) + || (sc->getSCE(SC_MAGICMUSHROOM) && sc->getSCE(SC_MAGICMUSHROOM)->val3 == 1) + || sc->getSCE(SC_SATURDAYNIGHTFEVER) + || sc->getSCE(SC_REBOUND)) regen->flag = RGN_NONE; // No natural SP regen - if (sc->data[SC_DANCING] || + if (sc->getSCE(SC_DANCING) || #ifdef RENEWAL - sc->data[SC_MAXIMIZEPOWER] || + sc->getSCE(SC_MAXIMIZEPOWER) || #endif #ifndef RENEWAL (bl->type == BL_PC && (((TBL_PC*)bl)->class_&MAPID_UPPERMASK) == MAPID_MONK && - (sc->data[SC_EXTREMITYFIST] || sc->data[SC_EXPLOSIONSPIRITS]) && (!sc->data[SC_SPIRIT] || sc->data[SC_SPIRIT]->val2 != SL_MONK)) || + (sc->getSCE(SC_EXTREMITYFIST) || sc->getSCE(SC_EXPLOSIONSPIRITS)) && (!sc->getSCE(SC_SPIRIT) || sc->getSCE(SC_SPIRIT)->val2 != SL_MONK)) || #else (bl->type == BL_PC && (((TBL_PC*)bl)->class_&MAPID_UPPERMASK) == MAPID_MONK && - sc->data[SC_EXTREMITYFIST] && (!sc->data[SC_SPIRIT] || sc->data[SC_SPIRIT]->val2 != SL_MONK)) || + sc->getSCE(SC_EXTREMITYFIST) && (!sc->getSCE(SC_SPIRIT) || sc->getSCE(SC_SPIRIT)->val2 != SL_MONK)) || #endif - (sc->data[SC_OBLIVIONCURSE] && sc->data[SC_OBLIVIONCURSE]->val3 == 1)) + (sc->getSCE(SC_OBLIVIONCURSE) && sc->getSCE(SC_OBLIVIONCURSE)->val3 == 1)) regen->flag &= ~RGN_SP; - if (sc->data[SC_TENSIONRELAX]) { - if (sc->data[SC_WEIGHT50] || sc->data[SC_WEIGHT90]) + if (sc->getSCE(SC_TENSIONRELAX)) { + if (sc->getSCE(SC_WEIGHT50) || sc->getSCE(SC_WEIGHT90)) regen->state.overweight = 0; // 1x HP regen else { regen->rate.hp += 200; @@ -5227,25 +5265,25 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str } } - if (sc->data[SC_MAGNIFICAT]) + if (sc->getSCE(SC_MAGNIFICAT)) regen->rate.sp += 100; - if (sc->data[SC_REGENERATION]) { - const struct status_change_entry *sce = sc->data[SC_REGENERATION]; + if (sc->getSCE(SC_REGENERATION)) { + const struct status_change_entry *sce = sc->getSCE(SC_REGENERATION); if (!sce->val4) { regen->rate.hp += (sce->val2*100); regen->rate.sp += (sce->val3*100); } else regen->flag &= ~sce->val4; // Remove regen as specified by val4 } - if(sc->data[SC_GT_REVITALIZE]) { - regen->hp += cap_value(regen->hp * sc->data[SC_GT_REVITALIZE]->val3/100, 1, SHRT_MAX); + if(sc->getSCE(SC_GT_REVITALIZE)) { + regen->hp += cap_value(regen->hp * sc->getSCE(SC_GT_REVITALIZE)->val3/100, 1, SHRT_MAX); regen->state.walk = 1; } - if (sc->data[SC_EXTRACT_WHITE_POTION_Z]) - regen->hp += cap_value(regen->hp * sc->data[SC_EXTRACT_WHITE_POTION_Z]->val1 / 100, 1, SHRT_MAX); - if (sc->data[SC_VITATA_500]) - regen->sp += cap_value(regen->sp * sc->data[SC_VITATA_500]->val1 / 100, 1, SHRT_MAX); + if (sc->getSCE(SC_EXTRACT_WHITE_POTION_Z)) + regen->hp += cap_value(regen->hp * sc->getSCE(SC_EXTRACT_WHITE_POTION_Z)->val1 / 100, 1, SHRT_MAX); + if (sc->getSCE(SC_VITATA_500)) + regen->sp += cap_value(regen->sp * sc->getSCE(SC_VITATA_500)->val1 / 100, 1, SHRT_MAX); if (bl->type == BL_ELEM) { // Recovery bonus only applies to the Elementals. int ele_class = status_get_class(bl); @@ -5254,21 +5292,21 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str case ELEMENTALID_AGNI_M: case ELEMENTALID_AGNI_L: case ELEMENTALID_ARDOR: - if (sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 1) + if (sc->getSCE(SC_FIRE_INSIGNIA) && sc->getSCE(SC_FIRE_INSIGNIA)->val1 == 1) regen->rate.hp += 100; break; case ELEMENTALID_AQUA_S: case ELEMENTALID_AQUA_M: case ELEMENTALID_AQUA_L: case ELEMENTALID_DILUVIO: - if (sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 1) + if (sc->getSCE(SC_WATER_INSIGNIA) && sc->getSCE(SC_WATER_INSIGNIA)->val1 == 1) regen->rate.hp += 100; break; case ELEMENTALID_VENTUS_S: case ELEMENTALID_VENTUS_M: case ELEMENTALID_VENTUS_L: case ELEMENTALID_PROCELLA: - if (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 1) + if (sc->getSCE(SC_WIND_INSIGNIA) && sc->getSCE(SC_WIND_INSIGNIA)->val1 == 1) regen->rate.hp += 100; break; case ELEMENTALID_TERA_S: @@ -5276,30 +5314,30 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str case ELEMENTALID_TERA_L: case ELEMENTALID_TERREMOTUS: case ELEMENTALID_SERPENS: - if (sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 1) + if (sc->getSCE(SC_EARTH_INSIGNIA) && sc->getSCE(SC_EARTH_INSIGNIA)->val1 == 1) regen->rate.hp += 100; break; } } - if (sc->data[SC_CATNIPPOWDER]) { + if (sc->getSCE(SC_CATNIPPOWDER)) { regen->rate.hp *= 2; regen->rate.sp *= 2; } - if (sc->data[SC_SHRIMPBLESSING]) + if (sc->getSCE(SC_SHRIMPBLESSING)) regen->rate.sp += 50; #ifdef RENEWAL - if (sc->data[SC_NIBELUNGEN]) { - if (sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_HPREGEN) + if (sc->getSCE(SC_NIBELUNGEN)) { + if (sc->getSCE(SC_NIBELUNGEN)->val2 == RINGNBL_HPREGEN) regen->rate.hp += 100; - else if (sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_SPREGEN) + else if (sc->getSCE(SC_NIBELUNGEN)->val2 == RINGNBL_SPREGEN) regen->rate.sp += 100; } #endif - if (sc->data[SC_SIRCLEOFNATURE]) - regen->rate.hp += sc->data[SC_SIRCLEOFNATURE]->val2; - if (sc->data[SC_SONGOFMANA]) - regen->rate.sp += sc->data[SC_SONGOFMANA]->val3; + if (sc->getSCE(SC_SIRCLEOFNATURE)) + regen->rate.hp += sc->getSCE(SC_SIRCLEOFNATURE)->val2; + if (sc->getSCE(SC_SONGOFMANA)) + regen->rate.sp += sc->getSCE(SC_SONGOFMANA)->val3; } /** @@ -5323,24 +5361,24 @@ void status_calc_state( struct block_list *bl, struct status_change *sc, std::bi if( !flag[SCS_NOMOVECOND] ) sc->cant.move += (start ? 1 : ((sc->cant.move) ? -1 : 0)); else if( - (sc->data[SC_GOSPEL] && sc->data[SC_GOSPEL]->val4 == BCT_SELF) // cannot move while gospel is in effect + (sc->getSCE(SC_GOSPEL) && sc->getSCE(SC_GOSPEL)->val4 == BCT_SELF) // cannot move while gospel is in effect #ifndef RENEWAL - || (sc->data[SC_BASILICA] && sc->data[SC_BASILICA]->val4 == bl->id) // Basilica caster cannot move - || (sc->data[SC_GRAVITATION] && sc->data[SC_GRAVITATION]->val3 == BCT_SELF) + || (sc->getSCE(SC_BASILICA) && sc->getSCE(SC_BASILICA)->val4 == bl->id) // Basilica caster cannot move + || (sc->getSCE(SC_GRAVITATION) && sc->getSCE(SC_GRAVITATION)->val3 == BCT_SELF) #endif - || (sc->data[SC_CAMOUFLAGE] && sc->data[SC_CAMOUFLAGE]->val1 < 3) - || (sc->data[SC_MAGNETICFIELD] && sc->data[SC_MAGNETICFIELD]->val2 != bl->id) - || (sc->data[SC_FEAR] && sc->data[SC_FEAR]->val2 > 0) - || (sc->data[SC_SPIDERWEB] && sc->data[SC_SPIDERWEB]->val1) - || (sc->data[SC_HIDING] && (bl->type != BL_PC || (pc_checkskill(BL_CAST(BL_PC,bl),RG_TUNNELDRIVE) <= 0))) - || (sc->data[SC_DANCING] && sc->data[SC_DANCING]->val4 && ( + || (sc->getSCE(SC_CAMOUFLAGE) && sc->getSCE(SC_CAMOUFLAGE)->val1 < 3) + || (sc->getSCE(SC_MAGNETICFIELD) && sc->getSCE(SC_MAGNETICFIELD)->val2 != bl->id) + || (sc->getSCE(SC_FEAR) && sc->getSCE(SC_FEAR)->val2 > 0) + || (sc->getSCE(SC_SPIDERWEB) && sc->getSCE(SC_SPIDERWEB)->val1) + || (sc->getSCE(SC_HIDING) && (bl->type != BL_PC || (pc_checkskill(BL_CAST(BL_PC,bl),RG_TUNNELDRIVE) <= 0))) + || (sc->getSCE(SC_DANCING) && sc->getSCE(SC_DANCING)->val4 && ( #ifndef RENEWAL - !sc->data[SC_LONGING] || + !sc->getSCE(SC_LONGING) || #endif - (sc->data[SC_DANCING]->val1&0xFFFF) == CG_MOONLIT || - (sc->data[SC_DANCING]->val1&0xFFFF) == CG_HERMODE + (sc->getSCE(SC_DANCING)->val1&0xFFFF) == CG_MOONLIT || + (sc->getSCE(SC_DANCING)->val1&0xFFFF) == CG_HERMODE )) - || (sc->data[SC_CRYSTALIZE] && bl->type != BL_MOB) + || (sc->getSCE(SC_CRYSTALIZE) && bl->type != BL_MOB) ) sc->cant.move += (start ? 1 : ((sc->cant.move) ? -1 : 0)); } @@ -5349,7 +5387,7 @@ void status_calc_state( struct block_list *bl, struct status_change *sc, std::bi if( flag[SCS_NOCAST] ) { if( !flag[SCS_NOCASTCOND] ) sc->cant.cast += (start ? 1 : ((sc->cant.cast) ? -1 : 0)); - else if (sc->data[SC_OBLIVIONCURSE] && sc->data[SC_OBLIVIONCURSE]->val3 == 1) + else if (sc->getSCE(SC_OBLIVIONCURSE) && sc->getSCE(SC_OBLIVIONCURSE)->val3 == 1) sc->cant.cast += (start ? 1 : ((sc->cant.cast) ? -1 : 0)); } @@ -5357,7 +5395,7 @@ void status_calc_state( struct block_list *bl, struct status_change *sc, std::bi if( flag[SCS_NOCHAT] ) { if( !flag[SCS_NOCHATCOND] ) sc->cant.chat += (start ? 1 : ((sc->cant.chat) ? -1 : 0)); - else if(sc->data[SC_NOCHAT] && sc->data[SC_NOCHAT]->val1&MANNER_NOCHAT) + else if(sc->getSCE(SC_NOCHAT) && sc->getSCE(SC_NOCHAT)->val1&MANNER_NOCHAT) sc->cant.chat += (start ? 1 : ((sc->cant.chat) ? -1 : 0)); } @@ -5373,7 +5411,7 @@ void status_calc_state( struct block_list *bl, struct status_change *sc, std::bi if (flag[SCS_NOWARP]) { if (!flag[SCS_NOWARPCOND]) sc->cant.warp += (start ? 1 : ((sc->cant.warp) ? -1 : 0)); - /*else if (sc->data[]) + /*else if (sc->getSCE()) sc->cant.warp += ( start ? 1 : ((sc->cant.warp)? -1:0) );*/ } @@ -5383,7 +5421,7 @@ void status_calc_state( struct block_list *bl, struct status_change *sc, std::bi if( flag[SCS_NOPICKITEM] ) { if( !flag[SCS_NOPICKITEMCOND] ) sc->cant.pickup += (start ? 1 : ((sc->cant.pickup) ? -1 : 0)); - else if( (sc->data[SC_NOCHAT] && sc->data[SC_NOCHAT]->val1&MANNER_NOITEM) ) + else if( (sc->getSCE(SC_NOCHAT) && sc->getSCE(SC_NOCHAT)->val1&MANNER_NOITEM) ) sc->cant.pickup += (start ? 1 : ((sc->cant.pickup) ? -1 : 0)); } @@ -5391,7 +5429,7 @@ void status_calc_state( struct block_list *bl, struct status_change *sc, std::bi if( flag[SCS_NODROPITEM] ) { if( !flag[SCS_NODROPITEMCOND] ) sc->cant.drop += (start ? 1 : ((sc->cant.drop) ? -1 : 0)); - else if( (sc->data[SC_NOCHAT] && sc->data[SC_NOCHAT]->val1&MANNER_NOITEM) ) + else if( (sc->getSCE(SC_NOCHAT) && sc->getSCE(SC_NOCHAT)->val1&MANNER_NOITEM) ) sc->cant.drop += (start ? 1 : ((sc->cant.drop) ? -1 : 0)); } @@ -5415,8 +5453,8 @@ void status_calc_state( struct block_list *bl, struct status_change *sc, std::bi if( flag[SCS_NOCONSUMEITEM]) { if( !flag[SCS_NOCONSUMEITEMCOND] ) sc->cant.consume += (start ? 1 : ((sc->cant.consume) ? -1 : 0)); - else if( (sc->data[SC_GRAVITATION] && sc->data[SC_GRAVITATION]->val3 == BCT_SELF) || - (sc->data[SC_NOCHAT] && sc->data[SC_NOCHAT]->val1&MANNER_NOITEM) ) + else if( (sc->getSCE(SC_GRAVITATION) && sc->getSCE(SC_GRAVITATION)->val3 == BCT_SELF) || + (sc->getSCE(SC_NOCHAT) && sc->getSCE(SC_NOCHAT)->val1&MANNER_NOITEM) ) sc->cant.consume += (start ? 1 : ((sc->cant.consume) ? -1 : 0)); } @@ -5424,7 +5462,7 @@ void status_calc_state( struct block_list *bl, struct status_change *sc, std::bi if (flag[SCS_NODEATHPENALTY]) { if (!flag[SCS_NODEATHPENALTYCOND]) sc->cant.deathpenalty += (start ? 1 : ((sc->cant.deathpenalty) ? -1 : 0)); - /*else if (sc->data[]) + /*else if (sc->getSCE()) sc->cant.deathpenalty += ( start ? 1 : ((sc->cant.deathpenalty)? -1:0) );*/ } @@ -5432,7 +5470,7 @@ void status_calc_state( struct block_list *bl, struct status_change *sc, std::bi if (flag[SCS_NOINTERACT]) { if (!flag[SCS_NOINTERACTCOND]) sc->cant.interact += (start ? 1 : ((sc->cant.interact) ? -1 : 0)); - /*else if (sc->data[]) + /*else if (sc->getSCE()) sc->cant.interact += ( start ? 1 : ((sc->cant.interact)? -1:0) );*/ } } @@ -5877,7 +5915,7 @@ void status_calc_bl_main(struct block_list *bl, std::bitset flag) } if ((bl->type&BL_HOM && battle_config.hom_setting&HOMSET_SAME_MATK) /// Hom Min Matk is always the same as Max Matk - || (sc && sc->data[SC_RECOGNIZEDSPELL])) + || (sc && sc->getSCE(SC_RECOGNIZEDSPELL))) status->matk_min = status->matk_max; #ifdef RENEWAL @@ -6278,76 +6316,76 @@ static unsigned short status_calc_str(struct block_list *bl, struct status_chang if(!sc || !sc->count) return cap_value(str,0,USHRT_MAX); - if(sc->data[SC_HARMONIZE]) { - str -= sc->data[SC_HARMONIZE]->val2; + if(sc->getSCE(SC_HARMONIZE)) { + str -= sc->getSCE(SC_HARMONIZE)->val2; return (unsigned short)cap_value(str,0,USHRT_MAX); } - if(sc->data[SC_INCALLSTATUS]) - str += sc->data[SC_INCALLSTATUS]->val1; - if(sc->data[SC_CHASEWALK2]) - str += sc->data[SC_CHASEWALK2]->val1; - if(sc->data[SC_INCSTR]) - str += sc->data[SC_INCSTR]->val1; - if(sc->data[SC_STRFOOD]) - str += sc->data[SC_STRFOOD]->val1; - if(sc->data[SC_FOOD_STR_CASH]) - str += sc->data[SC_FOOD_STR_CASH]->val1; - if(sc->data[SC_BATTLEORDERS]) + if(sc->getSCE(SC_INCALLSTATUS)) + str += sc->getSCE(SC_INCALLSTATUS)->val1; + if(sc->getSCE(SC_CHASEWALK2)) + str += sc->getSCE(SC_CHASEWALK2)->val1; + if(sc->getSCE(SC_INCSTR)) + str += sc->getSCE(SC_INCSTR)->val1; + if(sc->getSCE(SC_STRFOOD)) + str += sc->getSCE(SC_STRFOOD)->val1; + if(sc->getSCE(SC_FOOD_STR_CASH)) + str += sc->getSCE(SC_FOOD_STR_CASH)->val1; + if(sc->getSCE(SC_BATTLEORDERS)) str += 5; - if(sc->data[SC_LEADERSHIP]) - str += sc->data[SC_LEADERSHIP]->val1; - if(sc->data[SC_LOUD]) + if(sc->getSCE(SC_LEADERSHIP)) + str += sc->getSCE(SC_LEADERSHIP)->val1; + if(sc->getSCE(SC_LOUD)) str += 4; - if(sc->data[SC_TRUESIGHT]) + if(sc->getSCE(SC_TRUESIGHT)) str += 5; - if(sc->data[SC_SPURT]) + if(sc->getSCE(SC_SPURT)) str += 10; - if(sc->data[SC_NEN]) - str += sc->data[SC_NEN]->val1; - if(sc->data[SC_BLESSING]) { - if(sc->data[SC_BLESSING]->val2) - str += sc->data[SC_BLESSING]->val2; + if(sc->getSCE(SC_NEN)) + str += sc->getSCE(SC_NEN)->val1; + if(sc->getSCE(SC_BLESSING)) { + if(sc->getSCE(SC_BLESSING)->val2) + str += sc->getSCE(SC_BLESSING)->val2; else str -= str / 2; } - if(sc->data[SC_MARIONETTE]) - str -= ((sc->data[SC_MARIONETTE]->val3)>>16)&0xFF; - if(sc->data[SC_MARIONETTE2]) - str += ((sc->data[SC_MARIONETTE2]->val3)>>16)&0xFF; - if(sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_HIGH) - str += ((sc->data[SC_SPIRIT]->val3)>>16)&0xFF; - if(sc->data[SC_GIANTGROWTH]) - str += sc->data[SC_GIANTGROWTH]->val2; - if(sc->data[SC_BEYONDOFWARCRY]) - str -= sc->data[SC_BEYONDOFWARCRY]->val2; - if(sc->data[SC_SAVAGE_STEAK]) - str += sc->data[SC_SAVAGE_STEAK]->val1; - if(sc->data[SC_INSPIRATION]) - str += sc->data[SC_INSPIRATION]->val3; - if(sc->data[SC_STOMACHACHE]) - str -= sc->data[SC_STOMACHACHE]->val1; - if(sc->data[SC_KYOUGAKU]) - str -= sc->data[SC_KYOUGAKU]->val2; - if(sc->data[SC_SWORDCLAN]) + if(sc->getSCE(SC_MARIONETTE)) + str -= ((sc->getSCE(SC_MARIONETTE)->val3)>>16)&0xFF; + if(sc->getSCE(SC_MARIONETTE2)) + str += ((sc->getSCE(SC_MARIONETTE2)->val3)>>16)&0xFF; + if(sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_HIGH) + str += ((sc->getSCE(SC_SPIRIT)->val3)>>16)&0xFF; + if(sc->getSCE(SC_GIANTGROWTH)) + str += sc->getSCE(SC_GIANTGROWTH)->val2; + if(sc->getSCE(SC_BEYONDOFWARCRY)) + str -= sc->getSCE(SC_BEYONDOFWARCRY)->val2; + if(sc->getSCE(SC_SAVAGE_STEAK)) + str += sc->getSCE(SC_SAVAGE_STEAK)->val1; + if(sc->getSCE(SC_INSPIRATION)) + str += sc->getSCE(SC_INSPIRATION)->val3; + if(sc->getSCE(SC_STOMACHACHE)) + str -= sc->getSCE(SC_STOMACHACHE)->val1; + if(sc->getSCE(SC_KYOUGAKU)) + str -= sc->getSCE(SC_KYOUGAKU)->val2; + if(sc->getSCE(SC_SWORDCLAN)) str += 1; - if(sc->data[SC_JUMPINGCLAN]) + if(sc->getSCE(SC_JUMPINGCLAN)) str += 1; - if(sc->data[SC_FULL_THROTTLE]) - str += str * sc->data[SC_FULL_THROTTLE]->val3 / 100; - if(sc->data[SC_CHEERUP]) + if(sc->getSCE(SC_FULL_THROTTLE)) + str += str * sc->getSCE(SC_FULL_THROTTLE)->val3 / 100; + if(sc->getSCE(SC_CHEERUP)) str += 3; - if(sc->data[SC_GLASTHEIM_STATE]) - str += sc->data[SC_GLASTHEIM_STATE]->val1; + if(sc->getSCE(SC_GLASTHEIM_STATE)) + str += sc->getSCE(SC_GLASTHEIM_STATE)->val1; #ifdef RENEWAL - if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ALLSTAT) + if (sc->getSCE(SC_NIBELUNGEN) && sc->getSCE(SC_NIBELUNGEN)->val2 == RINGNBL_ALLSTAT) str += 15; #endif - if (sc->data[SC_UNIVERSESTANCE]) - str += sc->data[SC_UNIVERSESTANCE]->val2; - if (sc->data[SC_ALMIGHTY]) - str += sc->data[SC_ALMIGHTY]->val1; - if (sc->data[SC_ULTIMATECOOK]) - str += sc->data[SC_ULTIMATECOOK]->val1; + if (sc->getSCE(SC_UNIVERSESTANCE)) + str += sc->getSCE(SC_UNIVERSESTANCE)->val2; + if (sc->getSCE(SC_ALMIGHTY)) + str += sc->getSCE(SC_ALMIGHTY)->val1; + if (sc->getSCE(SC_ULTIMATECOOK)) + str += sc->getSCE(SC_ULTIMATECOOK)->val1; return (unsigned short)cap_value(str,0,USHRT_MAX); } @@ -6364,74 +6402,74 @@ static unsigned short status_calc_agi(struct block_list *bl, struct status_chang if(!sc || !sc->count) return cap_value(agi,0,USHRT_MAX); - if(sc->data[SC_HARMONIZE]) { - agi -= sc->data[SC_HARMONIZE]->val2; + if(sc->getSCE(SC_HARMONIZE)) { + agi -= sc->getSCE(SC_HARMONIZE)->val2; return (unsigned short)cap_value(agi,0,USHRT_MAX); } - if(sc->data[SC_CONCENTRATE] && !sc->data[SC_QUAGMIRE]) - agi += (agi-sc->data[SC_CONCENTRATE]->val3)*sc->data[SC_CONCENTRATE]->val2/100; - if(sc->data[SC_INCALLSTATUS]) - agi += sc->data[SC_INCALLSTATUS]->val1; - if(sc->data[SC_INCAGI]) - agi += sc->data[SC_INCAGI]->val1; - if(sc->data[SC_AGIFOOD]) - agi += sc->data[SC_AGIFOOD]->val1; - if(sc->data[SC_FOOD_AGI_CASH]) - agi += sc->data[SC_FOOD_AGI_CASH]->val1; - if(sc->data[SC_SOULCOLD]) - agi += sc->data[SC_SOULCOLD]->val1; - if(sc->data[SC_TRUESIGHT]) + if(sc->getSCE(SC_CONCENTRATE) && !sc->getSCE(SC_QUAGMIRE)) + agi += (agi-sc->getSCE(SC_CONCENTRATE)->val3)*sc->getSCE(SC_CONCENTRATE)->val2/100; + if(sc->getSCE(SC_INCALLSTATUS)) + agi += sc->getSCE(SC_INCALLSTATUS)->val1; + if(sc->getSCE(SC_INCAGI)) + agi += sc->getSCE(SC_INCAGI)->val1; + if(sc->getSCE(SC_AGIFOOD)) + agi += sc->getSCE(SC_AGIFOOD)->val1; + if(sc->getSCE(SC_FOOD_AGI_CASH)) + agi += sc->getSCE(SC_FOOD_AGI_CASH)->val1; + if(sc->getSCE(SC_SOULCOLD)) + agi += sc->getSCE(SC_SOULCOLD)->val1; + if(sc->getSCE(SC_TRUESIGHT)) agi += 5; - if(sc->data[SC_INCREASEAGI]) - agi += sc->data[SC_INCREASEAGI]->val2; - if(sc->data[SC_INCREASING]) + if(sc->getSCE(SC_INCREASEAGI)) + agi += sc->getSCE(SC_INCREASEAGI)->val2; + if(sc->getSCE(SC_INCREASING)) agi += 4; // Added based on skill updates [Reddozen] - if(sc->data[SC_DECREASEAGI]) - agi -= sc->data[SC_DECREASEAGI]->val2; - if(sc->data[SC_QUAGMIRE]) - agi -= sc->data[SC_QUAGMIRE]->val2; - if(sc->data[SC_SUITON] && sc->data[SC_SUITON]->val3) - agi -= sc->data[SC_SUITON]->val2; - if(sc->data[SC_MARIONETTE]) - agi -= ((sc->data[SC_MARIONETTE]->val3)>>8)&0xFF; - if(sc->data[SC_MARIONETTE2]) - agi += ((sc->data[SC_MARIONETTE2]->val3)>>8)&0xFF; - if(sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_HIGH) - agi += ((sc->data[SC_SPIRIT]->val3)>>8)&0xFF; - if(sc->data[SC_ADORAMUS]) - agi -= sc->data[SC_ADORAMUS]->val2; - if(sc->data[SC_MARSHOFABYSS]) - agi -= agi * sc->data[SC_MARSHOFABYSS]->val2 / 100; - if(sc->data[SC_DROCERA_HERB_STEAMED]) - agi += sc->data[SC_DROCERA_HERB_STEAMED]->val1; - if(sc->data[SC_INSPIRATION]) - agi += sc->data[SC_INSPIRATION]->val3; - if(sc->data[SC_STOMACHACHE]) - agi -= sc->data[SC_STOMACHACHE]->val1; - if(sc->data[SC_KYOUGAKU]) - agi -= sc->data[SC_KYOUGAKU]->val2; - if(sc->data[SC_CROSSBOWCLAN]) + if(sc->getSCE(SC_DECREASEAGI)) + agi -= sc->getSCE(SC_DECREASEAGI)->val2; + if(sc->getSCE(SC_QUAGMIRE)) + agi -= sc->getSCE(SC_QUAGMIRE)->val2; + if(sc->getSCE(SC_SUITON) && sc->getSCE(SC_SUITON)->val3) + agi -= sc->getSCE(SC_SUITON)->val2; + if(sc->getSCE(SC_MARIONETTE)) + agi -= ((sc->getSCE(SC_MARIONETTE)->val3)>>8)&0xFF; + if(sc->getSCE(SC_MARIONETTE2)) + agi += ((sc->getSCE(SC_MARIONETTE2)->val3)>>8)&0xFF; + if(sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_HIGH) + agi += ((sc->getSCE(SC_SPIRIT)->val3)>>8)&0xFF; + if(sc->getSCE(SC_ADORAMUS)) + agi -= sc->getSCE(SC_ADORAMUS)->val2; + if(sc->getSCE(SC_MARSHOFABYSS)) + agi -= agi * sc->getSCE(SC_MARSHOFABYSS)->val2 / 100; + if(sc->getSCE(SC_DROCERA_HERB_STEAMED)) + agi += sc->getSCE(SC_DROCERA_HERB_STEAMED)->val1; + if(sc->getSCE(SC_INSPIRATION)) + agi += sc->getSCE(SC_INSPIRATION)->val3; + if(sc->getSCE(SC_STOMACHACHE)) + agi -= sc->getSCE(SC_STOMACHACHE)->val1; + if(sc->getSCE(SC_KYOUGAKU)) + agi -= sc->getSCE(SC_KYOUGAKU)->val2; + if(sc->getSCE(SC_CROSSBOWCLAN)) agi += 1; - if(sc->data[SC_JUMPINGCLAN]) + if(sc->getSCE(SC_JUMPINGCLAN)) agi += 1; - if(sc->data[SC_FULL_THROTTLE]) - agi += agi * sc->data[SC_FULL_THROTTLE]->val3 / 100; - if (sc->data[SC_ARCLOUSEDASH]) - agi += sc->data[SC_ARCLOUSEDASH]->val2; - if(sc->data[SC_CHEERUP]) + if(sc->getSCE(SC_FULL_THROTTLE)) + agi += agi * sc->getSCE(SC_FULL_THROTTLE)->val3 / 100; + if (sc->getSCE(SC_ARCLOUSEDASH)) + agi += sc->getSCE(SC_ARCLOUSEDASH)->val2; + if(sc->getSCE(SC_CHEERUP)) agi += 3; - if(sc->data[SC_GLASTHEIM_STATE]) - agi += sc->data[SC_GLASTHEIM_STATE]->val1; + if(sc->getSCE(SC_GLASTHEIM_STATE)) + agi += sc->getSCE(SC_GLASTHEIM_STATE)->val1; #ifdef RENEWAL - if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ALLSTAT) + if (sc->getSCE(SC_NIBELUNGEN) && sc->getSCE(SC_NIBELUNGEN)->val2 == RINGNBL_ALLSTAT) agi += 15; #endif - if (sc->data[SC_UNIVERSESTANCE]) - agi += sc->data[SC_UNIVERSESTANCE]->val2; - if (sc->data[SC_ALMIGHTY]) - agi += sc->data[SC_ALMIGHTY]->val1; - if (sc->data[SC_ULTIMATECOOK]) - agi += sc->data[SC_ULTIMATECOOK]->val1; + if (sc->getSCE(SC_UNIVERSESTANCE)) + agi += sc->getSCE(SC_UNIVERSESTANCE)->val2; + if (sc->getSCE(SC_ALMIGHTY)) + agi += sc->getSCE(SC_ALMIGHTY)->val1; + if (sc->getSCE(SC_ULTIMATECOOK)) + agi += sc->getSCE(SC_ULTIMATECOOK)->val1; return (unsigned short)cap_value(agi,0,USHRT_MAX); } @@ -6448,65 +6486,65 @@ static unsigned short status_calc_vit(struct block_list *bl, struct status_chang if(!sc || !sc->count) return cap_value(vit,0,USHRT_MAX); - if(sc->data[SC_HARMONIZE]) { - vit -= sc->data[SC_HARMONIZE]->val2; + if(sc->getSCE(SC_HARMONIZE)) { + vit -= sc->getSCE(SC_HARMONIZE)->val2; return (unsigned short)cap_value(vit,0,USHRT_MAX); } - if(sc->data[SC_INCALLSTATUS]) - vit += sc->data[SC_INCALLSTATUS]->val1; - if(sc->data[SC_INCVIT]) - vit += sc->data[SC_INCVIT]->val1; - if(sc->data[SC_VITFOOD]) - vit += sc->data[SC_VITFOOD]->val1; - if(sc->data[SC_FOOD_VIT_CASH]) - vit += sc->data[SC_FOOD_VIT_CASH]->val1; - if(sc->data[SC_CHANGE]) - vit += sc->data[SC_CHANGE]->val2; - if(sc->data[SC_GLORYWOUNDS]) - vit += sc->data[SC_GLORYWOUNDS]->val1; - if(sc->data[SC_TRUESIGHT]) + if(sc->getSCE(SC_INCALLSTATUS)) + vit += sc->getSCE(SC_INCALLSTATUS)->val1; + if(sc->getSCE(SC_INCVIT)) + vit += sc->getSCE(SC_INCVIT)->val1; + if(sc->getSCE(SC_VITFOOD)) + vit += sc->getSCE(SC_VITFOOD)->val1; + if(sc->getSCE(SC_FOOD_VIT_CASH)) + vit += sc->getSCE(SC_FOOD_VIT_CASH)->val1; + if(sc->getSCE(SC_CHANGE)) + vit += sc->getSCE(SC_CHANGE)->val2; + if(sc->getSCE(SC_GLORYWOUNDS)) + vit += sc->getSCE(SC_GLORYWOUNDS)->val1; + if(sc->getSCE(SC_TRUESIGHT)) vit += 5; - if(sc->data[SC_MARIONETTE]) - vit -= sc->data[SC_MARIONETTE]->val3&0xFF; - if(sc->data[SC_MARIONETTE2]) - vit += sc->data[SC_MARIONETTE2]->val3&0xFF; - if(sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_HIGH) - vit += sc->data[SC_SPIRIT]->val3&0xFF; - if(sc->data[SC_MINOR_BBQ]) - vit += sc->data[SC_MINOR_BBQ]->val1; - if(sc->data[SC_INSPIRATION]) - vit += sc->data[SC_INSPIRATION]->val3; - if(sc->data[SC_STOMACHACHE]) - vit -= sc->data[SC_STOMACHACHE]->val1; - if(sc->data[SC_KYOUGAKU]) - vit -= sc->data[SC_KYOUGAKU]->val2; - if(sc->data[SC_SWORDCLAN]) + if(sc->getSCE(SC_MARIONETTE)) + vit -= sc->getSCE(SC_MARIONETTE)->val3&0xFF; + if(sc->getSCE(SC_MARIONETTE2)) + vit += sc->getSCE(SC_MARIONETTE2)->val3&0xFF; + if(sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_HIGH) + vit += sc->getSCE(SC_SPIRIT)->val3&0xFF; + if(sc->getSCE(SC_MINOR_BBQ)) + vit += sc->getSCE(SC_MINOR_BBQ)->val1; + if(sc->getSCE(SC_INSPIRATION)) + vit += sc->getSCE(SC_INSPIRATION)->val3; + if(sc->getSCE(SC_STOMACHACHE)) + vit -= sc->getSCE(SC_STOMACHACHE)->val1; + if(sc->getSCE(SC_KYOUGAKU)) + vit -= sc->getSCE(SC_KYOUGAKU)->val2; + if(sc->getSCE(SC_SWORDCLAN)) vit += 1; - if(sc->data[SC_JUMPINGCLAN]) + if(sc->getSCE(SC_JUMPINGCLAN)) vit += 1; - if(sc->data[SC_STRIPARMOR] && bl->type != BL_PC) - vit -= vit * sc->data[SC_STRIPARMOR]->val2/100; - if(sc->data[SC_FULL_THROTTLE]) - vit += vit * sc->data[SC_FULL_THROTTLE]->val3 / 100; + if(sc->getSCE(SC_STRIPARMOR) && bl->type != BL_PC) + vit -= vit * sc->getSCE(SC_STRIPARMOR)->val2/100; + if(sc->getSCE(SC_FULL_THROTTLE)) + vit += vit * sc->getSCE(SC_FULL_THROTTLE)->val3 / 100; #ifdef RENEWAL - if(sc->data[SC_DEFENCE]) - vit += sc->data[SC_DEFENCE]->val2; + if(sc->getSCE(SC_DEFENCE)) + vit += sc->getSCE(SC_DEFENCE)->val2; #endif - if(sc->data[SC_CHEERUP]) + if(sc->getSCE(SC_CHEERUP)) vit += 3; - if(sc->data[SC_GLASTHEIM_STATE]) - vit += sc->data[SC_GLASTHEIM_STATE]->val1; + if(sc->getSCE(SC_GLASTHEIM_STATE)) + vit += sc->getSCE(SC_GLASTHEIM_STATE)->val1; #ifdef RENEWAL - if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ALLSTAT) + if (sc->getSCE(SC_NIBELUNGEN) && sc->getSCE(SC_NIBELUNGEN)->val2 == RINGNBL_ALLSTAT) vit += 15; #endif - if (sc->data[SC_UNIVERSESTANCE]) - vit += sc->data[SC_UNIVERSESTANCE]->val2; - if (sc->data[SC_ALMIGHTY]) - vit += sc->data[SC_ALMIGHTY]->val1; - if (sc->data[SC_ULTIMATECOOK]) - vit += sc->data[SC_ULTIMATECOOK]->val1; - if (sc->data[SC_CUP_OF_BOZA]) + if (sc->getSCE(SC_UNIVERSESTANCE)) + vit += sc->getSCE(SC_UNIVERSESTANCE)->val2; + if (sc->getSCE(SC_ALMIGHTY)) + vit += sc->getSCE(SC_ALMIGHTY)->val1; + if (sc->getSCE(SC_ULTIMATECOOK)) + vit += sc->getSCE(SC_ULTIMATECOOK)->val1; + if (sc->getSCE(SC_CUP_OF_BOZA)) vit += 10; return (unsigned short)cap_value(vit,0,USHRT_MAX); @@ -6524,79 +6562,79 @@ static unsigned short status_calc_int(struct block_list *bl, struct status_chang if(!sc || !sc->count) return cap_value(int_,0,USHRT_MAX); - if(sc->data[SC_HARMONIZE]) { - int_ -= sc->data[SC_HARMONIZE]->val2; + if(sc->getSCE(SC_HARMONIZE)) { + int_ -= sc->getSCE(SC_HARMONIZE)->val2; return (unsigned short)cap_value(int_,0,USHRT_MAX); } - if(sc->data[SC_INCALLSTATUS]) - int_ += sc->data[SC_INCALLSTATUS]->val1; - if(sc->data[SC_INCINT]) - int_ += sc->data[SC_INCINT]->val1; - if(sc->data[SC_INTFOOD]) - int_ += sc->data[SC_INTFOOD]->val1; - if(sc->data[SC_FOOD_INT_CASH]) - int_ += sc->data[SC_FOOD_INT_CASH]->val1; - if(sc->data[SC_CHANGE]) - int_ += sc->data[SC_CHANGE]->val3; - if(sc->data[SC_BATTLEORDERS]) + if(sc->getSCE(SC_INCALLSTATUS)) + int_ += sc->getSCE(SC_INCALLSTATUS)->val1; + if(sc->getSCE(SC_INCINT)) + int_ += sc->getSCE(SC_INCINT)->val1; + if(sc->getSCE(SC_INTFOOD)) + int_ += sc->getSCE(SC_INTFOOD)->val1; + if(sc->getSCE(SC_FOOD_INT_CASH)) + int_ += sc->getSCE(SC_FOOD_INT_CASH)->val1; + if(sc->getSCE(SC_CHANGE)) + int_ += sc->getSCE(SC_CHANGE)->val3; + if(sc->getSCE(SC_BATTLEORDERS)) int_ += 5; - if(sc->data[SC_TRUESIGHT]) + if(sc->getSCE(SC_TRUESIGHT)) int_ += 5; - if(sc->data[SC_BLESSING]) { - if (sc->data[SC_BLESSING]->val2) - int_ += sc->data[SC_BLESSING]->val2; + if(sc->getSCE(SC_BLESSING)) { + if (sc->getSCE(SC_BLESSING)->val2) + int_ += sc->getSCE(SC_BLESSING)->val2; else int_ -= int_ / 2; } - if(sc->data[SC_NEN]) - int_ += sc->data[SC_NEN]->val1; - if(sc->data[SC_MARIONETTE]) - int_ -= ((sc->data[SC_MARIONETTE]->val4)>>16)&0xFF; - if(sc->data[SC_MARIONETTE2]) - int_ += ((sc->data[SC_MARIONETTE2]->val4)>>16)&0xFF; - if(sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_HIGH) - int_ += ((sc->data[SC_SPIRIT]->val4)>>16)&0xFF; - if(sc->data[SC_INSPIRATION]) - int_ += sc->data[SC_INSPIRATION]->val3; - if(sc->data[SC_MELODYOFSINK]) - int_ -= sc->data[SC_MELODYOFSINK]->val2; - if(sc->data[SC_MANDRAGORA]) - int_ -= 4 * sc->data[SC_MANDRAGORA]->val1; - if(sc->data[SC_COCKTAIL_WARG_BLOOD]) - int_ += sc->data[SC_COCKTAIL_WARG_BLOOD]->val1; - if(sc->data[SC_STOMACHACHE]) - int_ -= sc->data[SC_STOMACHACHE]->val1; - if(sc->data[SC_KYOUGAKU]) - int_ -= sc->data[SC_KYOUGAKU]->val2; - if(sc->data[SC_ARCWANDCLAN]) + if(sc->getSCE(SC_NEN)) + int_ += sc->getSCE(SC_NEN)->val1; + if(sc->getSCE(SC_MARIONETTE)) + int_ -= ((sc->getSCE(SC_MARIONETTE)->val4)>>16)&0xFF; + if(sc->getSCE(SC_MARIONETTE2)) + int_ += ((sc->getSCE(SC_MARIONETTE2)->val4)>>16)&0xFF; + if(sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_HIGH) + int_ += ((sc->getSCE(SC_SPIRIT)->val4)>>16)&0xFF; + if(sc->getSCE(SC_INSPIRATION)) + int_ += sc->getSCE(SC_INSPIRATION)->val3; + if(sc->getSCE(SC_MELODYOFSINK)) + int_ -= sc->getSCE(SC_MELODYOFSINK)->val2; + if(sc->getSCE(SC_MANDRAGORA)) + int_ -= 4 * sc->getSCE(SC_MANDRAGORA)->val1; + if(sc->getSCE(SC_COCKTAIL_WARG_BLOOD)) + int_ += sc->getSCE(SC_COCKTAIL_WARG_BLOOD)->val1; + if(sc->getSCE(SC_STOMACHACHE)) + int_ -= sc->getSCE(SC_STOMACHACHE)->val1; + if(sc->getSCE(SC_KYOUGAKU)) + int_ -= sc->getSCE(SC_KYOUGAKU)->val2; + if(sc->getSCE(SC_ARCWANDCLAN)) int_ += 1; - if(sc->data[SC_GOLDENMACECLAN]) + if(sc->getSCE(SC_GOLDENMACECLAN)) int_ += 1; - if(sc->data[SC_JUMPINGCLAN]) + if(sc->getSCE(SC_JUMPINGCLAN)) int_ += 1; - if(sc->data[SC_FULL_THROTTLE]) - int_ += int_ * sc->data[SC_FULL_THROTTLE]->val3 / 100; - if(sc->data[SC_CHEERUP]) + if(sc->getSCE(SC_FULL_THROTTLE)) + int_ += int_ * sc->getSCE(SC_FULL_THROTTLE)->val3 / 100; + if(sc->getSCE(SC_CHEERUP)) int_ += 3; - if(sc->data[SC_GLASTHEIM_STATE]) - int_ += sc->data[SC_GLASTHEIM_STATE]->val1; - if (sc->data[SC_UNIVERSESTANCE]) - int_ += sc->data[SC_UNIVERSESTANCE]->val2; + if(sc->getSCE(SC_GLASTHEIM_STATE)) + int_ += sc->getSCE(SC_GLASTHEIM_STATE)->val1; + if (sc->getSCE(SC_UNIVERSESTANCE)) + int_ += sc->getSCE(SC_UNIVERSESTANCE)->val2; if(bl->type != BL_PC) { - if(sc->data[SC_STRIPHELM]) - int_ -= int_ * sc->data[SC_STRIPHELM]->val2/100; - if(sc->data[SC__STRIPACCESSORY]) - int_ -= int_ * sc->data[SC__STRIPACCESSORY]->val2 / 100; + if(sc->getSCE(SC_STRIPHELM)) + int_ -= int_ * sc->getSCE(SC_STRIPHELM)->val2/100; + if(sc->getSCE(SC__STRIPACCESSORY)) + int_ -= int_ * sc->getSCE(SC__STRIPACCESSORY)->val2 / 100; } #ifdef RENEWAL - if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ALLSTAT) + if (sc->getSCE(SC_NIBELUNGEN) && sc->getSCE(SC_NIBELUNGEN)->val2 == RINGNBL_ALLSTAT) int_ += 15; #endif - if (sc->data[SC_ALMIGHTY]) - int_ += sc->data[SC_ALMIGHTY]->val1; - if (sc->data[SC_ULTIMATECOOK]) - int_ += sc->data[SC_ULTIMATECOOK]->val1; + if (sc->getSCE(SC_ALMIGHTY)) + int_ += sc->getSCE(SC_ALMIGHTY)->val1; + if (sc->getSCE(SC_ULTIMATECOOK)) + int_ += sc->getSCE(SC_ULTIMATECOOK)->val1; return (unsigned short)cap_value(int_,0,USHRT_MAX); } @@ -6613,76 +6651,76 @@ static unsigned short status_calc_dex(struct block_list *bl, struct status_chang if(!sc || !sc->count) return cap_value(dex,0,USHRT_MAX); - if(sc->data[SC_HARMONIZE]) { - dex -= sc->data[SC_HARMONIZE]->val2; + if(sc->getSCE(SC_HARMONIZE)) { + dex -= sc->getSCE(SC_HARMONIZE)->val2; return (unsigned short)cap_value(dex,0,USHRT_MAX); } - if(sc->data[SC_CONCENTRATE] && !sc->data[SC_QUAGMIRE]) - dex += (dex-sc->data[SC_CONCENTRATE]->val4)*sc->data[SC_CONCENTRATE]->val2/100; - if(sc->data[SC_INCALLSTATUS]) - dex += sc->data[SC_INCALLSTATUS]->val1; - if(sc->data[SC_INCDEX]) - dex += sc->data[SC_INCDEX]->val1; - if(sc->data[SC_DEXFOOD]) - dex += sc->data[SC_DEXFOOD]->val1; - if(sc->data[SC_FOOD_DEX_CASH]) - dex += sc->data[SC_FOOD_DEX_CASH]->val1; - if(sc->data[SC_BATTLEORDERS]) + if(sc->getSCE(SC_CONCENTRATE) && !sc->getSCE(SC_QUAGMIRE)) + dex += (dex-sc->getSCE(SC_CONCENTRATE)->val4)*sc->getSCE(SC_CONCENTRATE)->val2/100; + if(sc->getSCE(SC_INCALLSTATUS)) + dex += sc->getSCE(SC_INCALLSTATUS)->val1; + if(sc->getSCE(SC_INCDEX)) + dex += sc->getSCE(SC_INCDEX)->val1; + if(sc->getSCE(SC_DEXFOOD)) + dex += sc->getSCE(SC_DEXFOOD)->val1; + if(sc->getSCE(SC_FOOD_DEX_CASH)) + dex += sc->getSCE(SC_FOOD_DEX_CASH)->val1; + if(sc->getSCE(SC_BATTLEORDERS)) dex += 5; - if(sc->data[SC_HAWKEYES]) - dex += sc->data[SC_HAWKEYES]->val1; - if(sc->data[SC_TRUESIGHT]) + if(sc->getSCE(SC_HAWKEYES)) + dex += sc->getSCE(SC_HAWKEYES)->val1; + if(sc->getSCE(SC_TRUESIGHT)) dex += 5; - if(sc->data[SC_QUAGMIRE]) - dex -= sc->data[SC_QUAGMIRE]->val2; - if(sc->data[SC_BLESSING]) { - if (sc->data[SC_BLESSING]->val2) - dex += sc->data[SC_BLESSING]->val2; + if(sc->getSCE(SC_QUAGMIRE)) + dex -= sc->getSCE(SC_QUAGMIRE)->val2; + if(sc->getSCE(SC_BLESSING)) { + if (sc->getSCE(SC_BLESSING)->val2) + dex += sc->getSCE(SC_BLESSING)->val2; else dex -= dex / 2; } - if(sc->data[SC_INCREASING]) + if(sc->getSCE(SC_INCREASING)) dex += 4; // Added based on skill updates [Reddozen] - if(sc->data[SC_MARIONETTE]) - dex -= ((sc->data[SC_MARIONETTE]->val4)>>8)&0xFF; - if(sc->data[SC_MARIONETTE2]) - dex += ((sc->data[SC_MARIONETTE2]->val4)>>8)&0xFF; - if(sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_HIGH) - dex += ((sc->data[SC_SPIRIT]->val4)>>8)&0xFF; - if(sc->data[SC_SIROMA_ICE_TEA]) - dex += sc->data[SC_SIROMA_ICE_TEA]->val1; - if(sc->data[SC_INSPIRATION]) - dex += sc->data[SC_INSPIRATION]->val3; - if(sc->data[SC_STOMACHACHE]) - dex -= sc->data[SC_STOMACHACHE]->val1; - if(sc->data[SC_KYOUGAKU]) - dex -= sc->data[SC_KYOUGAKU]->val2; - if(sc->data[SC_ARCWANDCLAN]) + if(sc->getSCE(SC_MARIONETTE)) + dex -= ((sc->getSCE(SC_MARIONETTE)->val4)>>8)&0xFF; + if(sc->getSCE(SC_MARIONETTE2)) + dex += ((sc->getSCE(SC_MARIONETTE2)->val4)>>8)&0xFF; + if(sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_HIGH) + dex += ((sc->getSCE(SC_SPIRIT)->val4)>>8)&0xFF; + if(sc->getSCE(SC_SIROMA_ICE_TEA)) + dex += sc->getSCE(SC_SIROMA_ICE_TEA)->val1; + if(sc->getSCE(SC_INSPIRATION)) + dex += sc->getSCE(SC_INSPIRATION)->val3; + if(sc->getSCE(SC_STOMACHACHE)) + dex -= sc->getSCE(SC_STOMACHACHE)->val1; + if(sc->getSCE(SC_KYOUGAKU)) + dex -= sc->getSCE(SC_KYOUGAKU)->val2; + if(sc->getSCE(SC_ARCWANDCLAN)) dex += 1; - if(sc->data[SC_CROSSBOWCLAN]) + if(sc->getSCE(SC_CROSSBOWCLAN)) dex += 1; - if(sc->data[SC_JUMPINGCLAN]) + if(sc->getSCE(SC_JUMPINGCLAN)) dex += 1; - if(sc->data[SC__STRIPACCESSORY] && bl->type != BL_PC) - dex -= dex * sc->data[SC__STRIPACCESSORY]->val2 / 100; - if(sc->data[SC_MARSHOFABYSS]) - dex -= dex * sc->data[SC_MARSHOFABYSS]->val2 / 100; - if(sc->data[SC_FULL_THROTTLE]) - dex += dex * sc->data[SC_FULL_THROTTLE]->val3 / 100; - if(sc->data[SC_CHEERUP]) + if(sc->getSCE(SC__STRIPACCESSORY) && bl->type != BL_PC) + dex -= dex * sc->getSCE(SC__STRIPACCESSORY)->val2 / 100; + if(sc->getSCE(SC_MARSHOFABYSS)) + dex -= dex * sc->getSCE(SC_MARSHOFABYSS)->val2 / 100; + if(sc->getSCE(SC_FULL_THROTTLE)) + dex += dex * sc->getSCE(SC_FULL_THROTTLE)->val3 / 100; + if(sc->getSCE(SC_CHEERUP)) dex += 3; - if(sc->data[SC_GLASTHEIM_STATE]) - dex += sc->data[SC_GLASTHEIM_STATE]->val1; + if(sc->getSCE(SC_GLASTHEIM_STATE)) + dex += sc->getSCE(SC_GLASTHEIM_STATE)->val1; #ifdef RENEWAL - if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ALLSTAT) + if (sc->getSCE(SC_NIBELUNGEN) && sc->getSCE(SC_NIBELUNGEN)->val2 == RINGNBL_ALLSTAT) dex += 15; #endif - if (sc->data[SC_UNIVERSESTANCE]) - dex += sc->data[SC_UNIVERSESTANCE]->val2; - if (sc->data[SC_ALMIGHTY]) - dex += sc->data[SC_ALMIGHTY]->val1; - if (sc->data[SC_ULTIMATECOOK]) - dex += sc->data[SC_ULTIMATECOOK]->val1; + if (sc->getSCE(SC_UNIVERSESTANCE)) + dex += sc->getSCE(SC_UNIVERSESTANCE)->val2; + if (sc->getSCE(SC_ALMIGHTY)) + dex += sc->getSCE(SC_ALMIGHTY)->val1; + if (sc->getSCE(SC_ULTIMATECOOK)) + dex += sc->getSCE(SC_ULTIMATECOOK)->val1; return (unsigned short)cap_value(dex,0,USHRT_MAX); } @@ -6699,63 +6737,63 @@ static unsigned short status_calc_luk(struct block_list *bl, struct status_chang if(!sc || !sc->count) return cap_value(luk,0,USHRT_MAX); - if(sc->data[SC_HARMONIZE]) { - luk -= sc->data[SC_HARMONIZE]->val2; + if(sc->getSCE(SC_HARMONIZE)) { + luk -= sc->getSCE(SC_HARMONIZE)->val2; return (unsigned short)cap_value(luk,0,USHRT_MAX); } - if(sc->data[SC_CURSE]) + if(sc->getSCE(SC_CURSE)) return 0; - if(sc->data[SC_INCALLSTATUS]) - luk += sc->data[SC_INCALLSTATUS]->val1; - if(sc->data[SC_INCLUK]) - luk += sc->data[SC_INCLUK]->val1; - if(sc->data[SC_LUKFOOD]) - luk += sc->data[SC_LUKFOOD]->val1; - if(sc->data[SC_FOOD_LUK_CASH]) - luk += sc->data[SC_FOOD_LUK_CASH]->val1; - if(sc->data[SC_TRUESIGHT]) + if(sc->getSCE(SC_INCALLSTATUS)) + luk += sc->getSCE(SC_INCALLSTATUS)->val1; + if(sc->getSCE(SC_INCLUK)) + luk += sc->getSCE(SC_INCLUK)->val1; + if(sc->getSCE(SC_LUKFOOD)) + luk += sc->getSCE(SC_LUKFOOD)->val1; + if(sc->getSCE(SC_FOOD_LUK_CASH)) + luk += sc->getSCE(SC_FOOD_LUK_CASH)->val1; + if(sc->getSCE(SC_TRUESIGHT)) luk += 5; - if(sc->data[SC_GLORIA]) + if(sc->getSCE(SC_GLORIA)) luk += 30; - if(sc->data[SC_MARIONETTE]) - luk -= sc->data[SC_MARIONETTE]->val4&0xFF; - if(sc->data[SC_MARIONETTE2]) - luk += sc->data[SC_MARIONETTE2]->val4&0xFF; - if(sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_HIGH) - luk += sc->data[SC_SPIRIT]->val4&0xFF; - if(sc->data[SC_PUTTI_TAILS_NOODLES]) - luk += sc->data[SC_PUTTI_TAILS_NOODLES]->val1; - if(sc->data[SC_INSPIRATION]) - luk += sc->data[SC_INSPIRATION]->val3; - if(sc->data[SC_STOMACHACHE]) - luk -= sc->data[SC_STOMACHACHE]->val1; - if(sc->data[SC_KYOUGAKU]) - luk -= sc->data[SC_KYOUGAKU]->val2; - if(sc->data[SC__STRIPACCESSORY] && bl->type != BL_PC) - luk -= luk * sc->data[SC__STRIPACCESSORY]->val2 / 100; - if(sc->data[SC_BANANA_BOMB]) + if(sc->getSCE(SC_MARIONETTE)) + luk -= sc->getSCE(SC_MARIONETTE)->val4&0xFF; + if(sc->getSCE(SC_MARIONETTE2)) + luk += sc->getSCE(SC_MARIONETTE2)->val4&0xFF; + if(sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_HIGH) + luk += sc->getSCE(SC_SPIRIT)->val4&0xFF; + if(sc->getSCE(SC_PUTTI_TAILS_NOODLES)) + luk += sc->getSCE(SC_PUTTI_TAILS_NOODLES)->val1; + if(sc->getSCE(SC_INSPIRATION)) + luk += sc->getSCE(SC_INSPIRATION)->val3; + if(sc->getSCE(SC_STOMACHACHE)) + luk -= sc->getSCE(SC_STOMACHACHE)->val1; + if(sc->getSCE(SC_KYOUGAKU)) + luk -= sc->getSCE(SC_KYOUGAKU)->val2; + if(sc->getSCE(SC__STRIPACCESSORY) && bl->type != BL_PC) + luk -= luk * sc->getSCE(SC__STRIPACCESSORY)->val2 / 100; + if(sc->getSCE(SC_BANANA_BOMB)) luk -= 75; - if(sc->data[SC_GOLDENMACECLAN]) + if(sc->getSCE(SC_GOLDENMACECLAN)) luk += 1; - if(sc->data[SC_JUMPINGCLAN]) + if(sc->getSCE(SC_JUMPINGCLAN)) luk += 1; - if(sc->data[SC_FULL_THROTTLE]) - luk += luk * sc->data[SC_FULL_THROTTLE]->val3 / 100; - if(sc->data[SC_CHEERUP]) + if(sc->getSCE(SC_FULL_THROTTLE)) + luk += luk * sc->getSCE(SC_FULL_THROTTLE)->val3 / 100; + if(sc->getSCE(SC_CHEERUP)) luk += 3; - if(sc->data[SC_GLASTHEIM_STATE]) - luk += sc->data[SC_GLASTHEIM_STATE]->val1; + if(sc->getSCE(SC_GLASTHEIM_STATE)) + luk += sc->getSCE(SC_GLASTHEIM_STATE)->val1; #ifdef RENEWAL - if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ALLSTAT) + if (sc->getSCE(SC_NIBELUNGEN) && sc->getSCE(SC_NIBELUNGEN)->val2 == RINGNBL_ALLSTAT) luk += 15; #endif - if (sc->data[SC_UNIVERSESTANCE]) - luk += sc->data[SC_UNIVERSESTANCE]->val2; - if (sc->data[SC_ALMIGHTY]) - luk += sc->data[SC_ALMIGHTY]->val1; - if (sc->data[SC_ULTIMATECOOK]) - luk += sc->data[SC_ULTIMATECOOK]->val1; - if (sc->data[SC_MYSTICPOWDER]) + if (sc->getSCE(SC_UNIVERSESTANCE)) + luk += sc->getSCE(SC_UNIVERSESTANCE)->val2; + if (sc->getSCE(SC_ALMIGHTY)) + luk += sc->getSCE(SC_ALMIGHTY)->val1; + if (sc->getSCE(SC_ULTIMATECOOK)) + luk += sc->getSCE(SC_ULTIMATECOOK)->val1; + if (sc->getSCE(SC_MYSTICPOWDER)) luk += 10; return (unsigned short)cap_value(luk,0,USHRT_MAX); @@ -6773,8 +6811,8 @@ static unsigned short status_calc_pow(struct block_list *bl, struct status_chang if (!sc || !sc->count) return cap_value(pow, 0, USHRT_MAX); - if (sc->data[SC_BENEDICTUM]) - pow += sc->data[SC_BENEDICTUM]->val2; + if (sc->getSCE(SC_BENEDICTUM)) + pow += sc->getSCE(SC_BENEDICTUM)->val2; return (unsigned short)cap_value(pow, 0, USHRT_MAX); } @@ -6791,8 +6829,8 @@ static unsigned short status_calc_sta(struct block_list *bl, struct status_chang if (!sc || !sc->count) return cap_value(sta, 0, USHRT_MAX); - if (sc->data[SC_RELIGIO]) - sta += sc->data[SC_RELIGIO]->val2; + if (sc->getSCE(SC_RELIGIO)) + sta += sc->getSCE(SC_RELIGIO)->val2; return (unsigned short)cap_value(sta, 0, USHRT_MAX); } @@ -6809,8 +6847,8 @@ static unsigned short status_calc_wis(struct block_list *bl, struct status_chang if (!sc || !sc->count) return cap_value(wis, 0, USHRT_MAX); - if (sc->data[SC_RELIGIO]) - wis += sc->data[SC_RELIGIO]->val2; + if (sc->getSCE(SC_RELIGIO)) + wis += sc->getSCE(SC_RELIGIO)->val2; return (unsigned short)cap_value(wis, 0, USHRT_MAX); } @@ -6827,8 +6865,8 @@ static unsigned short status_calc_spl(struct block_list *bl, struct status_chang if (!sc || !sc->count) return cap_value(spl, 0, USHRT_MAX); - if (sc->data[SC_RELIGIO]) - spl += sc->data[SC_RELIGIO]->val2; + if (sc->getSCE(SC_RELIGIO)) + spl += sc->getSCE(SC_RELIGIO)->val2; return (unsigned short)cap_value(spl, 0, USHRT_MAX); } @@ -6845,8 +6883,8 @@ static unsigned short status_calc_con(struct block_list *bl, struct status_chang if (!sc || !sc->count) return cap_value(con, 0, USHRT_MAX); - if (sc->data[SC_BENEDICTUM]) - con += sc->data[SC_BENEDICTUM]->val2; + if (sc->getSCE(SC_BENEDICTUM)) + con += sc->getSCE(SC_BENEDICTUM)->val2; return (unsigned short)cap_value(con, 0, USHRT_MAX); } @@ -6863,8 +6901,8 @@ static unsigned short status_calc_crt(struct block_list *bl, struct status_chang if (!sc || !sc->count) return cap_value(crt, 0, USHRT_MAX); - if (sc->data[SC_BENEDICTUM]) - crt += sc->data[SC_BENEDICTUM]->val2; + if (sc->getSCE(SC_BENEDICTUM)) + crt += sc->getSCE(SC_BENEDICTUM)->val2; return (unsigned short)cap_value(crt, 0, USHRT_MAX); } @@ -6881,77 +6919,77 @@ static unsigned short status_calc_batk(struct block_list *bl, struct status_chan if(!sc || !sc->count) return cap_value(batk,0,USHRT_MAX); - if(sc->data[SC_ATKPOTION]) - batk += sc->data[SC_ATKPOTION]->val1; - if(sc->data[SC_BATKFOOD]) - batk += sc->data[SC_BATKFOOD]->val1; + if(sc->getSCE(SC_ATKPOTION)) + batk += sc->getSCE(SC_ATKPOTION)->val1; + if(sc->getSCE(SC_BATKFOOD)) + batk += sc->getSCE(SC_BATKFOOD)->val1; #ifndef RENEWAL - if(sc->data[SC_GATLINGFEVER]) - batk += sc->data[SC_GATLINGFEVER]->val3; - if(sc->data[SC_MADNESSCANCEL]) + if(sc->getSCE(SC_GATLINGFEVER)) + batk += sc->getSCE(SC_GATLINGFEVER)->val3; + if(sc->getSCE(SC_MADNESSCANCEL)) batk += 100; #endif - if(sc->data[SC_FULL_SWING_K]) - batk += sc->data[SC_FULL_SWING_K]->val1; - if(sc->data[SC_ASH]) - batk -= batk * sc->data[SC_ASH]->val4 / 100; - if(bl->type == BL_HOM && sc->data[SC_PYROCLASTIC]) - batk += sc->data[SC_PYROCLASTIC]->val2; - if (sc->data[SC_ANGRIFFS_MODUS]) - batk += sc->data[SC_ANGRIFFS_MODUS]->val2; - if(sc->data[SC_2011RWC_SCROLL]) + if(sc->getSCE(SC_FULL_SWING_K)) + batk += sc->getSCE(SC_FULL_SWING_K)->val1; + if(sc->getSCE(SC_ASH)) + batk -= batk * sc->getSCE(SC_ASH)->val4 / 100; + if(bl->type == BL_HOM && sc->getSCE(SC_PYROCLASTIC)) + batk += sc->getSCE(SC_PYROCLASTIC)->val2; + if (sc->getSCE(SC_ANGRIFFS_MODUS)) + batk += sc->getSCE(SC_ANGRIFFS_MODUS)->val2; + if(sc->getSCE(SC_2011RWC_SCROLL)) batk += 30; - if(sc->data[SC_INCATKRATE]) - batk += batk * sc->data[SC_INCATKRATE]->val1/100; - if(sc->data[SC_PROVOKE]) - batk += batk * sc->data[SC_PROVOKE]->val2/100; + if(sc->getSCE(SC_INCATKRATE)) + batk += batk * sc->getSCE(SC_INCATKRATE)->val1/100; + if(sc->getSCE(SC_PROVOKE)) + batk += batk * sc->getSCE(SC_PROVOKE)->val2/100; #ifndef RENEWAL - if(sc->data[SC_CONCENTRATION]) - batk += batk * sc->data[SC_CONCENTRATION]->val2/100; + if(sc->getSCE(SC_CONCENTRATION)) + batk += batk * sc->getSCE(SC_CONCENTRATION)->val2/100; #endif - if(sc->data[SC_SKE]) + if(sc->getSCE(SC_SKE)) batk += batk * 3; - if(sc->data[SC_BLOODLUST]) - batk += batk * sc->data[SC_BLOODLUST]->val2/100; - if(sc->data[SC_JOINTBEAT] && sc->data[SC_JOINTBEAT]->val2&BREAK_WAIST) + if(sc->getSCE(SC_BLOODLUST)) + batk += batk * sc->getSCE(SC_BLOODLUST)->val2/100; + if(sc->getSCE(SC_JOINTBEAT) && sc->getSCE(SC_JOINTBEAT)->val2&BREAK_WAIST) batk -= batk * 25/100; - if(sc->data[SC_CURSE]) + if(sc->getSCE(SC_CURSE)) batk -= batk * 25/100; /* Curse shouldn't effect on this? <- Curse OR Bleeding?? - if(sc->data[SC_BLEEDING]) + if(sc->getSCE(SC_BLEEDING)) batk -= batk * 25 / 100; */ - if(sc->data[SC_FLEET]) - batk += batk * sc->data[SC_FLEET]->val3/100; - if(sc->data[SC__ENERVATION]) - batk -= batk * sc->data[SC__ENERVATION]->val2 / 100; - if( sc->data[SC_ZANGETSU] ) - batk += sc->data[SC_ZANGETSU]->val2; - if(sc->data[SC_QUEST_BUFF1]) - batk += sc->data[SC_QUEST_BUFF1]->val1; - if(sc->data[SC_QUEST_BUFF2]) - batk += sc->data[SC_QUEST_BUFF2]->val1; - if(sc->data[SC_QUEST_BUFF3]) - batk += sc->data[SC_QUEST_BUFF3]->val1; - if (sc->data[SC_SHRIMP]) - batk += batk * sc->data[SC_SHRIMP]->val2 / 100; + if(sc->getSCE(SC_FLEET)) + batk += batk * sc->getSCE(SC_FLEET)->val3/100; + if(sc->getSCE(SC__ENERVATION)) + batk -= batk * sc->getSCE(SC__ENERVATION)->val2 / 100; + if( sc->getSCE(SC_ZANGETSU) ) + batk += sc->getSCE(SC_ZANGETSU)->val2; + if(sc->getSCE(SC_QUEST_BUFF1)) + batk += sc->getSCE(SC_QUEST_BUFF1)->val1; + if(sc->getSCE(SC_QUEST_BUFF2)) + batk += sc->getSCE(SC_QUEST_BUFF2)->val1; + if(sc->getSCE(SC_QUEST_BUFF3)) + batk += sc->getSCE(SC_QUEST_BUFF3)->val1; + if (sc->getSCE(SC_SHRIMP)) + batk += batk * sc->getSCE(SC_SHRIMP)->val2 / 100; #ifdef RENEWAL - if (sc->data[SC_LOUD]) + if (sc->getSCE(SC_LOUD)) batk += 30; - if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ATKRATE) + if (sc->getSCE(SC_NIBELUNGEN) && sc->getSCE(SC_NIBELUNGEN)->val2 == RINGNBL_ATKRATE) batk += batk * 20 / 100; #endif - if (sc->data[SC_SUNSTANCE]) - batk += batk * sc->data[SC_SUNSTANCE]->val2 / 100; - if (sc->data[SC_ALMIGHTY]) + if (sc->getSCE(SC_SUNSTANCE)) + batk += batk * sc->getSCE(SC_SUNSTANCE)->val2 / 100; + if (sc->getSCE(SC_ALMIGHTY)) batk += 30; - if (sc->data[SC_ULTIMATECOOK]) + if (sc->getSCE(SC_ULTIMATECOOK)) batk += 30; - if(sc->data[SC_LIMIT_POWER_BOOSTER]) - batk += sc->data[SC_LIMIT_POWER_BOOSTER]->val1; - if(sc->data[SC_SPARKCANDY]) + if(sc->getSCE(SC_LIMIT_POWER_BOOSTER)) + batk += sc->getSCE(SC_LIMIT_POWER_BOOSTER)->val1; + if(sc->getSCE(SC_SPARKCANDY)) batk += 20; - if(sc->data[SC_SKF_ATK]) - batk += sc->data[SC_SKF_ATK]->val1; + if(sc->getSCE(SC_SKF_ATK)) + batk += sc->getSCE(SC_SKF_ATK)->val1; return (unsigned short)cap_value(batk,0,USHRT_MAX); } @@ -6969,99 +7007,99 @@ static unsigned short status_calc_watk(struct block_list *bl, struct status_chan return cap_value(watk,0,USHRT_MAX); #ifndef RENEWAL - if(sc->data[SC_DRUMBATTLE]) - watk += sc->data[SC_DRUMBATTLE]->val2; + if(sc->getSCE(SC_DRUMBATTLE)) + watk += sc->getSCE(SC_DRUMBATTLE)->val2; #endif - if (sc->data[SC_IMPOSITIO]) - watk += sc->data[SC_IMPOSITIO]->val2; - if(sc->data[SC_WATKFOOD]) - watk += sc->data[SC_WATKFOOD]->val1; - if(sc->data[SC_VOLCANO]) - watk += sc->data[SC_VOLCANO]->val2; - if(sc->data[SC_MERC_ATKUP]) - watk += sc->data[SC_MERC_ATKUP]->val2; - if(sc->data[SC_WATER_BARRIER]) - watk -= sc->data[SC_WATER_BARRIER]->val2; + if (sc->getSCE(SC_IMPOSITIO)) + watk += sc->getSCE(SC_IMPOSITIO)->val2; + if(sc->getSCE(SC_WATKFOOD)) + watk += sc->getSCE(SC_WATKFOOD)->val1; + if(sc->getSCE(SC_VOLCANO)) + watk += sc->getSCE(SC_VOLCANO)->val2; + if(sc->getSCE(SC_MERC_ATKUP)) + watk += sc->getSCE(SC_MERC_ATKUP)->val2; + if(sc->getSCE(SC_WATER_BARRIER)) + watk -= sc->getSCE(SC_WATER_BARRIER)->val2; #ifndef RENEWAL - if(sc->data[SC_NIBELUNGEN]) { + if(sc->getSCE(SC_NIBELUNGEN)) { if (bl->type != BL_PC) - watk += sc->data[SC_NIBELUNGEN]->val2; + watk += sc->getSCE(SC_NIBELUNGEN)->val2; else { TBL_PC *sd = (TBL_PC*)bl; short index = sd->equip_index[sd->state.lr_flag?EQI_HAND_L:EQI_HAND_R]; if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_WEAPON && sd->inventory_data[index]->weapon_level == 4) - watk += sc->data[SC_NIBELUNGEN]->val2; + watk += sc->getSCE(SC_NIBELUNGEN)->val2; } } - if(sc->data[SC_CONCENTRATION]) - watk += watk * sc->data[SC_CONCENTRATION]->val2 / 100; + if(sc->getSCE(SC_CONCENTRATION)) + watk += watk * sc->getSCE(SC_CONCENTRATION)->val2 / 100; #endif - if(sc->data[SC_INCATKRATE]) - watk += watk * sc->data[SC_INCATKRATE]->val1/100; - if(sc->data[SC_PROVOKE]) - watk += watk * sc->data[SC_PROVOKE]->val2/100; - if(sc->data[SC_SKE]) + if(sc->getSCE(SC_INCATKRATE)) + watk += watk * sc->getSCE(SC_INCATKRATE)->val1/100; + if(sc->getSCE(SC_PROVOKE)) + watk += watk * sc->getSCE(SC_PROVOKE)->val2/100; + if(sc->getSCE(SC_SKE)) watk += watk * 3; - if(sc->data[SC_FLEET]) - watk += watk * sc->data[SC_FLEET]->val3/100; - if(sc->data[SC_CURSE]) + if(sc->getSCE(SC_FLEET)) + watk += watk * sc->getSCE(SC_FLEET)->val3/100; + if(sc->getSCE(SC_CURSE)) watk -= watk * 25/100; - if(sc->data[SC_STRIPWEAPON] && bl->type != BL_PC) - watk -= watk * sc->data[SC_STRIPWEAPON]->val2/100; - if(sc->data[SC_FIGHTINGSPIRIT]) - watk += sc->data[SC_FIGHTINGSPIRIT]->val1; - if (sc->data[SC_SHIELDSPELL_ATK]) - watk += sc->data[SC_SHIELDSPELL_ATK]->val2; - if(sc->data[SC_INSPIRATION]) - watk += sc->data[SC_INSPIRATION]->val2; - if(sc->data[SC_GT_CHANGE]) - watk += sc->data[SC_GT_CHANGE]->val2; - if(sc->data[SC__ENERVATION]) - watk -= watk * sc->data[SC__ENERVATION]->val2 / 100; - if(sc->data[SC_STRIKING]) - watk += sc->data[SC_STRIKING]->val2; - if(sc->data[SC_RUSHWINDMILL]) - watk += sc->data[SC_RUSHWINDMILL]->val3; - if(sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 2) + if(sc->getSCE(SC_STRIPWEAPON) && bl->type != BL_PC) + watk -= watk * sc->getSCE(SC_STRIPWEAPON)->val2/100; + if(sc->getSCE(SC_FIGHTINGSPIRIT)) + watk += sc->getSCE(SC_FIGHTINGSPIRIT)->val1; + if (sc->getSCE(SC_SHIELDSPELL_ATK)) + watk += sc->getSCE(SC_SHIELDSPELL_ATK)->val2; + if(sc->getSCE(SC_INSPIRATION)) + watk += sc->getSCE(SC_INSPIRATION)->val2; + if(sc->getSCE(SC_GT_CHANGE)) + watk += sc->getSCE(SC_GT_CHANGE)->val2; + if(sc->getSCE(SC__ENERVATION)) + watk -= watk * sc->getSCE(SC__ENERVATION)->val2 / 100; + if(sc->getSCE(SC_STRIKING)) + watk += sc->getSCE(SC_STRIKING)->val2; + if(sc->getSCE(SC_RUSHWINDMILL)) + watk += sc->getSCE(SC_RUSHWINDMILL)->val3; + if(sc->getSCE(SC_FIRE_INSIGNIA) && sc->getSCE(SC_FIRE_INSIGNIA)->val1 == 2) watk += 50; - if((sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 2) - || (sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 2) - || (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 2) - || (sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 2)) + if((sc->getSCE(SC_FIRE_INSIGNIA) && sc->getSCE(SC_FIRE_INSIGNIA)->val1 == 2) + || (sc->getSCE(SC_WATER_INSIGNIA) && sc->getSCE(SC_WATER_INSIGNIA)->val1 == 2) + || (sc->getSCE(SC_WIND_INSIGNIA) && sc->getSCE(SC_WIND_INSIGNIA)->val1 == 2) + || (sc->getSCE(SC_EARTH_INSIGNIA) && sc->getSCE(SC_EARTH_INSIGNIA)->val1 == 2)) watk += watk * 10 / 100; - if(sc->data[SC_PYROTECHNIC_OPTION]) - watk += sc->data[SC_PYROTECHNIC_OPTION]->val2; - if(sc->data[SC_HEATER_OPTION]) - watk += sc->data[SC_HEATER_OPTION]->val2; - if(sc->data[SC_TROPIC_OPTION]) - watk += sc->data[SC_TROPIC_OPTION]->val2; - if( sc && sc->data[SC_TIDAL_WEAPON] ) - watk += watk * sc->data[SC_TIDAL_WEAPON]->val2 / 100; - if(bl->type == BL_PC && sc->data[SC_PYROCLASTIC]) - watk += sc->data[SC_PYROCLASTIC]->val2; - if(sc->data[SC_ANGRIFFS_MODUS]) - watk += watk * sc->data[SC_ANGRIFFS_MODUS]->val2/100; - if(sc->data[SC_ODINS_POWER]) - watk += 40 + 30 * sc->data[SC_ODINS_POWER]->val1; - if (sc->data[SC_FLASHCOMBO]) - watk += sc->data[SC_FLASHCOMBO]->val2; - if (sc->data[SC_CATNIPPOWDER]) - watk -= watk * sc->data[SC_CATNIPPOWDER]->val2 / 100; - if (sc->data[SC_CHATTERING]) - watk += sc->data[SC_CHATTERING]->val2; - if (sc->data[SC_SUNSTANCE]) - watk += watk * sc->data[SC_SUNSTANCE]->val2 / 100; - if (sc->data[SC_SOULFALCON]) - watk += sc->data[SC_SOULFALCON]->val2; - if (sc->data[SC_PACKING_ENVELOPE1]) - watk += sc->data[SC_PACKING_ENVELOPE1]->val1; - if (sc->data[SC_POWERFUL_FAITH]) - watk += sc->data[SC_POWERFUL_FAITH]->val2; - if (sc->data[SC_GUARD_STANCE]) - watk -= sc->data[SC_GUARD_STANCE]->val3; - if (sc->data[SC_ATTACK_STANCE]) - watk += sc->data[SC_ATTACK_STANCE]->val3; + if(sc->getSCE(SC_PYROTECHNIC_OPTION)) + watk += sc->getSCE(SC_PYROTECHNIC_OPTION)->val2; + if(sc->getSCE(SC_HEATER_OPTION)) + watk += sc->getSCE(SC_HEATER_OPTION)->val2; + if(sc->getSCE(SC_TROPIC_OPTION)) + watk += sc->getSCE(SC_TROPIC_OPTION)->val2; + if( sc && sc->getSCE(SC_TIDAL_WEAPON) ) + watk += watk * sc->getSCE(SC_TIDAL_WEAPON)->val2 / 100; + if(bl->type == BL_PC && sc->getSCE(SC_PYROCLASTIC)) + watk += sc->getSCE(SC_PYROCLASTIC)->val2; + if(sc->getSCE(SC_ANGRIFFS_MODUS)) + watk += watk * sc->getSCE(SC_ANGRIFFS_MODUS)->val2/100; + if(sc->getSCE(SC_ODINS_POWER)) + watk += 40 + 30 * sc->getSCE(SC_ODINS_POWER)->val1; + if (sc->getSCE(SC_FLASHCOMBO)) + watk += sc->getSCE(SC_FLASHCOMBO)->val2; + if (sc->getSCE(SC_CATNIPPOWDER)) + watk -= watk * sc->getSCE(SC_CATNIPPOWDER)->val2 / 100; + if (sc->getSCE(SC_CHATTERING)) + watk += sc->getSCE(SC_CHATTERING)->val2; + if (sc->getSCE(SC_SUNSTANCE)) + watk += watk * sc->getSCE(SC_SUNSTANCE)->val2 / 100; + if (sc->getSCE(SC_SOULFALCON)) + watk += sc->getSCE(SC_SOULFALCON)->val2; + if (sc->getSCE(SC_PACKING_ENVELOPE1)) + watk += sc->getSCE(SC_PACKING_ENVELOPE1)->val1; + if (sc->getSCE(SC_POWERFUL_FAITH)) + watk += sc->getSCE(SC_POWERFUL_FAITH)->val2; + if (sc->getSCE(SC_GUARD_STANCE)) + watk -= sc->getSCE(SC_GUARD_STANCE)->val3; + if (sc->getSCE(SC_ATTACK_STANCE)) + watk += sc->getSCE(SC_ATTACK_STANCE)->val3; return (unsigned short)cap_value(watk,0,USHRT_MAX); } @@ -7079,64 +7117,64 @@ static unsigned short status_calc_ematk(struct block_list *bl, struct status_cha if (!sc || !sc->count) return cap_value(matk,0,USHRT_MAX); - if (sc->data[SC_IMPOSITIO]) - matk += sc->data[SC_IMPOSITIO]->val2; - if (sc->data[SC_MATKPOTION]) - matk += sc->data[SC_MATKPOTION]->val1; - if (sc->data[SC_MATKFOOD]) - matk += sc->data[SC_MATKFOOD]->val1; - if(sc->data[SC_MANA_PLUS]) - matk += sc->data[SC_MANA_PLUS]->val1; - if(sc->data[SC_COOLER_OPTION]) - matk += sc->data[SC_COOLER_OPTION]->val2; - if(sc->data[SC_AQUAPLAY_OPTION]) - matk += sc->data[SC_AQUAPLAY_OPTION]->val2; - if(sc->data[SC_CHILLY_AIR_OPTION]) - matk += sc->data[SC_CHILLY_AIR_OPTION]->val2; - if(sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 3) + if (sc->getSCE(SC_IMPOSITIO)) + matk += sc->getSCE(SC_IMPOSITIO)->val2; + if (sc->getSCE(SC_MATKPOTION)) + matk += sc->getSCE(SC_MATKPOTION)->val1; + if (sc->getSCE(SC_MATKFOOD)) + matk += sc->getSCE(SC_MATKFOOD)->val1; + if(sc->getSCE(SC_MANA_PLUS)) + matk += sc->getSCE(SC_MANA_PLUS)->val1; + if(sc->getSCE(SC_COOLER_OPTION)) + matk += sc->getSCE(SC_COOLER_OPTION)->val2; + if(sc->getSCE(SC_AQUAPLAY_OPTION)) + matk += sc->getSCE(SC_AQUAPLAY_OPTION)->val2; + if(sc->getSCE(SC_CHILLY_AIR_OPTION)) + matk += sc->getSCE(SC_CHILLY_AIR_OPTION)->val2; + if(sc->getSCE(SC_FIRE_INSIGNIA) && sc->getSCE(SC_FIRE_INSIGNIA)->val1 == 3) matk += 50; - if(sc->data[SC_ODINS_POWER]) - matk += 40 + 30 * sc->data[SC_ODINS_POWER]->val1; // 70 lvl1, 100lvl2 - if(sc->data[SC_MOONLITSERENADE]) - matk += sc->data[SC_MOONLITSERENADE]->val3; - if(sc->data[SC_IZAYOI]) - matk += 25 * sc->data[SC_IZAYOI]->val1; - if(sc->data[SC_ZANGETSU]) - matk += sc->data[SC_ZANGETSU]->val3; - if(sc->data[SC_QUEST_BUFF1]) - matk += sc->data[SC_QUEST_BUFF1]->val1; - if(sc->data[SC_QUEST_BUFF2]) - matk += sc->data[SC_QUEST_BUFF2]->val1; - if(sc->data[SC_QUEST_BUFF3]) - matk += sc->data[SC_QUEST_BUFF3]->val1; - if(sc->data[SC_MTF_MATK2]) - matk += sc->data[SC_MTF_MATK2]->val1; - if(sc->data[SC_2011RWC_SCROLL]) + if(sc->getSCE(SC_ODINS_POWER)) + matk += 40 + 30 * sc->getSCE(SC_ODINS_POWER)->val1; // 70 lvl1, 100lvl2 + if(sc->getSCE(SC_MOONLITSERENADE)) + matk += sc->getSCE(SC_MOONLITSERENADE)->val3; + if(sc->getSCE(SC_IZAYOI)) + matk += 25 * sc->getSCE(SC_IZAYOI)->val1; + if(sc->getSCE(SC_ZANGETSU)) + matk += sc->getSCE(SC_ZANGETSU)->val3; + if(sc->getSCE(SC_QUEST_BUFF1)) + matk += sc->getSCE(SC_QUEST_BUFF1)->val1; + if(sc->getSCE(SC_QUEST_BUFF2)) + matk += sc->getSCE(SC_QUEST_BUFF2)->val1; + if(sc->getSCE(SC_QUEST_BUFF3)) + matk += sc->getSCE(SC_QUEST_BUFF3)->val1; + if(sc->getSCE(SC_MTF_MATK2)) + matk += sc->getSCE(SC_MTF_MATK2)->val1; + if(sc->getSCE(SC_2011RWC_SCROLL)) matk += 30; - if (sc->data[SC_CATNIPPOWDER]) - matk -= matk * sc->data[SC_CATNIPPOWDER]->val2 / 100; - if (sc->data[SC_CHATTERING]) - matk += sc->data[SC_CHATTERING]->val2; - if (sc->data[SC_DORAM_MATK]) - matk += sc->data[SC_DORAM_MATK]->val1; - if (sc->data[SC_SOULFAIRY]) - matk += sc->data[SC_SOULFAIRY]->val2; - if (sc->data[SC__AUTOSHADOWSPELL]) - matk += sc->data[SC__AUTOSHADOWSPELL]->val4 * 5; - if (sc->data[SC_INSPIRATION]) - matk += sc->data[SC_INSPIRATION]->val2; - if (sc->data[SC_PACKING_ENVELOPE2]) - matk += sc->data[SC_PACKING_ENVELOPE2]->val1; - if(sc->data[SC_ALMIGHTY]) + if (sc->getSCE(SC_CATNIPPOWDER)) + matk -= matk * sc->getSCE(SC_CATNIPPOWDER)->val2 / 100; + if (sc->getSCE(SC_CHATTERING)) + matk += sc->getSCE(SC_CHATTERING)->val2; + if (sc->getSCE(SC_DORAM_MATK)) + matk += sc->getSCE(SC_DORAM_MATK)->val1; + if (sc->getSCE(SC_SOULFAIRY)) + matk += sc->getSCE(SC_SOULFAIRY)->val2; + if (sc->getSCE(SC__AUTOSHADOWSPELL)) + matk += sc->getSCE(SC__AUTOSHADOWSPELL)->val4 * 5; + if (sc->getSCE(SC_INSPIRATION)) + matk += sc->getSCE(SC_INSPIRATION)->val2; + if (sc->getSCE(SC_PACKING_ENVELOPE2)) + matk += sc->getSCE(SC_PACKING_ENVELOPE2)->val1; + if(sc->getSCE(SC_ALMIGHTY)) matk += 30; - if(sc->data[SC_ULTIMATECOOK]) + if(sc->getSCE(SC_ULTIMATECOOK)) matk += 30; - if (sc->data[SC_LIMIT_POWER_BOOSTER]) - matk += sc->data[SC_LIMIT_POWER_BOOSTER]->val1; - if (sc->data[SC_MAGICCANDY]) + if (sc->getSCE(SC_LIMIT_POWER_BOOSTER)) + matk += sc->getSCE(SC_LIMIT_POWER_BOOSTER)->val1; + if (sc->getSCE(SC_MAGICCANDY)) matk += 30; - if (sc->data[SC_SKF_MATK]) - matk += sc->data[SC_SKF_MATK]->val1; + if (sc->getSCE(SC_SKF_MATK)) + matk += sc->getSCE(SC_SKF_MATK)->val1; return (unsigned short)cap_value(matk,0,USHRT_MAX); } @@ -7155,72 +7193,72 @@ static unsigned short status_calc_matk(struct block_list *bl, struct status_chan return cap_value(matk,0,USHRT_MAX); #ifndef RENEWAL /// Take note fixed value first before % modifiers [PRE-RENEWAL] - if (sc->data[SC_MATKPOTION]) - matk += sc->data[SC_MATKPOTION]->val1; - if (sc->data[SC_MATKFOOD]) - matk += sc->data[SC_MATKFOOD]->val1; - if (sc->data[SC_MANA_PLUS]) - matk += sc->data[SC_MANA_PLUS]->val1; - if (sc->data[SC_AQUAPLAY_OPTION]) - matk += sc->data[SC_AQUAPLAY_OPTION]->val2; - if (sc->data[SC_CHILLY_AIR_OPTION]) - matk += sc->data[SC_CHILLY_AIR_OPTION]->val2; - if (sc->data[SC_COOLER_OPTION]) - matk += sc->data[SC_COOLER_OPTION]->val2; - if (sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 3) + if (sc->getSCE(SC_MATKPOTION)) + matk += sc->getSCE(SC_MATKPOTION)->val1; + if (sc->getSCE(SC_MATKFOOD)) + matk += sc->getSCE(SC_MATKFOOD)->val1; + if (sc->getSCE(SC_MANA_PLUS)) + matk += sc->getSCE(SC_MANA_PLUS)->val1; + if (sc->getSCE(SC_AQUAPLAY_OPTION)) + matk += sc->getSCE(SC_AQUAPLAY_OPTION)->val2; + if (sc->getSCE(SC_CHILLY_AIR_OPTION)) + matk += sc->getSCE(SC_CHILLY_AIR_OPTION)->val2; + if (sc->getSCE(SC_COOLER_OPTION)) + matk += sc->getSCE(SC_COOLER_OPTION)->val2; + if (sc->getSCE(SC_FIRE_INSIGNIA) && sc->getSCE(SC_FIRE_INSIGNIA)->val1 == 3) matk += 50; - if (sc->data[SC_ODINS_POWER]) - matk += 40 + 30 * sc->data[SC_ODINS_POWER]->val1; // 70 lvl1, 100lvl2 - if (sc->data[SC_IZAYOI]) - matk += 25 * sc->data[SC_IZAYOI]->val1; - if (sc->data[SC_MTF_MATK2]) - matk += sc->data[SC_MTF_MATK2]->val1; - if (sc->data[SC_2011RWC_SCROLL]) + if (sc->getSCE(SC_ODINS_POWER)) + matk += 40 + 30 * sc->getSCE(SC_ODINS_POWER)->val1; // 70 lvl1, 100lvl2 + if (sc->getSCE(SC_IZAYOI)) + matk += 25 * sc->getSCE(SC_IZAYOI)->val1; + if (sc->getSCE(SC_MTF_MATK2)) + matk += sc->getSCE(SC_MTF_MATK2)->val1; + if (sc->getSCE(SC_2011RWC_SCROLL)) matk += 30; - if (sc->data[SC_ALMIGHTY]) + if (sc->getSCE(SC_ALMIGHTY)) matk += 30; - if (sc->data[SC_ULTIMATECOOK]) + if (sc->getSCE(SC_ULTIMATECOOK)) matk += 30; - if (sc->data[SC_LIMIT_POWER_BOOSTER]) - matk += sc->data[SC_LIMIT_POWER_BOOSTER]->val1; - if (sc->data[SC_MAGICCANDY]) + if (sc->getSCE(SC_LIMIT_POWER_BOOSTER)) + matk += sc->getSCE(SC_LIMIT_POWER_BOOSTER)->val1; + if (sc->getSCE(SC_MAGICCANDY)) matk += 30; - if (sc->data[SC_SKF_MATK]) - matk += sc->data[SC_SKF_MATK]->val1; + if (sc->getSCE(SC_SKF_MATK)) + matk += sc->getSCE(SC_SKF_MATK)->val1; #endif - if (sc->data[SC_ZANGETSU]) - matk += sc->data[SC_ZANGETSU]->val3; - if (sc->data[SC_QUEST_BUFF1]) - matk += sc->data[SC_QUEST_BUFF1]->val1; - if (sc->data[SC_QUEST_BUFF2]) - matk += sc->data[SC_QUEST_BUFF2]->val1; - if (sc->data[SC_QUEST_BUFF3]) - matk += sc->data[SC_QUEST_BUFF3]->val1; - if (sc->data[SC_MAGICPOWER] + if (sc->getSCE(SC_ZANGETSU)) + matk += sc->getSCE(SC_ZANGETSU)->val3; + if (sc->getSCE(SC_QUEST_BUFF1)) + matk += sc->getSCE(SC_QUEST_BUFF1)->val1; + if (sc->getSCE(SC_QUEST_BUFF2)) + matk += sc->getSCE(SC_QUEST_BUFF2)->val1; + if (sc->getSCE(SC_QUEST_BUFF3)) + matk += sc->getSCE(SC_QUEST_BUFF3)->val1; + if (sc->getSCE(SC_MAGICPOWER) #ifndef RENEWAL - && sc->data[SC_MAGICPOWER]->val4 + && sc->getSCE(SC_MAGICPOWER)->val4 #endif ) - matk += matk * sc->data[SC_MAGICPOWER]->val3/100; - if (sc->data[SC_MINDBREAKER]) - matk += matk * sc->data[SC_MINDBREAKER]->val2/100; - if (sc->data[SC_INCMATKRATE]) - matk += matk * sc->data[SC_INCMATKRATE]->val1/100; - if (sc->data[SC_MOONLITSERENADE]) - matk += sc->data[SC_MOONLITSERENADE]->val3/100; - if (sc->data[SC_MTF_MATK]) - matk += matk * sc->data[SC_MTF_MATK]->val1 / 100; - if (sc->data[SC_SHRIMP]) - matk += matk * sc->data[SC_SHRIMP]->val2 / 100; - if (sc->data[SC_VOLCANO]) - matk += sc->data[SC_VOLCANO]->val2; + matk += matk * sc->getSCE(SC_MAGICPOWER)->val3/100; + if (sc->getSCE(SC_MINDBREAKER)) + matk += matk * sc->getSCE(SC_MINDBREAKER)->val2/100; + if (sc->getSCE(SC_INCMATKRATE)) + matk += matk * sc->getSCE(SC_INCMATKRATE)->val1/100; + if (sc->getSCE(SC_MOONLITSERENADE)) + matk += sc->getSCE(SC_MOONLITSERENADE)->val3/100; + if (sc->getSCE(SC_MTF_MATK)) + matk += matk * sc->getSCE(SC_MTF_MATK)->val1 / 100; + if (sc->getSCE(SC_SHRIMP)) + matk += matk * sc->getSCE(SC_SHRIMP)->val2 / 100; + if (sc->getSCE(SC_VOLCANO)) + matk += sc->getSCE(SC_VOLCANO)->val2; #ifdef RENEWAL - if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_MATKRATE) + if (sc->getSCE(SC_NIBELUNGEN) && sc->getSCE(SC_NIBELUNGEN)->val2 == RINGNBL_MATKRATE) matk += matk * 20 / 100; #endif - if (sc->data[SC_SHIELDSPELL_ATK]) - matk += sc->data[SC_SHIELDSPELL_ATK]->val2; - if (sc->data[SC_CLIMAX_DES_HU]) + if (sc->getSCE(SC_SHIELDSPELL_ATK)) + matk += sc->getSCE(SC_SHIELDSPELL_ATK)->val2; + if (sc->getSCE(SC_CLIMAX_DES_HU)) matk += 100; return (unsigned short)cap_value(matk,0,USHRT_MAX); @@ -7238,38 +7276,38 @@ static signed short status_calc_critical(struct block_list *bl, struct status_ch if(!sc || !sc->count) return cap_value(critical,10,SHRT_MAX); - if (sc->data[SC_INCCRI]) - critical += sc->data[SC_INCCRI]->val2; - if (sc->data[SC_EP16_2_BUFF_SC]) + if (sc->getSCE(SC_INCCRI)) + critical += sc->getSCE(SC_INCCRI)->val2; + if (sc->getSCE(SC_EP16_2_BUFF_SC)) critical += 300;// crit +30 - if (sc->data[SC_CRIFOOD]) - critical += sc->data[SC_CRIFOOD]->val1; - if (sc->data[SC_EXPLOSIONSPIRITS]) - critical += sc->data[SC_EXPLOSIONSPIRITS]->val2; - if (sc->data[SC_FORTUNE]) - critical += sc->data[SC_FORTUNE]->val2; - if (sc->data[SC_TRUESIGHT]) - critical += sc->data[SC_TRUESIGHT]->val2; - if (sc->data[SC_CLOAKING]) + if (sc->getSCE(SC_CRIFOOD)) + critical += sc->getSCE(SC_CRIFOOD)->val1; + if (sc->getSCE(SC_EXPLOSIONSPIRITS)) + critical += sc->getSCE(SC_EXPLOSIONSPIRITS)->val2; + if (sc->getSCE(SC_FORTUNE)) + critical += sc->getSCE(SC_FORTUNE)->val2; + if (sc->getSCE(SC_TRUESIGHT)) + critical += sc->getSCE(SC_TRUESIGHT)->val2; + if (sc->getSCE(SC_CLOAKING)) critical += critical; #ifdef RENEWAL - if (sc->data[SC_SPEARQUICKEN]) - critical += 3*sc->data[SC_SPEARQUICKEN]->val1*10; - if (sc->data[SC_TWOHANDQUICKEN]) - critical += (2 + sc->data[SC_TWOHANDQUICKEN]->val1) * 10; + if (sc->getSCE(SC_SPEARQUICKEN)) + critical += 3*sc->getSCE(SC_SPEARQUICKEN)->val1*10; + if (sc->getSCE(SC_TWOHANDQUICKEN)) + critical += (2 + sc->getSCE(SC_TWOHANDQUICKEN)->val1) * 10; #endif - if (sc->data[SC__INVISIBILITY]) - critical += sc->data[SC__INVISIBILITY]->val3 * 10; - if (sc->data[SC__UNLUCKY]) - critical -= sc->data[SC__UNLUCKY]->val2; - if (sc->data[SC_SOULSHADOW]) - critical += 10 * sc->data[SC_SOULSHADOW]->val3; - if(sc->data[SC_BEYONDOFWARCRY]) - critical += sc->data[SC_BEYONDOFWARCRY]->val3; - if (sc->data[SC_MTF_HITFLEE]) - critical += sc->data[SC_MTF_HITFLEE]->val1; - if (sc->data[SC_PACKING_ENVELOPE9]) - critical += sc->data[SC_PACKING_ENVELOPE9]->val1 * 10; + if (sc->getSCE(SC__INVISIBILITY)) + critical += sc->getSCE(SC__INVISIBILITY)->val3 * 10; + if (sc->getSCE(SC__UNLUCKY)) + critical -= sc->getSCE(SC__UNLUCKY)->val2; + if (sc->getSCE(SC_SOULSHADOW)) + critical += 10 * sc->getSCE(SC_SOULSHADOW)->val3; + if(sc->getSCE(SC_BEYONDOFWARCRY)) + critical += sc->getSCE(SC_BEYONDOFWARCRY)->val3; + if (sc->getSCE(SC_MTF_HITFLEE)) + critical += sc->getSCE(SC_MTF_HITFLEE)->val1; + if (sc->getSCE(SC_PACKING_ENVELOPE9)) + critical += sc->getSCE(SC_PACKING_ENVELOPE9)->val1 * 10; return (short)cap_value(critical,10,SHRT_MAX); } @@ -7286,65 +7324,65 @@ static signed short status_calc_hit(struct block_list *bl, struct status_change if(!sc || !sc->count) return cap_value(hit,1,SHRT_MAX); - if(sc->data[SC_INCHIT]) - hit += sc->data[SC_INCHIT]->val1; - if(sc->data[SC_HITFOOD]) - hit += sc->data[SC_HITFOOD]->val1; - if(sc->data[SC_TRUESIGHT]) - hit += sc->data[SC_TRUESIGHT]->val3; - if(sc->data[SC_HUMMING]) - hit += sc->data[SC_HUMMING]->val2; - if(sc->data[SC_CONCENTRATION]) - hit += sc->data[SC_CONCENTRATION]->val3; - if(sc->data[SC_INSPIRATION]) - hit += 12 * sc->data[SC_INSPIRATION]->val1; - if(sc->data[SC_ADJUSTMENT]) + if(sc->getSCE(SC_INCHIT)) + hit += sc->getSCE(SC_INCHIT)->val1; + if(sc->getSCE(SC_HITFOOD)) + hit += sc->getSCE(SC_HITFOOD)->val1; + if(sc->getSCE(SC_TRUESIGHT)) + hit += sc->getSCE(SC_TRUESIGHT)->val3; + if(sc->getSCE(SC_HUMMING)) + hit += sc->getSCE(SC_HUMMING)->val2; + if(sc->getSCE(SC_CONCENTRATION)) + hit += sc->getSCE(SC_CONCENTRATION)->val3; + if(sc->getSCE(SC_INSPIRATION)) + hit += 12 * sc->getSCE(SC_INSPIRATION)->val1; + if(sc->getSCE(SC_ADJUSTMENT)) hit -= 30; - if(sc->data[SC_INCREASING]) + if(sc->getSCE(SC_INCREASING)) hit += 20; // RockmanEXE; changed based on updated [Reddozen] - if(sc->data[SC_MERC_HITUP]) - hit += sc->data[SC_MERC_HITUP]->val2; - if(sc->data[SC_MTF_HITFLEE]) - hit += sc->data[SC_MTF_HITFLEE]->val1; - if(sc->data[SC_INCHITRATE]) - hit += hit * sc->data[SC_INCHITRATE]->val1/100; - if(sc->data[SC_BLIND]) + if(sc->getSCE(SC_MERC_HITUP)) + hit += sc->getSCE(SC_MERC_HITUP)->val2; + if(sc->getSCE(SC_MTF_HITFLEE)) + hit += sc->getSCE(SC_MTF_HITFLEE)->val1; + if(sc->getSCE(SC_INCHITRATE)) + hit += hit * sc->getSCE(SC_INCHITRATE)->val1/100; + if(sc->getSCE(SC_BLIND)) hit -= hit * 25/100; - if(sc->data[SC_HEAT_BARREL]) - hit -= sc->data[SC_HEAT_BARREL]->val4; - if(sc->data[SC__GROOMY]) - hit -= hit * sc->data[SC__GROOMY]->val3 / 100; - if(sc->data[SC_FEAR]) + if(sc->getSCE(SC_HEAT_BARREL)) + hit -= sc->getSCE(SC_HEAT_BARREL)->val4; + if(sc->getSCE(SC__GROOMY)) + hit -= hit * sc->getSCE(SC__GROOMY)->val3 / 100; + if(sc->getSCE(SC_FEAR)) hit -= hit * 20 / 100; - if (sc->data[SC_ASH]) - hit -= hit * sc->data[SC_ASH]->val2 / 100; - if (sc->data[SC_TEARGAS]) + if (sc->getSCE(SC_ASH)) + hit -= hit * sc->getSCE(SC_ASH)->val2 / 100; + if (sc->getSCE(SC_TEARGAS)) hit -= hit * 50 / 100; - if(sc->data[SC_ILLUSIONDOPING]) - hit -= sc->data[SC_ILLUSIONDOPING]->val2; - if (sc->data[SC_MTF_ASPD]) - hit += sc->data[SC_MTF_ASPD]->val2; + if(sc->getSCE(SC_ILLUSIONDOPING)) + hit -= sc->getSCE(SC_ILLUSIONDOPING)->val2; + if (sc->getSCE(SC_MTF_ASPD)) + hit += sc->getSCE(SC_MTF_ASPD)->val2; #ifdef RENEWAL - if (sc->data[SC_BLESSING]) - hit += sc->data[SC_BLESSING]->val1 * 2; - if (sc->data[SC_TWOHANDQUICKEN]) - hit += sc->data[SC_TWOHANDQUICKEN]->val1 * 2; - if (sc->data[SC_ADRENALINE]) - hit += sc->data[SC_ADRENALINE]->val1 * 3 + 5; - if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_HIT) + if (sc->getSCE(SC_BLESSING)) + hit += sc->getSCE(SC_BLESSING)->val1 * 2; + if (sc->getSCE(SC_TWOHANDQUICKEN)) + hit += sc->getSCE(SC_TWOHANDQUICKEN)->val1 * 2; + if (sc->getSCE(SC_ADRENALINE)) + hit += sc->getSCE(SC_ADRENALINE)->val1 * 3 + 5; + if (sc->getSCE(SC_NIBELUNGEN) && sc->getSCE(SC_NIBELUNGEN)->val2 == RINGNBL_HIT) hit += 50; #endif - if (sc->data[SC_SOULFALCON]) - hit += sc->data[SC_SOULFALCON]->val3; - if (sc->data[SC_SATURDAYNIGHTFEVER]) - hit -= 50 + 50 * sc->data[SC_SATURDAYNIGHTFEVER]->val1; - if (sc->data[SC_PACKING_ENVELOPE10]) - hit += sc->data[SC_PACKING_ENVELOPE10]->val1; - if (sc->data[SC_ABYSS_SLAYER]) - hit += sc->data[SC_ABYSS_SLAYER]->val3; - if (sc->data[SC_LIMIT_POWER_BOOSTER]) - hit += sc->data[SC_LIMIT_POWER_BOOSTER]->val1; - if (sc->data[SC_ACARAJE]) + if (sc->getSCE(SC_SOULFALCON)) + hit += sc->getSCE(SC_SOULFALCON)->val3; + if (sc->getSCE(SC_SATURDAYNIGHTFEVER)) + hit -= 50 + 50 * sc->getSCE(SC_SATURDAYNIGHTFEVER)->val1; + if (sc->getSCE(SC_PACKING_ENVELOPE10)) + hit += sc->getSCE(SC_PACKING_ENVELOPE10)->val1; + if (sc->getSCE(SC_ABYSS_SLAYER)) + hit += sc->getSCE(SC_ABYSS_SLAYER)->val3; + if (sc->getSCE(SC_LIMIT_POWER_BOOSTER)) + hit += sc->getSCE(SC_LIMIT_POWER_BOOSTER)->val1; + if (sc->getSCE(SC_ACARAJE)) hit += 5; return (short)cap_value(hit,1,SHRT_MAX); @@ -7370,99 +7408,99 @@ static signed short status_calc_flee(struct block_list *bl, struct status_change if(!sc || !sc->count) return cap_value(flee,1,SHRT_MAX); - if (sc->data[SC_POISON_MIST]) + if (sc->getSCE(SC_POISON_MIST)) return 0; - if(sc->data[SC_OVERED_BOOST]) //Should be final and unmodifiable by any means - return sc->data[SC_OVERED_BOOST]->val2; + if(sc->getSCE(SC_OVERED_BOOST)) //Should be final and unmodifiable by any means + return sc->getSCE(SC_OVERED_BOOST)->val2; // Fixed value - if(sc->data[SC_INCFLEE]) - flee += sc->data[SC_INCFLEE]->val1; - if(sc->data[SC_FLEEFOOD]) - flee += sc->data[SC_FLEEFOOD]->val1; - if(sc->data[SC_WHISTLE]) - flee += sc->data[SC_WHISTLE]->val2; - if(sc->data[SC_WINDWALK]) - flee += sc->data[SC_WINDWALK]->val2; - if(sc->data[SC_VIOLENTGALE]) - flee += sc->data[SC_VIOLENTGALE]->val2; - if(sc->data[SC_MOON_COMFORT]) // SG skill [Komurka] - flee += sc->data[SC_MOON_COMFORT]->val2; - if(sc->data[SC_CLOSECONFINE]) - flee += sc->data[SC_CLOSECONFINE]->val3; - if (sc->data[SC_ANGRIFFS_MODUS]) - flee -= sc->data[SC_ANGRIFFS_MODUS]->val3; - if(sc->data[SC_ADJUSTMENT]) + if(sc->getSCE(SC_INCFLEE)) + flee += sc->getSCE(SC_INCFLEE)->val1; + if(sc->getSCE(SC_FLEEFOOD)) + flee += sc->getSCE(SC_FLEEFOOD)->val1; + if(sc->getSCE(SC_WHISTLE)) + flee += sc->getSCE(SC_WHISTLE)->val2; + if(sc->getSCE(SC_WINDWALK)) + flee += sc->getSCE(SC_WINDWALK)->val2; + if(sc->getSCE(SC_VIOLENTGALE)) + flee += sc->getSCE(SC_VIOLENTGALE)->val2; + if(sc->getSCE(SC_MOON_COMFORT)) // SG skill [Komurka] + flee += sc->getSCE(SC_MOON_COMFORT)->val2; + if(sc->getSCE(SC_CLOSECONFINE)) + flee += sc->getSCE(SC_CLOSECONFINE)->val3; + if (sc->getSCE(SC_ANGRIFFS_MODUS)) + flee -= sc->getSCE(SC_ANGRIFFS_MODUS)->val3; + if(sc->getSCE(SC_ADJUSTMENT)) flee += 30; - if(sc->data[SC_SPEED]) - flee += 10 + sc->data[SC_SPEED]->val1 * 10; - if(sc->data[SC_GATLINGFEVER]) - flee -= sc->data[SC_GATLINGFEVER]->val4; - if(sc->data[SC_PARTYFLEE]) - flee += sc->data[SC_PARTYFLEE]->val1 * 10; - if(sc->data[SC_MERC_FLEEUP]) - flee += sc->data[SC_MERC_FLEEUP]->val2; - if( sc->data[SC_HALLUCINATIONWALK] ) - flee += sc->data[SC_HALLUCINATIONWALK]->val2; - if( sc->data[SC_NPC_HALLUCINATIONWALK] ) - flee += sc->data[SC_NPC_HALLUCINATIONWALK]->val2; - if(sc->data[SC_MTF_HITFLEE]) - flee += sc->data[SC_MTF_HITFLEE]->val2; - if( sc->data[SC_WATER_BARRIER] ) - flee -= sc->data[SC_WATER_BARRIER]->val2; - if( sc->data[SC_C_MARKER] ) - flee -= sc->data[SC_C_MARKER]->val3; + if(sc->getSCE(SC_SPEED)) + flee += 10 + sc->getSCE(SC_SPEED)->val1 * 10; + if(sc->getSCE(SC_GATLINGFEVER)) + flee -= sc->getSCE(SC_GATLINGFEVER)->val4; + if(sc->getSCE(SC_PARTYFLEE)) + flee += sc->getSCE(SC_PARTYFLEE)->val1 * 10; + if(sc->getSCE(SC_MERC_FLEEUP)) + flee += sc->getSCE(SC_MERC_FLEEUP)->val2; + if( sc->getSCE(SC_HALLUCINATIONWALK) ) + flee += sc->getSCE(SC_HALLUCINATIONWALK)->val2; + if( sc->getSCE(SC_NPC_HALLUCINATIONWALK) ) + flee += sc->getSCE(SC_NPC_HALLUCINATIONWALK)->val2; + if(sc->getSCE(SC_MTF_HITFLEE)) + flee += sc->getSCE(SC_MTF_HITFLEE)->val2; + if( sc->getSCE(SC_WATER_BARRIER) ) + flee -= sc->getSCE(SC_WATER_BARRIER)->val2; + if( sc->getSCE(SC_C_MARKER) ) + flee -= sc->getSCE(SC_C_MARKER)->val3; #ifdef RENEWAL - if( sc->data[SC_SPEARQUICKEN] ) - flee += 2 * sc->data[SC_SPEARQUICKEN]->val1; - if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_FLEE) + if( sc->getSCE(SC_SPEARQUICKEN) ) + flee += 2 * sc->getSCE(SC_SPEARQUICKEN)->val1; + if (sc->getSCE(SC_NIBELUNGEN) && sc->getSCE(SC_NIBELUNGEN)->val2 == RINGNBL_FLEE) flee += 50; #endif // Rate value - if(sc->data[SC_INCFLEERATE]) - flee += flee * sc->data[SC_INCFLEERATE]->val1/100; - if(sc->data[SC_SPIDERWEB] || sc->data[SC_WIDEWEB]) + if(sc->getSCE(SC_INCFLEERATE)) + flee += flee * sc->getSCE(SC_INCFLEERATE)->val1/100; + if(sc->getSCE(SC_SPIDERWEB) || sc->getSCE(SC_WIDEWEB)) flee -= flee * 50/100; - if(sc->data[SC_BERSERK]) + if(sc->getSCE(SC_BERSERK)) flee -= flee * 50/100; - if(sc->data[SC_BLIND]) + if(sc->getSCE(SC_BLIND)) flee -= flee * 25/100; - if(sc->data[SC_FEAR]) + if(sc->getSCE(SC_FEAR)) flee -= flee * 20 / 100; - if(sc->data[SC_PARALYSE] && sc->data[SC_PARALYSE]->val3 == 1) + if(sc->getSCE(SC_PARALYSE) && sc->getSCE(SC_PARALYSE)->val3 == 1) flee -= flee * 10 / 100; - if(sc->data[SC_INFRAREDSCAN]) + if(sc->getSCE(SC_INFRAREDSCAN)) flee -= flee * 30 / 100; - if( sc->data[SC__LAZINESS] ) - flee -= flee * sc->data[SC__LAZINESS]->val3 / 100; - if( sc->data[SC_GLOOMYDAY] ) - flee -= flee * sc->data[SC_GLOOMYDAY]->val2 / 100; - if( sc->data[SC_SATURDAYNIGHTFEVER] ) - flee -= 20 + 30 * sc->data[SC_SATURDAYNIGHTFEVER]->val1; - if( sc->data[SC_WIND_STEP_OPTION] ) - flee += flee * sc->data[SC_WIND_STEP_OPTION]->val2 / 100; - if( sc->data[SC_TINDER_BREAKER] || sc->data[SC_TINDER_BREAKER2] ) + if( sc->getSCE(SC__LAZINESS) ) + flee -= flee * sc->getSCE(SC__LAZINESS)->val3 / 100; + if( sc->getSCE(SC_GLOOMYDAY) ) + flee -= flee * sc->getSCE(SC_GLOOMYDAY)->val2 / 100; + if( sc->getSCE(SC_SATURDAYNIGHTFEVER) ) + flee -= 20 + 30 * sc->getSCE(SC_SATURDAYNIGHTFEVER)->val1; + if( sc->getSCE(SC_WIND_STEP_OPTION) ) + flee += flee * sc->getSCE(SC_WIND_STEP_OPTION)->val2 / 100; + if( sc->getSCE(SC_TINDER_BREAKER) || sc->getSCE(SC_TINDER_BREAKER2) ) flee -= flee * 50 / 100; - if( sc->data[SC_ZEPHYR] ) - flee += sc->data[SC_ZEPHYR]->val2; - if(sc->data[SC_ASH]) - flee -= flee * sc->data[SC_ASH]->val4 / 100; - if (sc->data[SC_GOLDENE_FERSE]) - flee += flee * sc->data[SC_GOLDENE_FERSE]->val2 / 100; - if (sc->data[SC_SMOKEPOWDER]) + if( sc->getSCE(SC_ZEPHYR) ) + flee += sc->getSCE(SC_ZEPHYR)->val2; + if(sc->getSCE(SC_ASH)) + flee -= flee * sc->getSCE(SC_ASH)->val4 / 100; + if (sc->getSCE(SC_GOLDENE_FERSE)) + flee += flee * sc->getSCE(SC_GOLDENE_FERSE)->val2 / 100; + if (sc->getSCE(SC_SMOKEPOWDER)) flee += flee * 20 / 100; - if (sc->data[SC_TEARGAS]) + if (sc->getSCE(SC_TEARGAS)) flee -= flee * 50 / 100; - //if( sc->data[SC_C_MARKER] ) - // flee -= (flee * sc->data[SC_C_MARKER]->val3) / 100; - if (sc->data[SC_GROOMING]) - flee += sc->data[SC_GROOMING]->val2; - if (sc->data[SC_PACKING_ENVELOPE5]) - flee += sc->data[SC_PACKING_ENVELOPE5]->val1; - if (sc->data[SC_LIMIT_POWER_BOOSTER]) - flee += sc->data[SC_LIMIT_POWER_BOOSTER]->val1; - if (sc->data[SC_MYSTICPOWDER]) + //if( sc->getSCE(SC_C_MARKER) ) + // flee -= (flee * sc->getSCE(SC_C_MARKER)->val3) / 100; + if (sc->getSCE(SC_GROOMING)) + flee += sc->getSCE(SC_GROOMING)->val2; + if (sc->getSCE(SC_PACKING_ENVELOPE5)) + flee += sc->getSCE(SC_PACKING_ENVELOPE5)->val1; + if (sc->getSCE(SC_LIMIT_POWER_BOOSTER)) + flee += sc->getSCE(SC_LIMIT_POWER_BOOSTER)->val1; + if (sc->getSCE(SC_MYSTICPOWDER)) flee += 20; return (short)cap_value(flee,1,SHRT_MAX); @@ -7480,16 +7518,16 @@ static signed short status_calc_flee2(struct block_list *bl, struct status_chang if(!sc || !sc->count) return cap_value(flee2,10,SHRT_MAX); - if(sc->data[SC_INCFLEE2]) - flee2 += sc->data[SC_INCFLEE2]->val2; - if(sc->data[SC_WHISTLE]) - flee2 += sc->data[SC_WHISTLE]->val3*10; - if(sc->data[SC__UNLUCKY]) - flee2 -= flee2 * sc->data[SC__UNLUCKY]->val2 / 100; - if (sc->data[SC_HISS]) - flee2 += sc->data[SC_HISS]->val2*10; - if (sc->data[SC_DORAM_FLEE2]) - flee2 += sc->data[SC_DORAM_FLEE2]->val1; + if(sc->getSCE(SC_INCFLEE2)) + flee2 += sc->getSCE(SC_INCFLEE2)->val2; + if(sc->getSCE(SC_WHISTLE)) + flee2 += sc->getSCE(SC_WHISTLE)->val3*10; + if(sc->getSCE(SC__UNLUCKY)) + flee2 -= flee2 * sc->getSCE(SC__UNLUCKY)->val2 / 100; + if (sc->getSCE(SC_HISS)) + flee2 += sc->getSCE(SC_HISS)->val2*10; + if (sc->getSCE(SC_DORAM_FLEE2)) + flee2 += sc->getSCE(SC_DORAM_FLEE2)->val1; return (short)cap_value(flee2,10,SHRT_MAX); } @@ -7506,101 +7544,101 @@ static defType status_calc_def(struct block_list *bl, struct status_change *sc, if(!sc || !sc->count) return (defType)cap_value(def,DEFTYPE_MIN,DEFTYPE_MAX); - if(sc->data[SC_BERSERK]) + if(sc->getSCE(SC_BERSERK)) return 0; - if(sc->data[SC_BARRIER]) + if(sc->getSCE(SC_BARRIER)) return 100; - if(sc->data[SC_KEEPING]) + if(sc->getSCE(SC_KEEPING)) return 90; #ifndef RENEWAL /// Steel Body does not provide 90 DEF in [RENEWAL] - if(sc->data[SC_STEELBODY]) + if(sc->getSCE(SC_STEELBODY)) return 90; #endif - if (sc->data[SC_NYANGGRASS]) { + if (sc->getSCE(SC_NYANGGRASS)) { if (bl->type == BL_PC) return 0; else return def >>= 1; } - if(sc->data[SC_DEFSET]) - return sc->data[SC_DEFSET]->val1; + if(sc->getSCE(SC_DEFSET)) + return sc->getSCE(SC_DEFSET)->val1; - if(sc->data[SC_DRUMBATTLE]) - def += sc->data[SC_DRUMBATTLE]->val3; + if(sc->getSCE(SC_DRUMBATTLE)) + def += sc->getSCE(SC_DRUMBATTLE)->val3; #ifdef RENEWAL - if (sc->data[SC_ASSUMPTIO]) - def += sc->data[SC_ASSUMPTIO]->val1 * 50; + if (sc->getSCE(SC_ASSUMPTIO)) + def += sc->getSCE(SC_ASSUMPTIO)->val1 * 50; #else - if(sc->data[SC_DEFENCE]) - def += sc->data[SC_DEFENCE]->val2; + if(sc->getSCE(SC_DEFENCE)) + def += sc->getSCE(SC_DEFENCE)->val2; #endif - if(sc->data[SC_INCDEFRATE]) - def += def * sc->data[SC_INCDEFRATE]->val1/100; - if(sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 2) + if(sc->getSCE(SC_INCDEFRATE)) + def += def * sc->getSCE(SC_INCDEFRATE)->val1/100; + if(sc->getSCE(SC_EARTH_INSIGNIA) && sc->getSCE(SC_EARTH_INSIGNIA)->val1 == 2) def += 50; - if(sc->data[SC_ODINS_POWER]) - def -= 20 * sc->data[SC_ODINS_POWER]->val1; - if( sc->data[SC_ANGRIFFS_MODUS] ) - def -= 20 + 10 * sc->data[SC_ANGRIFFS_MODUS]->val1; - if(sc->data[SC_STONEHARDSKIN]) - def += sc->data[SC_STONEHARDSKIN]->val1; - if(sc->data[SC_STONE]) + if(sc->getSCE(SC_ODINS_POWER)) + def -= 20 * sc->getSCE(SC_ODINS_POWER)->val1; + if( sc->getSCE(SC_ANGRIFFS_MODUS) ) + def -= 20 + 10 * sc->getSCE(SC_ANGRIFFS_MODUS)->val1; + if(sc->getSCE(SC_STONEHARDSKIN)) + def += sc->getSCE(SC_STONEHARDSKIN)->val1; + if(sc->getSCE(SC_STONE)) def >>=1; - if(sc->data[SC_FREEZE]) + if(sc->getSCE(SC_FREEZE)) def >>=1; - if(sc->data[SC_SIGNUMCRUCIS]) - def -= def * sc->data[SC_SIGNUMCRUCIS]->val2/100; - if(sc->data[SC_CONCENTRATION]) - def -= def * sc->data[SC_CONCENTRATION]->val4/100; - if(sc->data[SC_SKE]) + if(sc->getSCE(SC_SIGNUMCRUCIS)) + def -= def * sc->getSCE(SC_SIGNUMCRUCIS)->val2/100; + if(sc->getSCE(SC_CONCENTRATION)) + def -= def * sc->getSCE(SC_CONCENTRATION)->val4/100; + if(sc->getSCE(SC_SKE)) def >>=1; - if(sc->data[SC_PROVOKE] && bl->type != BL_PC) // Provoke doesn't alter player defense-> - def -= def * sc->data[SC_PROVOKE]->val3/100; - if(sc->data[SC_STRIPSHIELD] && bl->type != BL_PC) // Player doesn't have def reduction only equip removed - def -= def * sc->data[SC_STRIPSHIELD]->val2/100; - if (sc->data[SC_FLING]) - def -= def * (sc->data[SC_FLING]->val2)/100; - if( sc->data[SC_FREEZING] ) + if(sc->getSCE(SC_PROVOKE) && bl->type != BL_PC) // Provoke doesn't alter player defense-> + def -= def * sc->getSCE(SC_PROVOKE)->val3/100; + if(sc->getSCE(SC_STRIPSHIELD) && bl->type != BL_PC) // Player doesn't have def reduction only equip removed + def -= def * sc->getSCE(SC_STRIPSHIELD)->val2/100; + if (sc->getSCE(SC_FLING)) + def -= def * (sc->getSCE(SC_FLING)->val2)/100; + if( sc->getSCE(SC_FREEZING) ) def -= def * (bl->type == BL_PC ? 30 : 10) / 100; - if( sc->data[SC_ANALYZE] ) - def -= def * (14 * sc->data[SC_ANALYZE]->val1) / 100; - if( sc->data[SC_NEUTRALBARRIER] ) - def += def * sc->data[SC_NEUTRALBARRIER]->val2 / 100; - if( sc->data[SC_PRESTIGE] ) - def += sc->data[SC_PRESTIGE]->val3; - if( sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 1 ) - def += 6 * sc->data[SC_BANDING]->val1; - if( sc->data[SC_ECHOSONG] ) - def += sc->data[SC_ECHOSONG]->val3; - if( sc->data[SC_CAMOUFLAGE] ) - def -= def * 5 * sc->data[SC_CAMOUFLAGE]->val3 / 100; - if( sc->data[SC_SOLID_SKIN_OPTION] ) - def += def * sc->data[SC_SOLID_SKIN_OPTION]->val2 / 100; - if( sc->data[SC_ROCK_CRUSHER] ) - def -= def * sc->data[SC_ROCK_CRUSHER]->val2 / 100; - if( sc->data[SC_POWER_OF_GAIA] ) - def += def * sc->data[SC_POWER_OF_GAIA]->val2 / 100; - if(sc->data[SC_ASH]) - def -= def * sc->data[SC_ASH]->val3/100; - if( sc->data[SC_OVERED_BOOST] && bl->type == BL_HOM ) - def -= def * sc->data[SC_OVERED_BOOST]->val4 / 100; - if(sc->data[SC_GLASTHEIM_ITEMDEF]) - def += sc->data[SC_GLASTHEIM_ITEMDEF]->val1; - if (sc->data[SC_SOULGOLEM]) - def += sc->data[SC_SOULGOLEM]->val2; - if (sc->data[SC_STONE_WALL]) - def += sc->data[SC_STONE_WALL]->val2; - if( sc->data[SC_PACKING_ENVELOPE7] ) - def += sc->data[SC_PACKING_ENVELOPE7]->val1; - if (sc->data[SC_D_MACHINE]) - def += sc->data[SC_D_MACHINE]->val2; - if (sc->data[SC_CLIMAX_CRYIMP]) + if( sc->getSCE(SC_ANALYZE) ) + def -= def * (14 * sc->getSCE(SC_ANALYZE)->val1) / 100; + if( sc->getSCE(SC_NEUTRALBARRIER) ) + def += def * sc->getSCE(SC_NEUTRALBARRIER)->val2 / 100; + if( sc->getSCE(SC_PRESTIGE) ) + def += sc->getSCE(SC_PRESTIGE)->val3; + if( sc->getSCE(SC_BANDING) && sc->getSCE(SC_BANDING)->val2 > 1 ) + def += 6 * sc->getSCE(SC_BANDING)->val1; + if( sc->getSCE(SC_ECHOSONG) ) + def += sc->getSCE(SC_ECHOSONG)->val3; + if( sc->getSCE(SC_CAMOUFLAGE) ) + def -= def * 5 * sc->getSCE(SC_CAMOUFLAGE)->val3 / 100; + if( sc->getSCE(SC_SOLID_SKIN_OPTION) ) + def += def * sc->getSCE(SC_SOLID_SKIN_OPTION)->val2 / 100; + if( sc->getSCE(SC_ROCK_CRUSHER) ) + def -= def * sc->getSCE(SC_ROCK_CRUSHER)->val2 / 100; + if( sc->getSCE(SC_POWER_OF_GAIA) ) + def += def * sc->getSCE(SC_POWER_OF_GAIA)->val2 / 100; + if(sc->getSCE(SC_ASH)) + def -= def * sc->getSCE(SC_ASH)->val3/100; + if( sc->getSCE(SC_OVERED_BOOST) && bl->type == BL_HOM ) + def -= def * sc->getSCE(SC_OVERED_BOOST)->val4 / 100; + if(sc->getSCE(SC_GLASTHEIM_ITEMDEF)) + def += sc->getSCE(SC_GLASTHEIM_ITEMDEF)->val1; + if (sc->getSCE(SC_SOULGOLEM)) + def += sc->getSCE(SC_SOULGOLEM)->val2; + if (sc->getSCE(SC_STONE_WALL)) + def += sc->getSCE(SC_STONE_WALL)->val2; + if( sc->getSCE(SC_PACKING_ENVELOPE7) ) + def += sc->getSCE(SC_PACKING_ENVELOPE7)->val1; + if (sc->getSCE(SC_D_MACHINE)) + def += sc->getSCE(SC_D_MACHINE)->val2; + if (sc->getSCE(SC_CLIMAX_CRYIMP)) def += 300; - if (sc->data[SC_GUARD_STANCE]) - def += sc->data[SC_GUARD_STANCE]->val2; - if (sc->data[SC_ATTACK_STANCE]) - def -= sc->data[SC_ATTACK_STANCE]->val2; - if (sc->data[SC_M_DEFSCROLL]) + if (sc->getSCE(SC_GUARD_STANCE)) + def += sc->getSCE(SC_GUARD_STANCE)->val2; + if (sc->getSCE(SC_ATTACK_STANCE)) + def -= sc->getSCE(SC_ATTACK_STANCE)->val2; + if (sc->getSCE(SC_M_DEFSCROLL)) def += 500; return (defType)cap_value(def,DEFTYPE_MIN,DEFTYPE_MAX); @@ -7622,50 +7660,50 @@ static signed short status_calc_def2(struct block_list *bl, struct status_change return (short)cap_value(def2,1,SHRT_MAX); #endif - if(sc->data[SC_BERSERK]) + if(sc->getSCE(SC_BERSERK)) return 0; - if(sc->data[SC_ETERNALCHAOS]) + if(sc->getSCE(SC_ETERNALCHAOS)) return 0; - if(sc->data[SC_DEFSET]) - return sc->data[SC_DEFSET]->val1; + if(sc->getSCE(SC_DEFSET)) + return sc->getSCE(SC_DEFSET)->val1; - if(sc->data[SC_SUN_COMFORT]) - def2 += sc->data[SC_SUN_COMFORT]->val2; + if(sc->getSCE(SC_SUN_COMFORT)) + def2 += sc->getSCE(SC_SUN_COMFORT)->val2; #ifdef RENEWAL - if (sc->data[SC_SKA]) + if (sc->getSCE(SC_SKA)) def2 += 80; #endif - if(sc->data[SC_ANGELUS]) + if(sc->getSCE(SC_ANGELUS)) #ifdef RENEWAL /// The VIT stat bonus is boosted by angelus [RENEWAL] - def2 += status_get_vit(bl) / 2 * sc->data[SC_ANGELUS]->val2/100; + def2 += status_get_vit(bl) / 2 * sc->getSCE(SC_ANGELUS)->val2/100; #else - def2 += def2 * sc->data[SC_ANGELUS]->val2/100; - if(sc->data[SC_CONCENTRATION]) - def2 -= def2 * sc->data[SC_CONCENTRATION]->val4/100; + def2 += def2 * sc->getSCE(SC_ANGELUS)->val2/100; + if(sc->getSCE(SC_CONCENTRATION)) + def2 -= def2 * sc->getSCE(SC_CONCENTRATION)->val4/100; #endif - if(sc->data[SC_POISON]) + if(sc->getSCE(SC_POISON)) def2 -= def2 * 25/100; - if(sc->data[SC_DPOISON]) + if(sc->getSCE(SC_DPOISON)) def2 -= def2 * 25/100; - if(sc->data[SC_SKE]) + if(sc->getSCE(SC_SKE)) def2 -= def2 * 50/100; - if(sc->data[SC_PROVOKE]) - def2 -= def2 * sc->data[SC_PROVOKE]->val3/100; - if(sc->data[SC_JOINTBEAT]) - def2 -= def2 * ( sc->data[SC_JOINTBEAT]->val2&BREAK_SHOULDER ? 50 : 0 ) / 100 - + def2 * ( sc->data[SC_JOINTBEAT]->val2&BREAK_WAIST ? 25 : 0 ) / 100; - if(sc->data[SC_FLING]) - def2 -= def2 * (sc->data[SC_FLING]->val3)/100; - if(sc->data[SC_ANALYZE]) - def2 -= def2 * (14 * sc->data[SC_ANALYZE]->val1) / 100; - if(sc->data[SC_ASH]) - def2 -= def2 * sc->data[SC_ASH]->val3/100; - if (sc->data[SC_PARALYSIS]) - def2 -= def2 * sc->data[SC_PARALYSIS]->val2 / 100; - if(sc->data[SC_EQC]) - def2 -= def2 * sc->data[SC_EQC]->val2 / 100; - if( sc->data[SC_CAMOUFLAGE] ) - def2 -= def2 * 5 * sc->data[SC_CAMOUFLAGE]->val3 / 100; + if(sc->getSCE(SC_PROVOKE)) + def2 -= def2 * sc->getSCE(SC_PROVOKE)->val3/100; + if(sc->getSCE(SC_JOINTBEAT)) + def2 -= def2 * ( sc->getSCE(SC_JOINTBEAT)->val2&BREAK_SHOULDER ? 50 : 0 ) / 100 + + def2 * ( sc->getSCE(SC_JOINTBEAT)->val2&BREAK_WAIST ? 25 : 0 ) / 100; + if(sc->getSCE(SC_FLING)) + def2 -= def2 * (sc->getSCE(SC_FLING)->val3)/100; + if(sc->getSCE(SC_ANALYZE)) + def2 -= def2 * (14 * sc->getSCE(SC_ANALYZE)->val1) / 100; + if(sc->getSCE(SC_ASH)) + def2 -= def2 * sc->getSCE(SC_ASH)->val3/100; + if (sc->getSCE(SC_PARALYSIS)) + def2 -= def2 * sc->getSCE(SC_PARALYSIS)->val2 / 100; + if(sc->getSCE(SC_EQC)) + def2 -= def2 * sc->getSCE(SC_EQC)->val2 / 100; + if( sc->getSCE(SC_CAMOUFLAGE) ) + def2 -= def2 * 5 * sc->getSCE(SC_CAMOUFLAGE)->val3 / 100; #ifdef RENEWAL return (short)cap_value(def2,SHRT_MIN,SHRT_MAX); @@ -7686,55 +7724,55 @@ static defType status_calc_mdef(struct block_list *bl, struct status_change *sc, if(!sc || !sc->count) return (defType)cap_value(mdef,DEFTYPE_MIN,DEFTYPE_MAX); - if(sc->data[SC_BERSERK]) + if(sc->getSCE(SC_BERSERK)) return 0; - if(sc->data[SC_BARRIER]) + if(sc->getSCE(SC_BARRIER)) return 100; #ifndef RENEWAL /// Steel Body does not provide 90 MDEF in [RENEWAL] - if(sc->data[SC_STEELBODY]) + if(sc->getSCE(SC_STEELBODY)) return 90; #endif - if (sc->data[SC_NYANGGRASS]) { + if (sc->getSCE(SC_NYANGGRASS)) { if (bl->type == BL_PC) return 0; else return mdef >>= 1; } - if(sc->data[SC_MDEFSET]) - return sc->data[SC_MDEFSET]->val1; + if(sc->getSCE(SC_MDEFSET)) + return sc->getSCE(SC_MDEFSET)->val1; - if(sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 3) + if(sc->getSCE(SC_EARTH_INSIGNIA) && sc->getSCE(SC_EARTH_INSIGNIA)->val1 == 3) mdef += 50; - if(sc->data[SC_ENDURE] && !sc->data[SC_ENDURE]->val3) // It has been confirmed that Eddga card grants 1 MDEF, not 0, not 10, but 1. - mdef += (sc->data[SC_ENDURE]->val4 == 0) ? sc->data[SC_ENDURE]->val1 : 1; - if(sc->data[SC_STONEHARDSKIN]) - mdef += sc->data[SC_STONEHARDSKIN]->val1; - if(sc->data[SC_STONE]) + if(sc->getSCE(SC_ENDURE) && !sc->getSCE(SC_ENDURE)->val3) // It has been confirmed that Eddga card grants 1 MDEF, not 0, not 10, but 1. + mdef += (sc->getSCE(SC_ENDURE)->val4 == 0) ? sc->getSCE(SC_ENDURE)->val1 : 1; + if(sc->getSCE(SC_STONEHARDSKIN)) + mdef += sc->getSCE(SC_STONEHARDSKIN)->val1; + if(sc->getSCE(SC_STONE)) mdef += 25 * mdef / 100; - if(sc->data[SC_FREEZE]) + if(sc->getSCE(SC_FREEZE)) mdef += 25 * mdef / 100; - if(sc->data[SC_BURNING]) + if(sc->getSCE(SC_BURNING)) mdef -= 25 * mdef / 100; - if( sc->data[SC_NEUTRALBARRIER] ) - mdef += mdef * sc->data[SC_NEUTRALBARRIER]->val2 / 100; - if(sc->data[SC_ANALYZE]) - mdef -= mdef * ( 14 * sc->data[SC_ANALYZE]->val1 ) / 100; - if(sc->data[SC_SYMPHONYOFLOVER]) - mdef += mdef * sc->data[SC_SYMPHONYOFLOVER]->val3 / 100; - if (sc->data[SC_ODINS_POWER]) - mdef -= 20 * sc->data[SC_ODINS_POWER]->val1; - if(sc->data[SC_GLASTHEIM_ITEMDEF]) - mdef += sc->data[SC_GLASTHEIM_ITEMDEF]->val2; - if (sc->data[SC_SOULGOLEM]) - mdef += sc->data[SC_SOULGOLEM]->val3; - if (sc->data[SC_STONE_WALL]) - mdef += sc->data[SC_STONE_WALL]->val3; - if (sc->data[SC_PACKING_ENVELOPE8]) - mdef += sc->data[SC_PACKING_ENVELOPE8]->val1; - if (sc->data[SC_CLIMAX_CRYIMP]) + if( sc->getSCE(SC_NEUTRALBARRIER) ) + mdef += mdef * sc->getSCE(SC_NEUTRALBARRIER)->val2 / 100; + if(sc->getSCE(SC_ANALYZE)) + mdef -= mdef * ( 14 * sc->getSCE(SC_ANALYZE)->val1 ) / 100; + if(sc->getSCE(SC_SYMPHONYOFLOVER)) + mdef += mdef * sc->getSCE(SC_SYMPHONYOFLOVER)->val3 / 100; + if (sc->getSCE(SC_ODINS_POWER)) + mdef -= 20 * sc->getSCE(SC_ODINS_POWER)->val1; + if(sc->getSCE(SC_GLASTHEIM_ITEMDEF)) + mdef += sc->getSCE(SC_GLASTHEIM_ITEMDEF)->val2; + if (sc->getSCE(SC_SOULGOLEM)) + mdef += sc->getSCE(SC_SOULGOLEM)->val3; + if (sc->getSCE(SC_STONE_WALL)) + mdef += sc->getSCE(SC_STONE_WALL)->val3; + if (sc->getSCE(SC_PACKING_ENVELOPE8)) + mdef += sc->getSCE(SC_PACKING_ENVELOPE8)->val1; + if (sc->getSCE(SC_CLIMAX_CRYIMP)) mdef += 100; - if (sc->data[SC_M_DEFSCROLL]) + if (sc->getSCE(SC_M_DEFSCROLL)) mdef += 200; return (defType)cap_value(mdef,DEFTYPE_MIN,DEFTYPE_MAX); @@ -7756,19 +7794,19 @@ static signed short status_calc_mdef2(struct block_list *bl, struct status_chang return (short)cap_value(mdef2,1,SHRT_MAX); #endif - if(sc->data[SC_BERSERK]) + if(sc->getSCE(SC_BERSERK)) return 0; - if(sc->data[SC_SKA]) + if(sc->getSCE(SC_SKA)) return 90; - if(sc->data[SC_MDEFSET]) - return sc->data[SC_MDEFSET]->val1; + if(sc->getSCE(SC_MDEFSET)) + return sc->getSCE(SC_MDEFSET)->val1; - if(sc->data[SC_MINDBREAKER]) - mdef2 -= mdef2 * sc->data[SC_MINDBREAKER]->val3/100; - if(sc->data[SC_BURNING]) + if(sc->getSCE(SC_MINDBREAKER)) + mdef2 -= mdef2 * sc->getSCE(SC_MINDBREAKER)->val3/100; + if(sc->getSCE(SC_BURNING)) mdef2 -= mdef2 * 25 / 100; - if(sc->data[SC_ANALYZE]) - mdef2 -= mdef2 * (14 * sc->data[SC_ANALYZE]->val1) / 100; + if(sc->getSCE(SC_ANALYZE)) + mdef2 -= mdef2 * (14 * sc->getSCE(SC_ANALYZE)->val1) / 100; #ifdef RENEWAL return (short)cap_value(mdef2,SHRT_MIN,SHRT_MAX); @@ -7799,7 +7837,7 @@ static unsigned short status_calc_speed(struct block_list *bl, struct status_cha val = 50 - 10 * pc_checkskill(sd, NC_MADOLICENCE); else val -= 25; - if (sc->data[SC_ACCELERATION]) + if (sc->getSCE(SC_ACCELERATION)) val -= 25; speed += speed * val / 100; @@ -7815,90 +7853,90 @@ static unsigned short status_calc_speed(struct block_list *bl, struct status_cha int val = 0; // GetMoveHasteValue2() - if( sc->data[SC_FUSION] ) + if( sc->getSCE(SC_FUSION) ) val = 25; else if( sd ) { if( pc_isriding(sd) || sd->sc.option&OPTION_DRAGON ) val = 25; // Same bonus else if( pc_isridingwug(sd) ) val = 15 + 5 * pc_checkskill(sd, RA_WUGRIDER); - else if( sc->data[SC_ALL_RIDING] ) + else if( sc->getSCE(SC_ALL_RIDING) ) val = battle_config.rental_mount_speed_boost; } speed_rate -= val; // GetMoveSlowValue() - if( sd && sc->data[SC_HIDING] && pc_checkskill(sd,RG_TUNNELDRIVE) > 0 ) + if( sd && sc->getSCE(SC_HIDING) && pc_checkskill(sd,RG_TUNNELDRIVE) > 0 ) val = 120 - 6 * pc_checkskill(sd,RG_TUNNELDRIVE); - else if( sd && sc->data[SC_CHASEWALK] && sc->data[SC_CHASEWALK]->val3 < 0 ) - val = sc->data[SC_CHASEWALK]->val3; + else if( sd && sc->getSCE(SC_CHASEWALK) && sc->getSCE(SC_CHASEWALK)->val3 < 0 ) + val = sc->getSCE(SC_CHASEWALK)->val3; else { val = 0; // Longing for Freedom/Special Singer cancels song/dance penalty #ifdef RENEWAL - if (sc->data[SC_ENSEMBLEFATIGUE]) - val = max(val, sc->data[SC_ENSEMBLEFATIGUE]->val2); + if (sc->getSCE(SC_ENSEMBLEFATIGUE)) + val = max(val, sc->getSCE(SC_ENSEMBLEFATIGUE)->val2); #else - if( sc->data[SC_LONGING] ) - val = max( val, 50 - 10 * sc->data[SC_LONGING]->val1 ); + if( sc->getSCE(SC_LONGING) ) + val = max( val, 50 - 10 * sc->getSCE(SC_LONGING)->val1 ); #endif else - if( sd && sc->data[SC_DANCING] ) - val = max( val, 500 - (40 + 10 * (sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_BARDDANCER)) * pc_checkskill(sd,(sd->status.sex?BA_MUSICALLESSON:DC_DANCINGLESSON)) ); + if( sd && sc->getSCE(SC_DANCING) ) + val = max( val, 500 - (40 + 10 * (sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_BARDDANCER)) * pc_checkskill(sd,(sd->status.sex?BA_MUSICALLESSON:DC_DANCINGLESSON)) ); - if( sc->data[SC_DECREASEAGI] ) + if( sc->getSCE(SC_DECREASEAGI) ) val = max( val, 25 ); - if( sc->data[SC_QUAGMIRE] || sc->data[SC_HALLUCINATIONWALK_POSTDELAY] || (sc->data[SC_GLOOMYDAY] && sc->data[SC_GLOOMYDAY]->val4) ) + if( sc->getSCE(SC_QUAGMIRE) || sc->getSCE(SC_HALLUCINATIONWALK_POSTDELAY) || (sc->getSCE(SC_GLOOMYDAY) && sc->getSCE(SC_GLOOMYDAY)->val4) ) val = max( val, 50 ); - if( sc->data[SC_DONTFORGETME] ) - val = max( val, sc->data[SC_DONTFORGETME]->val3 ); - if( sc->data[SC_CURSE] ) + if( sc->getSCE(SC_DONTFORGETME) ) + val = max( val, sc->getSCE(SC_DONTFORGETME)->val3 ); + if( sc->getSCE(SC_CURSE) ) val = max( val, 300 ); - if( sc->data[SC_CHASEWALK] ) - val = max( val, sc->data[SC_CHASEWALK]->val3 ); - if( sc->data[SC_WEDDING] ) + if( sc->getSCE(SC_CHASEWALK) ) + val = max( val, sc->getSCE(SC_CHASEWALK)->val3 ); + if( sc->getSCE(SC_WEDDING) ) val = max( val, 100 ); - if( sc->data[SC_JOINTBEAT] && sc->data[SC_JOINTBEAT]->val2&(BREAK_ANKLE|BREAK_KNEE) ) - val = max( val, (sc->data[SC_JOINTBEAT]->val2&BREAK_ANKLE ? 50 : 0) + (sc->data[SC_JOINTBEAT]->val2&BREAK_KNEE ? 30 : 0) ); - if( sc->data[SC_CLOAKING] && (sc->data[SC_CLOAKING]->val4&1) == 0 ) - val = max( val, sc->data[SC_CLOAKING]->val1 < 3 ? 300 : 30 - 3 * sc->data[SC_CLOAKING]->val1 ); - if( sc->data[SC_GOSPEL] && sc->data[SC_GOSPEL]->val4 == BCT_ENEMY ) + if( sc->getSCE(SC_JOINTBEAT) && sc->getSCE(SC_JOINTBEAT)->val2&(BREAK_ANKLE|BREAK_KNEE) ) + val = max( val, (sc->getSCE(SC_JOINTBEAT)->val2&BREAK_ANKLE ? 50 : 0) + (sc->getSCE(SC_JOINTBEAT)->val2&BREAK_KNEE ? 30 : 0) ); + if( sc->getSCE(SC_CLOAKING) && (sc->getSCE(SC_CLOAKING)->val4&1) == 0 ) + val = max( val, sc->getSCE(SC_CLOAKING)->val1 < 3 ? 300 : 30 - 3 * sc->getSCE(SC_CLOAKING)->val1 ); + if( sc->getSCE(SC_GOSPEL) && sc->getSCE(SC_GOSPEL)->val4 == BCT_ENEMY ) val = max( val, 75 ); - if( sc->data[SC_SLOWDOWN] ) // Slow Potion - val = max( val, sc->data[SC_SLOWDOWN]->val1 ); - if( sc->data[SC_GATLINGFEVER] ) + if( sc->getSCE(SC_SLOWDOWN) ) // Slow Potion + val = max( val, sc->getSCE(SC_SLOWDOWN)->val1 ); + if( sc->getSCE(SC_GATLINGFEVER) ) val = max( val, 100 ); - if( sc->data[SC_SUITON] ) - val = max( val, sc->data[SC_SUITON]->val3 ); - if( sc->data[SC_SWOO] ) + if( sc->getSCE(SC_SUITON) ) + val = max( val, sc->getSCE(SC_SUITON)->val3 ); + if( sc->getSCE(SC_SWOO) ) val = max( val, 300 ); - if( sc->data[SC_SKA] ) + if( sc->getSCE(SC_SKA) ) val = max( val, 25 ); - if( sc->data[SC_FREEZING] ) + if( sc->getSCE(SC_FREEZING) ) val = max( val, 30 ); - if( sc->data[SC_MARSHOFABYSS] ) - val = max( val, sc->data[SC_MARSHOFABYSS]->val3 ); - if( sc->data[SC_CAMOUFLAGE] && sc->data[SC_CAMOUFLAGE]->val1 > 2 ) - val = max( val, 25 * (5 - sc->data[SC_CAMOUFLAGE]->val1) ); - if( sc->data[SC_STEALTHFIELD] ) + if( sc->getSCE(SC_MARSHOFABYSS) ) + val = max( val, sc->getSCE(SC_MARSHOFABYSS)->val3 ); + if( sc->getSCE(SC_CAMOUFLAGE) && sc->getSCE(SC_CAMOUFLAGE)->val1 > 2 ) + val = max( val, 25 * (5 - sc->getSCE(SC_CAMOUFLAGE)->val1) ); + if( sc->getSCE(SC_STEALTHFIELD) ) val = max( val, 20 ); - if( sc->data[SC__LAZINESS] ) + if( sc->getSCE(SC__LAZINESS) ) val = max( val, 25 ); - if( sc->data[SC_ROCK_CRUSHER_ATK] ) - val = max( val, sc->data[SC_ROCK_CRUSHER_ATK]->val2 ); - if( sc->data[SC_POWER_OF_GAIA] ) - val = max( val, sc->data[SC_POWER_OF_GAIA]->val2 ); - if( sc->data[SC_MELON_BOMB] ) - val = max( val, sc->data[SC_MELON_BOMB]->val2 ); - if( sc->data[SC_REBOUND] ) + if( sc->getSCE(SC_ROCK_CRUSHER_ATK) ) + val = max( val, sc->getSCE(SC_ROCK_CRUSHER_ATK)->val2 ); + if( sc->getSCE(SC_POWER_OF_GAIA) ) + val = max( val, sc->getSCE(SC_POWER_OF_GAIA)->val2 ); + if( sc->getSCE(SC_MELON_BOMB) ) + val = max( val, sc->getSCE(SC_MELON_BOMB)->val2 ); + if( sc->getSCE(SC_REBOUND) ) val = max( val, 25 ); - if( sc->data[SC_B_TRAP] ) - val = max( val, sc->data[SC_B_TRAP]->val3 ); - if (sc->data[SC_CATNIPPOWDER]) - val = max(val, sc->data[SC_CATNIPPOWDER]->val3); - if (sc->data[SC_SP_SHA]) - val = max(val, sc->data[SC_SP_SHA]->val2); - if (sc->data[SC_CREATINGSTAR]) + if( sc->getSCE(SC_B_TRAP) ) + val = max( val, sc->getSCE(SC_B_TRAP)->val3 ); + if (sc->getSCE(SC_CATNIPPOWDER)) + val = max(val, sc->getSCE(SC_CATNIPPOWDER)->val3); + if (sc->getSCE(SC_SP_SHA)) + val = max(val, sc->getSCE(SC_SP_SHA)->val2); + if (sc->getSCE(SC_CREATINGSTAR)) val = max(val, 90); if( sd && sd->bonus.speed_rate + sd->bonus.speed_add_rate > 0 ) // Permanent item-based speedup @@ -7907,59 +7945,59 @@ static unsigned short status_calc_speed(struct block_list *bl, struct status_cha speed_rate += val; val = 0; - if( sc->data[SC_MARSHOFABYSS] && speed_rate > 150 ) + if( sc->getSCE(SC_MARSHOFABYSS) && speed_rate > 150 ) speed_rate = 150; // GetMoveHasteValue1() - if( sc->data[SC_SPEEDUP1] ) // !FIXME: used both by NPC_AGIUP and Speed Potion script - val = max( val, sc->data[SC_SPEEDUP1]->val1 ); - if( sc->data[SC_INCREASEAGI] ) + if( sc->getSCE(SC_SPEEDUP1) ) // !FIXME: used both by NPC_AGIUP and Speed Potion script + val = max( val, sc->getSCE(SC_SPEEDUP1)->val1 ); + if( sc->getSCE(SC_INCREASEAGI) ) val = max( val, 25 ); - if( sc->data[SC_WINDWALK] ) - val = max( val, 2 * sc->data[SC_WINDWALK]->val1 ); - if( sc->data[SC_CARTBOOST] ) + if( sc->getSCE(SC_WINDWALK) ) + val = max( val, 2 * sc->getSCE(SC_WINDWALK)->val1 ); + if( sc->getSCE(SC_CARTBOOST) ) val = max( val, 20 ); if( sd && (sd->class_&MAPID_UPPERMASK) == MAPID_ASSASSIN && pc_checkskill(sd,TF_MISS) > 0 ) val = max( val, 1 * pc_checkskill(sd,TF_MISS) ); - if( sc->data[SC_CLOAKING] && (sc->data[SC_CLOAKING]->val4&1) == 1 ) - val = max( val, sc->data[SC_CLOAKING]->val1 >= 10 ? 25 : 3 * sc->data[SC_CLOAKING]->val1 - 3 ); - if( sc->data[SC_BERSERK] ) + if( sc->getSCE(SC_CLOAKING) && (sc->getSCE(SC_CLOAKING)->val4&1) == 1 ) + val = max( val, sc->getSCE(SC_CLOAKING)->val1 >= 10 ? 25 : 3 * sc->getSCE(SC_CLOAKING)->val1 - 3 ); + if( sc->getSCE(SC_BERSERK) ) val = max( val, 25 ); - if( sc->data[SC_RUN] ) + if( sc->getSCE(SC_RUN) ) val = max( val, 55 ); - if( sc->data[SC_AVOID] ) - val = max( val, 10 * sc->data[SC_AVOID]->val1 ); - if( sc->data[SC_INVINCIBLE] && !sc->data[SC_INVINCIBLEOFF] ) + if( sc->getSCE(SC_AVOID) ) + val = max( val, 10 * sc->getSCE(SC_AVOID)->val1 ); + if( sc->getSCE(SC_INVINCIBLE) && !sc->getSCE(SC_INVINCIBLEOFF) ) val = max( val, 75 ); - if( sc->data[SC_CLOAKINGEXCEED] ) - val = max( val, sc->data[SC_CLOAKINGEXCEED]->val3); - if (sc->data[SC_PARALYSE] && sc->data[SC_PARALYSE]->val3 == 0) + if( sc->getSCE(SC_CLOAKINGEXCEED) ) + val = max( val, sc->getSCE(SC_CLOAKINGEXCEED)->val3); + if (sc->getSCE(SC_PARALYSE) && sc->getSCE(SC_PARALYSE)->val3 == 0) val = max(val, 50); - if( sc->data[SC_HOVERING] ) + if( sc->getSCE(SC_HOVERING) ) val = max( val, 10 ); - if( sc->data[SC_GN_CARTBOOST] ) - val = max( val, sc->data[SC_GN_CARTBOOST]->val2 ); - if( sc->data[SC_SWINGDANCE] ) - val = max( val, sc->data[SC_SWINGDANCE]->val3 ); - if( sc->data[SC_WIND_STEP_OPTION] ) - val = max( val, sc->data[SC_WIND_STEP_OPTION]->val2 ); - if( sc->data[SC_FULL_THROTTLE] ) + if( sc->getSCE(SC_GN_CARTBOOST) ) + val = max( val, sc->getSCE(SC_GN_CARTBOOST)->val2 ); + if( sc->getSCE(SC_SWINGDANCE) ) + val = max( val, sc->getSCE(SC_SWINGDANCE)->val3 ); + if( sc->getSCE(SC_WIND_STEP_OPTION) ) + val = max( val, sc->getSCE(SC_WIND_STEP_OPTION)->val2 ); + if( sc->getSCE(SC_FULL_THROTTLE) ) val = max( val, 25 ); - if (sc->data[SC_ARCLOUSEDASH]) - val = max(val, sc->data[SC_ARCLOUSEDASH]->val3); - if( sc->data[SC_DORAM_WALKSPEED] ) - val = max(val, sc->data[SC_DORAM_WALKSPEED]->val1); - if (sc->data[SC_RUSHWINDMILL]) + if (sc->getSCE(SC_ARCLOUSEDASH)) + val = max(val, sc->getSCE(SC_ARCLOUSEDASH)->val3); + if( sc->getSCE(SC_DORAM_WALKSPEED) ) + val = max(val, sc->getSCE(SC_DORAM_WALKSPEED)->val1); + if (sc->getSCE(SC_RUSHWINDMILL)) val = max(val, 25); // !TODO: Confirm bonus movement speed - if (sc->data[SC_EMERGENCY_MOVE]) - val = max(val, sc->data[SC_EMERGENCY_MOVE]->val2); - if( sc->data[SC_JAWAII_SERENADE] ){ + if (sc->getSCE(SC_EMERGENCY_MOVE)) + val = max(val, sc->getSCE(SC_EMERGENCY_MOVE)->val2); + if( sc->getSCE(SC_JAWAII_SERENADE) ){ val = max( val, 25 ); } // !FIXME: official items use a single bonus for this [ultramage] - if( sc->data[SC_SPEEDUP0] ) // Temporary item-based speedup - val = max( val, sc->data[SC_SPEEDUP0]->val1 ); + if( sc->getSCE(SC_SPEEDUP0) ) // Temporary item-based speedup + val = max( val, sc->getSCE(SC_SPEEDUP0)->val1 ); if( sd && sd->bonus.speed_rate + sd->bonus.speed_add_rate < 0 ) // Permanent item-based speedup val = max( val, -(sd->bonus.speed_rate + sd->bonus.speed_add_rate) ); @@ -7972,16 +8010,16 @@ static unsigned short status_calc_speed(struct block_list *bl, struct status_cha // GetSpeed() if( sd && pc_iscarton(sd) ) speed += speed * (50 - 5 * pc_checkskill(sd,MC_PUSHCART)) / 100; - if( sc->data[SC_PARALYSE] && sc->data[SC_PARALYSE]->val3 == 1 ) + if( sc->getSCE(SC_PARALYSE) && sc->getSCE(SC_PARALYSE)->val3 == 1 ) speed += speed * 50 / 100; if( speed_rate != 100 ) speed = speed * speed_rate / 100; - if( sc->data[SC_STEELBODY] ) + if( sc->getSCE(SC_STEELBODY) ) speed = 200; - if( sc->data[SC_DEFENDER] ) + if( sc->getSCE(SC_DEFENDER) ) speed = max(speed, 200); - if( sc->data[SC_WALKSPEED] && sc->data[SC_WALKSPEED]->val1 > 0 ) // ChangeSpeed - speed = speed * 100 / sc->data[SC_WALKSPEED]->val1; + if( sc->getSCE(SC_WALKSPEED) && sc->getSCE(SC_WALKSPEED)->val1 > 0 ) // ChangeSpeed + speed = speed * 100 / sc->getSCE(SC_WALKSPEED)->val1; return (unsigned short)cap_value(speed, MIN_WALK_SPEED, MAX_WALK_SPEED); } @@ -8006,22 +8044,22 @@ static short status_calc_aspd(struct block_list *bl, struct status_change *sc, b if (fixed) { enum sc_type sc_val; - if (!sc->data[SC_QUAGMIRE]) { + if (!sc->getSCE(SC_QUAGMIRE)) { // !TODO: How does Two-Hand Quicken, Adrenaline Rush, and Spear quick change? (+10%) - if (bonus < 7 && (sc->data[SC_TWOHANDQUICKEN] || sc->data[SC_ONEHAND] || sc->data[SC_MERC_QUICKEN] || sc->data[SC_ADRENALINE] || sc->data[SC_SPEARQUICKEN])) + if (bonus < 7 && (sc->getSCE(SC_TWOHANDQUICKEN) || sc->getSCE(SC_ONEHAND) || sc->getSCE(SC_MERC_QUICKEN) || sc->getSCE(SC_ADRENALINE) || sc->getSCE(SC_SPEARQUICKEN))) bonus = 7; - else if (bonus < 6 && sc->data[SC_ADRENALINE2]) + else if (bonus < 6 && sc->getSCE(SC_ADRENALINE2)) bonus = 6; - else if (bonus < 5 && sc->data[SC_FLEET]) + else if (bonus < 5 && sc->getSCE(SC_FLEET)) bonus = 5; } - if (sc->data[SC_ASSNCROS] && bonus < sc->data[SC_ASSNCROS]->val2) { + if (sc->getSCE(SC_ASSNCROS) && bonus < sc->getSCE(SC_ASSNCROS)->val2) { #ifdef RENEWAL - bonus += sc->data[SC_ASSNCROS]->val2; + bonus += sc->getSCE(SC_ASSNCROS)->val2; #else if (bl->type != BL_PC) - bonus += sc->data[SC_ASSNCROS]->val2; + bonus += sc->getSCE(SC_ASSNCROS)->val2; else { switch(((TBL_PC*)bl)->status.weapon) { case W_BOW: @@ -8032,101 +8070,101 @@ static short status_calc_aspd(struct block_list *bl, struct status_change *sc, b case W_GRENADE: break; default: - bonus += sc->data[SC_ASSNCROS]->val2; + bonus += sc->getSCE(SC_ASSNCROS)->val2; break; } } #endif } - if (bonus < 20 && sc->data[SC_MADNESSCANCEL]) + if (bonus < 20 && sc->getSCE(SC_MADNESSCANCEL)) bonus = 20; - else if (bonus < 15 && sc->data[SC_BERSERK]) + else if (bonus < 15 && sc->getSCE(SC_BERSERK)) bonus = 15; - if (sc->data[sc_val = SC_ASPDPOTION3] || sc->data[sc_val = SC_ASPDPOTION2] || sc->data[sc_val = SC_ASPDPOTION1] || sc->data[sc_val = SC_ASPDPOTION0]) - bonus += sc->data[sc_val]->val1; - if (sc->data[SC_ATTHASTE_CASH]) - bonus += sc->data[SC_ATTHASTE_CASH]->val1; + if (sc->getSCE(sc_val = SC_ASPDPOTION3) || sc->getSCE(sc_val = SC_ASPDPOTION2) || sc->getSCE(sc_val = SC_ASPDPOTION1) || sc->getSCE(sc_val = SC_ASPDPOTION0)) + bonus += sc->getSCE(sc_val)->val1; + if (sc->getSCE(SC_ATTHASTE_CASH)) + bonus += sc->getSCE(SC_ATTHASTE_CASH)->val1; } else { - if (sc->data[SC_DONTFORGETME]) - bonus -= sc->data[SC_DONTFORGETME]->val2 / 10; + if (sc->getSCE(SC_DONTFORGETME)) + bonus -= sc->getSCE(SC_DONTFORGETME)->val2 / 10; #ifdef RENEWAL - if (sc->data[SC_ENSEMBLEFATIGUE]) - bonus -= sc->data[SC_ENSEMBLEFATIGUE]->val2 / 10; + if (sc->getSCE(SC_ENSEMBLEFATIGUE)) + bonus -= sc->getSCE(SC_ENSEMBLEFATIGUE)->val2 / 10; #else - if (sc->data[SC_LONGING]) - bonus -= sc->data[SC_LONGING]->val2 / 10; + if (sc->getSCE(SC_LONGING)) + bonus -= sc->getSCE(SC_LONGING)->val2 / 10; #endif - if (sc->data[SC_STEELBODY]) + if (sc->getSCE(SC_STEELBODY)) bonus -= 25; - if (sc->data[SC_SKA]) + if (sc->getSCE(SC_SKA)) bonus -= 25; - if (sc->data[SC_DEFENDER]) - bonus -= sc->data[SC_DEFENDER]->val4 / 10; - if (sc->data[SC_GOSPEL] && sc->data[SC_GOSPEL]->val4 == BCT_ENEMY) + if (sc->getSCE(SC_DEFENDER)) + bonus -= sc->getSCE(SC_DEFENDER)->val4 / 10; + if (sc->getSCE(SC_GOSPEL) && sc->getSCE(SC_GOSPEL)->val4 == BCT_ENEMY) bonus -= 75; #ifndef RENEWAL - if (sc->data[SC_GRAVITATION]) - bonus -= sc->data[SC_GRAVITATION]->val2 / 10; // Needs more info + if (sc->getSCE(SC_GRAVITATION)) + bonus -= sc->getSCE(SC_GRAVITATION)->val2 / 10; // Needs more info #endif - if (sc->data[SC_JOINTBEAT]) { // Needs more info - if (sc->data[SC_JOINTBEAT]->val2&BREAK_WRIST) + if (sc->getSCE(SC_JOINTBEAT)) { // Needs more info + if (sc->getSCE(SC_JOINTBEAT)->val2&BREAK_WRIST) bonus -= 25; - if (sc->data[SC_JOINTBEAT]->val2&BREAK_KNEE) + if (sc->getSCE(SC_JOINTBEAT)->val2&BREAK_KNEE) bonus -= 10; } - if (sc->data[SC_FREEZING]) + if (sc->getSCE(SC_FREEZING)) bonus -= 30; - if (sc->data[SC_HALLUCINATIONWALK_POSTDELAY]) + if (sc->getSCE(SC_HALLUCINATIONWALK_POSTDELAY)) bonus -= 50; - if (sc->data[SC_PARALYSE] && sc->data[SC_PARALYSE]->val3 == 1) + if (sc->getSCE(SC_PARALYSE) && sc->getSCE(SC_PARALYSE)->val3 == 1) bonus -= 10; - if (sc->data[SC__BODYPAINT]) - bonus -= 5 * sc->data[SC__BODYPAINT]->val1; - if (sc->data[SC__INVISIBILITY]) - bonus -= sc->data[SC__INVISIBILITY]->val2; - if (sc->data[SC__GROOMY]) - bonus -= sc->data[SC__GROOMY]->val2; - if (sc->data[SC_SWINGDANCE]) - bonus += sc->data[SC_SWINGDANCE]->val3; - if (sc->data[SC_DANCEWITHWUG]) - bonus += sc->data[SC_DANCEWITHWUG]->val3; - if (sc->data[SC_GLOOMYDAY]) - bonus -= sc->data[SC_GLOOMYDAY]->val3; - if (sc->data[SC_GT_CHANGE]) - bonus += sc->data[SC_GT_CHANGE]->val3; - if (sc->data[SC_MELON_BOMB]) - bonus -= sc->data[SC_MELON_BOMB]->val3; - if (sc->data[SC_BOOST500]) - bonus += sc->data[SC_BOOST500]->val1; - if (sc->data[SC_EXTRACT_SALAMINE_JUICE]) - bonus += sc->data[SC_EXTRACT_SALAMINE_JUICE]->val1; - if (sc->data[SC_GOLDENE_FERSE]) - bonus += sc->data[SC_GOLDENE_FERSE]->val3; - if (sc->data[SC_INCASPDRATE]) - bonus += sc->data[SC_INCASPDRATE]->val1; - if (sc->data[SC_GATLINGFEVER]) - bonus += sc->data[SC_GATLINGFEVER]->val1; - if (sc->data[SC_STAR_COMFORT]) - bonus += 3 * sc->data[SC_STAR_COMFORT]->val1; - if (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 2) + if (sc->getSCE(SC__BODYPAINT)) + bonus -= 5 * sc->getSCE(SC__BODYPAINT)->val1; + if (sc->getSCE(SC__INVISIBILITY)) + bonus -= sc->getSCE(SC__INVISIBILITY)->val2; + if (sc->getSCE(SC__GROOMY)) + bonus -= sc->getSCE(SC__GROOMY)->val2; + if (sc->getSCE(SC_SWINGDANCE)) + bonus += sc->getSCE(SC_SWINGDANCE)->val3; + if (sc->getSCE(SC_DANCEWITHWUG)) + bonus += sc->getSCE(SC_DANCEWITHWUG)->val3; + if (sc->getSCE(SC_GLOOMYDAY)) + bonus -= sc->getSCE(SC_GLOOMYDAY)->val3; + if (sc->getSCE(SC_GT_CHANGE)) + bonus += sc->getSCE(SC_GT_CHANGE)->val3; + if (sc->getSCE(SC_MELON_BOMB)) + bonus -= sc->getSCE(SC_MELON_BOMB)->val3; + if (sc->getSCE(SC_BOOST500)) + bonus += sc->getSCE(SC_BOOST500)->val1; + if (sc->getSCE(SC_EXTRACT_SALAMINE_JUICE)) + bonus += sc->getSCE(SC_EXTRACT_SALAMINE_JUICE)->val1; + if (sc->getSCE(SC_GOLDENE_FERSE)) + bonus += sc->getSCE(SC_GOLDENE_FERSE)->val3; + if (sc->getSCE(SC_INCASPDRATE)) + bonus += sc->getSCE(SC_INCASPDRATE)->val1; + if (sc->getSCE(SC_GATLINGFEVER)) + bonus += sc->getSCE(SC_GATLINGFEVER)->val1; + if (sc->getSCE(SC_STAR_COMFORT)) + bonus += 3 * sc->getSCE(SC_STAR_COMFORT)->val1; + if (sc->getSCE(SC_WIND_INSIGNIA) && sc->getSCE(SC_WIND_INSIGNIA)->val1 == 2) bonus += 10; - if (sc->data[SC_INCREASEAGI]) - bonus += sc->data[SC_INCREASEAGI]->val1; - if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ASPDRATE) + if (sc->getSCE(SC_INCREASEAGI)) + bonus += sc->getSCE(SC_INCREASEAGI)->val1; + if (sc->getSCE(SC_NIBELUNGEN) && sc->getSCE(SC_NIBELUNGEN)->val2 == RINGNBL_ASPDRATE) bonus += 20; - if (sc->data[SC_STARSTANCE]) - bonus += sc->data[SC_STARSTANCE]->val2; - if( sc->data[SC_2011RWC_SCROLL] ) + if (sc->getSCE(SC_STARSTANCE)) + bonus += sc->getSCE(SC_STARSTANCE)->val2; + if( sc->getSCE(SC_2011RWC_SCROLL) ) bonus += 5; - if( sc->data[SC_SPARKCANDY] ) + if( sc->getSCE(SC_SPARKCANDY) ) bonus += 25; - if( sc->data[SC_ACARAJE] ) + if( sc->getSCE(SC_ACARAJE) ) bonus += 10; - if( sc->data[SC_SKF_ASPD] ) - bonus += sc->data[SC_SKF_ASPD]->val1; - if( sc->data[SC_PORK_RIB_STEW] ) + if( sc->getSCE(SC_SKF_ASPD) ) + bonus += sc->getSCE(SC_SKF_ASPD)->val1; + if( sc->getSCE(SC_PORK_RIB_STEW) ) bonus += 5; struct map_session_data* sd = BL_CAST(BL_PC, bl); @@ -8153,28 +8191,28 @@ static short status_calc_fix_aspd(struct block_list *bl, struct status_change *s { if (!sc || !sc->count) return cap_value(aspd, 0, 2000); - if (sc->data[SC_OVERED_BOOST]) - return cap_value(2000 - sc->data[SC_OVERED_BOOST]->val3 * 10, 0, 2000); + if (sc->getSCE(SC_OVERED_BOOST)) + return cap_value(2000 - sc->getSCE(SC_OVERED_BOOST)->val3 * 10, 0, 2000); - if ((sc->data[SC_GUST_OPTION] || sc->data[SC_BLAST_OPTION] || sc->data[SC_WILD_STORM_OPTION])) + if ((sc->getSCE(SC_GUST_OPTION) || sc->getSCE(SC_BLAST_OPTION) || sc->getSCE(SC_WILD_STORM_OPTION))) aspd -= 50; // +5 ASPD - if (sc->data[SC_FIGHTINGSPIRIT]) - aspd -= sc->data[SC_FIGHTINGSPIRIT]->val2; - if (sc->data[SC_MTF_ASPD]) - aspd -= sc->data[SC_MTF_ASPD]->val1; - if (sc->data[SC_MTF_ASPD2]) - aspd -= sc->data[SC_MTF_ASPD2]->val1; - if (sc->data[SC_SOULSHADOW]) - aspd -= 10 * sc->data[SC_SOULSHADOW]->val2; - if (sc->data[SC_HEAT_BARREL]) - aspd -= sc->data[SC_HEAT_BARREL]->val1 * 10; - if (sc->data[SC_EP16_2_BUFF_SS]) + if (sc->getSCE(SC_FIGHTINGSPIRIT)) + aspd -= sc->getSCE(SC_FIGHTINGSPIRIT)->val2; + if (sc->getSCE(SC_MTF_ASPD)) + aspd -= sc->getSCE(SC_MTF_ASPD)->val1; + if (sc->getSCE(SC_MTF_ASPD2)) + aspd -= sc->getSCE(SC_MTF_ASPD2)->val1; + if (sc->getSCE(SC_SOULSHADOW)) + aspd -= 10 * sc->getSCE(SC_SOULSHADOW)->val2; + if (sc->getSCE(SC_HEAT_BARREL)) + aspd -= sc->getSCE(SC_HEAT_BARREL)->val1 * 10; + if (sc->getSCE(SC_EP16_2_BUFF_SS)) aspd -= 100; // +10 ASPD - if (sc->data[SC_PACKING_ENVELOPE6]) - aspd -= sc->data[SC_PACKING_ENVELOPE6]->val1 * 10; - if (sc->data[SC_SINCERE_FAITH]) - aspd -= 10 * sc->data[SC_SINCERE_FAITH]->val2; - if( sc->data[SC_LIMIT_POWER_BOOSTER] ) + if (sc->getSCE(SC_PACKING_ENVELOPE6)) + aspd -= sc->getSCE(SC_PACKING_ENVELOPE6)->val1 * 10; + if (sc->getSCE(SC_SINCERE_FAITH)) + aspd -= 10 * sc->getSCE(SC_SINCERE_FAITH)->val2; + if( sc->getSCE(SC_LIMIT_POWER_BOOSTER) ) aspd -= 10; return cap_value(aspd, 0, 2000); // Will be recap for proper bl anyway @@ -8196,46 +8234,46 @@ static short status_calc_aspd_rate(struct block_list *bl, struct status_change * if(!sc || !sc->count) return cap_value(aspd_rate,0,SHRT_MAX); - if( !sc->data[SC_QUAGMIRE] ) { + if( !sc->getSCE(SC_QUAGMIRE) ) { int max = 0; - if(sc->data[SC_STAR_COMFORT]) - max = sc->data[SC_STAR_COMFORT]->val2; + if(sc->getSCE(SC_STAR_COMFORT)) + max = sc->getSCE(SC_STAR_COMFORT)->val2; - if(sc->data[SC_TWOHANDQUICKEN] && - max < sc->data[SC_TWOHANDQUICKEN]->val2) - max = sc->data[SC_TWOHANDQUICKEN]->val2; + if(sc->getSCE(SC_TWOHANDQUICKEN) && + max < sc->getSCE(SC_TWOHANDQUICKEN)->val2) + max = sc->getSCE(SC_TWOHANDQUICKEN)->val2; - if(sc->data[SC_ONEHAND] && - max < sc->data[SC_ONEHAND]->val2) - max = sc->data[SC_ONEHAND]->val2; + if(sc->getSCE(SC_ONEHAND) && + max < sc->getSCE(SC_ONEHAND)->val2) + max = sc->getSCE(SC_ONEHAND)->val2; - if(sc->data[SC_MERC_QUICKEN] && - max < sc->data[SC_MERC_QUICKEN]->val2) - max = sc->data[SC_MERC_QUICKEN]->val2; + if(sc->getSCE(SC_MERC_QUICKEN) && + max < sc->getSCE(SC_MERC_QUICKEN)->val2) + max = sc->getSCE(SC_MERC_QUICKEN)->val2; - if(sc->data[SC_ADRENALINE2] && - max < sc->data[SC_ADRENALINE2]->val3) - max = sc->data[SC_ADRENALINE2]->val3; + if(sc->getSCE(SC_ADRENALINE2) && + max < sc->getSCE(SC_ADRENALINE2)->val3) + max = sc->getSCE(SC_ADRENALINE2)->val3; - if(sc->data[SC_ADRENALINE] && - max < sc->data[SC_ADRENALINE]->val3) - max = sc->data[SC_ADRENALINE]->val3; + if(sc->getSCE(SC_ADRENALINE) && + max < sc->getSCE(SC_ADRENALINE)->val3) + max = sc->getSCE(SC_ADRENALINE)->val3; - if(sc->data[SC_SPEARQUICKEN] && - max < sc->data[SC_SPEARQUICKEN]->val2) - max = sc->data[SC_SPEARQUICKEN]->val2; + if(sc->getSCE(SC_SPEARQUICKEN) && + max < sc->getSCE(SC_SPEARQUICKEN)->val2) + max = sc->getSCE(SC_SPEARQUICKEN)->val2; - if(sc->data[SC_GATLINGFEVER] && - max < sc->data[SC_GATLINGFEVER]->val2) - max = sc->data[SC_GATLINGFEVER]->val2; + if(sc->getSCE(SC_GATLINGFEVER) && + max < sc->getSCE(SC_GATLINGFEVER)->val2) + max = sc->getSCE(SC_GATLINGFEVER)->val2; - if(sc->data[SC_FLEET] && - max < sc->data[SC_FLEET]->val2) - max = sc->data[SC_FLEET]->val2; + if(sc->getSCE(SC_FLEET) && + max < sc->getSCE(SC_FLEET)->val2) + max = sc->getSCE(SC_FLEET)->val2; - if(sc->data[SC_ASSNCROS] && max < sc->data[SC_ASSNCROS]->val2) { + if(sc->getSCE(SC_ASSNCROS) && max < sc->getSCE(SC_ASSNCROS)->val2) { if (bl->type!=BL_PC) - max = sc->data[SC_ASSNCROS]->val2; + max = sc->getSCE(SC_ASSNCROS)->val2; else switch(((TBL_PC*)bl)->status.weapon) { case W_BOW: @@ -8246,96 +8284,96 @@ static short status_calc_aspd_rate(struct block_list *bl, struct status_change * case W_GRENADE: break; default: - max = sc->data[SC_ASSNCROS]->val2; + max = sc->getSCE(SC_ASSNCROS)->val2; } } aspd_rate -= max; - if(sc->data[SC_BERSERK]) + if(sc->getSCE(SC_BERSERK)) aspd_rate -= 300; - else if(sc->data[SC_MADNESSCANCEL]) + else if(sc->getSCE(SC_MADNESSCANCEL)) aspd_rate -= 200; } - if( sc->data[i=SC_ASPDPOTION3] || - sc->data[i=SC_ASPDPOTION2] || - sc->data[i=SC_ASPDPOTION1] || - sc->data[i=SC_ASPDPOTION0] ) - aspd_rate -= sc->data[i]->val2; + if( sc->getSCE(i=SC_ASPDPOTION3) || + sc->getSCE(i=SC_ASPDPOTION2) || + sc->getSCE(i=SC_ASPDPOTION1) || + sc->getSCE(i=SC_ASPDPOTION0) ) + aspd_rate -= sc->getSCE(i)->val2; - if (sc->data[SC_ATTHASTE_CASH]) - aspd_rate -= sc->data[SC_ATTHASTE_CASH]->val2; + if (sc->getSCE(SC_ATTHASTE_CASH)) + aspd_rate -= sc->getSCE(SC_ATTHASTE_CASH)->val2; - if(sc->data[SC_DONTFORGETME]) - aspd_rate += sc->data[SC_DONTFORGETME]->val2; + if(sc->getSCE(SC_DONTFORGETME)) + aspd_rate += sc->getSCE(SC_DONTFORGETME)->val2; #ifdef RENEWAL - if (sc->data[SC_ENSEMBLEFATIGUE]) - aspd_rate += sc->data[SC_ENSEMBLEFATIGUE]->val2; + if (sc->getSCE(SC_ENSEMBLEFATIGUE)) + aspd_rate += sc->getSCE(SC_ENSEMBLEFATIGUE)->val2; #else - if(sc->data[SC_LONGING]) - aspd_rate += sc->data[SC_LONGING]->val2; + if(sc->getSCE(SC_LONGING)) + aspd_rate += sc->getSCE(SC_LONGING)->val2; #endif - if(sc->data[SC_STEELBODY]) + if(sc->getSCE(SC_STEELBODY)) aspd_rate += 250; - if(sc->data[SC_SKA]) + if(sc->getSCE(SC_SKA)) aspd_rate += 250; - if(sc->data[SC_DEFENDER]) - aspd_rate += sc->data[SC_DEFENDER]->val4; - if(sc->data[SC_GOSPEL] && sc->data[SC_GOSPEL]->val4 == BCT_ENEMY) + if(sc->getSCE(SC_DEFENDER)) + aspd_rate += sc->getSCE(SC_DEFENDER)->val4; + if(sc->getSCE(SC_GOSPEL) && sc->getSCE(SC_GOSPEL)->val4 == BCT_ENEMY) aspd_rate += 250; #ifndef RENEWAL - if(sc->data[SC_GRAVITATION]) - aspd_rate += sc->data[SC_GRAVITATION]->val2; + if(sc->getSCE(SC_GRAVITATION)) + aspd_rate += sc->getSCE(SC_GRAVITATION)->val2; #endif - if(sc->data[SC_JOINTBEAT]) { - if( sc->data[SC_JOINTBEAT]->val2&BREAK_WRIST ) + if(sc->getSCE(SC_JOINTBEAT)) { + if( sc->getSCE(SC_JOINTBEAT)->val2&BREAK_WRIST ) aspd_rate += 250; - if( sc->data[SC_JOINTBEAT]->val2&BREAK_KNEE ) + if( sc->getSCE(SC_JOINTBEAT)->val2&BREAK_KNEE ) aspd_rate += 100; } - if( sc->data[SC_FREEZING] ) + if( sc->getSCE(SC_FREEZING) ) aspd_rate += 300; - if( sc->data[SC_HALLUCINATIONWALK_POSTDELAY] ) + if( sc->getSCE(SC_HALLUCINATIONWALK_POSTDELAY) ) aspd_rate += 500; - if( sc->data[SC_PARALYSE] && sc->data[SC_PARALYSE]->val3 == 1 ) + if( sc->getSCE(SC_PARALYSE) && sc->getSCE(SC_PARALYSE)->val3 == 1 ) aspd_rate += 100; - if( sc->data[SC__BODYPAINT] ) - aspd_rate += 50 * sc->data[SC__BODYPAINT]->val1; - if( sc->data[SC__INVISIBILITY] ) - aspd_rate += sc->data[SC__INVISIBILITY]->val2 * 10; - if( sc->data[SC__GROOMY] ) - aspd_rate += sc->data[SC__GROOMY]->val2 * 10; - if( sc->data[SC_SWINGDANCE] ) - aspd_rate -= sc->data[SC_SWINGDANCE]->val3 * 10; - if( sc->data[SC_DANCEWITHWUG] ) - aspd_rate -= sc->data[SC_DANCEWITHWUG]->val3 * 10; - if( sc->data[SC_GLOOMYDAY] ) - aspd_rate += sc->data[SC_GLOOMYDAY]->val3 * 10; - if( sc->data[SC_GT_CHANGE] ) - aspd_rate -= sc->data[SC_GT_CHANGE]->val3 * 10; - if( sc->data[SC_MELON_BOMB] ) - aspd_rate += sc->data[SC_MELON_BOMB]->val3 * 10; - if( sc->data[SC_BOOST500] ) - aspd_rate -= sc->data[SC_BOOST500]->val1 *10; - if( sc->data[SC_EXTRACT_SALAMINE_JUICE] ) - aspd_rate -= sc->data[SC_EXTRACT_SALAMINE_JUICE]->val1 * 10; - if( sc->data[SC_INCASPDRATE] ) - aspd_rate -= sc->data[SC_INCASPDRATE]->val1 * 10; - if( sc->data[SC_GOLDENE_FERSE]) - aspd_rate -= sc->data[SC_GOLDENE_FERSE]->val3 * 10; - if (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 2) + if( sc->getSCE(SC__BODYPAINT) ) + aspd_rate += 50 * sc->getSCE(SC__BODYPAINT)->val1; + if( sc->getSCE(SC__INVISIBILITY) ) + aspd_rate += sc->getSCE(SC__INVISIBILITY)->val2 * 10; + if( sc->getSCE(SC__GROOMY) ) + aspd_rate += sc->getSCE(SC__GROOMY)->val2 * 10; + if( sc->getSCE(SC_SWINGDANCE) ) + aspd_rate -= sc->getSCE(SC_SWINGDANCE)->val3 * 10; + if( sc->getSCE(SC_DANCEWITHWUG) ) + aspd_rate -= sc->getSCE(SC_DANCEWITHWUG)->val3 * 10; + if( sc->getSCE(SC_GLOOMYDAY) ) + aspd_rate += sc->getSCE(SC_GLOOMYDAY)->val3 * 10; + if( sc->getSCE(SC_GT_CHANGE) ) + aspd_rate -= sc->getSCE(SC_GT_CHANGE)->val3 * 10; + if( sc->getSCE(SC_MELON_BOMB) ) + aspd_rate += sc->getSCE(SC_MELON_BOMB)->val3 * 10; + if( sc->getSCE(SC_BOOST500) ) + aspd_rate -= sc->getSCE(SC_BOOST500)->val1 *10; + if( sc->getSCE(SC_EXTRACT_SALAMINE_JUICE) ) + aspd_rate -= sc->getSCE(SC_EXTRACT_SALAMINE_JUICE)->val1 * 10; + if( sc->getSCE(SC_INCASPDRATE) ) + aspd_rate -= sc->getSCE(SC_INCASPDRATE)->val1 * 10; + if( sc->getSCE(SC_GOLDENE_FERSE)) + aspd_rate -= sc->getSCE(SC_GOLDENE_FERSE)->val3 * 10; + if (sc->getSCE(SC_WIND_INSIGNIA) && sc->getSCE(SC_WIND_INSIGNIA)->val1 == 2) aspd_rate -= 100; - if (sc->data[SC_STARSTANCE]) - aspd_rate -= 10 * sc->data[SC_STARSTANCE]->val2; - if( sc->data[SC_2011RWC_SCROLL] ) + if (sc->getSCE(SC_STARSTANCE)) + aspd_rate -= 10 * sc->getSCE(SC_STARSTANCE)->val2; + if( sc->getSCE(SC_2011RWC_SCROLL) ) aspd_rate -= 50; - if( sc->data[SC_SPARKCANDY] ) + if( sc->getSCE(SC_SPARKCANDY) ) aspd_rate -= 250; - if( sc->data[SC_ACARAJE] ) + if( sc->getSCE(SC_ACARAJE) ) aspd_rate -= 100; - if( sc->data[SC_SKF_ASPD] ) - aspd_rate -= sc->data[SC_SKF_ASPD]->val1 * 10; - if( sc->data[SC_PORK_RIB_STEW] ) + if( sc->getSCE(SC_SKF_ASPD) ) + aspd_rate -= sc->getSCE(SC_SKF_ASPD)->val1 * 10; + if( sc->getSCE(SC_PORK_RIB_STEW) ) aspd_rate -= 50; return (short)cap_value(aspd_rate,0,SHRT_MAX); @@ -8363,7 +8401,7 @@ static unsigned short status_calc_dmotion(struct block_list *bl, struct status_c return 0; } - if (sc && sc->count > 0 && (sc->data[SC_ENDURE] || sc->data[SC_RUN] || sc->data[SC_WUGDASH] || sc->data[SC_SPARKCANDY])) + if (sc && sc->count > 0 && (sc->getSCE(SC_ENDURE) || sc->getSCE(SC_RUN) || sc->getSCE(SC_WUGDASH) || sc->getSCE(SC_SPARKCANDY))) return 0; return (unsigned short)cap_value(dmotion,0,USHRT_MAX); @@ -8381,14 +8419,14 @@ static signed short status_calc_patk(struct block_list *bl, struct status_change if (!sc || !sc->count) return cap_value(patk, 0, SHRT_MAX); - if (sc->data[SC_POWERFUL_FAITH]) - patk += sc->data[SC_POWERFUL_FAITH]->val3; - if (sc->data[SC_COMPETENTIA]) - patk += sc->data[SC_COMPETENTIA]->val2; - if (sc->data[SC_ABYSS_SLAYER]) - patk += sc->data[SC_ABYSS_SLAYER]->val2; - if (sc->data[SC_PRON_MARCH]) - patk += sc->data[SC_PRON_MARCH]->val2; + if (sc->getSCE(SC_POWERFUL_FAITH)) + patk += sc->getSCE(SC_POWERFUL_FAITH)->val3; + if (sc->getSCE(SC_COMPETENTIA)) + patk += sc->getSCE(SC_COMPETENTIA)->val2; + if (sc->getSCE(SC_ABYSS_SLAYER)) + patk += sc->getSCE(SC_ABYSS_SLAYER)->val2; + if (sc->getSCE(SC_PRON_MARCH)) + patk += sc->getSCE(SC_PRON_MARCH)->val2; return (short)cap_value(patk, 0, SHRT_MAX); } @@ -8405,14 +8443,14 @@ static signed short status_calc_smatk(struct block_list *bl, struct status_chang if (!sc || !sc->count) return cap_value(smatk, 0, SHRT_MAX); - if (sc->data[SC_COMPETENTIA]) - smatk += sc->data[SC_COMPETENTIA]->val2; - if (sc->data[SC_ABYSS_SLAYER]) - smatk += sc->data[SC_ABYSS_SLAYER]->val2; - if (sc->data[SC_JAWAII_SERENADE]) - smatk += sc->data[SC_JAWAII_SERENADE]->val2; - if (sc->data[SC_SPELL_ENCHANTING]) - smatk += sc->data[SC_SPELL_ENCHANTING]->val2; + if (sc->getSCE(SC_COMPETENTIA)) + smatk += sc->getSCE(SC_COMPETENTIA)->val2; + if (sc->getSCE(SC_ABYSS_SLAYER)) + smatk += sc->getSCE(SC_ABYSS_SLAYER)->val2; + if (sc->getSCE(SC_JAWAII_SERENADE)) + smatk += sc->getSCE(SC_JAWAII_SERENADE)->val2; + if (sc->getSCE(SC_SPELL_ENCHANTING)) + smatk += sc->getSCE(SC_SPELL_ENCHANTING)->val2; return (short)cap_value(smatk, 0, SHRT_MAX); } @@ -8429,16 +8467,16 @@ static signed short status_calc_res(struct block_list *bl, struct status_change if (!sc || !sc->count) return cap_value(res, 0, SHRT_MAX); - if (sc->data[SC_FIRM_FAITH]) - res += sc->data[SC_FIRM_FAITH]->val3; - if (sc->data[SC_D_MACHINE]) - res += sc->data[SC_D_MACHINE]->val3; - if (sc->data[SC_MUSICAL_INTERLUDE]) - res += sc->data[SC_MUSICAL_INTERLUDE]->val2; - if (sc->data[SC_SHADOW_STRIP] && bl->type != BL_PC) - res -= res * sc->data[SC_SHADOW_STRIP]->val2 / 100; - if (sc->data[SC_AIN_RHAPSODY]) - res -= sc->data[SC_AIN_RHAPSODY]->val2; + if (sc->getSCE(SC_FIRM_FAITH)) + res += sc->getSCE(SC_FIRM_FAITH)->val3; + if (sc->getSCE(SC_D_MACHINE)) + res += sc->getSCE(SC_D_MACHINE)->val3; + if (sc->getSCE(SC_MUSICAL_INTERLUDE)) + res += sc->getSCE(SC_MUSICAL_INTERLUDE)->val2; + if (sc->getSCE(SC_SHADOW_STRIP) && bl->type != BL_PC) + res -= res * sc->getSCE(SC_SHADOW_STRIP)->val2 / 100; + if (sc->getSCE(SC_AIN_RHAPSODY)) + res -= sc->getSCE(SC_AIN_RHAPSODY)->val2; return (short)cap_value(res, 0, SHRT_MAX); } @@ -8455,10 +8493,10 @@ static signed short status_calc_mres(struct block_list *bl, struct status_change if (!sc || !sc->count) return cap_value(mres, 0, SHRT_MAX); - if (sc->data[SC_SHADOW_STRIP] && bl->type != BL_PC) - mres -= mres * sc->data[SC_SHADOW_STRIP]->val2 / 100; - if (sc->data[SC_GEF_NOCTURN]) - mres -= sc->data[SC_GEF_NOCTURN]->val2; + if (sc->getSCE(SC_SHADOW_STRIP) && bl->type != BL_PC) + mres -= mres * sc->getSCE(SC_SHADOW_STRIP)->val2 / 100; + if (sc->getSCE(SC_GEF_NOCTURN)) + mres -= sc->getSCE(SC_GEF_NOCTURN)->val2; return (short)cap_value(mres, 0, SHRT_MAX); } @@ -8490,8 +8528,8 @@ static signed short status_calc_crate(struct block_list *bl, struct status_chang if (!sc || !sc->count) return cap_value(crate, 0, SHRT_MAX); - if (sc->data[SC_PRE_ACIES]) - crate += sc->data[SC_PRE_ACIES]->val2; + if (sc->getSCE(SC_PRE_ACIES)) + crate += sc->getSCE(SC_PRE_ACIES)->val2; return (short)cap_value(crate, 0, SHRT_MAX); } @@ -8565,24 +8603,24 @@ static unsigned char status_calc_element(struct block_list *bl, struct status_ch if(!sc || !sc->count) return cap_value(element, 0, UCHAR_MAX); - if(sc->data[SC_FREEZE] || sc->data[SC_CRYSTAL_ARMOR_OPTION]) + if(sc->getSCE(SC_FREEZE) || sc->getSCE(SC_CRYSTAL_ARMOR_OPTION)) return ELE_WATER; - if(sc->data[SC_STONE] || sc->data[SC_STRONG_PROTECTION_OPTION]) + if(sc->getSCE(SC_STONE) || sc->getSCE(SC_STRONG_PROTECTION_OPTION)) return ELE_EARTH; - if(sc->data[SC_FLAMEARMOR_OPTION]) + if(sc->getSCE(SC_FLAMEARMOR_OPTION)) return ELE_FIRE; - if(sc->data[SC_EYES_OF_STORM_OPTION]) + if(sc->getSCE(SC_EYES_OF_STORM_OPTION)) return ELE_WIND; - if(sc->data[SC_POISON_SHIELD_OPTION]) + if(sc->getSCE(SC_POISON_SHIELD_OPTION)) return ELE_POISON; - if(sc->data[SC_BENEDICTIO]) + if(sc->getSCE(SC_BENEDICTIO)) return ELE_HOLY; - if(sc->data[SC_CHANGEUNDEAD]) + if(sc->getSCE(SC_CHANGEUNDEAD)) return ELE_UNDEAD; - if(sc->data[SC_ELEMENTALCHANGE]) - return sc->data[SC_ELEMENTALCHANGE]->val2; - if(sc->data[SC_SHAPESHIFT]) - return sc->data[SC_SHAPESHIFT]->val2; + if(sc->getSCE(SC_ELEMENTALCHANGE)) + return sc->getSCE(SC_ELEMENTALCHANGE)->val2; + if(sc->getSCE(SC_SHAPESHIFT)) + return sc->getSCE(SC_SHAPESHIFT)->val2; return (unsigned char)cap_value(element,0,UCHAR_MAX); } @@ -8599,22 +8637,22 @@ static unsigned char status_calc_element_lv(struct block_list *bl, struct status if(!sc || !sc->count) return cap_value(lv, 1, 4); - if(sc->data[SC_FREEZE]) + if(sc->getSCE(SC_FREEZE)) return 1; - if(sc->data[SC_STONE]) + if(sc->getSCE(SC_STONE)) return 1; - if(sc->data[SC_BENEDICTIO]) + if(sc->getSCE(SC_BENEDICTIO)) return 1; - if(sc->data[SC_CHANGEUNDEAD]) + if(sc->getSCE(SC_CHANGEUNDEAD)) return 1; - if(sc->data[SC_ELEMENTALCHANGE]) - return sc->data[SC_ELEMENTALCHANGE]->val1; - if(sc->data[SC_SHAPESHIFT]) + if(sc->getSCE(SC_ELEMENTALCHANGE)) + return sc->getSCE(SC_ELEMENTALCHANGE)->val1; + if(sc->getSCE(SC_SHAPESHIFT)) return 1; - if(sc->data[SC__INVISIBILITY]) + if(sc->getSCE(SC__INVISIBILITY)) return 1; - if (sc->data[SC_FLAMEARMOR_OPTION] || sc->data[SC_CRYSTAL_ARMOR_OPTION] || sc->data[SC_EYES_OF_STORM_OPTION] || - sc->data[SC_STRONG_PROTECTION_OPTION] || sc->data[SC_POISON_SHIELD_OPTION]) + if (sc->getSCE(SC_FLAMEARMOR_OPTION) || sc->getSCE(SC_CRYSTAL_ARMOR_OPTION) || sc->getSCE(SC_EYES_OF_STORM_OPTION) || + sc->getSCE(SC_STRONG_PROTECTION_OPTION) || sc->getSCE(SC_POISON_SHIELD_OPTION)) return 1; return (unsigned char)cap_value(lv,1,4); @@ -8631,29 +8669,29 @@ unsigned char status_calc_attack_element(struct block_list *bl, struct status_ch { if(!sc || !sc->count) return cap_value(element, 0, UCHAR_MAX); - if(sc->data[SC_ENCHANTARMS]) - return sc->data[SC_ENCHANTARMS]->val1; - if(sc->data[SC_WATERWEAPON] - || (sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 2) ) + if(sc->getSCE(SC_ENCHANTARMS)) + return sc->getSCE(SC_ENCHANTARMS)->val1; + if(sc->getSCE(SC_WATERWEAPON) + || (sc->getSCE(SC_WATER_INSIGNIA) && sc->getSCE(SC_WATER_INSIGNIA)->val1 == 2) ) return ELE_WATER; - if(sc->data[SC_EARTHWEAPON] - || (sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 2) ) + if(sc->getSCE(SC_EARTHWEAPON) + || (sc->getSCE(SC_EARTH_INSIGNIA) && sc->getSCE(SC_EARTH_INSIGNIA)->val1 == 2) ) return ELE_EARTH; - if(sc->data[SC_FIREWEAPON] - || (sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 2) ) + if(sc->getSCE(SC_FIREWEAPON) + || (sc->getSCE(SC_FIRE_INSIGNIA) && sc->getSCE(SC_FIRE_INSIGNIA)->val1 == 2) ) return ELE_FIRE; - if(sc->data[SC_WINDWEAPON] - || (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 2) ) + if(sc->getSCE(SC_WINDWEAPON) + || (sc->getSCE(SC_WIND_INSIGNIA) && sc->getSCE(SC_WIND_INSIGNIA)->val1 == 2) ) return ELE_WIND; - if(sc->data[SC_ENCPOISON]) + if(sc->getSCE(SC_ENCPOISON)) return ELE_POISON; - if(sc->data[SC_ASPERSIO]) + if(sc->getSCE(SC_ASPERSIO)) return ELE_HOLY; - if(sc->data[SC_SHADOWWEAPON]) + if(sc->getSCE(SC_SHADOWWEAPON)) return ELE_DARK; - if(sc->data[SC_GHOSTWEAPON] || sc->data[SC__INVISIBILITY]) + if(sc->getSCE(SC_GHOSTWEAPON) || sc->getSCE(SC__INVISIBILITY)) return ELE_GHOST; - if(sc->data[SC_TIDAL_WEAPON_OPTION] || sc->data[SC_TIDAL_WEAPON] ) + if(sc->getSCE(SC_TIDAL_WEAPON_OPTION) || sc->getSCE(SC_TIDAL_WEAPON) ) return ELE_WATER; return (unsigned char)cap_value(element,0,UCHAR_MAX); } @@ -8669,13 +8707,13 @@ static int status_calc_mode(struct block_list *bl, struct status_change *sc, int { if(!sc || !sc->count) return cap_value(mode, MD_NONE,INT_MAX); - if(sc->data[SC_MODECHANGE]) { - if (sc->data[SC_MODECHANGE]->val2) - mode = (mode&~MD_MASK)|sc->data[SC_MODECHANGE]->val2; // Set mode - if (sc->data[SC_MODECHANGE]->val3) - mode = mode|sc->data[SC_MODECHANGE]->val3; // Add mode - if (sc->data[SC_MODECHANGE]->val4) - mode = mode&~sc->data[SC_MODECHANGE]->val4; // Del mode + if(sc->getSCE(SC_MODECHANGE)) { + if (sc->getSCE(SC_MODECHANGE)->val2) + mode = (mode&~MD_MASK)|sc->getSCE(SC_MODECHANGE)->val2; // Set mode + if (sc->getSCE(SC_MODECHANGE)->val3) + mode = mode|sc->getSCE(SC_MODECHANGE)->val3; // Add mode + if (sc->getSCE(SC_MODECHANGE)->val4) + mode = mode&~sc->getSCE(SC_MODECHANGE)->val4; // Del mode } return cap_value(mode, MD_NONE, INT_MAX); } @@ -9037,10 +9075,10 @@ int status_isimmune(struct block_list *bl) struct status_change *sc =status_get_sc(bl); if (sc) { - if (sc->data[SC_HERMODE]) + if (sc->getSCE(SC_HERMODE)) return 100; - if (sc->data[SC_DEADLY_DEFEASANCE]) + if (sc->getSCE(SC_DEADLY_DEFEASANCE)) return 0; } @@ -9596,22 +9634,22 @@ t_tick status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_ } if (sc) { - if (sc->data[SC_SCRESIST]) - sc_def += sc->data[SC_SCRESIST]->val1*100; // Status resist + if (sc->getSCE(SC_SCRESIST)) + sc_def += sc->getSCE(SC_SCRESIST)->val1*100; // Status resist #ifdef RENEWAL - else if (sc->data[SC_SIEGFRIED] && (type == SC_BLIND || type == SC_STONE || type == SC_FREEZE || type == SC_STUN || type == SC_CURSE || type == SC_SLEEP || type == SC_SILENCE)) - sc_def += sc->data[SC_SIEGFRIED]->val3 * 100; // Status resistance. + else if (sc->getSCE(SC_SIEGFRIED) && (type == SC_BLIND || type == SC_STONE || type == SC_FREEZE || type == SC_STUN || type == SC_CURSE || type == SC_SLEEP || type == SC_SILENCE)) + sc_def += sc->getSCE(SC_SIEGFRIED)->val3 * 100; // Status resistance. #else - else if (sc->data[SC_SIEGFRIED]) - sc_def += sc->data[SC_SIEGFRIED]->val3*100; // Status resistance. + else if (sc->getSCE(SC_SIEGFRIED)) + sc_def += sc->getSCE(SC_SIEGFRIED)->val3*100; // Status resistance. #endif - else if (sc->data[SC_LEECHESEND] && sc->data[SC_LEECHESEND]->val3 == 0) { + else if (sc->getSCE(SC_LEECHESEND) && sc->getSCE(SC_LEECHESEND)->val3 == 0) { switch (type) { case SC_BLIND: case SC_STUN: return 0; // Immune } - } else if (sc->data[SC_OBLIVIONCURSE] && sc->data[SC_OBLIVIONCURSE]->val3 == 0) { + } else if (sc->getSCE(SC_OBLIVIONCURSE) && sc->getSCE(SC_OBLIVIONCURSE)->val3 == 0) { switch (type) { case SC_SILENCE: case SC_CURSE: @@ -9635,8 +9673,8 @@ t_tick status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_ if (it.id == type) rate -= rate * it.val / 10000; } - if (sd->sc.data[SC_COMMONSC_RESIST] && SC_COMMON_MIN <= type && type <= SC_COMMON_MAX) - rate -= rate*sd->sc.data[SC_COMMONSC_RESIST]->val1/100; + if (sd->sc.getSCE(SC_COMMONSC_RESIST) && SC_COMMON_MIN <= type && type <= SC_COMMON_MAX) + rate -= rate*sd->sc.getSCE(SC_COMMONSC_RESIST)->val1/100; } // Aegis accuracy @@ -9664,8 +9702,8 @@ t_tick status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_ if (it.id == type) tick -= tick * it.val / 10000; } - if (sd->sc.data[SC_COMMONSC_RESIST] && SC_COMMON_MIN <= type && type <= SC_COMMON_MAX) - tick -= tick * sd->sc.data[SC_COMMONSC_RESIST]->val1 / 100; + if (sd->sc.getSCE(SC_COMMONSC_RESIST) && SC_COMMON_MIN <= type && type <= SC_COMMON_MAX) + tick -= tick * sd->sc.getSCE(SC_COMMONSC_RESIST)->val1 / 100; } #endif @@ -9848,7 +9886,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty if (status_change_isDisabledOnMap(type, map_getmapdata(bl->m))) return 0; - if (sc->data[SC_GRAVITYCONTROL]) + if (sc->getSCE(SC_GRAVITYCONTROL)) return 0; // !TODO: Confirm what statuses/conditions (if not all) are blocked. // Uncomment to prevent status adding hp to gvg mob (like bloodylust=hp*3 etc... @@ -9875,7 +9913,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty for (const auto &it : scdb->endreturn) { sc_type rem_sc = it; - if (sc->data[rem_sc]) { + if (sc->getSCE(rem_sc)) { status_change_end(bl, rem_sc); isRemoved = true; } @@ -9889,7 +9927,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty if (!scdb->fail.empty()) { for (const auto &it : scdb->fail) { // Don't let OPT1 that have RemoveOnDamaged start a new effect in the same attack. - if (sc->data[it] || sc->lastEffect == it) + if (sc->getSCE(it) || sc->lastEffect == it) return 0; } } @@ -9910,7 +9948,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty // Check for immunities / sc fails switch (type) { case SC_VACUUM_EXTREME: - if (sc && sc->data[SC_VACUUM_EXTREME_POSTDELAY] && sc->data[SC_VACUUM_EXTREME_POSTDELAY]->val2 == val2) // Ignore post delay from other vacuum (this will make stack effect enabled) + if (sc && sc->getSCE(SC_VACUUM_EXTREME_POSTDELAY) && sc->getSCE(SC_VACUUM_EXTREME_POSTDELAY)->val2 == val2) // Ignore post delay from other vacuum (this will make stack effect enabled) return 0; break; case SC_STONE: @@ -9959,16 +9997,16 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty int32 mode; struct status_data *bstatus = status_get_base_status(bl); if (!bstatus) return 0; - if (sc->data[type]) { // Pile up with previous values. - if (!val2) val2 = sc->data[type]->val2; - val3 |= sc->data[type]->val3; - val4 |= sc->data[type]->val4; + if (sc->getSCE(type)) { // Pile up with previous values. + if (!val2) val2 = sc->getSCE(type)->val2; + val3 |= sc->getSCE(type)->val3; + val4 |= sc->getSCE(type)->val4; } mode = val2 ? ((val2&~MD_MASK) | val2) : bstatus->mode; // Base mode if (val4) mode = static_cast(mode&~val4); // Del mode if (val3) mode = static_cast(mode | val3); // Add mode if (mode == bstatus->mode) { // No change. - if (sc->data[type]) // Abort previous status + if (sc->getSCE(type)) // Abort previous status return status_change_end(bl, type); return 0; } @@ -10067,51 +10105,51 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty return 0; // Stats only for Mercenaries break; case SC_STRFOOD: - if (sc->data[SC_FOOD_STR_CASH] && sc->data[SC_FOOD_STR_CASH]->val1 > val1) + if (sc->getSCE(SC_FOOD_STR_CASH) && sc->getSCE(SC_FOOD_STR_CASH)->val1 > val1) return 0; break; case SC_AGIFOOD: - if (sc->data[SC_FOOD_AGI_CASH] && sc->data[SC_FOOD_AGI_CASH]->val1 > val1) + if (sc->getSCE(SC_FOOD_AGI_CASH) && sc->getSCE(SC_FOOD_AGI_CASH)->val1 > val1) return 0; break; case SC_VITFOOD: - if (sc->data[SC_FOOD_VIT_CASH] && sc->data[SC_FOOD_VIT_CASH]->val1 > val1) + if (sc->getSCE(SC_FOOD_VIT_CASH) && sc->getSCE(SC_FOOD_VIT_CASH)->val1 > val1) return 0; break; case SC_INTFOOD: - if (sc->data[SC_FOOD_INT_CASH] && sc->data[SC_FOOD_INT_CASH]->val1 > val1) + if (sc->getSCE(SC_FOOD_INT_CASH) && sc->getSCE(SC_FOOD_INT_CASH)->val1 > val1) return 0; break; case SC_DEXFOOD: - if (sc->data[SC_FOOD_DEX_CASH] && sc->data[SC_FOOD_DEX_CASH]->val1 > val1) + if (sc->getSCE(SC_FOOD_DEX_CASH) && sc->getSCE(SC_FOOD_DEX_CASH)->val1 > val1) return 0; break; case SC_LUKFOOD: - if (sc->data[SC_FOOD_LUK_CASH] && sc->data[SC_FOOD_LUK_CASH]->val1 > val1) + if (sc->getSCE(SC_FOOD_LUK_CASH) && sc->getSCE(SC_FOOD_LUK_CASH)->val1 > val1) return 0; break; case SC_FOOD_STR_CASH: - if (sc->data[SC_STRFOOD] && sc->data[SC_STRFOOD]->val1 > val1) + if (sc->getSCE(SC_STRFOOD) && sc->getSCE(SC_STRFOOD)->val1 > val1) return 0; break; case SC_FOOD_AGI_CASH: - if (sc->data[SC_AGIFOOD] && sc->data[SC_AGIFOOD]->val1 > val1) + if (sc->getSCE(SC_AGIFOOD) && sc->getSCE(SC_AGIFOOD)->val1 > val1) return 0; break; case SC_FOOD_VIT_CASH: - if (sc->data[SC_VITFOOD] && sc->data[SC_VITFOOD]->val1 > val1) + if (sc->getSCE(SC_VITFOOD) && sc->getSCE(SC_VITFOOD)->val1 > val1) return 0; break; case SC_FOOD_INT_CASH: - if (sc->data[SC_INTFOOD] && sc->data[SC_INTFOOD]->val1 > val1) + if (sc->getSCE(SC_INTFOOD) && sc->getSCE(SC_INTFOOD)->val1 > val1) return 0; break; case SC_FOOD_DEX_CASH: - if (sc->data[SC_DEXFOOD] && sc->data[SC_DEXFOOD]->val1 > val1) + if (sc->getSCE(SC_DEXFOOD) && sc->getSCE(SC_DEXFOOD)->val1 > val1) return 0; break; case SC_FOOD_LUK_CASH: - if (sc->data[SC_LUKFOOD] && sc->data[SC_LUKFOOD]->val1 > val1) + if (sc->getSCE(SC_LUKFOOD) && sc->getSCE(SC_LUKFOOD)->val1 > val1) return 0; break; case SC_CAMOUFLAGE: @@ -10142,12 +10180,12 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty else { struct status_change *tsc = status_get_sc(bl); // Failed if the target is already marked and the new marker that isn't same marker - if (tsc && tsc->data[type] && tsc->data[type]->val2 != src->id) + if (tsc && tsc->getSCE(type) && tsc->getSCE(type)->val2 != src->id) return 0; } break; case SC_MADNESSCANCEL: - if (sc->data[type]) { // Toggle the status but still consume requirements. + if (sc->getSCE(type)) { // Toggle the status but still consume requirements. status_change_end(bl, type); return 0; } @@ -10163,9 +10201,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty if (val3 == 0) // Don't display icon on self flag |= SCSTART_NOICON; for (int32 i = SC_TOXIN; i <= SC_LEECHESEND; i++) { - if (sc->data[i] && sc->data[i]->val3 == 1) // It doesn't stack or even renew on the target + if (sc->getSCE(i) && sc->getSCE(i)->val3 == 1) // It doesn't stack or even renew on the target return 0; - else if (sc->data[i] && sc->data[i]->val3 == 0) + else if (sc->getSCE(i) && sc->getSCE(i)->val3 == 0) status_change_end(bl, static_cast(i)); // End the bonus part on the caster } break; @@ -10257,7 +10295,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty for (const auto &status_it : status_db) { sc_type opt1_type = status_it.second->type; - if (sc->data[opt1_type] && status_it.second->opt1 > OPT1_NONE) + if (sc->getSCE(opt1_type) && status_it.second->opt1 > OPT1_NONE) status_change_end(bl, opt1_type); } } @@ -10275,11 +10313,11 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty for (const auto &it : endlist) { sc_type rem_sc = it; - if (sc->data[rem_sc]) { + if (sc->getSCE(rem_sc)) { switch (rem_sc) { case SC_BERSERK: case SC_SATURDAYNIGHTFEVER: - sc->data[rem_sc]->val2 = 0; // Mark to not lose hp + sc->getSCE(rem_sc)->val2 = 0; // Mark to not lose hp default: status_change_end(bl, rem_sc); break; @@ -10293,31 +10331,31 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_BLESSING: if (bl->type == BL_PC) { // Remove Curse first, Stone is only removed if the target is not cursed - if (sc->data[SC_CURSE]) { + if (sc->getSCE(SC_CURSE)) { status_change_end(bl, SC_CURSE); return 1; // End Curse and do not give stat boost - } else if (sc->data[SC_STONE]) { + } else if (sc->getSCE(SC_STONE)) { status_change_end(bl, SC_STONE); return 1; // End Stone and do not give stat boost } } - if(sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_HIGH) + if(sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_HIGH) status_change_end(bl, SC_SPIRIT); break; case SC_INCREASEAGI: - if(sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_HIGH) + if(sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_HIGH) status_change_end(bl, SC_SPIRIT); break; case SC_DELUGE: - if (sc->data[SC_FOGWALL] && sc->data[SC_BLIND]) + if (sc->getSCE(SC_FOGWALL) && sc->getSCE(SC_BLIND)) status_change_end(bl, SC_BLIND); break; case SC_SILENCE: - if (sc->data[SC_GOSPEL] && sc->data[SC_GOSPEL]->val4 == BCT_SELF) + if (sc->getSCE(SC_GOSPEL) && sc->getSCE(SC_GOSPEL)->val4 == BCT_SELF) status_change_end(bl, SC_GOSPEL); break; case SC_IMPOSITIO: - if (sc->data[SC_IMPOSITIO] && sc->data[SC_IMPOSITIO]->val1 > val1) //Replace higher level effect for lower. + if (sc->getSCE(SC_IMPOSITIO) && sc->getSCE(SC_IMPOSITIO)->val1 > val1) //Replace higher level effect for lower. status_change_end(bl,SC_IMPOSITIO); break; case SC_ENDURE: @@ -10334,7 +10372,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty } // Check for overlapping fails - if( (sce = sc->data[type]) ) { + if( (sce = sc->getSCE(type)) ) { switch( type ) { case SC_MERC_FLEEUP: case SC_MERC_ATKUP: @@ -10371,7 +10409,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty val4 = sce->val4; break; case SC_LERADSDEW: - if (sc && sc->data[SC_BERSERK]) + if (sc && sc->getSCE(SC_BERSERK)) return 0; case SC_SHAPESHIFT: case SC_PROPERTYWALK: @@ -10384,7 +10422,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty return 0; break; case SC_JOINTBEAT: - if (sc && sc->data[type]->val2 & BREAK_NECK) + if (sc && sc->getSCE(type)->val2 & BREAK_NECK) return 0; // BREAK_NECK cannot be stacked with new breaks until the status is over. val2 |= sce->val2; // Stackable ailments default: @@ -10435,7 +10473,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty if (type == SC_ADORAMUS) { // 1000% base chance to blind, but still can be resisted sc_start(src, bl, SC_BLIND, 1000, val1, skill_get_time(scdb->skill_id, val1)); - if (sc->data[SC_ADORAMUS]) + if (sc->getSCE(SC_ADORAMUS)) return 0; //Adoramus can't refresh itself, but it can cause blind again } val2 = 2 + val1; // Agi change @@ -10459,7 +10497,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty break; case SC_AUTOBERSERK: if (status->hp < status->max_hp>>2 && - (!sc->data[SC_PROVOKE] || sc->data[SC_PROVOKE]->val4==0)) + (!sc->getSCE(SC_PROVOKE) || sc->getSCE(SC_PROVOKE)->val4==0)) sc_start4(src,bl,SC_PROVOKE,100,10,0,0,1,60000); tick = INFINITE_TICK; break; @@ -10839,7 +10877,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_CHASEWALK: val2 = tick>0?tick:10000; // Interval at which SP is drained. val3 = 35 - 5 * val1; // Speed adjustment. - if (sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_ROGUE) + if (sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_ROGUE) val3 -= 40; val4 = 10+val1*2; // SP cost. if (map_flag_gvg2(bl->m) || map_getmapflag(bl->m, MF_BATTLEGROUND)) val4 *= 5; @@ -10970,7 +11008,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty // Fetch caster information struct block_list *pbl = map_id2bl(val1); struct status_change *psc = pbl?status_get_sc(pbl):NULL; - struct status_change_entry *psce = psc?psc->data[SC_MARIONETTE]:NULL; + struct status_change_entry *psce = psc?psc->getSCE(SC_MARIONETTE):NULL; // Fetch target's stats struct status_data* status2 = status_get_status_data(bl); // Battle status @@ -11042,8 +11080,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty int i = (map_flag_gvg2(bl->m) || map_getmapflag(bl->m, MF_BATTLEGROUND))?2:3; while( i >= 0 ) { enum sc_type type2 = types[i]; - if( d_sc->data[type2] ) - status_change_start(d_bl, bl, type2, 10000, d_sc->data[type2]->val1, 0, 0, (type2 == SC_REFLECTSHIELD ? 1 : 0), skill_get_time(status_db.getSkill(type2),d_sc->data[type2]->val1), (type2 == SC_DEFENDER) ? SCSTART_NOAVOID : SCSTART_NOAVOID|SCSTART_NOICON); + if( d_sc->getSCE(type2) ) + status_change_start(d_bl, bl, type2, 10000, d_sc->getSCE(type2)->val1, 0, 0, (type2 == SC_REFLECTSHIELD ? 1 : 0), skill_get_time(status_db.getSkill(type2),d_sc->getSCE(type2)->val1), (type2 == SC_DEFENDER) ? SCSTART_NOAVOID : SCSTART_NOAVOID|SCSTART_NOICON); i--; } } @@ -11058,7 +11096,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty { struct block_list *src2 = val2?map_id2bl(val2):NULL; struct status_change *sc2 = src2?status_get_sc(src2):NULL; - struct status_change_entry *sce2 = sc2?sc2->data[SC_CLOSECONFINE]:NULL; + struct status_change_entry *sce2 = sc2?sc2->getSCE(SC_CLOSECONFINE):NULL; if (src2 && sc2) { if (!sce2) { // Start lock on caster. @@ -11984,7 +12022,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty break; case SC_PAIN_KILLER: // Yommy leak need confirm val2 = min((( 200 * val1 ) * status_get_lv(src)) / 150, 1000); // dmg reduction linear. upto a maximum of 1000 [iRO Wiki] - if(sc->data[SC_PARALYSIS]) + if(sc->getSCE(SC_PARALYSIS)) sc_start(src,bl, SC_ENDURE, 100, val1, tick); // Start endure for same duration break; case SC_STYLE_CHANGE: @@ -12653,7 +12691,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_FREEZE: case SC_STUN: case SC_STONE: - if (sc->data[SC_DANCING]) { + if (sc->getSCE(SC_DANCING)) { unit_stop_walking(bl, 1); status_change_end(bl, SC_DANCING); } @@ -12736,13 +12774,13 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty tick = tick_time; // Don't trust the previous sce assignment, in case the SC ended somewhere between there and here. - if((sce=sc->data[type])) { // reuse old sc + if((sce=sc->getSCE(type))) { // reuse old sc if( sce->timer != INVALID_TIMER ) delete_timer(sce->timer, status_change_timer); sc_isnew = false; } else { // New sc ++(sc->count); - sce = sc->data[type] = ers_alloc(sc_data_ers, struct status_change_entry); + sce = sc->createSCE(type); } sce->val1 = val1; sce->val2 = val2; @@ -12900,13 +12938,13 @@ int status_change_clear(struct block_list* bl, int type) for (const auto &it : status_db) { sc_type status = static_cast(it.first); - if (!sc->data[status]) + if (!sc->getSCE(status)) continue; if (type == 0) { // Type 0: PC killed if (it.second->flag[SCF_NOREMOVEONDEAD]) { switch (status) { case SC_ELEMENTALCHANGE: // Only when its Holy or Dark that it doesn't dispell on death - if (sc->data[status]->val2 != ELE_HOLY && sc->data[status]->val2 != ELE_DARK) + if (sc->getSCE(status)->val2 != ELE_HOLY && sc->getSCE(status)->val2 != ELE_DARK) break; default: continue; @@ -12918,12 +12956,11 @@ int status_change_clear(struct block_list* bl, int type) continue; status_change_end(bl, status); - if( type == 1 && sc->data[status] ) { // If for some reason status_change_end decides to still keep the status when quitting. [Skotlex] + if( type == 1 && sc->getSCE(status) ) { // If for some reason status_change_end decides to still keep the status when quitting. [Skotlex] (sc->count)--; - if (sc->data[status]->timer != INVALID_TIMER) - delete_timer(sc->data[status]->timer, status_change_timer); - ers_free(sc_data_ers, sc->data[status]); - sc->data[status] = NULL; + if (sc->getSCE(status)->timer != INVALID_TIMER) + delete_timer(sc->getSCE(status)->timer, status_change_timer); + sc->deleteSCE(status); } } @@ -12960,7 +12997,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid) sc = status_get_sc(bl); status = status_get_status_data(bl); - if(!sc || !(sce = sc->data[type]) || !scdb) + if(!sc || !(sce = sc->getSCE(type)) || !scdb) return 0; sd = BL_CAST(BL_PC,bl); @@ -13016,7 +13053,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid) if (scdb->state.any()) status_calc_state(bl,sc,scdb->state,false); - sc->data[type] = NULL; + sc->clearSCE(type); if (scdb->flag[SCF_DISPLAYPC] || scdb->flag[SCF_DISPLAYNPC]) status_display_remove(bl,type); @@ -13064,7 +13101,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid) } break; case SC_AUTOBERSERK: - if (sc->data[SC_PROVOKE] && sc->data[SC_PROVOKE]->val4 == 1) + if (sc->getSCE(SC_PROVOKE) && sc->getSCE(SC_PROVOKE)->val4 == 1) status_change_end(bl, SC_PROVOKE); break; @@ -13077,13 +13114,13 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid) if( bl->type == BL_PC ) { // Clear Status from others int i; for( i = 0; i < MAX_DEVOTION; i++ ) { - if( sd->devotion[i] && (tsd = map_id2sd(sd->devotion[i])) && tsd->sc.data[type] ) + if( sd->devotion[i] && (tsd = map_id2sd(sd->devotion[i])) && tsd->sc.getSCE(type) ) status_change_end(&tsd->bl, type); } } else if( bl->type == BL_MER && ((TBL_MER*)bl)->devotion_flag ) { // Clear Status from Master tsd = ((TBL_MER*)bl)->master; - if( tsd && tsd->sc.data[type] ) + if( tsd && tsd->sc.getSCE(type) ) status_change_end(&tsd->bl, type); } } @@ -13127,8 +13164,8 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid) struct block_list *tbl = map_id2bl(tid2); struct status_change *tsc = status_get_sc(tbl); sce->val4 = 0; - if(tbl && tsc && tsc->data[SC_BLADESTOP]) { - tsc->data[SC_BLADESTOP]->val4 = 0; + if(tbl && tsc && tsc->getSCE(SC_BLADESTOP)) { + tsc->getSCE(SC_BLADESTOP)->val4 = 0; status_change_end(tbl, SC_BLADESTOP); } clif_bladestop(bl, tid2, 0); @@ -13139,7 +13176,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid) map_session_data *dsd; if(sce->val4 && sce->val4 != BCT_SELF && (dsd=map_id2sd(sce->val4))) { // End status on partner as well - status_change_entry *dsc = dsd->sc.data[SC_DANCING]; + status_change_entry *dsc = dsd->sc.getSCE(SC_DANCING); if(dsc) { // This will prevent recursive loops. @@ -13181,10 +13218,10 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid) case SC_CLOSECONFINE2:{ struct block_list *src = sce->val2?map_id2bl(sce->val2):NULL; struct status_change *sc2 = src?status_get_sc(src):NULL; - if (src && sc2 && sc2->data[SC_CLOSECONFINE]) { + if (src && sc2 && sc2->getSCE(SC_CLOSECONFINE)) { // If status was already ended, do nothing. // Decrease count - if (--(sc2->data[SC_CLOSECONFINE]->val1) <= 0) // No more holds, free him up. + if (--(sc2->getSCE(SC_CLOSECONFINE)->val1) <= 0) // No more holds, free him up. status_change_end(src, SC_CLOSECONFINE); } } @@ -13208,25 +13245,25 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid) struct block_list *pbl = map_id2bl(sce->val1); struct status_change* sc2 = pbl?status_get_sc(pbl):NULL; - if (sc2 && sc2->data[type2]) { - sc2->data[type2]->val1 = 0; + if (sc2 && sc2->getSCE(type2)) { + sc2->getSCE(type2)->val1 = 0; status_change_end(pbl, type2); } } break; case SC_CONCENTRATION: - if (sc->data[SC_ENDURE] && !sc->data[SC_ENDURE]->val4) + if (sc->getSCE(SC_ENDURE) && !sc->getSCE(SC_ENDURE)->val4) status_change_end(bl, SC_ENDURE); break; case SC_BERSERK: - if(status->hp > 200 && sc && sc->data[SC__BLOODYLUST]) { + if(status->hp > 200 && sc && sc->getSCE(SC__BLOODYLUST)) { status_percent_heal(bl, 100, 0); status_change_end(bl, SC__BLOODYLUST); } else if (status->hp > 100 && sce->val2) // If val2 is removed, no HP penalty (dispelled?) [Skotlex] status_set_hp(bl, 100, 0); - if(sc->data[SC_ENDURE] && sc->data[SC_ENDURE]->val4) { - sc->data[SC_ENDURE]->val4 = 0; + if(sc->getSCE(SC_ENDURE) && sc->getSCE(SC_ENDURE)->val4) { + sc->getSCE(SC_ENDURE)->val4 = 0; status_change_end(bl, SC_ENDURE); } sc_start4(bl, bl, SC_REGENERATION, 100, 10,0,0,(RGN_HP|RGN_SP), skill_get_time(LK_BERSERK, sce->val1)); @@ -13298,12 +13335,12 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid) if( sce->val2 ) { struct block_list* tbl = map_id2bl(sce->val2); sce->val2 = 0; - if( tbl && (sc = status_get_sc(tbl)) && sc->data[SC_STOP] && sc->data[SC_STOP]->val2 == bl->id ) + if( tbl && (sc = status_get_sc(tbl)) && sc->getSCE(SC_STOP) && sc->getSCE(SC_STOP)->val2 == bl->id ) status_change_end(tbl, SC_STOP); } break; case SC_TENSIONRELAX: - if (sc && (sc->data[SC_WEIGHT50] || sc->data[SC_WEIGHT90])) + if (sc && (sc->getSCE(SC_WEIGHT50) || sc->getSCE(SC_WEIGHT90))) status_get_regen_data(bl)->state.overweight = 1; // Add the overweight flag back break; case SC_MONSTER_TRANSFORM: @@ -13377,7 +13414,7 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid) struct block_list *src = map_id2bl(sce->val2); struct status_change *sc2 = status_get_sc(src); - if( sc2 && sc2->data[SC_CURSEDCIRCLE_ATKER] && --(sc2->data[SC_CURSEDCIRCLE_ATKER]->val2) == 0 ) { + if( sc2 && sc2->getSCE(SC_CURSEDCIRCLE_ATKER) && --(sc2->getSCE(SC_CURSEDCIRCLE_ATKER)->val2) == 0 ) { clif_bladestop(bl, sce->val2, 0); status_change_end(src, SC_CURSEDCIRCLE_ATKER); } @@ -13638,7 +13675,7 @@ TIMER_FUNC(status_change_timer){ return 0; } - struct status_change_entry * const sce = sc->data[type]; + struct status_change_entry * const sce = sc->getSCE(type); if(!sce) { ShowDebug("status_change_timer: Null pointer id: %d data: %" PRIdPTR " bl-type: %d\n", id, data, bl->type); return 0; @@ -13666,9 +13703,9 @@ TIMER_FUNC(status_change_timer){ if(!status_charge(bl, 0, sce->val4)) break; // Not enough SP to continue. - if (!sc->data[SC_CHASEWALK2]) { + if (!sc->getSCE(SC_CHASEWALK2)) { sc_start(bl,bl, SC_CHASEWALK2,100,1<<(sce->val1-1), - (t_tick)(sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_ROGUE?10:1) // SL bonus -> x10 duration + (t_tick)(sc->getSCE(SC_SPIRIT) && sc->getSCE(SC_SPIRIT)->val2 == SL_ROGUE?10:1) // SL bonus -> x10 duration *skill_get_time2(status_db.getSkill(type),sce->val1)); } sc_timer_next(sce->val2+tick); @@ -13720,7 +13757,7 @@ TIMER_FUNC(status_change_timer){ case SC_POISON: case SC_DPOISON: - if (sce->val4 >= 0 && !sc->data[SC_SLOWPOISON]) { + if (sce->val4 >= 0 && !sc->getSCE(SC_SLOWPOISON)) { unsigned int damage = 0; if (sd) damage = (type == SC_DPOISON) ? 2 + status->max_hp / 50 : 2 + status->max_hp * 3 / 200; @@ -13776,7 +13813,7 @@ TIMER_FUNC(status_change_timer){ if (damage > 0) { // 3% Damage each 4 seconds map_freeblock_lock(); status_zap(bl, damage, 0); - flag = !sc->data[type]; // Killed? Should not + flag = !sc->getSCE(type); // Killed? Should not map_freeblock_unlock(); } @@ -13861,7 +13898,7 @@ TIMER_FUNC(status_change_timer){ if( --(sce->val4) >= 0 ) { // val1 < 0 = per max% | val1 > 0 = exact amount int hp = 0; - if( status->hp < status->max_hp && !sc->data[SC_BERSERK] ) + if( status->hp < status->max_hp && !sc->getSCE(SC_BERSERK) ) hp = (sce->val1 < 0) ? (int)(status->max_hp * -1 * sce->val1 / 100.) : sce->val1; status_heal(bl, hp, 0, 2); sc_timer_next((sce->val2 * 1000) + tick); @@ -13873,7 +13910,7 @@ TIMER_FUNC(status_change_timer){ if( --(sce->val4) >= 0 ) { // val1 < 0 = per max% | val1 > 0 = exact amount int sp = 0; - if( status->sp < status->max_sp && !sc->data[SC_BERSERK] ) + if( status->sp < status->max_sp && !sc->getSCE(SC_BERSERK) ) sp = (sce->val1 < 0) ? (int)(status->max_sp * -1 * sce->val1 / 100.) : sce->val1; status_heal(bl, 0, sp, 2); sc_timer_next((sce->val2 * 1000) + tick); @@ -13948,7 +13985,7 @@ TIMER_FUNC(status_change_timer){ } if( s != 0 && sce->val3 % s == 0 ) { #ifndef RENEWAL - if (sc->data[SC_LONGING]) + if (sc->getSCE(SC_LONGING)) sp*= 3; #endif if (!status_charge(bl, 0, sp)) @@ -14022,7 +14059,7 @@ TIMER_FUNC(status_change_timer){ break; case SC_BLIND: - if(sc->data[SC_FOGWALL]) { // Blind lasts forever while you are standing on the fog. + if(sc->getSCE(SC_FOGWALL)) { // Blind lasts forever while you are standing on the fog. sc_timer_next(5000+tick); return 0; } @@ -14060,7 +14097,7 @@ TIMER_FUNC(status_change_timer){ case SC_RENOVATIO: if( --(sce->val4) >= 0 ) { int heal = status->max_hp * (sce->val1 + 4) / 100; - if( sc && sc->data[SC_AKAITSUKI] && heal ) + if( sc && sc->getSCE(SC_AKAITSUKI) && heal ) heal = ~heal + 1; status_heal(bl, heal, 0, 3); sc_timer_next(5000 + tick); @@ -14141,11 +14178,11 @@ TIMER_FUNC(status_change_timer){ int hp = 0; struct status_change *ssc = status_get_sc(map_id2bl(sce->val2)); - if (ssc && ssc->data[SC_HEATER_OPTION]) + if (ssc && ssc->getSCE(SC_HEATER_OPTION)) hp = status->max_hp * 3 * sce->val1 / 100; else hp = status->max_hp * sce->val1 / 100; - if (sc && sc->data[SC_AKAITSUKI] && hp) + if (sc && sc->getSCE(SC_AKAITSUKI) && hp) hp = ~hp + 1; if (status->hp != status->max_hp) status_heal(bl, hp, 0, 0); @@ -14257,7 +14294,7 @@ TIMER_FUNC(status_change_timer){ map_freeblock_lock(); if (!status_charge(bl, 0, 50)) status_zap(bl, 0, status->sp); - if (sc->data[type]) + if (sc->getSCE(type)) sc_timer_next(1000 + tick); map_freeblock_unlock(); return 0; @@ -14341,7 +14378,7 @@ TIMER_FUNC(status_change_timer){ map_freeblock_lock(); clif_damage(bl, bl, tick, 0, 0, damage, 1, DMG_MULTI_HIT_ENDURE, 0, false); status_damage(src, bl, damage,0, 0, 1, 0); - if( sc->data[type] ) { + if( sc->getSCE(type) ) { sc_timer_next(2000 + tick); } map_freeblock_unlock(); @@ -14596,7 +14633,7 @@ TIMER_FUNC(status_change_timer){ damage = status->hp - 1; map_freeblock_lock(); status_zap(bl,damage,0); - if( sc->data[type] ) { + if( sc->getSCE(type) ) { sc_timer_next(1000 + tick); } map_freeblock_unlock(); @@ -14650,7 +14687,7 @@ TIMER_FUNC(status_change_timer){ } // If status has an interval and there is at least 100ms remaining time, wait for next interval - if(interval > 0 && sc->data[type] && sce->val4 >= 100) { + if(interval > 0 && sc->getSCE(type) && sce->val4 >= 100) { sc_timer_next(min(sce->val4,interval)+tick); sce->val4 -= interval; if (dounlock) @@ -14692,13 +14729,13 @@ int status_change_timer_sub(struct block_list* bl, va_list ap) status_change_end(bl, SC_CLOAKINGEXCEED); status_change_end(bl, SC_CAMOUFLAGE); status_change_end(bl, SC_NEWMOON); - if (tsc && tsc->data[SC__SHADOWFORM] && (sce && sce->val4 > 0 && sce->val4%2000 == 0) && // For every 2 seconds do the checking - rnd()%100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10) // [100 - (Skill Level x 10)] % + if (tsc && tsc->getSCE(SC__SHADOWFORM) && (sce && sce->val4 > 0 && sce->val4%2000 == 0) && // For every 2 seconds do the checking + rnd()%100 < 100 - tsc->getSCE(SC__SHADOWFORM)->val1 * 10) // [100 - (Skill Level x 10)] % status_change_end(bl, SC__SHADOWFORM); break; case SC_RUWACH: // Reveal hidden target and deal little dammages if enemy - if (tsc && (tsc->data[SC_HIDING] || tsc->data[SC_CLOAKING] || - tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_NEWMOON] || tsc->data[SC_CLOAKINGEXCEED])) { + if (tsc && (tsc->getSCE(SC_HIDING) || tsc->getSCE(SC_CLOAKING) || + tsc->getSCE(SC_CAMOUFLAGE) || tsc->getSCE(SC_NEWMOON) || tsc->getSCE(SC_CLOAKINGEXCEED))) { status_change_end(bl, SC_HIDING); status_change_end(bl, SC_CLOAKING); status_change_end(bl, SC_CAMOUFLAGE); @@ -14707,8 +14744,8 @@ int status_change_timer_sub(struct block_list* bl, va_list ap) if(battle_check_target( src, bl, BCT_ENEMY ) > 0) skill_attack(BF_MAGIC,src,src,bl,AL_RUWACH,1,tick,0); } - if (tsc && tsc->data[SC__SHADOWFORM] && (sce && sce->val4 > 0 && sce->val4%2000 == 0) && // For every 2 seconds do the checking - rnd()%100 < 100 - tsc->data[SC__SHADOWFORM]->val1 * 10 ) { // [100 - (Skill Level x 10)] % + if (tsc && tsc->getSCE(SC__SHADOWFORM) && (sce && sce->val4 > 0 && sce->val4%2000 == 0) && // For every 2 seconds do the checking + rnd()%100 < 100 - tsc->getSCE(SC__SHADOWFORM)->val1 * 10 ) { // [100 - (Skill Level x 10)] % status_change_end(bl, SC__SHADOWFORM); if (battle_check_target(src, bl, BCT_ENEMY) > 0) skill_attack(BF_MAGIC, src, src, bl, status_db.getSkill(type), 1, tick, 0); @@ -14734,14 +14771,14 @@ int status_change_timer_sub(struct block_list* bl, va_list ap) break; case SC_CLOSECONFINE: // Lock char has released the hold on everyone... - if (tsc && tsc->data[SC_CLOSECONFINE2] && tsc->data[SC_CLOSECONFINE2]->val2 == src->id) { - tsc->data[SC_CLOSECONFINE2]->val2 = 0; + if (tsc && tsc->getSCE(SC_CLOSECONFINE2) && tsc->getSCE(SC_CLOSECONFINE2)->val2 == src->id) { + tsc->getSCE(SC_CLOSECONFINE2)->val2 = 0; status_change_end(bl, SC_CLOSECONFINE2); } break; case SC_CURSEDCIRCLE_TARGET: - if( tsc && tsc->data[SC_CURSEDCIRCLE_TARGET] && tsc->data[SC_CURSEDCIRCLE_TARGET]->val2 == src->id ) { - clif_bladestop(bl, tsc->data[SC_CURSEDCIRCLE_TARGET]->val2, 0); + if( tsc && tsc->getSCE(SC_CURSEDCIRCLE_TARGET) && tsc->getSCE(SC_CURSEDCIRCLE_TARGET)->val2 == src->id ) { + clif_bladestop(bl, tsc->getSCE(SC_CURSEDCIRCLE_TARGET)->val2, 0); status_change_end(bl, type); } break; @@ -14772,7 +14809,7 @@ void status_change_clear_buffs(struct block_list* bl, uint8 type) sc_type status = static_cast(it.first); std::bitset flag = it.second->flag; - if (!sc->data[status] || flag[SCF_NOCLEARBUFF]) //Skip status with SCF_NOCLEARBUFF, no matter what + if (!sc->getSCE(status) || flag[SCF_NOCLEARBUFF]) //Skip status with SCF_NOCLEARBUFF, no matter what continue; // &SCCB_LUXANIMA : Cleared by RK_LUXANIMA if (!(type&SCCB_LUXANIMA) && flag[SCF_REMOVEONLUXANIMA]) @@ -14790,7 +14827,7 @@ void status_change_clear_buffs(struct block_list* bl, uint8 type) if (!(type&SCCB_BUFFS) && !(flag[SCF_DEBUFF])) continue; if (status == SC_SATURDAYNIGHTFEVER || status == SC_BERSERK) // Mark to not lose HP - sc->data[status]->val2 = 0; + sc->getSCE(status)->val2 = 0; status_change_end(bl, status); } @@ -14842,20 +14879,20 @@ int status_change_spread(block_list *src, block_list *bl) sc_type type = static_cast(it.first); const TimerData *timer; - if (sc->data[type] && it.second->flag[SCF_SPREADEFFECT]) { - if (sc->data[type]->timer != INVALID_TIMER) { - timer = get_timer(sc->data[type]->timer); + if (sc->getSCE(type) && it.second->flag[SCF_SPREADEFFECT]) { + if (sc->getSCE(type)->timer != INVALID_TIMER) { + timer = get_timer(sc->getSCE(type)->timer); if (timer == nullptr || timer->func != status_change_timer || DIFF_TICK(timer->tick, tick) < 0) continue; - int32 val4 = sc->data[type]->val4; + int32 val4 = sc->getSCE(type)->val4; sc_tick = DIFF_TICK(timer->tick, tick) + (val4 > 0 ? val4 : 0); } else sc_tick = INFINITE_TICK; - status_change_start(src, bl, type, 10000, sc->data[type]->val1, sc->data[type]->val2, sc->data[type]->val3, sc->data[type]->val4, sc_tick, SCSTART_NOAVOID | SCSTART_NOTICKDEF | SCSTART_NORATEDEF); + status_change_start(src, bl, type, 10000, sc->getSCE(type)->val1, sc->getSCE(type)->val2, sc->getSCE(type)->val3, sc->getSCE(type)->val4, sc_tick, SCSTART_NOAVOID | SCSTART_NOTICKDEF | SCSTART_NORATEDEF); if (!hasSpread) hasSpread = true; @@ -14906,7 +14943,7 @@ static int status_natural_heal(struct block_list* bl, va_list args) if (flag && ( status_isdead(bl) || - (sc && (sc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK) || sc->data[SC__INVISIBILITY])) + (sc && (sc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK) || sc->getSCE(SC__INVISIBILITY))) )) flag = RGN_NONE; @@ -15003,7 +15040,7 @@ static int status_natural_heal(struct block_list* bl, va_list args) rate /= 2; #ifdef RENEWAL if (sd && (sd->class_&MAPID_UPPERMASK) == MAPID_MONK && - sc && sc->data[SC_EXPLOSIONSPIRITS] && (!sc->data[SC_SPIRIT] || sc->data[SC_SPIRIT]->val2 != SL_MONK)) + sc && sc->getSCE(SC_EXPLOSIONSPIRITS) && (!sc->getSCE(SC_SPIRIT) || sc->getSCE(SC_SPIRIT)->val2 != SL_MONK)) rate *= 2; // Tick is doubled in Fury state #endif @@ -15151,7 +15188,7 @@ void status_change_clear_onChangeMap(struct block_list *bl, struct status_change for (const auto &it : status_db) { sc_type type = static_cast(it.first); - if (!sc->data[type] || !SCDisabled[type]) + if (!sc->getSCE(type) || !SCDisabled[type]) continue; if (status_change_isDisabledOnMap_(type, mapIsVS, mapIsPVP, mapIsGVG, mapIsBG, mapdata->zone, mapIsTE)) diff --git a/src/map/status.hpp b/src/map/status.hpp index c0378043df..7eec11859e 100644 --- a/src/map/status.hpp +++ b/src/map/status.hpp @@ -3133,7 +3133,8 @@ struct status_change_entry { }; ///Status change -struct status_change { +class status_change { +public: unsigned int option;// effect state (bitfield) unsigned int opt3;// skill state (bitfield) unsigned short opt1;// body state @@ -3164,7 +3165,16 @@ struct status_change { #ifndef RENEWAL unsigned char sg_counter; //Storm gust counter (previous hits from storm gust) #endif +private: struct status_change_entry *data[SC_MAX]; + std::pair lastStatus; // last-fetched status + +public: + status_change_entry * getSCE(enum sc_type type); + status_change_entry * getSCE(uint32 type); + status_change_entry * createSCE(enum sc_type type); + void deleteSCE(enum sc_type type); + void clearSCE(enum sc_type type); }; int status_damage( struct block_list *src, struct block_list *target, int64 dhp, int64 dsp, int64 dap, t_tick walkdelay, int flag, uint16 skill_id ); diff --git a/src/map/unit.cpp b/src/map/unit.cpp index dc10d44853..45f09b86ba 100644 --- a/src/map/unit.cpp +++ b/src/map/unit.cpp @@ -769,7 +769,7 @@ int unit_walktoxy( struct block_list *bl, short x, short y, unsigned char flag) unit_stop_attack(bl); //Sets target to 0 status_change* sc = status_get_sc(bl); - if (sc && sc->data[SC_CONFUSION]) // Randomize the target position + if (sc && sc->getSCE(SC_CONFUSION)) // Randomize the target position map_random_dir(bl, &ud->to_x, &ud->to_y); if(ud->walktimer != INVALID_TIMER) { @@ -879,7 +879,7 @@ int unit_walktobl(struct block_list *bl, struct block_list *tbl, int range, unsi unit_stop_attack(bl); //Sets target to 0 status_change *sc = status_get_sc(bl); - if (sc && sc->data[SC_CONFUSION]) // Randomize the target position + if (sc && sc->getSCE(SC_CONFUSION)) // Randomize the target position map_random_dir(bl, &ud->to_x, &ud->to_y); if(ud->walktimer != INVALID_TIMER) { @@ -912,7 +912,7 @@ int unit_walktobl(struct block_list *bl, struct block_list *tbl, int range, unsi */ void unit_run_hit(struct block_list *bl, struct status_change *sc, struct map_session_data *sd, enum sc_type type) { - int lv = sc->data[type]->val1; + int lv = sc->getSCE(type)->val1; // If you can't run forward, you must be next to a wall, so bounce back. [Skotlex] if (type == SC_RUN) @@ -948,7 +948,7 @@ bool unit_run(struct block_list *bl, struct map_session_data *sd, enum sc_type t sc = status_get_sc(bl); - if (!(sc && sc->data[type])) + if (!(sc && sc->getSCE(type))) return false; if (!unit_can_move(bl)) { @@ -956,8 +956,8 @@ bool unit_run(struct block_list *bl, struct map_session_data *sd, enum sc_type t return false; } - dir_x = dirx[sc->data[type]->val2]; - dir_y = diry[sc->data[type]->val2]; + dir_x = dirx[sc->getSCE(type)->val2]; + dir_y = diry[sc->getSCE(type)->val2]; // Determine destination cell to_x = bl->x; @@ -1252,7 +1252,7 @@ enum e_unit_blown unit_blown_immune(struct block_list* bl, uint8 flag) #ifndef RENEWAL // Basilica caster can't be knocked-back by normal monsters. - if( !(flag&0x4) && sd->sc.data[SC_BASILICA] && sd->sc.data[SC_BASILICA]->val4 == sd->bl.id) + if( !(flag&0x4) && sd->sc.getSCE(SC_BASILICA) && sd->sc.getSCE(SC_BASILICA)->val4 == sd->bl.id) return UB_TARGET_BASILICA; #endif // Target has special_state.no_knockback (equip) @@ -1638,14 +1638,14 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui return 0; // temp: used to signal combo-skills right now. - if (sc && sc->data[SC_COMBO] && + if (sc && sc->getSCE(SC_COMBO) && skill_is_combo(skill_id) && - (sc->data[SC_COMBO]->val1 == skill_id || + (sc->getSCE(SC_COMBO)->val1 == skill_id || (sd?skill_check_condition_castbegin(sd,skill_id,skill_lv):0) )) { if (skill_is_combo(skill_id) == 2 && target_id == src->id && ud->target > 0) target_id = ud->target; - else if (sc->data[SC_COMBO]->val2) - target_id = sc->data[SC_COMBO]->val2; + else if (sc->getSCE(SC_COMBO)->val2) + target_id = sc->getSCE(SC_COMBO)->val2; else if (target_id == src->id || ud->target > 0) target_id = ud->target; @@ -1665,21 +1665,21 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui switch(skill_id) { // Check for skills that auto-select target case MO_CHAINCOMBO: - if (sc && sc->data[SC_BLADESTOP]) { - if ((target=map_id2bl(sc->data[SC_BLADESTOP]->val4)) == NULL) + if (sc && sc->getSCE(SC_BLADESTOP)) { + if ((target=map_id2bl(sc->getSCE(SC_BLADESTOP)->val4)) == NULL) return 0; } break; case GC_WEAPONCRUSH: - if (sc && sc->data[SC_WEAPONBLOCK_ON]) { - if ((target = map_id2bl(sc->data[SC_WEAPONBLOCK_ON]->val1)) == nullptr) + if (sc && sc->getSCE(SC_WEAPONBLOCK_ON)) { + if ((target = map_id2bl(sc->getSCE(SC_WEAPONBLOCK_ON)->val1)) == nullptr) return 0; combo = 1; } break; case RL_QD_SHOT: - if (sc && sc->data[SC_QD_SHOT_READY]) { - if ((target = map_id2bl(sc->data[SC_QD_SHOT_READY]->val1)) == nullptr) + if (sc && sc->getSCE(SC_QD_SHOT_READY)) { + if ((target = map_id2bl(sc->getSCE(SC_QD_SHOT_READY)->val1)) == nullptr) return 0; combo = 1; } @@ -1717,8 +1717,8 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui case MH_TINDER_BREAKER: { int skill_id2 = ((skill_id==MH_SONIC_CRAW)?MH_MIDNIGHT_FRENZY:MH_EQC); - if(sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == skill_id2) { // It's a combo - target_id = sc->data[SC_COMBO]->val2; + if(sc->getSCE(SC_COMBO) && sc->getSCE(SC_COMBO)->val1 == skill_id2) { // It's a combo + target_id = sc->getSCE(SC_COMBO)->val2; combo = 1; casttime = -1; } @@ -1907,17 +1907,17 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui casttime += casttime * min(skill_lv, sd->spiritball); break; case MO_EXTREMITYFIST: - if (sc && sc->data[SC_COMBO] && - (sc->data[SC_COMBO]->val1 == MO_COMBOFINISH || - sc->data[SC_COMBO]->val1 == CH_TIGERFIST || - sc->data[SC_COMBO]->val1 == CH_CHAINCRUSH)) + if (sc && sc->getSCE(SC_COMBO) && + (sc->getSCE(SC_COMBO)->val1 == MO_COMBOFINISH || + sc->getSCE(SC_COMBO)->val1 == CH_TIGERFIST || + sc->getSCE(SC_COMBO)->val1 == CH_CHAINCRUSH)) casttime = -1; combo = 1; break; case SR_GATEOFHELL: case SR_TIGERCANNON: - if (sc && sc->data[SC_COMBO] && - sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE) + if (sc && sc->getSCE(SC_COMBO) && + sc->getSCE(SC_COMBO)->val1 == SR_FALLENEMPIRE) casttime = -1; combo = 1; break; @@ -1926,17 +1926,17 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui break; #ifndef RENEWAL_CAST case ST_CHASEWALK: - if (sc && sc->data[SC_CHASEWALK]) + if (sc && sc->getSCE(SC_CHASEWALK)) casttime = -1; break; #endif case TK_RUN: - if (sc && sc->data[SC_RUN]) + if (sc && sc->getSCE(SC_RUN)) casttime = -1; break; #ifndef RENEWAL case HP_BASILICA: - if( sc && sc->data[SC_BASILICA] ) + if( sc && sc->getSCE(SC_BASILICA) ) casttime = -1; // No Casting time on basilica cancel break; #endif @@ -1955,14 +1955,14 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui casttime *= 2; break; case RA_WUGDASH: - if (sc && sc->data[SC_WUGDASH]) + if (sc && sc->getSCE(SC_WUGDASH)) casttime = -1; break; case DK_SERVANT_W_PHANTOM: { // Stops servants from being consumed on unmarked targets. status_change *tsc = status_get_sc(target); // Only allow to attack if the enemy has a sign mark given by the caster. - if( tsc == nullptr || tsc->data[SC_SERVANT_SIGN] == nullptr || tsc->data[SC_SERVANT_SIGN]->val1 != src->id ){ + if( tsc == nullptr || tsc->getSCE(SC_SERVANT_SIGN) == nullptr || tsc->getSCE(SC_SERVANT_SIGN)->val1 != src->id ){ clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0); return 0; } @@ -2056,17 +2056,17 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui if( sc ) { // These 3 status do not stack, so it's efficient to use if-else - if( sc->data[SC_CLOAKING] && !(sc->data[SC_CLOAKING]->val4&4) && skill_id != AS_CLOAKING && skill_id != SHC_SHADOW_STAB) { + if( sc->getSCE(SC_CLOAKING) && !(sc->getSCE(SC_CLOAKING)->val4&4) && skill_id != AS_CLOAKING && skill_id != SHC_SHADOW_STAB) { status_change_end(src, SC_CLOAKING); if (!src->prev) return 0; // Warped away! - } else if( sc->data[SC_CLOAKINGEXCEED] && !(sc->data[SC_CLOAKINGEXCEED]->val4&4) && skill_id != GC_CLOAKINGEXCEED && skill_id != SHC_SHADOW_STAB) { + } else if( sc->getSCE(SC_CLOAKINGEXCEED) && !(sc->getSCE(SC_CLOAKINGEXCEED)->val4&4) && skill_id != GC_CLOAKINGEXCEED && skill_id != SHC_SHADOW_STAB) { status_change_end(src,SC_CLOAKINGEXCEED); if (!src->prev) return 0; - } else if (sc->data[SC_NEWMOON] && skill_id != SJ_NEWMOONKICK) { + } else if (sc->getSCE(SC_NEWMOON) && skill_id != SJ_NEWMOONKICK) { status_change_end(src, SC_NEWMOON); if (!src->prev) return 0; // Warped away! @@ -2238,17 +2238,17 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, ui if( sc ) { // These 3 status do not stack, so it's efficient to use if-else - if (sc->data[SC_CLOAKING] && !(sc->data[SC_CLOAKING]->val4&4)) { + if (sc->getSCE(SC_CLOAKING) && !(sc->getSCE(SC_CLOAKING)->val4&4)) { status_change_end(src, SC_CLOAKING); if (!src->prev) return 0; // Warped away! - } else if (sc->data[SC_CLOAKINGEXCEED] && !(sc->data[SC_CLOAKINGEXCEED]->val4&4)) { + } else if (sc->getSCE(SC_CLOAKINGEXCEED) && !(sc->getSCE(SC_CLOAKINGEXCEED)->val4&4)) { status_change_end(src, SC_CLOAKINGEXCEED); if (!src->prev) return 0; - } else if (sc->data[SC_NEWMOON]) { + } else if (sc->getSCE(SC_NEWMOON)) { status_change_end(src, SC_NEWMOON); if (!src->prev) @@ -2871,7 +2871,7 @@ bool unit_can_attack(struct block_list *bl, int target_id) { if (!(sc = status_get_sc(bl))) return true; - if (sc->cant.attack || (sc->data[SC_VOICEOFSIREN] && sc->data[SC_VOICEOFSIREN]->val2 == target_id)) + if (sc->cant.attack || (sc->getSCE(SC_VOICEOFSIREN) && sc->getSCE(SC_VOICEOFSIREN)->val2 == target_id)) return false; return true; @@ -2904,7 +2904,7 @@ int unit_skillcastcancel(struct block_list *bl, char type) return 0; if (sd && (sd->special_state.no_castcancel2 || - ((sd->sc.data[SC_UNLIMITEDHUMMINGVOICE] || sd->special_state.no_castcancel) && !map_flag_gvg2(bl->m) && !map_getmapflag(bl->m, MF_BATTLEGROUND)))) // fixed flags being read the wrong way around [blackhole89] + ((sd->sc.getSCE(SC_UNLIMITEDHUMMINGVOICE) || sd->special_state.no_castcancel) && !map_flag_gvg2(bl->m) && !map_getmapflag(bl->m, MF_BATTLEGROUND)))) // fixed flags being read the wrong way around [blackhole89] return 0; } @@ -3076,9 +3076,9 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file, status_change_end(bl, SC_CLOAKING); status_change_end(bl, SC_CLOAKINGEXCEED); } - if (sc->data[SC_GOSPEL] && sc->data[SC_GOSPEL]->val4 == BCT_SELF) + if (sc->getSCE(SC_GOSPEL) && sc->getSCE(SC_GOSPEL)->val4 == BCT_SELF) status_change_end(bl, SC_GOSPEL); - if (sc->data[SC_PROVOKE] && sc->data[SC_PROVOKE]->val4 == 1) + if (sc->getSCE(SC_PROVOKE) && sc->getSCE(SC_PROVOKE)->val4 == 1) status_change_end(bl, SC_PROVOKE); //End infinite provoke to prevent exploit } @@ -3691,8 +3691,8 @@ void unit_addshadowscar(unit_data &ud, int interval) { status_change *sc = status_get_sc(ud.bl); if (sc != nullptr) { - if (sc->data[SC_SHADOW_SCAR] != nullptr) { - sc->data[SC_SHADOW_SCAR]->val1 = static_cast(ud.shadow_scar_timer.size()); + if (sc->getSCE(SC_SHADOW_SCAR) != nullptr) { + sc->getSCE(SC_SHADOW_SCAR)->val1 = static_cast(ud.shadow_scar_timer.size()); } else { sc_start(ud.bl, ud.bl, SC_SHADOW_SCAR, 100, 1, INFINITE_TICK); } From da375a04c13cb590405d3491688f1666d2eaf8dc Mon Sep 17 00:00:00 2001 From: Aleos Date: Wed, 14 Dec 2022 14:17:41 -0500 Subject: [PATCH 8/8] Adds battle config mob_respawn_time (#7312) * Adjusts the minimum respawn time of a monster to be 1 second as it is officially. * Adds a battle config to allow for easy adjustment. * Monsters that don't define a delay1 for permanent spawn scripts are defaulted to 5 seconds. Thanks to @mrjnumber1, @vstumpf, @Lemongrass3110, and @Atemo! Co-authored-by: Lemongrass3110 --- conf/battle/monster.conf | 5 ++++ doc/script_commands.txt | 3 +- npc/pre-re/mobs/dungeons/nyd_dun.txt | 2 +- npc/pre-re/mobs/dungeons/prt_maze.txt | 2 +- npc/re/mobs/dungeons/glastheim.txt | 14 +++++----- npc/re/mobs/verus.txt | 40 +++++++++++++-------------- src/map/battle.cpp | 2 ++ src/map/battle.hpp | 2 ++ src/map/mob.cpp | 13 ++++----- src/map/npc.cpp | 10 +++++-- 10 files changed, 54 insertions(+), 39 deletions(-) diff --git a/conf/battle/monster.conf b/conf/battle/monster.conf index bfd1217f86..7adb358440 100644 --- a/conf/battle/monster.conf +++ b/conf/battle/monster.conf @@ -297,3 +297,8 @@ achievement_mob_share: no // Should slaves teleport back to their master if they get too far during chase? (Note 1) // Default (Official): no slave_stick_with_master: no + +// Absolute minimum respawn time in milliseconds of a monster. +// Also used in delaying the spawning of guardians when a guild is not loaded. +// Default (Official): 1000 +mob_respawn_time: 1000 diff --git a/doc/script_commands.txt b/doc/script_commands.txt index a6d48a2c0b..113e59535e 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -159,7 +159,8 @@ executed, it is affected by spawn rates in 'battle_athena.conf'. Delay1 and delay2 control monster respawn delays - the first one is the fixed base respawn time, and the second is random variance on top of the base time. Both values are given in milliseconds (1000 = 1 second). -Note that the server also enforces a minimum respawn delay of 5 seconds. +Note that the server also enforces a minimum respawn delay of 1 second (See +/conf/battle/monster.conf::mob_respawn_time). Event is a script event to be executed when the mob is killed. The event must be in the form "NPCName::OnEventName" to execute, and the event name label diff --git a/npc/pre-re/mobs/dungeons/nyd_dun.txt b/npc/pre-re/mobs/dungeons/nyd_dun.txt index 751a1a308a..112a94c7dc 100644 --- a/npc/pre-re/mobs/dungeons/nyd_dun.txt +++ b/npc/pre-re/mobs/dungeons/nyd_dun.txt @@ -14,7 +14,7 @@ // nyd_dun01 - Yggdrasil Root Dungeon //================================================== nyd_dun01,0,0 monster Draco 2013,40 -nyd_dun01,0,0 monster Draco's Egg 2014,10,0,0,0 +nyd_dun01,0,0 monster Draco's Egg 2014,10 nyd_dun01,0,0 monster Aqua Elemental 2016,20 nyd_dun01,0,0 monster Dark Pinguicula 2015,10 nyd_dun01,0,0 monster Rata 2017,2,900000 diff --git a/npc/pre-re/mobs/dungeons/prt_maze.txt b/npc/pre-re/mobs/dungeons/prt_maze.txt index 2b868dd249..abd058709b 100644 --- a/npc/pre-re/mobs/dungeons/prt_maze.txt +++ b/npc/pre-re/mobs/dungeons/prt_maze.txt @@ -84,7 +84,7 @@ prt_maze03,50,150,70,70 monster Vagabond Wolf 1092,1,1920000,150000 prt_maze03,170,170,70,70 monster Mantis 1139,30,60000,30000 prt_maze03,170,170,70,70 monster Eclipse 1093,1,1920000,150000 prt_maze03,23,23,70,70 monster Mastering 1090,1,1920000,150000 -prt_maze03,100,100,80,80 monster Baphomet Jr. 1101,25,0,0,0 +prt_maze03,100,100,80,80 monster Baphomet Jr. 1101,25 prt_maze03,0,0,0,0 boss_monster Baphomet 1039,1,7200000,600000,1 prt_maze03,61,98,10,10 monster Shining Plant 1083,1,1800000,900000 prt_maze03,61,98,10,10 monster Blue Plant 1079,1,1800000,900000 diff --git a/npc/re/mobs/dungeons/glastheim.txt b/npc/re/mobs/dungeons/glastheim.txt index 15d1b990a9..7f29dca520 100644 --- a/npc/re/mobs/dungeons/glastheim.txt +++ b/npc/re/mobs/dungeons/glastheim.txt @@ -184,11 +184,11 @@ gl_step,0,0 monster Mimic 1191,6,5000 //================================================== // gl_cas02_ - Nightmare Mode 2f //================================================== -gl_cas02_,0,0 monster Evil Druid (Nightmare) 2480,4,0,0,0 -gl_cas02_,0,0 monster Chimera (Nightmare) 2485,1,0,0,0 -gl_cas02_,0,0 monster Mimic (Nightmare) 2479,19,0,0,0 -gl_cas02_,0,0 monster Rideword (Nightmare) 2478,10,0,0,0 -gl_cas02_,0,0 monster Wanderer (Nightmare) 2477,60,0,0,0 +gl_cas02_,0,0 monster Evil Druid (Nightmare) 2480,4,5000 +gl_cas02_,0,0 monster Chimera (Nightmare) 2485,1,5000 +gl_cas02_,0,0 monster Mimic (Nightmare) 2479,19,5000 +gl_cas02_,0,0 monster Rideword (Nightmare) 2478,10,5000 +gl_cas02_,0,0 monster Wanderer (Nightmare) 2477,60,5000 gl_cas02_,0,0 monster Mysteltainn 1203,1,7200000,3600000 gl_cas02_,0,0 monster Alice 1275,1,5000 gl_cas02_,102,180 monster Whisper 1185,1,1800000,900000 @@ -197,8 +197,8 @@ gl_cas02_,0,0 monster Baphomet (Nightmare) 2483,1,7200000,0,0 //================================================== // gl_chyard_ - Nightmare Mode Churchyard //================================================== -gl_chyard_,0,0 monster Wraith Dead (Nightmare) 2481,91,0,0,0 -gl_chyard_,0,0 monster Wraith Dead 1291,31,0,0,0 +gl_chyard_,0,0 monster Wraith Dead (Nightmare) 2481,91,5000 +gl_chyard_,0,0 monster Wraith Dead 1291,31,5000 gl_chyard_,0,0 monster Evil Druid (Nightmare) 2480,22,60000,0,0 gl_chyard_,0,0 monster Mimic (Nightmare) 2479,34,60000,0,0 gl_chyard_,0,0,0,0 boss_monster Dark Lord 1272,1,3600000,600000,1 diff --git a/npc/re/mobs/verus.txt b/npc/re/mobs/verus.txt index b98c3ffeee..8f7bf2f9e0 100644 --- a/npc/re/mobs/verus.txt +++ b/npc/re/mobs/verus.txt @@ -10,28 +10,28 @@ //============================================================ // ver_eju -ver_eju,0,0,0,0 monster Recon Robot 3154,50,0,0,0 -ver_eju,0,0,0,0 monster Excavator Robot 3153,10,0,0,0 +ver_eju,0,0,0,0 monster Recon Robot 3154,50,5000 +ver_eju,0,0,0,0 monster Excavator Robot 3153,10,5000 // ver_tunn -ver_tunn,0,0,0,0 monster Recon Robot 3154,5,0,0,0 +ver_tunn,0,0,0,0 monster Recon Robot 3154,5,30000 // verus01 -verus01,0,0,0,0 monster Green Cenere 3247,50,0,0,0 -verus01,0,0,0,0 monster Explorer Robot Turbo 3249,25,0,0,0 -verus01,0,0,0,0 monster Repair Robot Turbo 3248,25,0,0,0 +verus01,0,0,0,0 monster Green Cenere 3247,50,5000 +verus01,0,0,0,0 monster Explorer Robot Turbo 3249,25,5000 +verus01,0,0,0,0 monster Repair Robot Turbo 3248,25,5000 // verus02 -verus02,0,0,0,0 monster Repair Robot Turbo 3248,50,0,0,0 -verus02,0,0,0,0 monster Explorer Robot Turbo 3249,50,0,0,0 +verus02,0,0,0,0 monster Repair Robot Turbo 3248,50,5000 +verus02,0,0,0,0 monster Explorer Robot Turbo 3249,50,5000 // verus03 -verus03,0,0,0,0 monster Illegal Promotion 3159,40,0,0,0 -verus03,0,0,0,0 monster Explorer Robot 3156,50,0,0,0 -verus03,0,0,0,0 monster Repair Robot 3155,50,0,0,0 -verus03,0,0,0,0 monster Ruin Grace Believer 3158,10,0,0,0 +verus03,0,0,0,0 monster Illegal Promotion 3159,40,5000 +verus03,0,0,0,0 monster Explorer Robot 3156,50,5000 +verus03,0,0,0,0 monster Repair Robot 3155,50,5000 +verus03,0,0,0,0 monster Ruin Grace Believer 3158,10,5000 // un_bunker -un_bunker,0,0,0,0 monster Thief Bug 1051,6,0,0,0 -un_bunker,0,0,0,0 monster Smelly Ghoul 3255,68,0,0,0 -un_bunker,0,0,0,0 monster Smelly Zombie 3256,80,0,0,0 -un_bunker,0,0,0,0 monster Machine Component 3250,28,0,0,0 -un_bunker,0,0,0,0 monster DR815 3252,14,0,0,0 -un_bunker,0,0,0,0 monster GC109 3251,10,0,0,0 -un_bunker,0,0,0,0 monster Black Mushroom 1084,1,0,0,0 -un_bunker,0,0,0,0 monster Chonchon 1011,2,0,0,0 +un_bunker,0,0,0,0 monster Thief Bug 1051,6,5000 +un_bunker,0,0,0,0 monster Smelly Ghoul 3255,68,5000 +un_bunker,0,0,0,0 monster Smelly Zombie 3256,80,5000 +un_bunker,0,0,0,0 monster Machine Component 3250,28,5000 +un_bunker,0,0,0,0 monster DR815 3252,14,5000 +un_bunker,0,0,0,0 monster GC109 3251,10,5000 +un_bunker,0,0,0,0 monster Black Mushroom 1084,1,5000 +un_bunker,0,0,0,0 monster Chonchon 1011,2,5000 diff --git a/src/map/battle.cpp b/src/map/battle.cpp index d8998d0758..facd7754f0 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -10283,6 +10283,8 @@ static const struct _battle_data { { "feature.dynamicnpc_rangey", &battle_config.feature_dynamicnpc_rangey, 2, 0, INT_MAX, }, { "feature.dynamicnpc_direction", &battle_config.feature_dynamicnpc_direction, 0, 0, 1, }, + { "mob_respawn_time", &battle_config.mob_respawn_time, 1000, 1000, INT_MAX, }, + #include "../custom/battle_config_init.inc" }; diff --git a/src/map/battle.hpp b/src/map/battle.hpp index 0ead94920d..98ffd16bbc 100644 --- a/src/map/battle.hpp +++ b/src/map/battle.hpp @@ -722,6 +722,8 @@ struct Battle_Config int feature_dynamicnpc_rangey; int feature_dynamicnpc_direction; + int mob_respawn_time; + #include "../custom/battle_config_struct.inc" }; diff --git a/src/map/mob.cpp b/src/map/mob.cpp index ec9fab2323..2f1e6fc57b 100644 --- a/src/map/mob.cpp +++ b/src/map/mob.cpp @@ -695,8 +695,8 @@ int mob_once_spawn(struct map_session_data* sd, int16 m, int16 x, int16 y, const md->guardian_data->emblem_id = g->emblem_id; memcpy(md->guardian_data->guild_name, g->name, NAME_LENGTH); } - else if (gc->guild_id) //Guild not yet available, retry in 5. - add_timer(gettick()+5000,mob_spawn_guardian_sub,md->bl.id,md->guardian_data->guild_id); + else if (gc->guild_id) // Guild is not yet available, retry after the configured timespan. + add_timer(gettick() + battle_config.mob_respawn_time,mob_spawn_guardian_sub,md->bl.id,md->guardian_data->guild_id); } } // end addition [Valaris] @@ -914,7 +914,7 @@ int mob_spawn_guardian(const char* mapname, int16 x, int16 y, const char* mobnam memcpy (md->guardian_data->guild_name, g->name, NAME_LENGTH); md->guardian_data->guardup_lv = guild_checkskill(g,GD_GUARDUP); } else if (md->guardian_data->guild_id) - add_timer(gettick()+5000,mob_spawn_guardian_sub,md->bl.id,md->guardian_data->guild_id); + add_timer(gettick() + battle_config.mob_respawn_time,mob_spawn_guardian_sub,md->bl.id,md->guardian_data->guild_id); mob_spawn(md); return md->bl.id; @@ -1073,8 +1073,7 @@ int mob_setdelayspawn(struct mob_data *md) spawntime = spawntime/100*battle_config.mob_spawn_delay; } - if (spawntime < 5000) //Monsters should never respawn faster than within 5 seconds - spawntime = 5000; + spawntime = u32max(1000, spawntime); //Monsters should never respawn faster than 1 second if( md->spawn_timer != INVALID_TIMER ) delete_timer(md->spawn_timer, mob_delayspawn); @@ -1126,7 +1125,7 @@ int mob_spawn (struct mob_data *md) { // retry again later if( md->spawn_timer != INVALID_TIMER ) delete_timer(md->spawn_timer, mob_delayspawn); - md->spawn_timer = add_timer(tick+5000,mob_delayspawn,md->bl.id,0); + md->spawn_timer = add_timer(tick + battle_config.mob_respawn_time,mob_delayspawn,md->bl.id,0); return 1; } } @@ -1134,7 +1133,7 @@ int mob_spawn (struct mob_data *md) { // retry again later (players on sight) if( md->spawn_timer != INVALID_TIMER ) delete_timer(md->spawn_timer, mob_delayspawn); - md->spawn_timer = add_timer(tick+5000,mob_delayspawn,md->bl.id,0); + md->spawn_timer = add_timer(tick + battle_config.mob_respawn_time,mob_delayspawn,md->bl.id,0); return 1; } } diff --git a/src/map/npc.cpp b/src/map/npc.cpp index cf5939f027..2ad192bca6 100644 --- a/src/map/npc.cpp +++ b/src/map/npc.cpp @@ -5118,7 +5118,7 @@ void npc_parse_mob2(struct spawn_data* mob) static const char* npc_parse_mob(char* w1, char* w2, char* w3, char* w4, const char* start, const char* buffer, const char* filepath) { - int num, mob_id, mob_lv = -1, size = -1, w1count; + int num, mob_id, mob_lv = -1, delay = 5000, size = -1, w1count, w4count; short m, x = 0, y = 0, xs = -1, ys = -1; char mapname[MAP_NAME_LENGTH_EXT], mobname[NAME_LENGTH], sprite[NAME_LENGTH]; struct spawn_data mob, *data; @@ -5133,7 +5133,7 @@ static const char* npc_parse_mob(char* w1, char* w2, char* w3, char* w4, const c // w4=,{,{,{,{,{,}}}}} if( ( w1count = sscanf(w1, "%15[^,],%6hd,%6hd,%6hd,%6hd", mapname, &x, &y, &xs, &ys) ) < 1 || sscanf(w3, "%23[^,],%11d", mobname, &mob_lv) < 1 - || sscanf(w4, "%23[^,],%11d,%11u,%11u,%77[^,],%11d,%11d[^\t\r\n]", sprite, &num, &mob.delay1, &mob.delay2, mob.eventname, &size, &ai) < 2 ) + || ( w4count = sscanf(w4, "%23[^,],%11d,%11u,%11u,%77[^,],%11d,%11d[^\t\r\n]", sprite, &num, &delay, &mob.delay2, mob.eventname, &size, &ai) ) < 2 ) { ShowError("npc_parse_mob: Invalid mob definition in file '%s', line '%d'.\n * w1=%s\n * w2=%s\n * w3=%s\n * w4=%s\n", filepath, strline(buffer,start-buffer), w1, w2, w3, w4); return strchr(start,'\n');// skip and continue @@ -5181,6 +5181,12 @@ static const char* npc_parse_mob(char* w1, char* w2, char* w3, char* w4, const c return strchr(start,'\n');// skip and continue } + if (w4count > 2 && delay != 5000 && delay < battle_config.mob_respawn_time) { + ShowWarning("npc_parse_mob: Invalid delay %u for mob ID %d (file '%s', line '%d'), defaulting to 5 seconds.\n", delay, mob_id, filepath, strline(buffer, start - buffer)); + mob.delay1 = 5000; + } else + mob.delay1 = delay; + if( mob.state.size > SZ_BIG && size != -1 ) { ShowError("npc_parse_mob: Invalid size number %d for mob ID %d (file '%s', line '%d').\n", mob.state.size, mob_id, filepath, strline(buffer, start - buffer));