summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt2
-rw-r--r--src/map/battle.c5
-rw-r--r--src/map/skill.c102
3 files changed, 43 insertions, 66 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 980ffd5a6..4a9a111bb 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -5,6 +5,8 @@ IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. EV
GOES INTO TRUNK AND WILL BE MERGED INTO STABLE BY VALARIS AND WIZPUTER. -- VALARIS
2006/03/10
+ * Cleaned up the Skillbreaker implementation, HP gaining happens at level 5
+ now. [Skotlex]
* Autospells won't trigger now on maps where said skills are forbidden.
[Skotlex]
* Changed div (multi-hit) behaviour. Skills with div above zero will get
diff --git a/src/map/battle.c b/src/map/battle.c
index a4dc67b91..633c774d7 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -316,8 +316,9 @@ int battle_heal(struct block_list *bl,struct block_list *target,int hp,int sp,in
if (hp == 0 && sp == 0)
return 0;
- if (hp < 0)
- return battle_damage(bl,target,-hp,flag);
+//If battle_heal was invoked, HP/SP should just be reduced without damage animation. [Skotlex]
+// if (hp < 0)
+// return battle_damage(bl,target,-hp,flag);
if (target->type == BL_MOB)
return mob_heal((struct mob_data *)target,hp);
diff --git a/src/map/skill.c b/src/map/skill.c
index ab45b973d..4495e1c02 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -4763,13 +4763,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
sp = sp * tsc->data[SC_MAGICROD].val2 / 100;
if(sp > 0x7fff) sp = 0x7fff;
else if(sp < 1) sp = 1;
- if(dstsd->status.sp + sp > dstsd->status.max_sp) {
- sp = dstsd->status.max_sp - dstsd->status.sp;
- dstsd->status.sp = dstsd->status.max_sp;
- }
- else
- dstsd->status.sp += sp;
- clif_heal(dstsd->fd,SP_SP,sp);
+ clif_heal(dstsd->fd,SP_SP,pc_heal(dstsd, 0, sp));
}
clif_skill_nodamage(bl,bl,SA_MAGICROD,tsc->data[SC_MAGICROD].val1,1);
if(sd) {
@@ -4777,67 +4771,47 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
if(sp < 1) sp = 1;
pc_heal(sd,0,-sp);
}
- }
- else {
+ } else {
int bl_skillid=0,bl_skilllv=0,hp = 0;
- if(bl->type == BL_PC) {
- if(dstsd && dstsd->skilltimer != -1) {
- bl_skillid = dstsd->skillid;
- bl_skilllv = dstsd->skilllv;
- if (map_flag_vs(bl->m))
- hp = status_get_max_hp(bl)/50; //Recover 2% HP [Skotlex]
- }
+ if(dstsd && dstsd->skilltimer != -1) {
+ bl_skillid = dstsd->skillid;
+ bl_skilllv = dstsd->skilllv;
+ if (map_flag_vs(bl->m))
+ hp = status_get_max_hp(bl)/50; //Recover 2% HP [Skotlex]
}
- else if(bl->type == BL_MOB) {
- if(dstmd && dstmd->skilltimer != -1) {
- if (status_get_mode(bl) & MD_BOSS)
- { //Only 10% success chance against bosses. [Skotlex]
- if (rand()%100 < 90)
- {
- if (sd) clif_skill_fail(sd,skillid,0,0);
- break;
- }
- } else
- hp = status_get_max_hp(bl)/50; //Recover 2% HP [Skotlex]
- bl_skillid = dstmd->skillid;
- bl_skilllv = dstmd->skilllv;
- }
- }
- if(bl_skillid > 0 /*&& bl_skillid != PA_PRESSURE && skill_db[bl_skillid].skill_type == BF_MAGIC*/) { //Reports indicate Spell Break cancels any type of skill, except Pressure. [Skotlex]
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_castcancel(bl,0);
- sp = skill_get_sp(bl_skillid,bl_skilllv);
- if(dstsd)
- pc_heal(dstsd,-hp,-sp);
- if(sd) {
- sp = sp*(25*(skilllv-1))/100;
- if(skilllv > 1 && sp < 1) sp = 1;
- if(sp > 0x7fff) sp = 0x7fff;
- else if(sp < 1) sp = 1;
- if(sd->status.sp + sp > sd->status.max_sp) {
- sp = sd->status.max_sp - sd->status.sp;
- sd->status.sp = sd->status.max_sp;
- }
- else
- sd->status.sp += sp;
-
- if (hp && skilllv > 5)
- { //Recover half damaged HP at levels 6-10 [Skotlex]
- hp /=2;
- if(sd->status.hp + hp > sd->status.max_hp) {
- hp = sd->status.max_hp - sd->status.hp;
- sd->status.hp = sd->status.max_hp;
- }
- else
- sd->status.hp += hp;
-
- clif_heal(sd->fd,SP_HP,hp);
+ else if(dstmd && dstmd->skilltimer != -1) {
+ if (status_get_mode(bl) & MD_BOSS)
+ { //Only 10% success chance against bosses. [Skotlex]
+ if (rand()%100 < 90)
+ {
+ if (sd) clif_skill_fail(sd,skillid,0,0);
+ break;
}
- clif_heal(sd->fd,SP_SP,sp);
- }
+ } else
+ hp = status_get_max_hp(bl)/50; //Recover 2% HP [Skotlex]
+ bl_skillid = dstmd->skillid;
+ bl_skilllv = dstmd->skilllv;
+ }
+ if(!bl_skillid) {
+ if(sd) clif_skill_fail(sd,skillid,0,0);
+ break;
+ }
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_castcancel(bl,0);
+ sp = skill_get_sp(bl_skillid,bl_skilllv);
+ battle_heal(NULL, bl, -hp, -sp, 0);
+ if(sd && sp) {
+ sp = sp*(25*(skilllv-1))/100;
+ if(skilllv > 1 && sp < 1) sp = 1;
+ else if(sp > 0x7fff) sp = 0x7fff;
+ clif_heal(sd->fd,SP_SP,pc_heal(sd, 0, sp));
+ }
+ if (hp && skilllv >= 5)
+ { //Recover half damaged HP at levels 6-10 [Skotlex]
+ hp = battle_heal(bl, src, hp/2, 0, 0);
+ if (sd && sd->fd)
+ clif_heal(sd->fd,SP_HP,hp);
}
- else if(sd)
- clif_skill_fail(sd,skillid,0,0);
}
}
break;