void ConfusedMovementGenerator<T>::Initialize(T &unit) { const float wander_distance = 11; float x,y,z; x = unit.GetPositionX(); y = unit.GetPositionY(); z = unit.GetPositionZ(); Map const* map = unit.GetBaseMap(); i_nextMove = 1; bool is_water_ok, is_land_ok; _InitSpecific(unit, is_water_ok, is_land_ok); VMAP::IVMapManager *vMaps = VMAP::VMapFactory::createOrGetVMapManager(); for (uint8 idx = 0; idx <= MAX_CONF_WAYPOINTS; ++idx) { const bool isInLoS = vMaps->isInLineOfSight(unit.GetMapId(), x, y, z + 2.0f, i_waypoints[idx][0], i_waypoints[idx][1], z + 2.0f); if (isInLoS) { const float wanderX = wander_distance*rand_norm() - wander_distance/2; const float wanderY = wander_distance*rand_norm() - wander_distance/2; i_waypoints[idx][0] = x + wanderX; i_waypoints[idx][1] = y + wanderY; } else { i_waypoints[idx][0] = x; i_waypoints[idx][1] = y; } // prevent invalid coordinates generation Quad::NormalizeMapCoord(i_waypoints[idx][0]); Quad::NormalizeMapCoord(i_waypoints[idx][1]); bool is_water = map->IsInWater(i_waypoints[idx][0],i_waypoints[idx][1],z); // if generated wrong path just ignore if ((is_water && !is_water_ok) || (!is_water && !is_land_ok)) { i_waypoints[idx][0] = idx > 0 ? i_waypoints[idx-1][0] : x; i_waypoints[idx][1] = idx > 0 ? i_waypoints[idx-1][1] : y; } unit.UpdateGroundPositionZ(i_waypoints[idx][0],i_waypoints[idx][1],z); i_waypoints[idx][2] = z; } unit.SetUInt64Value(UNIT_FIELD_TARGET, 0); unit.SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_CONFUSED); unit.CastStop(); unit.StopMoving(); unit.RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); unit.addUnitState(UNIT_STAT_CONFUSED); }
bool TerrainInfo::CheckPath(float srcX, float srcY, float srcZ, float& dstX, float& dstY, float& dstZ) const { VMAP::IVMapManager* vMapManager = VMAP::VMapFactory::createOrGetVMapManager(); bool result = vMapManager->isInLineOfSight(GetMapId(), srcX, srcY, srcZ+0.5f, dstX, dstY, dstZ+1.0f); if (!result) { // check if your may correct destination float fx2, fy2, fz2; // getObjectHitPos overwrite last args in any result case bool result2 = vMapManager->getObjectHitPos(GetMapId(), srcX,srcY,srcZ+0.5f,dstX,dstY,dstZ+0.5f,fx2,fy2,fz2,-0.1f); if (result2) { dstX = fx2; dstY = fy2; dstZ = fz2; result = true; } } return result; }
void ConfusedMovementGenerator<T>::Initialize(T &unit) { const float wander_distance = 11; float x,y,z; x = unit.GetPositionX(); y = unit.GetPositionY(); z = unit.GetPositionZ(); Map const* map = unit.GetBaseMap(); i_nextMove = 1; bool is_water_ok, is_land_ok; _InitSpecific(unit, is_water_ok, is_land_ok); VMAP::IVMapManager *vMaps = VMAP::VMapFactory::createOrGetVMapManager(); for (uint8 idx = 0; idx <= MAX_CONF_WAYPOINTS; ++idx) { float wanderX = x + wander_distance*rand_norm() - wander_distance/2; float wanderY = y + wander_distance*rand_norm() - wander_distance/2; BlizzLike::NormalizeMapCoord(wanderX); BlizzLike::NormalizeMapCoord(wanderY); float new_z = map->GetHeight(wanderX, wanderY, z, true); if (new_z > INVALID_HEIGHT && unit.IsWithinLOS(wanderX, wanderY, new_z)) { // Don't move in water if we're not already in // Don't move on land if we're not already on it either bool is_water_now = map->IsInWater(x, y, z); bool is_water_next = map->IsInWater(wanderX, wanderY, new_z); if ((is_water_now && !is_water_next && !is_land_ok) || (!is_water_now && is_water_next && !is_water_ok)) { i_waypoints[idx][0] = idx > 0 ? i_waypoints[idx-1][0] : x; // Back to previous location i_waypoints[idx][1] = idx > 0 ? i_waypoints[idx-1][1] : y; i_waypoints[idx][2] = idx > 0 ? i_waypoints[idx-1][2] : z; continue; } i_waypoints[idx][0] = wanderX; i_waypoints[idx][1] = wanderY; i_waypoints[idx][2] = new_z; // prevent falling down over an edge and check vmap if possible if (z > i_waypoints[idx][2] + 3.0f || (vMaps && !vMaps->isInLineOfSight(map->GetId(), x, y, z + 2.0f, i_waypoints[idx][0], i_waypoints[idx][1], i_waypoints[idx][2]))) { i_waypoints[idx][0] = idx > 0 ? i_waypoints[idx-1][0] : x; i_waypoints[idx][1] = idx > 0 ? i_waypoints[idx-1][1] : y; i_waypoints[idx][2] = idx > 0 ? i_waypoints[idx-1][2] : z; } } else // Back to previous location { i_waypoints[idx][0] = idx > 0 ? i_waypoints[idx-1][0] : x; i_waypoints[idx][1] = idx > 0 ? i_waypoints[idx-1][1] : y; i_waypoints[idx][2] = idx > 0 ? i_waypoints[idx-1][2] : z; continue; } } unit.SetUInt64Value(UNIT_FIELD_TARGET, 0); unit.SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_CONFUSED); unit.CastStop(); unit.StopMoving(); unit.RemoveUnitMovementFlag(MOVEFLAG_WALK_MODE); unit.addUnitState(UNIT_STAT_CONFUSED); }
bool TerrainHolder::InLineOfSight(float x, float y, float z, float x2, float y2, float z2) { VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager(); return vmgr->isInLineOfSight(m_mapid, x, y, z, x2, y2, z2); }