Skill menu and looter fixes

- Fixed a bug that stopped characters server-sided and caused position lag when closing a skill menu (bugreport:9117)
- Fixed behavior of looter monsters (#125=fixed)
  * They will now always target the oldest item in their view range (which makes it seemingly random), rather than always the most south-western item available
  * Their loot range is now "0" meaning they need to be on the same cell as the item to loot it
  * Their AI will no longer get stuck in an endless loop when someone drops an item around the corner
This commit is contained in:
Playtester
2014-11-22 20:36:06 +01:00
parent a212839665
commit e6caa9569b
3 changed files with 10 additions and 8 deletions

View File

@@ -1180,12 +1180,11 @@ static int mob_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap)
target = va_arg(ap,struct block_list**);
dist = distance_bl(&md->bl, bl);
if (mob_can_reach(md,bl,dist+1, MSS_LOOT) && (*target) == NULL) {
if (mob_can_reach(md,bl,dist+1, MSS_LOOT) && ((*target) == NULL || md->target_id > bl->id)) {
(*target) = bl;
md->target_id = bl->id;
md->min_chase = md->db->range3;
} else
mob_stop_walking(md, 1); // Stop walking immediately if item is no longer on the ground.
}
return 0;
}
@@ -1561,7 +1560,7 @@ static bool mob_ai_sub_hard(struct mob_data *md, unsigned int tick)
if (!tbl && mode&MD_LOOTER && md->lootitem && DIFF_TICK(tick, md->ud.canact_tick) > 0 &&
(md->lootitem_count < LOOTITEM_SIZE || battle_config.monster_loot_type != 1))
{ // Scan area for items to loot, avoid trying to loot if the mob is full and can't consume the items.
map_foreachinrange (mob_ai_sub_hard_lootsearch, &md->bl, view_range, BL_ITEM, md, &tbl);
map_foreachinshootrange (mob_ai_sub_hard_lootsearch, &md->bl, view_range, BL_ITEM, md, &tbl);
}
if ((!tbl && mode&MD_AGGRESSIVE) || md->state.skillstate == MSS_FOLLOW)
@@ -1607,7 +1606,7 @@ static bool mob_ai_sub_hard(struct mob_data *md, unsigned int tick)
mob_unlocktarget(md, tick);
return true;
}
if (!check_distance_bl(&md->bl, tbl, 1))
if (!check_distance_bl(&md->bl, tbl, 0))
{ //Still not within loot range.
if (!(mode&MD_CANMOVE))
{ //A looter that can't move? Real smart.
@@ -1617,7 +1616,7 @@ static bool mob_ai_sub_hard(struct mob_data *md, unsigned int tick)
if (!can_move) //Stuck. Wait before walking.
return true;
md->state.skillstate = MSS_LOOT;
if (!unit_walktobl(&md->bl, tbl, 1, 1))
if (!unit_walktobl(&md->bl, tbl, 0, 1))
mob_unlocktarget(md, tick); //Can't loot...
return true;
}

View File

@@ -11664,7 +11664,6 @@ int skill_castend_map (struct map_session_data *sd, uint16 skill_id, const char
}
pc_stop_attack(sd);
pc_stop_walking(sd,0);
if(battle_config.skill_log && battle_config.skill_log&BL_PC)
ShowInfo("PC %d skill castend skill =%d map=%s\n",sd->bl.id,skill_id,mapname);

View File

@@ -722,7 +722,7 @@ static int unit_walktobl_sub(int tid, unsigned int tick, int id, intptr_t data)
* @param tbl: Target object
* @param range: How close to get to target (or attack range if flag&2)
* @param flag: Extra behaviour
* &1: Use hard path seek (obstacles will be walked around if possible)
* &1: Use easy path seek (obstacles will not be walked around)
* &2: Start attacking upon arrival within range, otherwise just walk to target
* @return 1: Started walking or set timer 0: Failed
*/
@@ -748,6 +748,10 @@ int unit_walktobl(struct block_list *bl, struct block_list *tbl, int range, unsi
ud->target_to = 0;
return 0;
} else if (range == 0) {
//Should walk on the same cell as target (for looters)
ud->to_x = tbl->x;
ud->to_y = tbl->y;
}
ud->state.walk_easy = flag&1;