* Typo in const.txt for SC with ID 608, SC_HASTEATTACK_CASH -> SC_ATTHASTE_CASH.

* Move 'dummy' skill lookup to `skill_dummy2skill_id` so can be used for item bonus for revelant skill.

Signed-off-by: Cydh Ramdh <cydh@pservero.com>
This commit is contained in:
Cydh Ramdh 2015-09-02 23:02:13 +07:00
parent ebaefc1476
commit 4a55439550
4 changed files with 72 additions and 56 deletions

View File

@ -1797,7 +1797,7 @@ SC_MTF_MSP 604
SC_MTF_PUMPKIN 605 SC_MTF_PUMPKIN 605
SC_MTF_HITFLEE 606 SC_MTF_HITFLEE 606
SC_CRIFOOD 607 SC_CRIFOOD 607
SC_HASTEATTACK_CASH 608 SC_ATTHASTE_CASH 608
SC_REUSE_LIMIT_A 609 SC_REUSE_LIMIT_A 609
SC_REUSE_LIMIT_B 610 SC_REUSE_LIMIT_B 610
SC_REUSE_LIMIT_C 611 SC_REUSE_LIMIT_C 611

View File

@ -1376,9 +1376,10 @@ void pc_reg_received(struct map_session_data *sd)
} }
if ((i = pc_checkskill(sd,RG_PLAGIARISM)) > 0) { if ((i = pc_checkskill(sd,RG_PLAGIARISM)) > 0) {
sd->cloneskill_idx = skill_get_index(pc_readglobalreg(sd, add_str(SKILL_VAR_PLAGIARISM))); unsigned short skid = pc_readglobalreg(sd, add_str(SKILL_VAR_PLAGIARISM));
sd->cloneskill_idx = skill_get_index(skid);
if (sd->cloneskill_idx > 0) { if (sd->cloneskill_idx > 0) {
sd->status.skill[sd->cloneskill_idx].id = pc_readglobalreg(sd, add_str(SKILL_VAR_PLAGIARISM)); sd->status.skill[sd->cloneskill_idx].id = skid;
sd->status.skill[sd->cloneskill_idx].lv = pc_readglobalreg(sd, add_str(SKILL_VAR_PLAGIARISM_LV)); sd->status.skill[sd->cloneskill_idx].lv = pc_readglobalreg(sd, add_str(SKILL_VAR_PLAGIARISM_LV));
if (sd->status.skill[sd->cloneskill_idx].lv > i) if (sd->status.skill[sd->cloneskill_idx].lv > i)
sd->status.skill[sd->cloneskill_idx].lv = i; sd->status.skill[sd->cloneskill_idx].lv = i;
@ -1386,9 +1387,10 @@ void pc_reg_received(struct map_session_data *sd)
} }
} }
if ((i = pc_checkskill(sd,SC_REPRODUCE)) > 0) { if ((i = pc_checkskill(sd,SC_REPRODUCE)) > 0) {
sd->reproduceskill_idx = skill_get_index(pc_readglobalreg(sd, add_str(SKILL_VAR_REPRODUCE))); unsigned short skid = pc_readglobalreg(sd, add_str(SKILL_VAR_REPRODUCE));
sd->reproduceskill_idx = skill_get_index(skid);
if (sd->reproduceskill_idx > 0) { if (sd->reproduceskill_idx > 0) {
sd->status.skill[sd->reproduceskill_idx].id = pc_readglobalreg(sd, add_str(SKILL_VAR_REPRODUCE)); sd->status.skill[sd->reproduceskill_idx].id = skid;
sd->status.skill[sd->reproduceskill_idx].lv = pc_readglobalreg(sd, add_str(SKILL_VAR_REPRODUCE_LV)); sd->status.skill[sd->reproduceskill_idx].lv = pc_readglobalreg(sd, add_str(SKILL_VAR_REPRODUCE_LV));
if (i < sd->status.skill[sd->reproduceskill_idx].lv) if (i < sd->status.skill[sd->reproduceskill_idx].lv)
sd->status.skill[sd->reproduceskill_idx].lv = i; sd->status.skill[sd->reproduceskill_idx].lv = i;
@ -7057,6 +7059,8 @@ int pc_skillatk_bonus(struct map_session_data *sd, uint16 skill_id)
int i, bonus = 0; int i, bonus = 0;
nullpo_ret(sd); nullpo_ret(sd);
skill_id = skill_dummy2skill_id(skill_id);
ARR_FIND(0, ARRAYLENGTH(sd->skillatk), i, sd->skillatk[i].id == skill_id); ARR_FIND(0, ARRAYLENGTH(sd->skillatk), i, sd->skillatk[i].id == skill_id);
if( i < ARRAYLENGTH(sd->skillatk) ) if( i < ARRAYLENGTH(sd->skillatk) )
bonus = sd->skillatk[i].val; bonus = sd->skillatk[i].val;
@ -7069,6 +7073,8 @@ int pc_sub_skillatk_bonus(struct map_session_data *sd, uint16 skill_id)
int i, bonus = 0; int i, bonus = 0;
nullpo_ret(sd); nullpo_ret(sd);
skill_id = skill_dummy2skill_id(skill_id);
ARR_FIND(0, ARRAYLENGTH(sd->subskill), i, sd->subskill[i].id == skill_id); ARR_FIND(0, ARRAYLENGTH(sd->subskill), i, sd->subskill[i].id == skill_id);
if( i < ARRAYLENGTH(sd->subskill) ) if( i < ARRAYLENGTH(sd->subskill) )
bonus = sd->subskill[i].val; bonus = sd->subskill[i].val;
@ -7079,6 +7085,8 @@ int pc_sub_skillatk_bonus(struct map_session_data *sd, uint16 skill_id)
int pc_skillheal_bonus(struct map_session_data *sd, uint16 skill_id) { int pc_skillheal_bonus(struct map_session_data *sd, uint16 skill_id) {
int i, bonus = sd->bonus.add_heal_rate; int i, bonus = sd->bonus.add_heal_rate;
skill_id = skill_dummy2skill_id(skill_id);
if( bonus ) { if( bonus ) {
switch( skill_id ) { switch( skill_id ) {
case AL_HEAL: if( !(battle_config.skill_add_heal_rate&1) ) bonus = 0; break; case AL_HEAL: if( !(battle_config.skill_add_heal_rate&1) ) bonus = 0; break;
@ -7100,6 +7108,8 @@ int pc_skillheal_bonus(struct map_session_data *sd, uint16 skill_id) {
int pc_skillheal2_bonus(struct map_session_data *sd, uint16 skill_id) { int pc_skillheal2_bonus(struct map_session_data *sd, uint16 skill_id) {
int i, bonus = sd->bonus.add_heal2_rate; int i, bonus = sd->bonus.add_heal2_rate;
skill_id = skill_dummy2skill_id(skill_id);
ARR_FIND(0, ARRAYLENGTH(sd->skillheal2), i, sd->skillheal2[i].id == skill_id); ARR_FIND(0, ARRAYLENGTH(sd->skillheal2), i, sd->skillheal2[i].id == skill_id);
if( i < ARRAYLENGTH(sd->skillheal2) ) if( i < ARRAYLENGTH(sd->skillheal2) )

View File

@ -377,6 +377,58 @@ int skill_get_range2 (struct block_list *bl, uint16 skill_id, uint16 skill_lv) {
return range; return range;
} }
/** Copy Referral: dummy skills should point to their source.
* @param skill_id Dummy skill ID
* @return Real skill id if found
**/
unsigned short skill_dummy2skill_id(unsigned short skill_id) {
switch (skill_id) {
case AB_DUPLELIGHT_MELEE:
case AB_DUPLELIGHT_MAGIC:
return AB_DUPLELIGHT;
case WL_CHAINLIGHTNING_ATK:
return WL_CHAINLIGHTNING;
case WL_TETRAVORTEX_FIRE:
case WL_TETRAVORTEX_WATER:
case WL_TETRAVORTEX_WIND:
case WL_TETRAVORTEX_GROUND:
return WL_TETRAVORTEX;
case WL_SUMMON_ATK_FIRE:
return WL_SUMMONFB;
case WL_SUMMON_ATK_WIND:
return WL_SUMMONBL;
case WL_SUMMON_ATK_WATER:
return WL_SUMMONWB;
case WL_SUMMON_ATK_GROUND:
return WL_SUMMONSTONE;
case LG_OVERBRAND_BRANDISH:
case LG_OVERBRAND_PLUSATK:
return LG_OVERBRAND;
case WM_REVERBERATION_MELEE:
case WM_REVERBERATION_MAGIC:
return WM_REVERBERATION;
case WM_SEVERE_RAINSTORM_MELEE:
return WM_SEVERE_RAINSTORM;
case GN_CRAZYWEED_ATK:
return GN_CRAZYWEED;
case GN_HELLS_PLANT_ATK:
return GN_HELLS_PLANT;
case GN_SLINGITEM_RANGEMELEEATK:
return GN_SLINGITEM;
case SR_FLASHCOMBO_ATK_STEP1:
return SR_DRAGONCOMBO;
case SR_FLASHCOMBO_ATK_STEP2:
return SR_FALLENEMPIRE;
case SR_FLASHCOMBO_ATK_STEP3:
return SR_TIGERCANNON;
case SR_FLASHCOMBO_ATK_STEP4:
return SR_SKYNETBLOW;
case RL_R_TRIP_PLUSATK:
return RL_R_TRIP;
}
return skill_id;
}
/** /**
* Calculates heal value of skill's effect * Calculates heal value of skill's effect
* @param src * @param src
@ -2709,54 +2761,7 @@ static void skill_do_copy(struct block_list* src,struct block_list *bl, uint16 s
uint16 idx; uint16 idx;
unsigned char lv; unsigned char lv;
// Copy Referal: dummy skills should point to their source upon copying skill_id = skill_dummy2skill_id(skill_id);
switch (skill_id) {
case AB_DUPLELIGHT_MELEE:
case AB_DUPLELIGHT_MAGIC:
skill_id = AB_DUPLELIGHT;
break;
case WL_CHAINLIGHTNING_ATK:
skill_id = WL_CHAINLIGHTNING;
break;
case WL_TETRAVORTEX_FIRE:
case WL_TETRAVORTEX_WATER:
case WL_TETRAVORTEX_WIND:
case WL_TETRAVORTEX_GROUND:
skill_id = WL_TETRAVORTEX;
break;
case WL_SUMMON_ATK_FIRE:
skill_id = WL_SUMMONFB;
break;
case WL_SUMMON_ATK_WIND:
skill_id = WL_SUMMONBL;
break;
case WL_SUMMON_ATK_WATER:
skill_id = WL_SUMMONWB;
break;
case WL_SUMMON_ATK_GROUND:
skill_id = WL_SUMMONSTONE;
break;
case LG_OVERBRAND_BRANDISH:
case LG_OVERBRAND_PLUSATK:
skill_id = LG_OVERBRAND;
break;
case WM_REVERBERATION_MELEE:
case WM_REVERBERATION_MAGIC:
skill_id = WM_REVERBERATION;
break;
case WM_SEVERE_RAINSTORM_MELEE:
skill_id = WM_SEVERE_RAINSTORM;
break;
case GN_CRAZYWEED_ATK:
skill_id = GN_CRAZYWEED;
break;
case GN_HELLS_PLANT_ATK:
skill_id = GN_HELLS_PLANT;
break;
case GN_SLINGITEM_RANGEMELEEATK:
skill_id = GN_SLINGITEM;
break;
}
//Use skill index, avoiding out-of-bound array [Cydh] //Use skill index, avoiding out-of-bound array [Cydh]
if (!(idx = skill_get_index(skill_id))) if (!(idx = skill_get_index(skill_id)))
@ -6753,7 +6758,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case SL_KAUPE: case SL_KAUPE:
if (sd) { if (sd) {
if (!dstsd || !( if (!dstsd || !(
(sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_SOULLINKER) || (&sd->sc && sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_SOULLINKER) ||
(dstsd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER || (dstsd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER ||
dstsd->status.char_id == sd->status.char_id || dstsd->status.char_id == sd->status.char_id ||
dstsd->status.char_id == sd->status.partner_id || dstsd->status.char_id == sd->status.partner_id ||
@ -6901,10 +6906,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
if(status_isimmune(bl) || !tsc) if(status_isimmune(bl) || !tsc)
break; break;
if (sd && sd->sc.data[SC_PETROLOGY_OPTION]) if (sd && &sd->sc && sd->sc.data[SC_PETROLOGY_OPTION])
brate = sd->sc.data[SC_PETROLOGY_OPTION]->val3; brate = sd->sc.data[SC_PETROLOGY_OPTION]->val3;
if (tsc->data[SC_STONE]) { if (tsc && tsc->data[SC_STONE]) {
status_change_end(bl, SC_STONE, INVALID_TIMER); status_change_end(bl, SC_STONE, INVALID_TIMER);
if (sd) clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); if (sd) clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
break; break;

View File

@ -404,6 +404,7 @@ int skill_get_status_count( uint16 skill_id );
int skill_get_spiritball( uint16 skill_id, uint16 skill_lv ); int skill_get_spiritball( uint16 skill_id, uint16 skill_lv );
int skill_get_itemid( uint16 skill_id, int idx ); int skill_get_itemid( uint16 skill_id, int idx );
int skill_get_itemqty( uint16 skill_id, int idx ); int skill_get_itemqty( uint16 skill_id, int idx );
unsigned short skill_dummy2skill_id(unsigned short skill_id);
int skill_name2id(const char* name); int skill_name2id(const char* name);
uint16 skill_idx2id(uint16 idx); uint16 skill_idx2id(uint16 idx);