Преглед на файлове

- Cleaned up the Skillbreaker implementation, HP gaining happens at level 5 now.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@5567 54d463be-8e91-2dee-dedb-b68131a5f0ec
skotlex преди 19 години
родител
ревизия
dd2012602d
променени са 3 файла, в които са добавени 43 реда и са изтрити 66 реда
  1. 2 0
      Changelog-Trunk.txt
  2. 3 2
      src/map/battle.c
  3. 38 64
      src/map/skill.c

+ 2 - 0
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

+ 3 - 2
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);

+ 38 - 64
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;