ok, here are the git diffs for 3 mob movement-related changes that I have been running on my test server.
Fix for Creature Formations where followers get their Z-axis calculated incorrectly.
CreatureGroups.cpp
[SPOILER]diff --git a/src/server/game/Entities/Creature/CreatureGroups.cpp b/src/server/game/Entities/Creature/CreatureGroups.cpp
index 8823a78…3c3c348 100755
— a/src/server/game/Entities/Creature/CreatureGroups.cpp
+++ b/src/server/game/Entities/Creature/CreatureGroups.cpp
@@ -232,7 +232,7 @@ void CreatureGroup::LeaderMoveTo(float x, float y, float z)
Trinity::NormalizeMapCoord(dx);
Trinity::NormalizeMapCoord(dy);
- dz = member->GetBaseMap()->GetHeight(member->GetPhaseMask(), dx, dy, MAX_HEIGHT);
if (member->IsWithinDist(m_leader, dist + MAX_DESYNC))
member->SetUnitMovementFlags(m_leader->GetUnitMovementFlags());
[/SPOILER]
Fix for Random Movement Generator to allow larger distances (2 files)
RandomMovementGenerator.h
[SPOILER]diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h
index 07ec364…eaf8ce3 100755
— a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h
@@ -39,6 +39,8 @@ class RandomMovementGenerator : public MovementGeneratorMedium< T, RandomMovemen
uint32 i_nextMove;
float wander_distance;
-
float curr_angle;
-
bool running;
};
#endif
[/SPOILER]
RandomMovementGenerator.cpp
diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
index 84cd9e8…05938e4 100755
— a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
@@ -43,11 +43,27 @@ void RandomMovementGenerator::_setRandomLocation(Creature& creature)
//bool is_land_ok = creature.CanWalk(); // not used?
//bool is_water_ok = creature.CanSwim(); // not used?
bool is_air_ok = creature.CanFly();
-
-
const float angle = float(rand_norm()) * static_cast(M_PI*2.0f);
-
const float range = float(rand_norm()) * wander_distance;
-
const float distanceX = range * cos(angle);
-
const float distanceY = range * sin(angle);
-
-
// curr_angle can be set to -1 if previous move attempt failed and we need to try a new direction
-
float prev_angle = curr_angle;
-
if (curr_angle < 0)
-
curr_angle = float(rand_norm()) * static_cast(M_PI*2.0f);
-
-
// step distance is greater for flyers since they are less affected by ground changes
-
// and the animation resynch with each step is more noticeable
-
float max_step_distance = (is_air_ok) ? 20.0 : 5.0;
-
float step_distance = (wander_distance > max_step_distance) ? max_step_distance : wander_distance;
-
-
float distanceX = step_distance * cos(curr_angle) + creature.GetPositionX() - respX;
-
float distanceY = step_distance * sin(curr_angle) + creature.GetPositionY() - respY;
-
float newDistXY = sqrtf(distanceXdistanceX + distanceYdistanceY);
-
while (newDistXY > wander_distance)
-
{
-
curr_angle = float(rand_norm()) * static_cast(M_PI*2.0f);
-
distanceX = step_distance * cos(curr_angle) + creature.GetPositionX() - respX;
-
distanceY = step_distance * sin(curr_angle) + creature.GetPositionY() - respY;
-
newDistXY = sqrtf(distanceXdistanceX + distanceYdistanceY);
-
}
destX = respX + distanceX;
destY = respY + distanceY;
@@ -60,14 +76,11 @@ void RandomMovementGenerator::_setRandomLocation(Creature& creature)
if (is_air_ok) // 3D system above ground and above water (flying mode)
{
-
// Limit height change
-
const float distanceZ = float(rand_norm()) * sqrtf(travelDistZ)/2.0f;
-
destZ = respZ + distanceZ;
-
float levelZ = map->GetWaterOrGroundLevel(destX, destY, destZ-2.0f);
-
-
// Problem here, we must fly above the ground and water, not under. Let's try on next tick
-
if (levelZ >= destZ)
-
return;
-
// Maintain same height as at spawn point (minimum 2 Z)
-
float spawnHeight = respZ - map->GetHeight(creature.GetPhaseMask(), respX, respY, MAX_HEIGHT);
-
if (spawnHeight < 2.0)
-
spawnHeight = 2.0;
-
destZ = spawnHeight + map->GetHeight(creature.GetPhaseMask(), destX, destY, MAX_HEIGHT);
}
//else if (is_water_ok) // 3D system under water and above ground (swimming mode)
else // 2D only
@@ -90,22 +103,32 @@ void RandomMovementGenerator::_setRandomLocation(Creature& creature)
destZ = map->GetHeight(creature.GetPhaseMask(), destX, destY, respZ+travelDistZ-2.0f, true);
// let’s forget this bad coords where a z cannot be find and retry at next tick
return;
}
}
}
if (is_air_ok)
i_nextMoveTime.Reset(0);
-
else if (prev_angle == curr_angle)
-
i_nextMoveTime.Reset(0);
-
else { // if we are changing directions, don’t move on this tick
-
destX = creature.GetPositionX();
-
destY = creature.GetPositionY();
-
destZ = creature.GetPositionZ();
-
running = urand(1,100) <= RUNNING_CHANCE_RANDOMMV;
i_nextMoveTime.Reset(urand(500, 10000));
creature.AddUnitState(UNIT_STATE_ROAMING_MOVE);
Movement::MoveSplineInit init(creature);
init.MoveTo(destX, destY, destZ);
init.Launch();
//Call for creature group update