diff options
Diffstat (limited to 'src/map/skill.c')
-rw-r--r-- | src/map/skill.c | 52 |
1 files changed, 32 insertions, 20 deletions
diff --git a/src/map/skill.c b/src/map/skill.c index c2022b0a6..6bfecf46f 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -6041,18 +6041,23 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin case MO_ABSORBSPIRITS: { int sp = 0; - if (dstsd && dstsd->spiritball - && (sd == dstsd || map_flag_vs(src->m) || (sd->duel_group && sd->duel_group == dstsd->duel_group)) - && ((dstsd->class_&MAPID_BASEMASK)!=MAPID_GUNSLINGER || (dstsd->class_&MAPID_UPPERMASK)!=MAPID_REBELLION) - ) { + int i; + if ( dstsd && dstsd->spiritball + && (sd == dstsd || map_flag_vs(src->m) || (sd->duel_group && sd->duel_group == dstsd->duel_group)) + && ((dstsd->class_&MAPID_BASEMASK) != MAPID_GUNSLINGER || (dstsd->class_&MAPID_UPPERMASK) != MAPID_REBELLION) + ) { // split the if for readability, and included gunslingers in the check so that their coins cannot be removed [Reddozen] sp = dstsd->spiritball * 7; - pc->delspiritball(dstsd,dstsd->spiritball,0); - } else if (dstmd && !(tstatus->mode&MD_BOSS) && rnd() % 100 < 20) { + pc->delspiritball(dstsd, dstsd->spiritball, 0); + } else if ( dstmd && !(tstatus->mode&MD_BOSS) && rnd() % 100 < 20 ) { // check if target is a monster and not a Boss, for the 20% chance to absorb 2 SP per monster's level [Reddozen] sp = 2 * dstmd->level; mob->target(dstmd,src,0); } + if ( dstsd ) { + for (i = SPIRITS_TYPE_CHARM_WATER; i < SPIRITS_TYPE_SPHERE; i++) + pc->del_charm(dstsd, dstsd->spiritcharm[i], i); + } if (sp) status->heal(src, 0, sp, 3); clif->skill_nodamage(src,bl,skill_id,skill_lv,sp?1:0); } @@ -8917,6 +8922,11 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin pc->delspiritball(dstsd, dstsd->spiritball, 0); status_percent_heal(src, 0, sp); } + if ( dstsd ) { + int i; + for (i = SPIRITS_TYPE_CHARM_WATER; i < SPIRITS_TYPE_SPHERE; i++) + pc->del_charm(dstsd, dstsd->spiritcharm[i], i); + } clif->skill_nodamage(src, bl, skill_id, skill_lv, sp ? 1:0); } else { clif->skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6); @@ -9455,10 +9465,10 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin int i; int ttype = skill->get_ele(skill_id, skill_lv); clif->skill_nodamage(src, bl, skill_id, skill_lv, 1); - ARR_FIND(1, 6, i, sd->charm[i] > 0 && ttype != i); - if( i < 6 ) - pc->del_charm(sd, sd->charm[i], i); // replace with a new one. - pc->add_charm(sd, skill->get_time(skill_id, skill_lv), 10, ttype); + ARR_FIND(SPIRITS_TYPE_CHARM_WATER, SPIRITS_TYPE_SPHERE, i, sd->spiritcharm[i] > 0 && ttype != i); + if( i < SPIRITS_TYPE_SPHERE ) + pc->del_charm(sd, sd->spiritcharm[i], i); // replace with a new one. + pc->add_charm(sd, skill->get_time(skill_id, skill_lv), MAX_SPIRITCHARM, ttype); } break; @@ -10107,11 +10117,13 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui } case MG_SAFETYWALL: - if (map->foreachincell(skill->cell_overlap,src->m,x,y,BL_SKILL)) { - skill->unitsetting(src,skill_id,skill_lv,x,y,0); + { + int alive = 1; + if ( map->foreachincell(skill->cell_overlap, src->m, x, y, BL_SKILL, skill_id, &alive, src) ) { + skill->unitsetting(src, skill_id, skill_lv, x, y, 0); return 0; // Don't consume gems if cast on LP } - + } case MG_FIREWALL: case MG_THUNDERSTORM: @@ -11190,13 +11202,13 @@ struct skill_unit_group* skill_unitsetting(struct block_list *src, uint16 skill_ break; case KO_ZENKAI: if( sd ){ - ARR_FIND(1, 6, i, sd->charm[i] > 0); - if( i < 5 ){ - val1 = sd->charm[i]; // no. of aura + ARR_FIND(SPIRITS_TYPE_CHARM_WATER, SPIRITS_TYPE_SPHERE, i, sd->spiritcharm[i] > 0); + if( i < SPIRITS_TYPE_SPHERE ){ + val1 = sd->spiritcharm[i]; // no. of aura val2 = i; // aura type limit += val1 * 1000; subunt = i - 1; - pc->del_charm(sd, sd->charm[i], i); + pc->del_charm(sd, sd->spiritcharm[i], i); } } break; @@ -13495,7 +13507,7 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id case KO_DOHU_KOUKAI: { int ttype = skill->get_ele(skill_id, skill_lv); - if( sd->charm[ttype] >= 10 ){ + if( sd->spiritcharm[ttype] >= MAX_SPIRITCHARM ){ clif->skill_fail(sd, skill_id, USESKILL_FAIL_SUMMON, 0); return 0; } @@ -13505,8 +13517,8 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id case KO_ZENKAI: { int i; - ARR_FIND(1, 6, i, sd->charm[i] > 0); // FIXME: 4 or 6? - if( i > 4 ) { + ARR_FIND(SPIRITS_TYPE_CHARM_WATER, SPIRITS_TYPE_SPHERE, i, sd->spiritcharm[i] > 0); + if( i >= SPIRITS_TYPE_SPHERE ) { clif->skill_fail(sd,skill_id,USESKILL_FAIL_SUMMON,0); return 0; } |