diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 9da5a42568..d20071a0eb 100644 --- a/Changelog-Trunk.txt +++ b/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. 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] * Removed the check that deletes Magnus Exorcism cells after they hit once. [Skotlex] diff --git a/src/map/unit.c b/src/map/unit.c index 47bae59a41..b828f721cd 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -58,9 +58,10 @@ int unit_walktoxy_sub(struct block_list *bl) memcpy(&ud->walkpath,&wpd,sizeof(wpd)); 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--; dir = ud->walkpath.path[ud->walkpath.path_len]; if(dir&1) @@ -70,12 +71,6 @@ int unit_walktoxy_sub(struct block_list *bl) ud->to_x -= dirx[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; @@ -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->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. sc = status_get_sc(bl);