Minor monster walk and skill use fixes
- Fixed a bug that caused monsters to never use their idle skills even if the define MOB_LAZYSKILLPERC was set * The default value of the define is now 100% for spotted mobs and 0% for non-spotted mobs as on official servers * On officials, spotted monsters also use skills when nobody is on the map (healing up, metamorphing), but I decided to not implement this out of performance reasons for now; needs to be discussed as this would prevent the exploit of players leaving the map to heal up SP and then coming back to kill an MVP - Monsters now use complex path searching for their random walk, so they can also walk around corners now (OFFICIAL_WALKPATH still applies!) - Fixed spotted monsters using their "walk" skills even if nobody is on the map - Monsters will no longer stop when using "walk" skills (they are supposed to be used while walking)
This commit is contained in:
parent
b1330a4c63
commit
c2377c8f54
@ -46,7 +46,9 @@
|
|||||||
|
|
||||||
#define IDLE_SKILL_INTERVAL 10 //Active idle skills should be triggered every 1 second (1000/MIN_MOBTHINKTIME)
|
#define IDLE_SKILL_INTERVAL 10 //Active idle skills should be triggered every 1 second (1000/MIN_MOBTHINKTIME)
|
||||||
|
|
||||||
#define MOB_LAZYSKILLPERC 0 // Probability for mobs far from players from doing their IDLE skill. (rate of 1000 minute)
|
// Probability for mobs far from players from doing their IDLE skill. (rate of 1000 minute)
|
||||||
|
// in Aegis, this is 100% for mobs that have been activated by players and none otherwise.
|
||||||
|
#define MOB_LAZYSKILLPERC(md) (md->state.spotted?1000:0)
|
||||||
// Move probability for mobs away from players (rate of 1000 minute)
|
// Move probability for mobs away from players (rate of 1000 minute)
|
||||||
// in Aegis, this is 100% for mobs that have been activated by players and none otherwise.
|
// in Aegis, this is 100% for mobs that have been activated by players and none otherwise.
|
||||||
#define MOB_LAZYMOVEPERC(md) (md->state.spotted?1000:0)
|
#define MOB_LAZYMOVEPERC(md) (md->state.spotted?1000:0)
|
||||||
@ -1357,7 +1359,7 @@ int mob_randomwalk(struct mob_data *md,unsigned int tick)
|
|||||||
x+=md->bl.x;
|
x+=md->bl.x;
|
||||||
y+=md->bl.y;
|
y+=md->bl.y;
|
||||||
|
|
||||||
if(((x != md->bl.x) || (y != md->bl.y)) && map_getcell(md->bl.m,x,y,CELL_CHKPASS) && unit_walktoxy(&md->bl,x,y,1)){
|
if(((x != md->bl.x) || (y != md->bl.y)) && map_getcell(md->bl.m,x,y,CELL_CHKPASS) && unit_walktoxy(&md->bl,x,y,0)){
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1770,20 +1772,17 @@ static int mob_ai_sub_lazy(struct mob_data *md, va_list args)
|
|||||||
|
|
||||||
if( DIFF_TICK(md->next_walktime,tick) < 0 && (status_get_mode(&md->bl)&MD_CANMOVE) && unit_can_move(&md->bl) )
|
if( DIFF_TICK(md->next_walktime,tick) < 0 && (status_get_mode(&md->bl)&MD_CANMOVE) && unit_can_move(&md->bl) )
|
||||||
{
|
{
|
||||||
if( map[md->bl.m].users > 0 )
|
if( rnd()%1000 < MOB_LAZYMOVEPERC(md) )
|
||||||
{
|
mob_randomwalk(md, tick);
|
||||||
if( rnd()%1000 < MOB_LAZYMOVEPERC(md) )
|
|
||||||
mob_randomwalk(md, tick);
|
|
||||||
else
|
|
||||||
if( rnd()%1000 < MOB_LAZYSKILLPERC ) //Chance to do a mob's idle skill.
|
|
||||||
mobskill_use(md, tick, -1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( rnd()%1000 < MOB_LAZYMOVEPERC(md) )
|
|
||||||
mob_randomwalk(md, tick);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else if( md->ud.walktimer == INVALID_TIMER && map[md->bl.m].users > 0 )
|
||||||
|
{
|
||||||
|
//Because it is not unset when the mob finishes walking.
|
||||||
|
md->state.skillstate = MSS_IDLE;
|
||||||
|
if( rnd()%1000 < MOB_LAZYSKILLPERC(md) ) //Chance to do a mob's idle skill.
|
||||||
|
mobskill_use(md, tick, -1);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -409,8 +409,11 @@ static int unit_walktoxy_timer(int tid, unsigned int tick, int id, intptr_t data
|
|||||||
// But avoid triggering on stop-walk calls.
|
// But avoid triggering on stop-walk calls.
|
||||||
if(tid != INVALID_TIMER &&
|
if(tid != INVALID_TIMER &&
|
||||||
!(ud->walk_count%WALK_SKILL_INTERVAL) &&
|
!(ud->walk_count%WALK_SKILL_INTERVAL) &&
|
||||||
|
map[bl->m].users > 0 &&
|
||||||
mobskill_use(md, tick, -1)) {
|
mobskill_use(md, tick, -1)) {
|
||||||
if (!(ud->skill_id == NPC_SELFDESTRUCTION && ud->skilltimer != INVALID_TIMER)) { // Skill used, abort walking
|
if (!(ud->skill_id == NPC_SELFDESTRUCTION && ud->skilltimer != INVALID_TIMER)
|
||||||
|
&& md->state.skillstate != MSS_WALK) //Walk skills are supposed to be used while walking
|
||||||
|
{ // Skill used, abort walking
|
||||||
clif_fixpos(bl); // Fix position as walk has been cancelled.
|
clif_fixpos(bl); // Fix position as walk has been cancelled.
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user