Visual Debugger implementation

This commit is contained in:
Jett 2022-09-04 11:47:53 +01:00
parent 14d4bf3cc5
commit f3ace4e7ed
39 changed files with 334 additions and 92 deletions

3
.gitmodules vendored
View File

@ -23,3 +23,6 @@
[submodule "thirdparty/AccountManager"] [submodule "thirdparty/AccountManager"]
path = thirdparty/AccountManager path = thirdparty/AccountManager
url = https://github.com/DarkflameUniverse/AccountManager url = https://github.com/DarkflameUniverse/AccountManager
[submodule "thirdparty/raylib"]
path = thirdparty/raylib
url = https://github.com/raysan5/raylib

View File

@ -39,6 +39,9 @@ endforeach()
# Set the version # Set the version
set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
# Set our compile options
option(BUILD_VISUAL_DEBUGGER "Toggle for building visual debugger (default off)" OFF)
# Echo the version # Echo the version
message(STATUS "Version: ${PROJECT_VERSION}") message(STATUS "Version: ${PROJECT_VERSION}")
@ -140,6 +143,7 @@ set(INCLUDED_DIRECTORIES
"dDatabase/Tables" "dDatabase/Tables"
"dNet" "dNet"
"dScripts" "dScripts"
"dWorldServer"
"thirdparty/raknet/Source" "thirdparty/raknet/Source"
"thirdparty/tinyxml2" "thirdparty/tinyxml2"
@ -216,6 +220,10 @@ add_subdirectory(dZoneManager)
add_subdirectory(dNavigation) add_subdirectory(dNavigation)
add_subdirectory(dPhysics) add_subdirectory(dPhysics)
if (BUILD_VISUAL_DEBUGGER)
add_subdirectory(dVisualDebugger)
endif()
# Create a list of common libraries shared between all binaries # Create a list of common libraries shared between all binaries
set(COMMON_LIBRARIES "dCommon" "dDatabase" "dNet" "raknet" "mariadbConnCpp") set(COMMON_LIBRARIES "dCommon" "dDatabase" "dNet" "raknet" "mariadbConnCpp")

View File

@ -14,6 +14,9 @@ std::vector<MetricVariable> Metrics::m_Variables = {
MetricVariable::CPUTime, MetricVariable::CPUTime,
MetricVariable::Sleep, MetricVariable::Sleep,
MetricVariable::Frame, MetricVariable::Frame,
#ifdef BUILD_VISUAL_DEBUGGER
MetricVariable::VisualDebugger,
#endif
}; };
void Metrics::AddMeasurement(MetricVariable variable, int64_t value) { void Metrics::AddMeasurement(MetricVariable variable, int64_t value) {
@ -132,7 +135,10 @@ std::string Metrics::MetricVariableToString(MetricVariable variable) {
return "Frame"; return "Frame";
case MetricVariable::Ghosting: case MetricVariable::Ghosting:
return "Ghosting"; return "Ghosting";
#ifdef BUILD_VISUAL_DEBUGGER
case MetricVariable::VisualDebugger:
return "VisualDebugger";
#endif
default: default:
return "Invalid"; return "Invalid";
} }

View File

@ -20,6 +20,9 @@ enum class MetricVariable : int32_t
CPUTime, CPUTime,
Sleep, Sleep,
Frame, Frame,
#ifdef BUILD_VISUAL_DEBUGGER
VisualDebugger
#endif
}; };
struct Metric struct Metric

View File

@ -80,13 +80,13 @@ float NiPoint3::SquaredLength(void) const {
} }
//! Returns the dot product of the vector dotted with another vector //! Returns the dot product of the vector dotted with another vector
float NiPoint3::DotProduct(const Vector3& vec) const { float NiPoint3::DotProduct(const NiPoint3& vec) const {
return ((this->x * vec.x) + (this->y * vec.y) + (this->z * vec.z)); return ((this->x * vec.x) + (this->y * vec.y) + (this->z * vec.z));
} }
//! Returns the cross product of the vector crossed with another vector //! Returns the cross product of the vector crossed with another vector
Vector3 NiPoint3::CrossProduct(const Vector3& vec) const { NiPoint3 NiPoint3::CrossProduct(const NiPoint3& vec) const {
return Vector3(((this->y * vec.z) - (this->z * vec.y)), return NiPoint3(((this->y * vec.z) - (this->z * vec.y)),
((this->z * vec.x) - (this->x * vec.z)), ((this->z * vec.x) - (this->x * vec.z)),
((this->x * vec.y) - (this->y * vec.x))); ((this->x * vec.y) - (this->y * vec.x)));
} }
@ -171,7 +171,7 @@ bool NiPoint3::IsWithinAxisAlignedBox(const NiPoint3& minPoint, const NiPoint3&
//! Checks to see if the point (or vector) is within a sphere //! Checks to see if the point (or vector) is within a sphere
bool NiPoint3::IsWithinSpehere(const NiPoint3& sphereCenter, float radius) { bool NiPoint3::IsWithinSpehere(const NiPoint3& sphereCenter, float radius) {
Vector3 diffVec = Vector3(x - sphereCenter.GetX(), y - sphereCenter.GetY(), z - sphereCenter.GetZ()); NiPoint3 diffVec = NiPoint3(x - sphereCenter.GetX(), y - sphereCenter.GetY(), z - sphereCenter.GetZ());
return (diffVec.SquaredLength() <= (radius * radius)); return (diffVec.SquaredLength() <= (radius * radius));
} }
@ -226,7 +226,7 @@ NiPoint3 NiPoint3::MoveTowards(const NiPoint3& current, const NiPoint3& target,
//This code is yoinked from the MS XNA code, so it should be right, even if it's horrible. //This code is yoinked from the MS XNA code, so it should be right, even if it's horrible.
NiPoint3 NiPoint3::RotateByQuaternion(const NiQuaternion& rotation) { NiPoint3 NiPoint3::RotateByQuaternion(const NiQuaternion& rotation) {
Vector3 vector; NiPoint3 vector;
float num12 = rotation.x + rotation.x; float num12 = rotation.x + rotation.x;
float num2 = rotation.y + rotation.y; float num2 = rotation.y + rotation.y;
float num = rotation.z + rotation.z; float num = rotation.z + rotation.z;

View File

@ -7,7 +7,6 @@
class NiPoint3; class NiPoint3;
class NiQuaternion; class NiQuaternion;
typedef NiPoint3 Vector3; //!< The Vector3 class is technically the NiPoint3 class, but typedef'd for clarity in some cases
//! A custom class the defines a point in space //! A custom class the defines a point in space
class NiPoint3 { class NiPoint3 {
@ -102,14 +101,14 @@ public:
\param vec The second vector \param vec The second vector
\return The dot product of the two vectors \return The dot product of the two vectors
*/ */
float DotProduct(const Vector3& vec) const; float DotProduct(const NiPoint3& vec) const;
//! Returns the cross product of the vector crossed with another vector //! Returns the cross product of the vector crossed with another vector
/*! /*!
\param vec The second vector \param vec The second vector
\return The cross product of the two vectors \return The cross product of the two vectors
*/ */
Vector3 CrossProduct(const Vector3& vec) const; NiPoint3 CrossProduct(const NiPoint3& vec) const;
//! Unitize the vector //! Unitize the vector
/*! /*!

View File

@ -72,22 +72,22 @@ void NiQuaternion::SetZ(float z) {
// MARK: Member Functions // MARK: Member Functions
//! Returns the forward vector from the quaternion //! Returns the forward vector from the quaternion
Vector3 NiQuaternion::GetForwardVector(void) const { NiPoint3 NiQuaternion::GetForwardVector(void) const {
return Vector3(2 * (x * z + w * y), 2 * (y * z - w * x), 1 - 2 * (x * x + y * y)); return NiPoint3(2 * (x * z + w * y), 2 * (y * z - w * x), 1 - 2 * (x * x + y * y));
} }
//! Returns the up vector from the quaternion //! Returns the up vector from the quaternion
Vector3 NiQuaternion::GetUpVector(void) const { NiPoint3 NiQuaternion::GetUpVector(void) const {
return Vector3(2 * (x * y - w * z), 1 - 2 * (x * x + z * z), 2 * (y * z + w * x)); return NiPoint3(2 * (x * y - w * z), 1 - 2 * (x * x + z * z), 2 * (y * z + w * x));
} }
//! Returns the right vector from the quaternion //! Returns the right vector from the quaternion
Vector3 NiQuaternion::GetRightVector(void) const { NiPoint3 NiQuaternion::GetRightVector(void) const {
return Vector3(1 - 2 * (y * y + z * z), 2 * (x * y + w * z), 2 * (x * z - w * y)); return NiPoint3(1 - 2 * (y * y + z * z), 2 * (x * y + w * z), 2 * (x * z - w * y));
} }
Vector3 NiQuaternion::GetEulerAngles() const { NiPoint3 NiQuaternion::GetEulerAngles() const {
Vector3 angles; NiPoint3 angles;
// roll (x-axis rotation) // roll (x-axis rotation)
const float sinr_cosp = 2 * (w * x + y * z); const float sinr_cosp = 2 * (w * x + y * z);
@ -164,7 +164,7 @@ NiQuaternion NiQuaternion::LookAtUnlocked(const NiPoint3& sourcePoint, const NiP
} }
//! Creates a Quaternion from a specific axis and angle relative to that axis //! Creates a Quaternion from a specific axis and angle relative to that axis
NiQuaternion NiQuaternion::CreateFromAxisAngle(const Vector3& axis, float angle) { NiQuaternion NiQuaternion::CreateFromAxisAngle(const NiPoint3& axis, float angle) {
float halfAngle = angle * 0.5f; float halfAngle = angle * 0.5f;
float s = static_cast<float>(sin(halfAngle)); float s = static_cast<float>(sin(halfAngle));

View File

@ -9,7 +9,6 @@
*/ */
class NiQuaternion; class NiQuaternion;
typedef NiQuaternion Quaternion; //!< A typedef for a shorthand version of NiQuaternion
//! A class that defines a rotation in space //! A class that defines a rotation in space
class NiQuaternion { class NiQuaternion {
@ -95,21 +94,21 @@ public:
/*! /*!
\return The forward vector of the quaternion \return The forward vector of the quaternion
*/ */
Vector3 GetForwardVector(void) const; NiPoint3 GetForwardVector(void) const;
//! Returns the up vector from the quaternion //! Returns the up vector from the quaternion
/*! /*!
\return The up vector fo the quaternion \return The up vector fo the quaternion
*/ */
Vector3 GetUpVector(void) const; NiPoint3 GetUpVector(void) const;
//! Returns the right vector from the quaternion //! Returns the right vector from the quaternion
/*! /*!
\return The right vector of the quaternion \return The right vector of the quaternion
*/ */
Vector3 GetRightVector(void) const; NiPoint3 GetRightVector(void) const;
Vector3 GetEulerAngles() const; NiPoint3 GetEulerAngles() const;
// MARK: Operators // MARK: Operators
@ -145,7 +144,7 @@ public:
\param angle The angle relative to this axis \param angle The angle relative to this axis
\return A quaternion created from the axis and angle \return A quaternion created from the axis and angle
*/ */
static NiQuaternion CreateFromAxisAngle(const Vector3& axis, float angle); static NiQuaternion CreateFromAxisAngle(const NiPoint3& axis, float angle);
static NiQuaternion FromEulerAngles(const NiPoint3& eulerAngles); static NiQuaternion FromEulerAngles(const NiPoint3& eulerAngles);
}; };

View File

@ -48,7 +48,9 @@ const uint64_t LWOZONEID_INVALID = 0; //!< Invalid LWOZONEID
typedef std::set<LWOOBJID> TSetObjID; typedef std::set<LWOOBJID> TSetObjID;
const float PI = 3.14159f; #ifndef PI
#define PI 3.14159265358979323846f
#endif
#if defined(__unix) || defined(__APPLE__) #if defined(__unix) || defined(__APPLE__)
//For Linux: //For Linux:

View File

@ -54,7 +54,7 @@ void AreaOfEffectBehavior::Calculate(BehaviorContext* context, RakNet::BitStream
auto* presetTarget = EntityManager::Instance()->GetEntity(branch.target); auto* presetTarget = EntityManager::Instance()->GetEntity(branch.target);
if (presetTarget != nullptr) { if (presetTarget != nullptr) {
if (this->m_radius * this->m_radius >= Vector3::DistanceSquared(reference, presetTarget->GetPosition())) { if (this->m_radius * this->m_radius >= NiPoint3::DistanceSquared(reference, presetTarget->GetPosition())) {
targets.push_back(presetTarget); targets.push_back(presetTarget);
} }
} }
@ -90,7 +90,7 @@ void AreaOfEffectBehavior::Calculate(BehaviorContext* context, RakNet::BitStream
continue; continue;
} }
const auto distance = Vector3::DistanceSquared(reference, entity->GetPosition()); const auto distance = NiPoint3::DistanceSquared(reference, entity->GetPosition());
if (this->m_radius * this->m_radius >= distance && (this->m_maxTargets == 0 || targets.size() < this->m_maxTargets)) { if (this->m_radius * this->m_radius >= distance && (this->m_maxTargets == 0 || targets.size() < this->m_maxTargets)) {
targets.push_back(entity); targets.push_back(entity);
@ -98,8 +98,8 @@ void AreaOfEffectBehavior::Calculate(BehaviorContext* context, RakNet::BitStream
} }
std::sort(targets.begin(), targets.end(), [reference](Entity* a, Entity* b) { std::sort(targets.begin(), targets.end(), [reference](Entity* a, Entity* b) {
const auto aDistance = Vector3::DistanceSquared(a->GetPosition(), reference); const auto aDistance = NiPoint3::DistanceSquared(a->GetPosition(), reference);
const auto bDistance = Vector3::DistanceSquared(b->GetPosition(), reference); const auto bDistance = NiPoint3::DistanceSquared(b->GetPosition(), reference);
return aDistance > bDistance; return aDistance > bDistance;
}); });

View File

@ -78,7 +78,7 @@ void ProjectileAttackBehavior::Calculate(BehaviorContext* context, RakNet::BitSt
const auto position = entity->GetPosition() + this->m_offset; const auto position = entity->GetPosition() + this->m_offset;
const auto distance = Vector3::Distance(position, other->GetPosition()); const auto distance = NiPoint3::Distance(position, other->GetPosition());
const auto time = distance / this->m_projectileSpeed; const auto time = distance / this->m_projectileSpeed;

View File

@ -154,19 +154,19 @@ void TacArcBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitS
// reference is the position of the caster. // reference is the position of the caster.
// If we cast a ray forward from the caster, does it come within m_farWidth of the target? // If we cast a ray forward from the caster, does it come within m_farWidth of the target?
const auto distance = Vector3::Distance(reference, otherPosition); const auto distance = NiPoint3::Distance(reference, otherPosition);
if (m_method == 2) { if (m_method == 2) {
NiPoint3 rayPoint = casterPosition + forward * distance; NiPoint3 rayPoint = casterPosition + forward * distance;
if (m_farWidth > 0 && Vector3::DistanceSquared(rayPoint, otherPosition) > this->m_farWidth * this->m_farWidth) { if (m_farWidth > 0 && NiPoint3::DistanceSquared(rayPoint, otherPosition) > this->m_farWidth * this->m_farWidth) {
continue; continue;
} }
} }
auto normalized = (reference - otherPosition) / distance; auto normalized = (reference - otherPosition) / distance;
const float degreeAngle = std::abs(Vector3::Angle(forward, normalized) * (180 / 3.14) - 180); const float degreeAngle = std::abs(NiPoint3::Angle(forward, normalized) * (180 / 3.14) - 180);
if (distance >= this->m_minDistance && this->m_maxDistance >= distance && degreeAngle <= 2 * this->m_angle) { if (distance >= this->m_minDistance && this->m_maxDistance >= distance && degreeAngle <= 2 * this->m_angle) {
targets.push_back(entity); targets.push_back(entity);
@ -174,8 +174,8 @@ void TacArcBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitS
} }
std::sort(targets.begin(), targets.end(), [reference](Entity* a, Entity* b) { std::sort(targets.begin(), targets.end(), [reference](Entity* a, Entity* b) {
const auto aDistance = Vector3::DistanceSquared(reference, a->GetPosition()); const auto aDistance = NiPoint3::DistanceSquared(reference, a->GetPosition());
const auto bDistance = Vector3::DistanceSquared(reference, b->GetPosition()); const auto bDistance = NiPoint3::DistanceSquared(reference, b->GetPosition());
return aDistance > bDistance; return aDistance > bDistance;
}); });

View File

@ -23,7 +23,7 @@ void VerifyBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitS
return; return;
} }
const auto distance = Vector3::DistanceSquared(self->GetPosition(), entity->GetPosition()); const auto distance = NiPoint3::DistanceSquared(self->GetPosition(), entity->GetPosition());
if (distance > this->m_range * this->m_range) { if (distance > this->m_range * this->m_range) {
success = false; success = false;

View File

@ -402,7 +402,7 @@ LWOOBJID BaseCombatAIComponent::FindTarget() {
if (target != nullptr && !m_DirtyThreat) { if (target != nullptr && !m_DirtyThreat) {
const auto targetPosition = target->GetPosition(); const auto targetPosition = target->GetPosition();
if (Vector3::DistanceSquared(targetPosition, m_StartPosition) < m_HardTetherRadius * m_HardTetherRadius) { if (NiPoint3::DistanceSquared(targetPosition, m_StartPosition) < m_HardTetherRadius * m_HardTetherRadius) {
return m_Target; return m_Target;
} }
@ -433,7 +433,7 @@ LWOOBJID BaseCombatAIComponent::FindTarget() {
const auto maxDistanceSquared = m_HardTetherRadius * m_HardTetherRadius; const auto maxDistanceSquared = m_HardTetherRadius * m_HardTetherRadius;
if (Vector3::DistanceSquared(targetPosition, m_StartPosition) > maxDistanceSquared) { if (NiPoint3::DistanceSquared(targetPosition, m_StartPosition) > maxDistanceSquared) {
if (threat > 0) { if (threat > 0) {
SetThreat(entry, 0); SetThreat(entry, 0);
} }
@ -448,7 +448,7 @@ LWOOBJID BaseCombatAIComponent::FindTarget() {
continue; continue;
} }
const auto proximityThreat = -(Vector3::DistanceSquared(targetPosition, reference) - maxDistanceSquared) / 100; // Proximity threat takes last priority const auto proximityThreat = -(NiPoint3::DistanceSquared(targetPosition, reference) - maxDistanceSquared) / 100; // Proximity threat takes last priority
if (proximityThreat > biggestThreat) { if (proximityThreat > biggestThreat) {
biggestThreat = proximityThreat; biggestThreat = proximityThreat;
@ -477,7 +477,7 @@ LWOOBJID BaseCombatAIComponent::FindTarget() {
const auto targetPosition = entity->GetPosition(); const auto targetPosition = entity->GetPosition();
if (Vector3::DistanceSquared(targetPosition, m_StartPosition) > m_HardTetherRadius * m_HardTetherRadius) { if (NiPoint3::DistanceSquared(targetPosition, m_StartPosition) > m_HardTetherRadius * m_HardTetherRadius) {
deadThreats.push_back(threatTarget.first); deadThreats.push_back(threatTarget.first);
continue; continue;
@ -508,7 +508,7 @@ std::vector<LWOOBJID> BaseCombatAIComponent::GetTargetWithinAggroRange() const {
for (auto id : m_Parent->GetTargetsInPhantom()) { for (auto id : m_Parent->GetTargetsInPhantom()) {
auto* other = EntityManager::Instance()->GetEntity(id); auto* other = EntityManager::Instance()->GetEntity(id);
const auto distance = Vector3::DistanceSquared(m_Parent->GetPosition(), other->GetPosition()); const auto distance = NiPoint3::DistanceSquared(m_Parent->GetPosition(), other->GetPosition());
if (distance > m_AggroRadius * m_AggroRadius) continue; if (distance > m_AggroRadius * m_AggroRadius) continue;
@ -657,7 +657,7 @@ void BaseCombatAIComponent::Wander() {
destination.y = dpWorld::Instance().GetNavMesh()->GetHeightAtPoint(destination); destination.y = dpWorld::Instance().GetNavMesh()->GetHeightAtPoint(destination);
} }
if (Vector3::DistanceSquared(destination, m_MovementAI->GetCurrentPosition()) < 2 * 2) { if (NiPoint3::DistanceSquared(destination, m_MovementAI->GetCurrentPosition()) < 2 * 2) {
m_MovementAI->Stop(); m_MovementAI->Stop();
return; return;
@ -685,16 +685,16 @@ void BaseCombatAIComponent::OnAggro() {
NiPoint3 currentPos = m_MovementAI->GetCurrentPosition(); NiPoint3 currentPos = m_MovementAI->GetCurrentPosition();
// If the player's position is within range, attack // If the player's position is within range, attack
if (Vector3::DistanceSquared(currentPos, targetPos) <= m_AttackRadius * m_AttackRadius) { if (NiPoint3::DistanceSquared(currentPos, targetPos) <= m_AttackRadius * m_AttackRadius) {
m_MovementAI->Stop(); m_MovementAI->Stop();
} else if (Vector3::DistanceSquared(m_StartPosition, targetPos) > m_HardTetherRadius * m_HardTetherRadius) //Return to spawn if we're too far } else if (NiPoint3::DistanceSquared(m_StartPosition, targetPos) > m_HardTetherRadius * m_HardTetherRadius) //Return to spawn if we're too far
{ {
m_MovementAI->SetSpeed(m_PursuitSpeed); m_MovementAI->SetSpeed(m_PursuitSpeed);
m_MovementAI->SetDestination(m_StartPosition); m_MovementAI->SetDestination(m_StartPosition);
} else //Chase the player's new position } else //Chase the player's new position
{ {
if (IsMech() && Vector3::DistanceSquared(targetPos, currentPos) > m_AttackRadius * m_AttackRadius * 3 * 3) return; if (IsMech() && NiPoint3::DistanceSquared(targetPos, currentPos) > m_AttackRadius * m_AttackRadius * 3 * 3) return;
m_MovementAI->SetSpeed(m_PursuitSpeed); m_MovementAI->SetSpeed(m_PursuitSpeed);
@ -718,9 +718,9 @@ void BaseCombatAIComponent::OnTether() {
NiPoint3 targetPos = target->GetPosition(); NiPoint3 targetPos = target->GetPosition();
NiPoint3 currentPos = m_MovementAI->ApproximateLocation(); NiPoint3 currentPos = m_MovementAI->ApproximateLocation();
if (Vector3::DistanceSquared(currentPos, targetPos) <= m_AttackRadius * m_AttackRadius) { if (NiPoint3::DistanceSquared(currentPos, targetPos) <= m_AttackRadius * m_AttackRadius) {
m_MovementAI->Stop(); m_MovementAI->Stop();
} else if (Vector3::DistanceSquared(m_StartPosition, targetPos) > m_HardTetherRadius * m_HardTetherRadius) //Return to spawn if we're too far } else if (NiPoint3::DistanceSquared(m_StartPosition, targetPos) > m_HardTetherRadius * m_HardTetherRadius) //Return to spawn if we're too far
{ {
m_MovementAI->SetSpeed(m_PursuitSpeed); m_MovementAI->SetSpeed(m_PursuitSpeed);
@ -728,7 +728,7 @@ void BaseCombatAIComponent::OnTether() {
m_State = AiState::aggro; m_State = AiState::aggro;
} else { } else {
if (IsMech() && Vector3::DistanceSquared(targetPos, currentPos) > m_AttackRadius * m_AttackRadius * 3 * 3) return; if (IsMech() && NiPoint3::DistanceSquared(targetPos, currentPos) > m_AttackRadius * m_AttackRadius * 3 * 3) return;
m_MovementAI->SetSpeed(m_PursuitSpeed); m_MovementAI->SetSpeed(m_PursuitSpeed);

View File

@ -815,7 +815,7 @@ void InventoryComponent::EquipItem(Item* item, const bool skipChecks) {
const auto position = m_Parent->GetPosition(); const auto position = m_Parent->GetPosition();
for (auto* lauchPad : rocketLauchPads) { for (auto* lauchPad : rocketLauchPads) {
if (Vector3::DistanceSquared(lauchPad->GetPosition(), position) > 13 * 13) continue; if (NiPoint3::DistanceSquared(lauchPad->GetPosition(), position) > 13 * 13) continue;
auto* characterComponent = m_Parent->GetComponent<CharacterComponent>(); auto* characterComponent = m_Parent->GetComponent<CharacterComponent>();

View File

@ -55,7 +55,7 @@ void MovementAIComponent::Update(const float deltaTime) {
SetPosition(source + velocity); SetPosition(source + velocity);
if (Vector3::DistanceSquared(GetCurrentPosition(), m_PullPoint) < 2 * 2) { if (NiPoint3::DistanceSquared(GetCurrentPosition(), m_PullPoint) < 2 * 2) {
m_Interrupted = false; m_Interrupted = false;
} }
@ -68,7 +68,7 @@ void MovementAIComponent::Update(const float deltaTime) {
} }
if (m_HaltDistance > 0) { if (m_HaltDistance > 0) {
if (Vector3::DistanceSquared(ApproximateLocation(), GetDestination()) < m_HaltDistance * m_HaltDistance) // Prevent us from hugging the target if (NiPoint3::DistanceSquared(ApproximateLocation(), GetDestination()) < m_HaltDistance * m_HaltDistance) // Prevent us from hugging the target
{ {
Stop(); Stop();
@ -373,7 +373,7 @@ void MovementAIComponent::SetDestination(const NiPoint3& value) {
return; return;
} }
/*if (Vector3::DistanceSquared(value, GetDestination()) < 2 * 2) /*if (NiPoint3::DistanceSquared(value, GetDestination()) < 2 * 2)
{ {
return; return;
}*/ }*/

View File

@ -177,7 +177,7 @@ void MovingPlatformComponent::StartPathing() {
SetMovementState(MovementPlatformState::Moving); SetMovementState(MovementPlatformState::Moving);
}); });
const auto travelTime = Vector3::Distance(targetPosition, subComponent->mPosition) / subComponent->mSpeed + 1.5f; const auto travelTime = NiPoint3::Distance(targetPosition, subComponent->mPosition) / subComponent->mSpeed + 1.5f;
const auto travelNext = subComponent->mWaitTime + travelTime; const auto travelNext = subComponent->mWaitTime + travelTime;
@ -285,7 +285,7 @@ void MovingPlatformComponent::ContinuePathing() {
SetMovementState(MovementPlatformState::Moving); SetMovementState(MovementPlatformState::Moving);
}); });
auto travelTime = Vector3::Distance(targetPosition, subComponent->mPosition) / subComponent->mSpeed + 1.5; auto travelTime = NiPoint3::Distance(targetPosition, subComponent->mPosition) / subComponent->mSpeed + 1.5;
if (m_Parent->GetLOT() == 9483) { if (m_Parent->GetLOT() == 9483) {
travelTime += 20; travelTime += 20;

View File

@ -400,7 +400,7 @@ void PetComponent::Update(float deltaTime) {
auto destination = owner->GetPosition(); auto destination = owner->GetPosition();
NiPoint3 position = m_MovementAI->GetCurrentPosition(); NiPoint3 position = m_MovementAI->GetCurrentPosition();
float distanceToOwner = Vector3::DistanceSquared(position, destination); float distanceToOwner = NiPoint3::DistanceSquared(position, destination);
if (distanceToOwner > 50 * 50 || m_TimerAway > 5) { if (distanceToOwner > 50 * 50 || m_TimerAway > 5) {
m_MovementAI->Warp(destination); m_MovementAI->Warp(destination);
@ -430,7 +430,7 @@ void PetComponent::Update(float deltaTime) {
if (closestSwitch != nullptr) { if (closestSwitch != nullptr) {
if (!closestSwitch->GetActive()) { if (!closestSwitch->GetActive()) {
NiPoint3 switchPosition = closestSwitch->GetParentEntity()->GetPosition(); NiPoint3 switchPosition = closestSwitch->GetParentEntity()->GetPosition();
float distance = Vector3::DistanceSquared(position, switchPosition); float distance = NiPoint3::DistanceSquared(position, switchPosition);
if (distance < 3 * 3) { if (distance < 3 * 3) {
m_Interaction = closestSwitch->GetParentEntity()->GetObjectID(); m_Interaction = closestSwitch->GetParentEntity()->GetObjectID();
closestSwitch->EntityEnter(m_Parent); closestSwitch->EntityEnter(m_Parent);
@ -451,7 +451,7 @@ void PetComponent::Update(float deltaTime) {
} }
NiPoint3 tresurePosition = closestTresure->GetPosition(); NiPoint3 tresurePosition = closestTresure->GetPosition();
float distance = Vector3::DistanceSquared(position, tresurePosition); float distance = NiPoint3::DistanceSquared(position, tresurePosition);
if (distance < 3 * 3) { if (distance < 3 * 3) {
m_Interaction = closestTresure->GetObjectID(); m_Interaction = closestTresure->GetObjectID();
@ -825,7 +825,7 @@ void PetComponent::Wander() {
destination.y = dpWorld::Instance().GetNavMesh()->GetHeightAtPoint(destination); destination.y = dpWorld::Instance().GetNavMesh()->GetHeightAtPoint(destination);
} }
if (Vector3::DistanceSquared(destination, m_MovementAI->GetCurrentPosition()) < 2 * 2) { if (NiPoint3::DistanceSquared(destination, m_MovementAI->GetCurrentPosition()) < 2 * 2) {
m_MovementAI->Stop(); m_MovementAI->Stop();
return; return;

View File

@ -794,7 +794,7 @@ void RacingControlComponent::Update(float deltaTime) {
continue; continue;
} }
if (Vector3::DistanceSquared(position, vehiclePosition) > 50 * 50) { if (NiPoint3::DistanceSquared(position, vehiclePosition) > 50 * 50) {
++respawnIndex; ++respawnIndex;
continue; continue;

View File

@ -12,12 +12,12 @@ struct DynamicShootingGalleryParams {
/** /**
* The distance from the camera to the barrel * The distance from the camera to the barrel
*/ */
Vector3 cameraBarrelOffset; NiPoint3 cameraBarrelOffset;
/** /**
* The area the barrel is looking at * The area the barrel is looking at
*/ */
Vector3 facing; NiPoint3 facing;
/** /**
* The velocity of the cannonballs * The velocity of the cannonballs
@ -58,12 +58,12 @@ struct StaticShootingGalleryParams {
/** /**
* The position of the camera * The position of the camera
*/ */
Vector3 cameraPosition; NiPoint3 cameraPosition;
/** /**
* The position that the camera is looking at * The position that the camera is looking at
*/ */
Vector3 cameraLookatPosition; NiPoint3 cameraLookatPosition;
}; };
/** /**

View File

@ -314,9 +314,9 @@ void SkillComponent::CalculateUpdate(const float deltaTime) {
const auto targetPosition = target->GetPosition(); const auto targetPosition = target->GetPosition();
const auto closestPoint = Vector3::ClosestPointOnLine(entry.lastPosition, position, targetPosition); const auto closestPoint = NiPoint3::ClosestPointOnLine(entry.lastPosition, position, targetPosition);
const auto distance = Vector3::DistanceSquared(targetPosition, closestPoint); const auto distance = NiPoint3::DistanceSquared(targetPosition, closestPoint);
if (distance > 3 * 3) { if (distance > 3 * 3) {
/* /*
@ -328,7 +328,7 @@ void SkillComponent::CalculateUpdate(const float deltaTime) {
const auto homingTarget = rotation.GetForwardVector() * speed; const auto homingTarget = rotation.GetForwardVector() * speed;
Vector3 homing; NiPoint3 homing;
// Move towards // Move towards

View File

@ -108,7 +108,7 @@ SwitchComponent* SwitchComponent::GetClosestSwitch(NiPoint3 position) {
SwitchComponent* closest = nullptr; SwitchComponent* closest = nullptr;
for (SwitchComponent* petSwitch : petSwitches) { for (SwitchComponent* petSwitch : petSwitches) {
float distance = Vector3::DistanceSquared(petSwitch->m_Parent->GetPosition(), position); float distance = NiPoint3::DistanceSquared(petSwitch->m_Parent->GetPosition(), position);
if (closest == nullptr || distance < closestDistance) { if (closest == nullptr || distance < closestDistance) {
closestDistance = distance; closestDistance = distance;

View File

@ -4919,7 +4919,7 @@ void GameMessages::HandlePlayEmote(RakNet::BitStream* inStream, Entity* entity)
const auto& referencePoint = entity->GetPosition(); const auto& referencePoint = entity->GetPosition();
for (auto* scripted : scriptedEntities) { for (auto* scripted : scriptedEntities) {
if (Vector3::DistanceSquared(scripted->GetPosition(), referencePoint) > 5.0f * 5.0f) continue; if (NiPoint3::DistanceSquared(scripted->GetPosition(), referencePoint) > 5.0f * 5.0f) continue;
scripted->OnEmoteReceived(emoteID, entity); scripted->OnEmoteReceived(emoteID, entity);
} }

View File

@ -32,6 +32,8 @@ RawFile::RawFile(std::string fileName) {
m_Chunks.push_back(chunk); m_Chunks.push_back(chunk);
} }
m_FinalMesh = new RawMesh();
this->GenerateFinalMeshFromChunks(); this->GenerateFinalMeshFromChunks();
} }

View File

@ -11,6 +11,8 @@ public:
RawFile(std::string filePath); RawFile(std::string filePath);
~RawFile(); ~RawFile();
RawMesh* GetMesh() { return m_FinalMesh; }
private: private:
void GenerateFinalMeshFromChunks(); void GenerateFinalMeshFromChunks();
@ -23,5 +25,5 @@ private:
uint32_t m_Height; uint32_t m_Height;
std::vector<RawChunk*> m_Chunks; std::vector<RawChunk*> m_Chunks;
RawMesh* m_FinalMesh; RawMesh* m_FinalMesh = nullptr;
}; };

View File

@ -25,7 +25,7 @@ bool dpCollisionChecks::CheckSpheres(dpEntity* a, dpEntity* b) {
if (!a || !b) return false; if (!a || !b) return false;
auto posA = a->GetPosition(); auto posA = a->GetPosition();
auto distance = Vector3::DistanceSquared(posA, b->GetPosition()); auto distance = NiPoint3::DistanceSquared(posA, b->GetPosition());
auto sphereA = static_cast<dpShapeSphere*>(a->GetShape()); auto sphereA = static_cast<dpShapeSphere*>(a->GetShape());
auto sphereB = static_cast<dpShapeSphere*>(b->GetShape()); auto sphereB = static_cast<dpShapeSphere*>(b->GetShape());

View File

@ -32,6 +32,8 @@ public:
void RemoveEntity(dpEntity* entity); void RemoveEntity(dpEntity* entity);
dNavMesh* GetNavMesh() { return m_NavMesh; } dNavMesh* GetNavMesh() { return m_NavMesh; }
std::vector<dpEntity*>* GetStaticEntities() { return &m_StaticEntities; }
std::vector<dpEntity*>* GetDynamicEntities() { return &m_DynamicEntites; }
private: private:
dpGrid* m_Grid; dpGrid* m_Grid;

View File

@ -33,16 +33,16 @@ void AgLaserSensorServer::OnCollisionPhantom(Entity* self, Entity* target) {
const auto source = script->GetPosition(); const auto source = script->GetPosition();
const auto obj = self->GetObjectID(); const auto obj = self->GetObjectID();
if (obj == 76690936093053 && Vector3::DistanceSquared(source, NiPoint3(149.007f, 417.083f, 218.346f)) <= 1.0f) { if (obj == 76690936093053 && NiPoint3::DistanceSquared(source, NiPoint3(149.007f, 417.083f, 218.346f)) <= 1.0f) {
laser = script; laser = script;
break; break;
} else if (obj == 75866302318824 && Vector3::DistanceSquared(source, NiPoint3(48.6403f, 403.803f, 196.711f)) <= 1.0f) { } else if (obj == 75866302318824 && NiPoint3::DistanceSquared(source, NiPoint3(48.6403f, 403.803f, 196.711f)) <= 1.0f) {
laser = script; laser = script;
break; break;
} else if (obj == 75866302318822 && Vector3::DistanceSquared(source, NiPoint3(19.2155f, 420.083f, 249.226f)) <= 1.0f) { } else if (obj == 75866302318822 && NiPoint3::DistanceSquared(source, NiPoint3(19.2155f, 420.083f, 249.226f)) <= 1.0f) {
laser = script; laser = script;
break; break;
} else if (obj == 75866302318823 && Vector3::DistanceSquared(source, NiPoint3(-6.61596f, 404.633f, 274.323f)) <= 1.0f) { } else if (obj == 75866302318823 && NiPoint3::DistanceSquared(source, NiPoint3(-6.61596f, 404.633f, 274.323f)) <= 1.0f) {
laser = script; laser = script;
break; break;
} }

View File

@ -20,7 +20,7 @@ void ExplodingAsset::OnHit(Entity* self, Entity* attacker) {
if (!self->GetBoolean(u"bIsHit")) { if (!self->GetBoolean(u"bIsHit")) {
for (Entity* en : entities) { for (Entity* en : entities) {
if (en->GetObjectID() == attacker->GetObjectID()) { if (en->GetObjectID() == attacker->GetObjectID()) {
if (Vector3::DistanceSquared(en->GetPosition(), self->GetPosition()) > 10 * 10) continue; if (NiPoint3::DistanceSquared(en->GetPosition(), self->GetPosition()) > 10 * 10) continue;
auto* destroyable = en->GetComponent<DestroyableComponent>(); auto* destroyable = en->GetComponent<DestroyableComponent>();
if (destroyable == nullptr) { if (destroyable == nullptr) {

View File

@ -69,7 +69,7 @@ void MastTeleport::OnTimerDone(Entity* self, std::string timerName) {
const auto rads = degrees * (static_cast<float>(M_PI) / 180.0f); const auto rads = degrees * (static_cast<float>(M_PI) / 180.0f);
const Vector3 newPlayerRot = { 0, rads, 0 }; const NiPoint3 newPlayerRot = { 0, rads, 0 };
auto position = self->GetPosition(); auto position = self->GetPosition();

View File

@ -222,7 +222,7 @@ Entity* PetDigServer::GetClosestTresure(NiPoint3 position) {
if (tresure == nullptr) continue; if (tresure == nullptr) continue;
float distance = Vector3::DistanceSquared(tresure->GetPosition(), position); float distance = NiPoint3::DistanceSquared(tresure->GetPosition(), position);
if (closest == nullptr || distance < closestDistance) { if (closest == nullptr || distance < closestDistance) {
closestDistance = distance; closestDistance = distance;

View File

@ -21,19 +21,19 @@ void SGCannon::OnStartup(Entity* self) {
ResetVars(self); ResetVars(self);
self->SetVar<bool>(GameStartedVariable, false); self->SetVar<bool>(GameStartedVariable, false);
self->SetVar<Vector3>(InitialVelocityVariable, {}); self->SetVar<NiPoint3>(InitialVelocityVariable, {});
self->SetVar<uint32_t>(ImpactSkillVariale, constants.impactSkillID); self->SetVar<uint32_t>(ImpactSkillVariale, constants.impactSkillID);
auto* shootingGalleryComponent = self->GetComponent<ShootingGalleryComponent>(); auto* shootingGalleryComponent = self->GetComponent<ShootingGalleryComponent>();
if (shootingGalleryComponent != nullptr) { if (shootingGalleryComponent != nullptr) {
shootingGalleryComponent->SetStaticParams({ shootingGalleryComponent->SetStaticParams({
Vector3 { -327.8609924316406, 256.8999938964844, 1.6482199430465698 }, NiPoint3 { -327.8609924316406, 256.8999938964844, 1.6482199430465698 },
Vector3 { -181.4320068359375, 212.39999389648438, 2.5182199478149414 } NiPoint3 { -181.4320068359375, 212.39999389648438, 2.5182199478149414 }
}); });
shootingGalleryComponent->SetDynamicParams({ shootingGalleryComponent->SetDynamicParams({
Vector3 { 0.0, 4.3, 9.0 }, NiPoint3 { 0.0, 4.3, 9.0 },
Vector3 { }, NiPoint3 { },
129.0, 129.0,
800.0, 800.0,
30.0, 30.0,
@ -1030,17 +1030,17 @@ void SGCannon::ResetVars(Entity* self) {
SGConstants SGCannon::GetConstants() { SGConstants SGCannon::GetConstants() {
return { return {
Vector3 { -908.542480, 229.773178, -908.542480 }, NiPoint3 { -908.542480, 229.773178, -908.542480 },
Quaternion { 0.91913521289825, 0, 0.39394217729568, 0 }, NiQuaternion { 0.91913521289825, 0, 0.39394217729568, 0 },
1864, 1864,
34, 34,
1822, 1822,
Vector3 { 6.652, -2, 1.5 }, NiPoint3 { 6.652, -2, 1.5 },
157, 157,
129.0, 129.0,
30.0, 30.0,
800.0, 800.0,
Vector3 { 0, 4.3, 9 }, NiPoint3 { 0, 4.3, 9 },
6297, 6297,
1822, 1822,
249, 249,

View File

@ -21,17 +21,17 @@ struct SGEnemy {
}; };
struct SGConstants { struct SGConstants {
Vector3 playerStartPosition; NiPoint3 playerStartPosition;
Quaternion playerStartRotation; NiQuaternion playerStartRotation;
LOT cannonLot; LOT cannonLot;
uint32_t impactSkillID; uint32_t impactSkillID;
LOT projectileLot; LOT projectileLot;
Vector3 playerOffset; NiPoint3 playerOffset;
uint32_t rewardModelMatrix; uint32_t rewardModelMatrix;
float_t cannonVelocity; float_t cannonVelocity;
float_t cannonMinDistance; float_t cannonMinDistance;
float_t cannonRefireRate; float_t cannonRefireRate;
Vector3 cannonBarrelOffset; NiPoint3 cannonBarrelOffset;
LOT cannonSuperchargedProjectileLot; LOT cannonSuperchargedProjectileLot;
LOT cannonProjectileLot; LOT cannonProjectileLot;
uint32_t cannonSuperChargeSkill; uint32_t cannonSuperChargeSkill;

View File

@ -0,0 +1,2 @@
add_library(dVisualDebugger dVisualDebugger.cpp)
target_link_libraries(dVisualDebugger raylib Recast Detour)

View File

@ -0,0 +1,150 @@
#include "dVisualDebugger.h"
#include <iostream>
#include "raylib.h"
#include "Game.h"
#include "dpWorld.h"
#include "dpEntity.h"
#include "dpShapeBox.h"
#include "dpShapeSphere.h"
#include "EntityManager.h"
#include "PerformanceManager.h"
#include "dTerrain/RawFile.h"
#include "dTerrain/RawMesh.h"
#include "SimplePhysicsComponent.h"
#include "dZoneManager.h"
inline Vector3 NiPointToVector3(NiPoint3 pos) { return { pos.x, pos.y, pos.z }; };
dVisualDebugger::dVisualDebugger(std::string zoneName) {
SetTraceLogLevel(LOG_FATAL);
InitWindow(m_Width, m_Height, ("dVisualDebugger: " + zoneName).c_str());
CreateCamera();
CreateInGameCamera();
std::string zonePath = dZoneManager::Instance()->GetZone()->GetFilePathForZoneID();
zonePath = zonePath.substr(0, zonePath.rfind('/') + 1);
zonePath += dZoneManager::Instance()->GetZone()->GetZoneRawPath();
m_Terrain = new RawFile(zonePath);
}
dVisualDebugger::~dVisualDebugger() {
if (m_Camera) delete m_Camera;
if (m_Terrain) delete m_Terrain;
}
void dVisualDebugger::CreateInGameCamera() {
EntityInfo info;
info.lot = m_CameraID;
info.pos = { m_Camera->position.x, m_Camera->position.y, m_Camera->position.z };
info.rot = NiQuaternion::LookAt(info.pos, { m_Camera->target.x, m_Camera->target.y, m_Camera->target.z });
info.spawner = nullptr;
info.spawnerID = 0;
info.spawnerNodeID = 0;
Entity* newEntity = EntityManager::Instance()->CreateEntity(info, nullptr);
m_CameraObjid = newEntity->GetObjectID();
EntityManager::Instance()->ConstructEntity(newEntity);
}
void dVisualDebugger::CreateCamera() {
Camera3D* camera = new Camera3D();
camera->position = { 0.f, 0.f, 0.f };
camera->target = { 0.f, 1.f, 0.f };
camera->up = { 0.f, 1.f, 0.f };
camera->fovy = 40.0f;
camera->projection = CAMERA_PERSPECTIVE;
m_Camera = camera;
SetCameraMode(*m_Camera, CAMERA_FIRST_PERSON);
float frameRateAprox = 1000 / PerformanceManager::GetServerFramerate();
SetTargetFPS((int32_t)frameRateAprox); // truncate exact frame rate
}
void dVisualDebugger::Step(float delta) {
if (WindowShouldClose()) {
CloseWindow();
exit(0); // Kill entire server, this is a dev tool at the end of the day
}
UpdateCamera(m_Camera);
this->AttachToCharacter();
if (IsKeyDown(KEY_SPACE)) m_BindToGM = !m_BindToGM;
delete m_Camera;
BeginDrawing();
ClearBackground(RAYWHITE);
BeginMode3D(*m_Camera);
this->RenderEntities(Game::physicsWorld->GetDynamicEntities(), true);
this->RenderEntities(Game::physicsWorld->GetStaticEntities(), false);
this->RenderTerrainMesh();
EndMode3D();
DrawText((std::to_string(m_Camera->position.x) + " " + std::to_string(m_Camera->position.y) + " " + std::to_string(m_Camera->position.z)).c_str(), 20, 20, 10, BLACK);
DrawFPS(10, 10);
EndDrawing();
}
void dVisualDebugger::AttachToCharacter() {
if (!m_BindToGM) return;
auto characters = EntityManager::Instance()->GetEntitiesByLOT(1);
if (characters.size() != 1) return;
m_Camera->position = NiPointToVector3(characters[0]->GetPosition());
m_Camera->target = NiPointToVector3(characters[0]->GetRotation().GetForwardVector());
// Reposition our camera
auto* camera = EntityManager::Instance()->GetEntity(m_CameraObjid);
if (!camera) return;
auto* physComp = camera->GetComponent<SimplePhysicsComponent>();
physComp->SetPosition(characters[0]->GetPosition());
physComp->SetRotation(characters[0]->GetRotation());
EntityManager::Instance()->SerializeEntity(camera);
}
void dVisualDebugger::RenderTerrainMesh() {
if (!m_Terrain->GetMesh()) return;
for (int i = 0; i < m_Terrain->GetMesh()->m_Triangles.size(); i += 3) {
auto v1 = m_Terrain->GetMesh()->m_Vertices[m_Terrain->GetMesh()->m_Triangles[i]];
auto v2 = m_Terrain->GetMesh()->m_Vertices[m_Terrain->GetMesh()->m_Triangles[i + 1]];
auto v3 = m_Terrain->GetMesh()->m_Vertices[m_Terrain->GetMesh()->m_Triangles[i + 2]];
DrawTriangle3D(NiPointToVector3(v1), NiPointToVector3(v2), NiPointToVector3(v3), GRAY);
}
}
void dVisualDebugger::RenderEntities(std::vector<dpEntity*>* entities, bool dynamic) {
auto colour = dynamic ? RED : BLUE;
for (auto* item : *entities) {
auto* shape = item->GetShape();
switch (shape->GetShapeType()) {
case dpShapeType::Box: {
auto box = static_cast<dpShapeBox*>(shape);
DrawCube(NiPointToVector3(item->GetPosition()), box->GetWidth(), box->GetHeight(), box->GetDepth(), colour);
break;
};
case dpShapeType::Sphere: {
auto sphere = static_cast<dpShapeSphere*>(shape);
DrawSphere(NiPointToVector3(item->GetPosition()), sphere->GetRadius(), colour);
break;
};
default: {
break; // We can ignore this
}
};
}
}

View File

@ -0,0 +1,33 @@
#pragma once
#include <cstdint>
#include <vector>
#include <string>
class Camera3D;
class dpEntity;
class RawFile;
class dVisualDebugger {
public:
dVisualDebugger(std::string zoneName);
~dVisualDebugger();
void Step(float delta);
void RenderEntities(std::vector<dpEntity*>* entities, bool dynamic);
void RenderTerrainMesh();
void AttachToCharacter();
private:
Camera3D* m_Camera;
RawFile* m_Terrain;
uint64_t m_CameraObjid;
bool m_BindToGM = false;
void CreateCamera();
void CreateInGameCamera();
const int32_t m_Width = 800;
const int32_t m_Height = 450;
const int32_t m_CameraID = 2181;
};

View File

@ -1,6 +1,17 @@
if (BUILD_VISUAL_DEBUGGER)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBUILD_VISUAL_DEBUGGER=1")
endif()
set(DWORLDSERVER_SOURCES "ObjectIDManager.cpp" set(DWORLDSERVER_SOURCES "ObjectIDManager.cpp"
"PerformanceManager.cpp" "PerformanceManager.cpp"
"WorldServer.cpp") "WorldServer.cpp")
add_executable(WorldServer ${DWORLDSERVER_SOURCES}) add_executable(WorldServer ${DWORLDSERVER_SOURCES})
target_link_libraries(WorldServer ${COMMON_LIBRARIES} dChatFilter dGame dZoneManager Detour Recast dPhysics tinyxml2 dNavigation)
set(DWORLDSERVER_LIBRARIES dChatFilter dGame dZoneManager Detour Recast dPhysics tinyxml2 dNavigation)
if (BUILD_VISUAL_DEBUGGER)
set(DWORLDSERVER_LIBRARIES ${DWORLDSERVER_LIBRARIES} dVisualDebugger raylib)
endif()
target_link_libraries(WorldServer ${COMMON_LIBRARIES} ${DWORLDSERVER_LIBRARIES})

View File

@ -56,6 +56,10 @@
#include "Player.h" #include "Player.h"
#include "PropertyManagementComponent.h" #include "PropertyManagementComponent.h"
#ifdef BUILD_VISUAL_DEBUGGER
#include "../dVisualDebugger/dVisualDebugger.h"
#endif
#include "ZCompression.h" #include "ZCompression.h"
namespace Game { namespace Game {
@ -66,6 +70,9 @@ namespace Game {
dChatFilter* chatFilter; dChatFilter* chatFilter;
dConfig* config; dConfig* config;
dLocale* locale; dLocale* locale;
#ifdef BUILD_VISUAL_DEBUGGER
dVisualDebugger* visualDebugger;
#endif
std::mt19937 randomEngine; std::mt19937 randomEngine;
RakPeerInterface* chatServer; RakPeerInterface* chatServer;
@ -237,7 +244,9 @@ int main(int argc, char** argv) {
Game::physicsWorld = &dpWorld::Instance(); //just in case some old code references it Game::physicsWorld = &dpWorld::Instance(); //just in case some old code references it
dZoneManager::Instance()->Initialize(LWOZONEID(zoneID, instanceID, cloneID)); dZoneManager::Instance()->Initialize(LWOZONEID(zoneID, instanceID, cloneID));
g_CloneID = cloneID; g_CloneID = cloneID;
#ifdef BUILD_VISUAL_DEBUGGER
Game::visualDebugger = new dVisualDebugger(dZoneManager::Instance()->GetZone()->GetZoneName());
#endif
// pre calculate the FDB checksum // pre calculate the FDB checksum
if (Game::config->GetValue("check_fdb") == "1") { if (Game::config->GetValue("check_fdb") == "1") {
std::ifstream fileStream; std::ifstream fileStream;
@ -347,6 +356,12 @@ int main(int argc, char** argv) {
Metrics::StartMeasurement(MetricVariable::UpdateSpawners); Metrics::StartMeasurement(MetricVariable::UpdateSpawners);
dZoneManager::Instance()->Update(deltaTime); dZoneManager::Instance()->Update(deltaTime);
Metrics::EndMeasurement(MetricVariable::UpdateSpawners); Metrics::EndMeasurement(MetricVariable::UpdateSpawners);
#ifdef BUILD_VISUAL_DEBUGGER
Metrics::StartMeasurement(MetricVariable::VisualDebugger);
Game::visualDebugger->Step(deltaTime);
Metrics::EndMeasurement(MetricVariable::VisualDebugger);
#endif
} }
Metrics::StartMeasurement(MetricVariable::PacketHandling); Metrics::StartMeasurement(MetricVariable::PacketHandling);

View File

@ -25,6 +25,11 @@ include(CMakeMariaDBLists.txt)
# Create our third party library objects # Create our third party library objects
add_subdirectory(raknet) add_subdirectory(raknet)
if(BUILD_VISUAL_DEBUGGER)
# If we are supposed to build the visual debugger include raylib
add_subdirectory(raylib)
endif()
# Download Backtrace if configured # Download Backtrace if configured
if(UNIX AND NOT APPLE) if(UNIX AND NOT APPLE)
include(FetchContent) include(FetchContent)