summaryrefslogtreecommitdiff
path: root/src/map
diff options
context:
space:
mode:
authorskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-07-21 14:05:27 +0000
committerskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-07-21 14:05:27 +0000
commit3fc3bc499c203c6cb17d10709bf1f589a44d0642 (patch)
tree37afa787ddc55c483ade1d0a2ef3bfdbafa162ee /src/map
parent6d34fcfe024681d1c796b1c485a76371c39a0b10 (diff)
downloadhercules-3fc3bc499c203c6cb17d10709bf1f589a44d0642.tar.gz
hercules-3fc3bc499c203c6cb17d10709bf1f589a44d0642.tar.bz2
hercules-3fc3bc499c203c6cb17d10709bf1f589a44d0642.tar.xz
hercules-3fc3bc499c203c6cb17d10709bf1f589a44d0642.zip
- 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
Diffstat (limited to 'src/map')
-rw-r--r--src/map/itemdb.c4
-rw-r--r--src/map/mob.c25
-rw-r--r--src/map/status.c9
3 files changed, 26 insertions, 12 deletions
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