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); for (uint8 idx = 0; idx <= MAX_CONF_WAYPOINTS; ++idx) { float wanderX = x + wander_distance * (float) rand_norm() - wander_distance / 2; float wanderY = y + wander_distance * (float) rand_norm() - wander_distance / 2; Trinity::NormalizeMapCoord(wanderX); Trinity::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; } // Taken from FleeingMovementGenerator if (!(new_z - z) || wander_distance / fabs(new_z - z) > 1.0f) { i_waypoints[idx][0] = wanderX; i_waypoints[idx][1] = wanderY; i_waypoints[idx][2] = new_z; continue; } } 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(MOVEMENTFLAG_WALKING); unit.AddUnitState(UNIT_STAT_CONFUSED); }
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); }
void ConfusedMovementGenerator<T>::Initialize(T &unit) { unit.StopMoving(); float const wander_distance = 2; float x = unit.GetPositionX(); float y = unit.GetPositionY(); float 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); for (uint8 idx = 0; idx < MAX_CONF_WAYPOINTS + 1; ++idx) { float wanderX = x + (wander_distance * (float)rand_norm() - wander_distance/2); float wanderY = y + (wander_distance * (float)rand_norm() - wander_distance/2); // prevent invalid coordinates generation WoWSource::NormalizeMapCoord(wanderX); WoWSource::NormalizeMapCoord(wanderY); if (unit.IsWithinLOS(wanderX, wanderY, z)) { bool is_water = map->IsInWater(wanderX, wanderY, z); if ((is_water && !is_water_ok) || (!is_water && !is_land_ok)) { //! Cannot use coordinates outside our InhabitType. Use the current or previous position. wanderX = idx > 0 ? i_waypoints[idx-1][0] : x; wanderY = idx > 0 ? i_waypoints[idx-1][1] : y; } } else { //! Trying to access path outside line of sight. Skip this by using the current or previous position. wanderX = idx > 0 ? i_waypoints[idx-1][0] : x; wanderY = idx > 0 ? i_waypoints[idx-1][1] : y; } unit.UpdateAllowedPositionZ(wanderX, wanderY, z); //! Positions are fine - apply them to this waypoint i_waypoints[idx][0] = wanderX; i_waypoints[idx][1] = wanderY; i_waypoints[idx][2] = z; } unit.StopMoving(); unit.SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_CONFUSED); unit.AddUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_CONFUSED_MOVE); }
void ConfusedMovementGenerator<T>::Initialize(T &unit) { const float wander_distance=11; float x,y,z; x = unit.GetPositionX(); y = unit.GetPositionY(); z = unit.GetPositionZ(); TerrainInfo const* map = unit.GetTerrain(); i_nextMove = 1; bool is_water_ok, is_land_ok; _InitSpecific(unit, is_water_ok, is_land_ok); for(unsigned int idx=0; idx < MAX_CONF_WAYPOINTS+1; ++idx) { const float wanderX=wander_distance*rand_norm_f() - wander_distance/2; const float wanderY=wander_distance*rand_norm_f() - wander_distance/2; i_waypoints[idx][0] = x + wanderX; i_waypoints[idx][1] = y + wanderY; // prevent invalid coordinates generation MaNGOS::NormalizeMapCoord(i_waypoints[idx][0]); MaNGOS::NormalizeMapCoord(i_waypoints[idx][1]); // check LOS if(!unit.IsWithinLOS(i_waypoints[idx][0], i_waypoints[idx][1], z)) { i_waypoints[idx][0] = idx > 0 ? i_waypoints[idx-1][0] : x; i_waypoints[idx][1] = idx > 0 ? i_waypoints[idx-1][1] : y; } 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) || !map->IsNextZcoordOK(i_waypoints[idx][0], i_waypoints[idx][1], z)) // check if not under map { 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.UpdateAllowedPositionZ(i_waypoints[idx][0],i_waypoints[idx][1],z); i_waypoints[idx][2] = z; } unit.StopMoving(); unit.addUnitState(UNIT_STAT_CONFUSED|UNIT_STAT_CONFUSED_MOVE); }
void ConfusedMovementGenerator<T>::Initialize(T &unit) { const float wander_distance=11; float x,y,z; x = unit.GetPositionX(); y = unit.GetPositionY(); z = unit.GetPositionZ(); uint32 mapid=unit.GetMapId(); Map const* map = MapManager::Instance().GetBaseMap(mapid); i_nextMove = 1; bool is_water_ok, is_land_ok; _InitSpecific(unit, is_water_ok, is_land_ok); for(unsigned int idx=0; idx < MAX_CONF_WAYPOINTS+1; ++idx) { 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; // prevent invalid coordinates generation MaNGOS::NormalizeMapCoord(i_waypoints[idx][0]); MaNGOS::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.StopMoving(); unit.RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); unit.addUnitState(UNIT_STAT_CONFUSED); }
void ConfusedMovementGenerator<T>::Initialize(T &unit) { const float wander_distance=4; 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); for (uint8 idx = 0; idx < MAX_CONF_WAYPOINTS + 1; ++idx) { const float wanderX=wander_distance*(float)rand_norm() - wander_distance/2; const float wanderY=wander_distance*(float)rand_norm() - wander_distance/2; i_waypoints[idx][0] = x + wanderX; i_waypoints[idx][1] = y + wanderY; // prevent invalid coordinates generation Trinity::NormalizeMapCoord(i_waypoints[idx][0]); Trinity::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.UpdateAllowedPositionZ(i_waypoints[idx][0], i_waypoints[idx][1], z); i_waypoints[idx][2] = z; } unit.StopMoving(); unit.SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_CONFUSED); unit.AddUnitState(UNIT_STAT_CONFUSED|UNIT_STAT_CONFUSED_MOVE); }
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); }
void ConfusedMovementGenerator<T>::DoInitialize(T* owner) { if (!owner) return; if (!owner->isAlive()) return; float min_wander_distance = 2.0f; float max_wander_distance = 4.0f; float x = owner->GetPositionX(); float y = owner->GetPositionY(); float z = owner->GetPositionZ(); Map const* map = owner->GetBaseMap(); i_nextMove = 1; bool is_water_ok, is_land_ok; _InitSpecific(owner, is_water_ok, is_land_ok); for (uint8 idx = 0; idx < MAX_CONF_WAYPOINTS + 1; ++idx) { float wanderX = x + frand(min_wander_distance, max_wander_distance); float wanderY = y + frand(min_wander_distance, max_wander_distance); // prevent invalid coordinates generation SkyMistCore::NormalizeMapCoord(wanderX); SkyMistCore::NormalizeMapCoord(wanderY); if (owner->IsWithinLOS(wanderX, wanderY, z)) { bool is_water = map->IsInWater(wanderX, wanderY, z); if ((is_water && !is_water_ok) || (!is_water && !is_land_ok)) { //! Cannot use coordinates outside our InhabitType. Use the current or previous position. wanderX = idx > 0 ? i_waypoints[idx - 1][0] : x; wanderY = idx > 0 ? i_waypoints[idx - 1][1] : y; } } else { //! Trying to access path outside line of sight. Skip this by using the current or previous position. wanderX = idx > 0 ? i_waypoints[idx - 1][0] : x; wanderY = idx > 0 ? i_waypoints[idx - 1][1] : y; } owner->UpdateAllowedPositionZ(wanderX, wanderY, z); //! Positions are fine - apply them to this waypoint i_waypoints[idx][0] = wanderX; i_waypoints[idx][1] = wanderY; i_waypoints[idx][2] = z; } if (!owner->IsStopped()) owner->StopMoving(); owner->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_CONFUSED); owner->AddUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_CONFUSED_MOVE); }
void ConfusedMovementGenerator<T>::Initialize(T &unit) { const float wander_distance=11; float x,y,z; unit.GetPosition(x,y,z); //Get the nearest point i_nextMove = urand(1,MAX_CONF_WAYPOINTS); i_nextMoveTime.Reset(1); bool is_water_ok, is_land_ok; _InitSpecific(unit, is_water_ok, is_land_ok); uint32 mapId = unit.GetMapId(); if (MMAP::MMapFactory::IsPathfindingEnabled(mapId)) { MMAP::MMapManager* mmap = MMAP::MMapFactory::createOrGetMMapManager(); float ox=x; float oy=y; float oz=z; dtPolyRef originPoly; mmap->GetNearestValidPosition(&unit,3,3,5,ox,oy,oz,&originPoly); i_waypoints[0][0] = ox; i_waypoints[0][1] = oy; i_waypoints[0][2] = oz; for (int i = 1; i < MAX_CONF_WAYPOINTS+1;i++) { const float wanderX=wander_distance*rand_norm_f() - wander_distance/2; const float wanderY=wander_distance*rand_norm_f() - wander_distance/2; float toX = ox + wanderX; float toY = oy + wanderY; float toZ = oz; if (mmap->DrawRay(&unit,originPoly,ox,oy,oz,toX,toY,toZ)) { i_waypoints[i][0] = toX; i_waypoints[i][1] = toY; i_waypoints[i][2] = toZ; } else { i_waypoints[i][0] = ox; i_waypoints[i][1] = oy; i_waypoints[i][2] = oz; } } } else { TerrainInfo const* map = unit.GetTerrain(); for(unsigned int idx=0; idx < MAX_CONF_WAYPOINTS+1; ++idx) { const float wanderX=wander_distance*rand_norm_f() - wander_distance/2; const float wanderY=wander_distance*rand_norm_f() - wander_distance/2; i_waypoints[idx][0] = x + wanderX; i_waypoints[idx][1] = y + wanderY; // prevent invalid coordinates generation MaNGOS::NormalizeMapCoord(i_waypoints[idx][0]); MaNGOS::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.UpdateAllowedPositionZ(i_waypoints[idx][0],i_waypoints[idx][1],z); i_waypoints[idx][2] = z; } } unit.StopMoving(); unit.addUnitState(UNIT_STAT_CONFUSED|UNIT_STAT_CONFUSED_MOVE); }
void ConfusedMovementGenerator<T>::DoInitialize(T* unit) { unit->StopMoving(); float const wander_distance = 4; float x = unit->GetPositionX(); float y = unit->GetPositionY(); float z = unit->GetPositionZ(); Map const* map = unit->GetBaseMap(); bool is_water_ok, is_land_ok; _InitSpecific(unit, is_water_ok, is_land_ok); for (uint8 idx = 0; idx < MAX_CONF_WAYPOINTS + 1; ++idx) { float wanderX = x + (wander_distance * (float)rand_norm() - wander_distance/2); float wanderY = y + (wander_distance * (float)rand_norm() - wander_distance/2); // prevent invalid coordinates generation Trinity::NormalizeMapCoord(wanderX); Trinity::NormalizeMapCoord(wanderY); float new_z = map->GetHeight(unit->GetPhaseMask(), wanderX, wanderY, z, true); if (new_z <= INVALID_HEIGHT || fabs(z-new_z) > 3.0f) // pussywizard { 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; } else if (unit->IsWithinLOS(wanderX, wanderY, z)) { bool is_water = map->IsInWater(wanderX, wanderY, z); if ((is_water && !is_water_ok) || (!is_water && !is_land_ok)) { //! Cannot use coordinates outside our InhabitType. Use the current or previous position. 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; } } else { //! Trying to access path outside line of sight. Skip this by using the current or previous position. 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->UpdateAllowedPositionZ(wanderX, wanderY, z); //! Positions are fine - apply them to this waypoint i_waypoints[idx][0] = wanderX; i_waypoints[idx][1] = wanderY; i_waypoints[idx][2] = new_z; } // Xinef: Call movement immediately to broadcast movement packet // Xinef: Initial timer is set to 1 so update with 1 i_nextMove = urand(1, MAX_CONF_WAYPOINTS); DoUpdate(unit, 1); unit->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_CONFUSED); unit->AddUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_CONFUSED_MOVE); }