c'était un peu le bordel, notamment concernant la charge CPU qui s'envole et le flood dans la console.
Donc problème de calcul de vecteur ( y x z).. ..je test actuellement un Fix de @click/machia
si vous voulez le testez aussi et mettre les logs de crash si vous en avez.
(sur Debian lenny 5 quadcore 8giga) aucun crash mais un cpu qui monte a 7% 8631 pour 0.7% en 8384 (même nombres de joueurs) mais support de Vmaps différents.
voici le fix
Code PHP :
diff -r 9ef7fd6e110d src/server/collision/Management/VMapManager2.cpp
--- a/src/server/collision/Management/VMapManager2.cpp Fri Jun 18 04:17:21 2010 +0200
+++ b/src/server/collision/Management/VMapManager2.cpp Sat Jun 19 02:40:23 2010 +0200
@@ -303,7 +303,7 @@
delete worldmodel;
return NULL;
}
- std::cout << "VMapManager2: loading file '" << basepath << filename << "'.\n";
+// std::cout << "VMapManager2: loading file '" << basepath << filename << "'.\n";
model = iLoadedModelFiles.insert(std::pair<std::string, ManagedModel>(filename, ManagedModel())).first;
model->second.setModel(worldmodel);
}
@@ -321,7 +321,7 @@
}
if( model->second.decRefCount() == 0)
{
- std::cout << "VMapManager2: unloading file '" << filename << "'.\n";
+// std::cout << "VMapManager2: unloading file '" << filename << "'.\n";
delete model->second.getModel();
iLoadedModelFiles.erase(model);
}
diff -r 9ef7fd6e110d src/server/collision/Maps/MapTree.cpp
--- a/src/server/collision/Maps/MapTree.cpp Fri Jun 18 04:17:21 2010 +0200
+++ b/src/server/collision/Maps/MapTree.cpp Sat Jun 19 02:40:23 2010 +0200
@@ -146,35 +146,23 @@
bool StaticMapTree::isInLineOfSight(const Vector3& pos1, const Vector3& pos2) const
{
- bool result = false;
+ bool result = true;
float maxDist = (pos2 - pos1).magnitude();
// valid map coords should *never ever* produce float overflow, but this would produce NaNs too
-
- //ASSERT(maxDist < std::numeric_limits<float>::max());
-
+ ASSERT(maxDist < std::numeric_limits<float>::max());
// prevent NaN values which can cause BIH intersection to enter infinite loop
if (maxDist < 1e-10f)
return true;
// direction with length of 1
- G3D::Plane checkPlane = G3D::Plane((pos2 - pos1)/maxDist,pos1, pos2);
G3D::Ray ray = G3D::Ray::fromOriginAndDirection(pos1, (pos2 - pos1)/maxDist);
-
- Vector3 checkFinite = ray.intersection(checkPlane);
- if (!checkFinite.isFinite())
+ float resultDist = getIntersectionTime(ray, maxDist, true);
+ if (resultDist < maxDist)
{
- ray = G3D::Ray::fromOriginAndDirection(pos1, -((pos2 - pos1)/maxDist));
- checkFinite = ray.intersection(checkPlane);
- }
- if (checkFinite.isFinite())
- {
- float resultDist = getIntersectionTime(ray, maxDist, true);
- if (resultDist >= maxDist)
- {
- result = true;
- }
+ result = false;
}
return result;
}
+
//=========================================================
/**
When moving from pos1 to pos2 check if we hit an object. Return true and the position if we hit one
diff -r 9ef7fd6e110d src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp
--- a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp Fri Jun 18 04:17:21 2010 +0200
+++ b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp Sat Jun 19 02:40:23 2010 +0200
@@ -51,15 +51,13 @@
for (uint8 idx = 0; idx <= MAX_CONF_WAYPOINTS; ++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;
+
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
+ if (!isInLoS)
{
i_waypoints[idx][0] = x;
i_waypoints[idx][1] = y;
Édition :
test terminé.