diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index f7bb346540..dd4ea28c52 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -4,6 +4,9 @@ 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/12 + * Changed slave chasing from using unit_walktobl to map_search_freecell + + unit_walktoxy, since the previous behaviour makes all slaves always end up + on the same cell. [Skotlex] * Removed area of effect of Assumptio. [Skotlex] * Added "can't act" delay update when an auto-spell triggers. [Skotlex] * Expanded the warp warning so that it also warns when a warps takes you to diff --git a/src/map/map.c b/src/map/map.c index bfe0f777f5..a1a517ec83 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -1380,7 +1380,7 @@ static int map_count_sub(struct block_list *bl,va_list ap) * &4 = there shouldn't be any players around the target tile (use the no_spawn_on_player setting) *------------------------------------------ */ -int map_search_freecell(struct block_list *src, int m, int *x,int *y, int rx, int ry, int flag) { +int map_search_freecell(struct block_list *src, int m, short *x,short *y, int rx, int ry, int flag) { int tries, spawn=0; int bx, by; int rx2 = 2*rx+1; diff --git a/src/map/map.h b/src/map/map.h index 0fa350f8bc..83c3f3cdbe 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -1248,7 +1248,7 @@ int map_addobject(struct block_list *); int map_delobject(int); int map_delobjectnofree(int id); void map_foreachobject(int (*)(struct block_list*,va_list),int,...); -int map_search_freecell(struct block_list *src, int m, int *x,int *y, int rx, int ry, int flag); +int map_search_freecell(struct block_list *src, int m, short *x, short *y, int rx, int ry, int flag); // int map_quit(struct map_session_data *); // npc diff --git a/src/map/mob.c b/src/map/mob.c index f7e007bddf..8e28ff6bf9 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -256,7 +256,7 @@ int mob_get_random_id(int type, int flag, int lv) { *------------------------------------------ */ int mob_once_spawn (struct map_session_data *sd, char *mapname, - int x, int y, const char *mobname, int class_, int amount, const char *event) + short x, short y, const char *mobname, int class_, int amount, const char *event) { struct mob_data *md = NULL; struct spawn_data data; @@ -633,7 +633,7 @@ int mob_spawn (struct mob_data *md) if ((md->spawn->x == 0 && md->spawn->y == 0) || md->spawn->xs || md->spawn->ys) { //Monster can be spawned on an area. - int x, y, xs, ys; + short x, y, xs, ys; if (md->spawn->x == 0 && md->spawn->y == 0) xs = ys = -1; else { @@ -917,9 +917,11 @@ static int mob_ai_sub_hard_slavemob(struct mob_data *md,unsigned int tick) (md->master_dist>MOB_SLAVEDISTANCE || md->master_dist == 0) && unit_can_move(&md->bl)) { + short x = bl->x, y = bl->y; mob_stop_attack(md); - unit_walktobl(&md->bl, bl, MOB_SLAVEDISTANCE, 0); - } + if (map_search_freecell(&md->bl, bl->m, &x, &y, MOB_SLAVEDISTANCE, MOB_SLAVEDISTANCE, 1)) + unit_walktoxy(&md->bl, x, y, 0); + } } else if (bl->m != md->bl.m && map_flag_gvg(md->bl.m)) { //Delete the summoned mob if it's in a gvg ground and the master is elsewhere. [Skotlex] if(md->special_state.ai>0) @@ -2305,7 +2307,7 @@ int mob_warpslave_sub(struct block_list *bl,va_list ap) { struct mob_data *md=(struct mob_data *)bl; struct block_list *master; - int x,y,range=0; + short x,y,range=0; master = va_arg(ap, struct block_list*); range = va_arg(ap, int); @@ -2388,7 +2390,7 @@ int mob_summonslave(struct mob_data *md2,int *value,int amount,int skill_id) amount+=k; //Increase final value by same amount to preserve total number to summon. } for(;kskill_id) { case RG_INTIMIDATE: if (unit_warp(src,-1,-1,-1,3) == 0) { - int x,y; + short x,y; map_search_freecell(src, 0, &x, &y, 1, 1, 0); if (!status_isdead(target)) unit_warp(target, -1, x, y, 3); @@ -6003,7 +6003,7 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil case WZ_METEOR: //?eIXg? { int flag=0, area = skill_get_splash(skillid, skilllv); - int tmpx, tmpy, x1 = 0, y1 = 0; + short tmpx, tmpy, x1 = 0, y1 = 0; if (sc && sc->data[SC_MAGICPOWER].timer != -1) flag = flag|2; //Store the magic power flag for future use. [Skotlex] for(i=0;i<2+(skilllv>>1);i++) { diff --git a/src/map/unit.c b/src/map/unit.c index 599ed6a3e2..a24cfc7233 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -423,7 +423,7 @@ int unit_getdir(struct block_list *bl) //Warps a unit/ud to a given map/position. //In the case of players, pc_setpos is used. //it respects the no warp flags, so it is safe to call this without doing nowarpto/nowarp checks. -int unit_warp(struct block_list *bl,int m,int x,int y,int type) +int unit_warp(struct block_list *bl,int m,short x,short y,int type) { struct unit_data *ud; nullpo_retr(0, bl); diff --git a/src/map/unit.h b/src/map/unit.h index 09eaafc306..5c44663519 100644 --- a/src/map/unit.h +++ b/src/map/unit.h @@ -25,7 +25,7 @@ int unit_set_walkdelay(struct block_list *bl, unsigned int tick, int delay, int // ʒűړ(΂Ȃ) int unit_movepos(struct block_list *bl,int dst_x,int dst_y, int easy, int checkpath); -int unit_warp(struct block_list *bl, int map, int x, int y, int type); +int unit_warp(struct block_list *bl, int map, short x, short y, int type); int unit_setdir(struct block_list *bl,unsigned char dir); int unit_getdir(struct block_list *bl);