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
This commit is contained in:
parent
ee2dcf816e
commit
1f4c068c39
@ -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
|
||||
|
1176
src/map/battle.cpp
1176
src/map/battle.cpp
File diff suppressed because it is too large
Load Diff
@ -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<int32>((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<int32>((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<int32>(DIFF_TICK(get_timer(sd->sc.data[SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT]->timer)->tick, gettick()) / 1000);
|
||||
int32 status_tick = static_cast<int32>(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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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<sc_type>(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++;
|
||||
|
@ -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"
|
||||
|
@ -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;
|
||||
|
@ -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 );
|
||||
}
|
||||
}
|
||||
|
@ -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<SCF_MAX> &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<sc_type>(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 ){
|
||||
|
@ -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<s_mob_db> 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%
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
142
src/map/pc.cpp
142
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<std::vector<uint16>> 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<sc_type>(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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
1105
src/map/skill.cpp
1105
src/map/skill.cpp
File diff suppressed because it is too large
Load Diff
3553
src/map/status.cpp
3553
src/map/status.cpp
File diff suppressed because it is too large
Load Diff
@ -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<enum sc_type, struct status_change_entry *> 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 );
|
||||
|
@ -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<int>(ud.shadow_scar_timer.size());
|
||||
if (sc->getSCE(SC_SHADOW_SCAR) != nullptr) {
|
||||
sc->getSCE(SC_SHADOW_SCAR)->val1 = static_cast<int>(ud.shadow_scar_timer.size());
|
||||
} else {
|
||||
sc_start(ud.bl, ud.bl, SC_SHADOW_SCAR, 100, 1, INFINITE_TICK);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user