summaryrefslogtreecommitdiff
path: root/src/map/skill.c
diff options
context:
space:
mode:
authorskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-05-05 15:03:53 +0000
committerskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-05-05 15:03:53 +0000
commitfc694ecbe6734d01c0a1626beb96f514fb06aa5e (patch)
tree153214b8623bb3671d0ed5f8876020add55740c7 /src/map/skill.c
parent6fc7c2a2614eeb39ac8a6f62e8d4998b7860fd27 (diff)
downloadhercules-fc694ecbe6734d01c0a1626beb96f514fb06aa5e.tar.gz
hercules-fc694ecbe6734d01c0a1626beb96f514fb06aa5e.tar.bz2
hercules-fc694ecbe6734d01c0a1626beb96f514fb06aa5e.tar.xz
hercules-fc694ecbe6734d01c0a1626beb96f514fb06aa5e.zip
- Kaupe now will only block all skills of players, for non-players, only normal attacks can be missed.
- Moved the Kaite spell-reflect code after the damage calculation function, so the reflected damage is exactly the damage the original target would have received. Will only trigger if the damage to be reflected is above 0. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@6489 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/map/skill.c')
-rw-r--r--src/map/skill.c82
1 files changed, 39 insertions, 43 deletions
diff --git a/src/map/skill.c b/src/map/skill.c
index 216132567..7cb552ab9 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -1725,33 +1725,11 @@ int skill_attack( int attack_type, struct block_list* src, struct block_list *ds
// Is this check really needed? FrostNova won't hurt you if you step right where the caster is?
if(skillid == WZ_FROSTNOVA && dsrc->x == bl->x && dsrc->y == bl->y) //使用スキルがフ?ストノヴァで?Adsrcとblが同じ??鰍ネら何もしない
return 0;
- if(sd && sd->chatID) //術者がPCでチャット中なら何もしない
- return 0;
-
-//何もしない判定ここまで
- sc= status_get_sc(bl);
- if (sc && !sc->count)
- sc = NULL; //Don't need it.
-
- if (attack_type&BF_MAGIC && sc && sc->data[SC_KAITE].timer != -1
- && !(status_get_mode(src)&MD_BOSS) && (sd || status_get_lv(dsrc) <= 80) //Works on players or mobs with level under 80.
- ) { //Bounce back the skill.
- clif_skill_nodamage(bl,bl,SL_KAITE,sc->data[SC_KAITE].val1,1);
- if (--sc->data[SC_KAITE].val2 <= 0)
- status_change_end(bl, SC_KAITE, -1);
- bl = src; //Just make the skill attack yourself @.@
- sc = status_get_sc(bl);
- tsd = (bl->type == BL_PC)?(struct map_session_data *)bl:NULL;
- if (sc && !sc->count)
- sc = NULL; //Don't need it.
- if (sc && sc->data[SC_SPIRIT].timer != -1 && sc->data[SC_SPIRIT].val2 == SL_WIZARD)
- return 0; //Spirit of Wizard blocks bounced back spells.
- }
-
type=-1;
lv=(flag>>20)&0xf;
- dmg=battle_calc_attack(attack_type,src,bl,skillid,skilllv,flag&0xff ); //ダ??ジ計算
+ dmg=battle_calc_attack(attack_type,src,bl,skillid,skilllv,flag&0xff );
+
//Skotlex: Adjusted to the new system
if(src->type==BL_PET && (struct pet_data *)src)
@@ -1768,29 +1746,47 @@ int skill_attack( int attack_type, struct block_list* src, struct block_list *ds
}
}
-//マジックロッド?理ここから
- if(attack_type&BF_MAGIC && sc && sc->data[SC_MAGICROD].timer != -1 && src == dsrc) { //魔法攻?でマジックロッド?態でsrc=dsrcなら
- dmg.damage = dmg.damage2 = 0; //ダメ?ジ0
- dmg.dmg_lv = ATK_FLEE; //This will prevent skill additional effect from taking effect. [Skotlex]
- if(tsd) {
- int sp = skill_get_sp(skillid,skilllv); //使用されたスキルのSPを吸?
- sp = sp * sc->data[SC_MAGICROD].val2 / 100; //吸?率計算
- if(skillid == WZ_WATERBALL && skilllv > 1) //ウォ?タ?ボ?ルLv1以上
- sp = sp/((skilllv|1)*(skilllv|1)); //さらに計算?
- if(sp > 0x7fff) sp = 0x7fff; //SP多すぎの場合は理論最大値
- else if(sp < 1) sp = 1; //1以下の場合は1
- if(tsd->status.sp + sp > tsd->status.max_sp) { //回復SP+現在のSPがMSPより大きい場合
- sp = tsd->status.max_sp - tsd->status.sp; //SPをMSP-現在SPにする
- tsd->status.sp = tsd->status.max_sp; //現在のSPにMSPを代入
+ sc= status_get_sc(bl);
+ if (sc && !sc->count) sc = NULL; //Don't need it.
+
+ if (attack_type&BF_MAGIC) {
+ if(sc && sc->data[SC_KAITE].timer != -1 && (dmg.damage || dmg.damage2)
+ && !(status_get_mode(src)&MD_BOSS) && (sd || status_get_lv(dsrc) <= 80)
+ ) { //Works on players or mobs with level under 80.
+ clif_skill_nodamage(bl,bl,SL_KAITE,sc->data[SC_KAITE].val1,1);
+ if (--sc->data[SC_KAITE].val2 <= 0)
+ status_change_end(bl, SC_KAITE, -1);
+ bl = src; //Just make the skill attack yourself @.@
+ sc = status_get_sc(bl);
+ tsd = (bl->type == BL_PC)?(TBL_PC*)bl:NULL;
+ if (sc && !sc->count)
+ sc = NULL; //Don't need it.
+ if (sc && sc->data[SC_SPIRIT].timer != -1 && sc->data[SC_SPIRIT].val2 == SL_WIZARD)
+ { //Spirit of Wizard blocks bounced back spells.
+ dmg.damage = dmg.damage2 = 0;
+ dmg.dmg_lv = ATK_FLEE;
}
- else //回復SP+現在のSPがMSPより小さい場合は回復SPを加算
+ }
+
+ if(sc && sc->data[SC_MAGICROD].timer != -1 && src == dsrc) {
+ dmg.damage = dmg.damage2 = 0;
+ dmg.dmg_lv = ATK_FLEE; //This will prevent skill additional effect from taking effect. [Skotlex]
+ if(tsd) {
+ int sp = skill_get_sp(skillid,skilllv);
+ sp = sp * sc->data[SC_MAGICROD].val2 / 100;
+ if(skillid == WZ_WATERBALL && skilllv > 1)
+ sp = sp/((skilllv|1)*(skilllv|1)); //Estimate SP cost of a single water-ball
+ if(sp > SHRT_MAX) sp = SHRT_MAX;
+ else if(sp < 1) sp = 1;
+ if(sp > tsd->status.max_sp - tsd->status.sp)
+ sp = tsd->status.max_sp - tsd->status.sp;
tsd->status.sp += sp;
- clif_heal(tsd->fd,SP_SP,sp); //SP回復エフェクトの表示
- tsd->ud.canact_tick = tick + skill_delayfix(bl, SA_MAGICROD, sc->data[SC_MAGICROD].val1);
+ clif_heal(tsd->fd,SP_SP,sp);
+ tsd->ud.canact_tick = tick + skill_delayfix(bl, SA_MAGICROD, sc->data[SC_MAGICROD].val1);
+ }
+ clif_skill_nodamage(bl,bl,SA_MAGICROD,sc->data[SC_MAGICROD].val1,1);
}
- clif_skill_nodamage(bl,bl,SA_MAGICROD,sc->data[SC_MAGICROD].val1,1); //マジックロッドエフェクトを表示
}
-//マジックロッド?理ここまで
damage = dmg.damage + dmg.damage2;