diff options
author | skotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2006-05-05 15:03:53 +0000 |
---|---|---|
committer | skotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2006-05-05 15:03:53 +0000 |
commit | fc694ecbe6734d01c0a1626beb96f514fb06aa5e (patch) | |
tree | 153214b8623bb3671d0ed5f8876020add55740c7 /src/map/skill.c | |
parent | 6fc7c2a2614eeb39ac8a6f62e8d4998b7860fd27 (diff) | |
download | hercules-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.c | 82 |
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) //�g�p�X�L�����t�?�X�g�m���@��?Adsrc��bl������?�?��Ȃ牽�����Ȃ�
return 0;
- if(sd && sd->chatID) //�p�҂�PC�Ń`���b�g���Ȃ牽�����Ȃ�
- 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 ); //�_�??�W�v�Z
+ 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 }
}
-//�}�W�b�N���b�h?����������
- if(attack_type&BF_MAGIC && sc && sc->data[SC_MAGICROD].timer != -1 && src == dsrc) { //���@�U?�Ń}�W�b�N���b�h?�Ԃ�src=dsrc�Ȃ�
- dmg.damage = dmg.damage2 = 0; //�_��?�W0
- dmg.dmg_lv = ATK_FLEE; //This will prevent skill additional effect from taking effect. [Skotlex]
- if(tsd) {
- int sp = skill_get_sp(skillid,skilllv); //�g�p���ꂽ�X�L����SP���z?
- sp = sp * sc->data[SC_MAGICROD].val2 / 100; //�z?���v�Z
- if(skillid == WZ_WATERBALL && skilllv > 1) //�E�H?�^?�{?��Lv1�ȏ�
- sp = sp/((skilllv|1)*(skilllv|1)); //����Ɍv�Z�H
- if(sp > 0x7fff) sp = 0x7fff; //SP�������̏ꍇ�͗��_�ő�l
- 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�����Z
+ }
+
+ 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�G�t�F�N�g�̕\��
- 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); //�}�W�b�N���b�h�G�t�F�N�g��\��
}
-//�}�W�b�N���b�h?�������܂�
damage = dmg.damage + dmg.damage2;
|