From 3fc3bc499c203c6cb17d10709bf1f589a44d0642 Mon Sep 17 00:00:00 2001 From: skotlex Date: Fri, 21 Jul 2006 14:05:27 +0000 Subject: - Added a check to prevent Blind from ending while standing on a fog of wall. - The mob Slave ai will be executed now even when the slave has a target. This will allow for "instant" warping to the master when it changes maps or teleports. if the slave has a target already, it won't unlock it and chase back to the master or anything like that. - Removed a couple of checks that prevents item ids above 20000. However, remember that the max id is still ~32k or the client is the one who's gonna crash! git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@7799 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/itemdb.c | 4 ++-- src/map/mob.c | 25 +++++++++++++++---------- src/map/status.c | 9 +++++++++ 3 files changed, 26 insertions(+), 12 deletions(-) (limited to 'src/map') diff --git a/src/map/itemdb.c b/src/map/itemdb.c index 1849fdbb6..29b676aed 100644 --- a/src/map/itemdb.c +++ b/src/map/itemdb.c @@ -429,7 +429,7 @@ static int itemdb_read_itemavail (void) } if (j < 2 || str[0] == NULL || - (nameid = atoi(str[0])) < 0 || nameid >= 20000 || !(id = itemdb_exists(nameid))) + (nameid = atoi(str[0])) < 0 || !(id = itemdb_exists(nameid))) continue; k = atoi(str[1]); @@ -1036,7 +1036,7 @@ static int itemdb_readdb(void) continue; nameid=atoi(str[0]); - if(nameid<=0 || nameid>=20000) + if(nameid<=0) continue; if (j < 19) { //Crash-fix on broken item lines. [Skotlex] diff --git a/src/map/mob.c b/src/map/mob.c index e4e2d325f..4e9ee7781 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -887,14 +887,14 @@ static int mob_ai_sub_hard_slavemob(struct mob_data *md,unsigned int tick) struct block_list *bl; int old_dist; - nullpo_retr(0, md); - bl=map_id2bl(md->master_id); if (!bl || status_isdead(bl)) { status_kill(&md->bl); - return 0; + return 1; } + if (bl->prev == NULL) + return 0; //Master not on a map? Could be warping, do not process. if(status_get_mode(&md->bl)&MD_CANMOVE) { //If the mob can move, follow around. [Check by Skotlex] @@ -910,22 +910,26 @@ static int mob_ai_sub_hard_slavemob(struct mob_data *md,unsigned int tick) ){ md->master_dist = 0; unit_warp(&md->bl,bl->m,bl->x,bl->y,3); - return 0; + return 1; } + if(md->target_id) //Slave is busy with a target. + return 0; + // Approach master if within view range, chase back to Master's area also if standing on top of the master. if((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); - if (map_search_freecell(&md->bl, bl->m, &x, &y, MOB_SLAVEDISTANCE, MOB_SLAVEDISTANCE, 1)) - unit_walktoxy(&md->bl, x, y, 0); + if(map_search_freecell(&md->bl, bl->m, &x, &y, MOB_SLAVEDISTANCE, MOB_SLAVEDISTANCE, 1) + && unit_walktoxy(&md->bl, x, y, 0)) + return 1; } } 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] status_kill(&md->bl); - return 0; + return 1; } //Avoid attempting to lock the master's target too often to avoid unnecessary overload. [Skotlex] @@ -951,6 +955,7 @@ static int mob_ai_sub_hard_slavemob(struct mob_data *md,unsigned int tick) md->min_chase=md->db->range3+distance_bl(&md->bl, tbl); if(md->min_chase>MAX_MINCHASE) md->min_chase=MAX_MINCHASE; + return 1; } } } @@ -1149,9 +1154,9 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap) md->attacked_id = 0; } - // Processing of slave monster, is it needed when there's a target to deal with? - if (md->master_id > 0 && !tbl) - mob_ai_sub_hard_slavemob(md, tick); + // Processing of slave monster + if (md->master_id > 0 && mob_ai_sub_hard_slavemob(md, tick)) + return 0; // Scan area for targets if (!tbl && mode&MD_LOOTER && md->lootitem && DIFF_TICK(tick, md->ud.canact_tick) > 0 && diff --git a/src/map/status.c b/src/map/status.c index 8d24827ff..747547386 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -6436,6 +6436,15 @@ int status_change_timer(int tid, unsigned int tick, int id, int data) return 0; } break; + case SC_BLIND: + if(sc->data[SC_FOGWALL].timer!= -1) + { //Blind lasts forever while you are standing on the fog. + sc->data[type].timer=add_timer( + 5000+tick, status_change_timer, + bl->id, data); + return 0; + } + break; } // default for all non-handled control paths -- cgit v1.2.3-70-g09d2