浏览代码

- Modified unit_walktoxy_sub to always move at least one cell when a large chaserange is specified to prevent possible infinite loops where attack_timer says you are not within range, but unit_walktoxy says you are.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@5987 54d463be-8e91-2dee-dedb-b68131a5f0ec
skotlex 19 年之前
父节点
当前提交
d3db62a041
共有 2 个文件被更改,包括 9 次插入10 次删除
  1. 4 0
      Changelog-Trunk.txt
  2. 5 10
      src/map/unit.c

+ 4 - 0
Changelog-Trunk.txt

@@ -4,6 +4,10 @@ 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.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 
 2006/04/11
 2006/04/11
+	* Modified unit_walktoxy_sub to always move at least one cell when a large
+	  chaserange is specified to prevent possible infinite loops where
+	  attack_timer says you are not within range, but unit_walktoxy says you are.
+	  [Skotlex]
 	* Fixed Looted items always dropping in quantities of one. [Skotlex]
 	* Fixed Looted items always dropping in quantities of one. [Skotlex]
 	* Removed the check that deletes Magnus Exorcism cells after they hit once.
 	* Removed the check that deletes Magnus Exorcism cells after they hit once.
 	  [Skotlex]
 	  [Skotlex]

+ 5 - 10
src/map/unit.c

@@ -58,9 +58,10 @@ int unit_walktoxy_sub(struct block_list *bl)
 	memcpy(&ud->walkpath,&wpd,sizeof(wpd));
 	memcpy(&ud->walkpath,&wpd,sizeof(wpd));
 	
 	
 	if (ud->target && ud->chaserange >0) {
 	if (ud->target && ud->chaserange >0) {
-		//Trim the last part of the path to account for range.
-		for (i = ud->chaserange*10; i > 0 && ud->walkpath.path_len>0;) {
-			int dir;
+		int dir;
+		//Trim the last part of the path to account for range,
+		//but always move at least one cell when requested to move.
+		for (i = ud->chaserange*10; i > 0 && ud->walkpath.path_len>1;) {
 		   ud->walkpath.path_len--;
 		   ud->walkpath.path_len--;
 			dir = ud->walkpath.path[ud->walkpath.path_len];
 			dir = ud->walkpath.path[ud->walkpath.path_len];
 			if(dir&1)
 			if(dir&1)
@@ -70,12 +71,6 @@ int unit_walktoxy_sub(struct block_list *bl)
 			ud->to_x -= dirx[dir];
 			ud->to_x -= dirx[dir];
 			ud->to_y -= diry[dir];
 			ud->to_y -= diry[dir];
 		}
 		}
-		if (!ud->walkpath.path_len) {
-			//Already within requested range.
-			if (ud->target && ud->state.attack_continue)
-				unit_attack(bl, ud->target, 1);
-			return 0;
-		}
 	}
 	}
 
 
 	ud->state.change_walk_target=0;
 	ud->state.change_walk_target=0;
@@ -314,7 +309,7 @@ int unit_walktobl(struct block_list *bl, struct block_list *tbl, int range, int
 
 
 	ud->state.walk_easy = flag&1;
 	ud->state.walk_easy = flag&1;
 	ud->target = tbl->id;
 	ud->target = tbl->id;
-	ud->chaserange = range;
+	ud->chaserange = range; //Note that if flag&2, this SHOULD be attack-range
 	ud->state.attack_continue = flag&2?1:0; //Chase to attack.
 	ud->state.attack_continue = flag&2?1:0; //Chase to attack.
 
 
 	sc = status_get_sc(bl);
 	sc = status_get_sc(bl);