Explorar el Código

* Corrected skill Charge Attack as described in bugreport:67
- cast time is between 100% and 300% (+ infinite waiting fixed)
- damage is also between 100% and 300% (doesn't increase past range 9)
- added knockback that's equal to the distance to target
- no longer causes teleportation on WoE grounds
- if target runs behind an obstacle, the skill will still teleport you, but will not perform the attack or do knockback
- this should be official behavior, so enjoy the weirdness!

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@11256 54d463be-8e91-2dee-dedb-b68131a5f0ec

ultramage hace 17 años
padre
commit
3503fc5de1
Se han modificado 4 ficheros con 41 adiciones y 11 borrados
  1. 8 0
      Changelog-Trunk.txt
  2. 5 1
      src/map/battle.c
  3. 23 8
      src/map/skill.c
  4. 5 2
      src/map/unit.c

+ 8 - 0
Changelog-Trunk.txt

@@ -4,6 +4,14 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 2007/09/21
+	* Corrected skill Charge Attack as described in bugreport:67 [ultramage]
+	- cast time is between 100% and 300% (+ infinite waiting fixed)
+	- damage is also between 100% and 300% (doesn't increase past range 9)
+	- added knockback that's equal to the distance to target
+	- no longer causes teleportation on WoE grounds
+	- if target runs behind an obstacle, the skill will still teleport you,
+	  but will not perform the attack or do knockback
+	- this should be official behavior, so enjoy the weirdness!
 	* Makefile deleting .svn in save folder.
 	* Limited the number of packets parsed per cycle to 3.
 	* Fixed sql login throwing an out-of-place debug message and escaping too 

+ 5 - 1
src/map/battle.c

@@ -1546,7 +1546,11 @@ static struct Damage battle_calc_weapon_attack(
 					skillratio += 100*(skill_lv-1);
 					break;
 				case KN_CHARGEATK:
-					skillratio += 100*((wflag-1)/3); //+100% every 3 cells.of distance
+					{
+					int k = (wflag-1)/3; //+100% every 3 cells of distance
+					if( k > 2 ) k = 2; // ...but hard-limited to 300%.
+					skillratio += 100 * k; 
+					}
 					break;
 				case HT_PHANTASMIC:
 					skillratio += 50;

+ 23 - 8
src/map/skill.c

@@ -2799,10 +2799,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 	if (bl->prev == NULL)
 		return 1;
 	
-	if (src->type == BL_PC)
-		sd = (struct map_session_data *)src;
-	if (bl->type == BL_PC)
-		tsd = (struct map_session_data *)bl;
+	BL_CAST(BL_PC, src, sd);
+	BL_CAST(BL_PC, bl, tsd);
 
 	if (status_isdead(bl))
 		return 1;
@@ -2942,10 +2940,27 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 		break;
 
 	case KN_CHARGEATK:
-		flag = distance_bl(src, bl);
-		skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
-		if (unit_movepos(src, bl->x, bl->y, 1, 1))
-			clif_slide(src,bl->x,bl->y);
+		{
+		bool path = path_search_long(NULL, src->m, src->x, src->y, bl->x, bl->y);
+		unsigned int dist = distance_bl(src, bl);
+		unsigned int dir = map_calc_dir(bl, src->x, src->y);
+
+		// teleport to target (if not on WoE grounds)
+		if( !map_flag_gvg(src->m) && unit_movepos(src, bl->x, bl->y, 0, 1) )
+			clif_slide(src, bl->x, bl->y);
+
+		// cause damage and knockback if the path to target was a straight one
+		if( path )
+		{
+			skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick, dist);
+			skill_blown(src, bl, dist, dir, 0);
+			//HACK: since knockback officially defaults to the left, the client also turns to the left... therefore,
+			// make the caster look in the direction of the target
+			unit_setdir(src, (dir+4)%8);
+			clif_changed_dir(src, AREA);
+		}
+
+		}
 		break;
 
 	case TK_JUMPKICK:

+ 5 - 2
src/map/unit.c

@@ -987,8 +987,11 @@ int unit_skilluse_id2(struct block_list *src, int target_id, int skill_num, int
 			casttime = 0;
 	break;
 	case KN_CHARGEATK:
-		//Taken from jA: Casttime is increased by dist/3*100%
-		casttime+= casttime * (distance_bl(src,target)-1)/3;
+		{
+		unsigned int k = (distance_bl(src,target)-1)/3; //+100% every 3 cells of distance
+		if( k > 2 ) k = 2; // ...but hard-limited to 300%.
+		casttime += casttime * k; 
+		}
 	break;
 	}