mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2024-11-26 23:47:21 +00:00
fix: Falling Off Edge in Pet Puzzle (#1584)
* FloatFix * game activity setting * Update dNavMesh.cpp --------- Co-authored-by: David Markowitz <EmosewaMC@gmail.com>
This commit is contained in:
parent
d8f079cb1b
commit
d6cac65a8d
@ -32,6 +32,8 @@
|
|||||||
#include "eGameMasterLevel.h"
|
#include "eGameMasterLevel.h"
|
||||||
#include "eMissionState.h"
|
#include "eMissionState.h"
|
||||||
#include "dNavMesh.h"
|
#include "dNavMesh.h"
|
||||||
|
#include "eGameActivity.h"
|
||||||
|
#include "eStateChangeType.h"
|
||||||
|
|
||||||
std::unordered_map<LWOOBJID, LWOOBJID> PetComponent::currentActivities{};
|
std::unordered_map<LWOOBJID, LWOOBJID> PetComponent::currentActivities{};
|
||||||
std::unordered_map<LWOOBJID, LWOOBJID> PetComponent::activePets{};
|
std::unordered_map<LWOOBJID, LWOOBJID> PetComponent::activePets{};
|
||||||
@ -210,24 +212,23 @@ void PetComponent::OnUse(Entity* originator) {
|
|||||||
if (dpWorld::IsLoaded()) {
|
if (dpWorld::IsLoaded()) {
|
||||||
NiPoint3 attempt = petPosition + forward * interactionDistance;
|
NiPoint3 attempt = petPosition + forward * interactionDistance;
|
||||||
|
|
||||||
float y = dpWorld::GetNavMesh()->GetHeightAtPoint(attempt);
|
NiPoint3 nearestPoint = dpWorld::GetNavMesh()->NearestPoint(attempt);
|
||||||
|
|
||||||
while (std::abs(y - petPosition.y) > 4 && interactionDistance > 10) {
|
while (std::abs(nearestPoint.y - petPosition.y) > 4 && interactionDistance > 10) {
|
||||||
const NiPoint3 forward = m_Parent->GetRotation().GetForwardVector();
|
const NiPoint3 forward = m_Parent->GetRotation().GetForwardVector();
|
||||||
|
|
||||||
attempt = originatorPosition + forward * interactionDistance;
|
attempt = originatorPosition + forward * interactionDistance;
|
||||||
|
|
||||||
y = dpWorld::GetNavMesh()->GetHeightAtPoint(attempt);
|
nearestPoint = dpWorld::GetNavMesh()->NearestPoint(attempt);
|
||||||
|
|
||||||
interactionDistance -= 0.5f;
|
interactionDistance -= 0.5f;
|
||||||
}
|
}
|
||||||
|
|
||||||
position = attempt;
|
position = nearestPoint;
|
||||||
} else {
|
} else {
|
||||||
position = petPosition + forward * interactionDistance;
|
position = petPosition + forward * interactionDistance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
auto rotation = NiQuaternion::LookAt(position, petPosition);
|
auto rotation = NiQuaternion::LookAt(position, petPosition);
|
||||||
|
|
||||||
GameMessages::SendNotifyPetTamingMinigame(
|
GameMessages::SendNotifyPetTamingMinigame(
|
||||||
@ -246,11 +247,11 @@ void PetComponent::OnUse(Entity* originator) {
|
|||||||
m_Parent->GetObjectID(),
|
m_Parent->GetObjectID(),
|
||||||
LWOOBJID_EMPTY,
|
LWOOBJID_EMPTY,
|
||||||
originator->GetObjectID(),
|
originator->GetObjectID(),
|
||||||
true,
|
false,
|
||||||
ePetTamingNotifyType::BEGIN,
|
ePetTamingNotifyType::BEGIN,
|
||||||
petPosition,
|
NiPoint3Constant::ZERO,
|
||||||
position,
|
NiPoint3Constant::ZERO,
|
||||||
rotation,
|
NiQuaternion(0.0f, 0.0f, 0.0f, 0.0f),
|
||||||
UNASSIGNED_SYSTEM_ADDRESS
|
UNASSIGNED_SYSTEM_ADDRESS
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -258,11 +259,18 @@ void PetComponent::OnUse(Entity* originator) {
|
|||||||
|
|
||||||
m_Tamer = originator->GetObjectID();
|
m_Tamer = originator->GetObjectID();
|
||||||
SetStatus(5);
|
SetStatus(5);
|
||||||
|
Game::entityManager->SerializeEntity(m_Parent);
|
||||||
|
|
||||||
currentActivities.insert_or_assign(m_Tamer, m_Parent->GetObjectID());
|
currentActivities.insert_or_assign(m_Tamer, m_Parent->GetObjectID());
|
||||||
|
|
||||||
// Notify the start of a pet taming minigame
|
// Notify the start of a pet taming minigame
|
||||||
m_Parent->GetScript()->OnNotifyPetTamingMinigame(m_Parent, originator, ePetTamingNotifyType::BEGIN);
|
m_Parent->GetScript()->OnNotifyPetTamingMinigame(m_Parent, originator, ePetTamingNotifyType::BEGIN);
|
||||||
|
|
||||||
|
auto* characterComponent = originator->GetComponent<CharacterComponent>();
|
||||||
|
if (characterComponent != nullptr) {
|
||||||
|
characterComponent->SetCurrentActivity(eGameActivity::PET_TAMING);
|
||||||
|
Game::entityManager->SerializeEntity(originator);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PetComponent::Update(float deltaTime) {
|
void PetComponent::Update(float deltaTime) {
|
||||||
@ -627,6 +635,11 @@ void PetComponent::RequestSetPetName(std::u16string name) {
|
|||||||
UNASSIGNED_SYSTEM_ADDRESS
|
UNASSIGNED_SYSTEM_ADDRESS
|
||||||
);
|
);
|
||||||
|
|
||||||
|
auto* characterComponent = tamer->GetComponent<CharacterComponent>();
|
||||||
|
if (characterComponent != nullptr) {
|
||||||
|
characterComponent->SetCurrentActivity(eGameActivity::NONE);
|
||||||
|
Game::entityManager->SerializeEntity(tamer);
|
||||||
|
}
|
||||||
GameMessages::SendTerminateInteraction(m_Tamer, eTerminateType::FROM_INTERACTION, m_Parent->GetObjectID());
|
GameMessages::SendTerminateInteraction(m_Tamer, eTerminateType::FROM_INTERACTION, m_Parent->GetObjectID());
|
||||||
|
|
||||||
auto* modelEntity = Game::entityManager->GetEntity(m_ModelId);
|
auto* modelEntity = Game::entityManager->GetEntity(m_ModelId);
|
||||||
@ -666,6 +679,11 @@ void PetComponent::ClientExitTamingMinigame(bool voluntaryExit) {
|
|||||||
UNASSIGNED_SYSTEM_ADDRESS
|
UNASSIGNED_SYSTEM_ADDRESS
|
||||||
);
|
);
|
||||||
|
|
||||||
|
auto* characterComponent = tamer->GetComponent<CharacterComponent>();
|
||||||
|
if (characterComponent != nullptr) {
|
||||||
|
characterComponent->SetCurrentActivity(eGameActivity::NONE);
|
||||||
|
Game::entityManager->SerializeEntity(tamer);
|
||||||
|
}
|
||||||
GameMessages::SendNotifyTamingModelLoadedOnServer(m_Tamer, tamer->GetSystemAddress());
|
GameMessages::SendNotifyTamingModelLoadedOnServer(m_Tamer, tamer->GetSystemAddress());
|
||||||
|
|
||||||
GameMessages::SendTerminateInteraction(m_Tamer, eTerminateType::FROM_INTERACTION, m_Parent->GetObjectID());
|
GameMessages::SendTerminateInteraction(m_Tamer, eTerminateType::FROM_INTERACTION, m_Parent->GetObjectID());
|
||||||
@ -712,6 +730,11 @@ void PetComponent::ClientFailTamingMinigame() {
|
|||||||
UNASSIGNED_SYSTEM_ADDRESS
|
UNASSIGNED_SYSTEM_ADDRESS
|
||||||
);
|
);
|
||||||
|
|
||||||
|
auto* characterComponent = tamer->GetComponent<CharacterComponent>();
|
||||||
|
if (characterComponent != nullptr) {
|
||||||
|
characterComponent->SetCurrentActivity(eGameActivity::NONE);
|
||||||
|
Game::entityManager->SerializeEntity(tamer);
|
||||||
|
}
|
||||||
GameMessages::SendNotifyTamingModelLoadedOnServer(m_Tamer, tamer->GetSystemAddress());
|
GameMessages::SendNotifyTamingModelLoadedOnServer(m_Tamer, tamer->GetSystemAddress());
|
||||||
|
|
||||||
GameMessages::SendTerminateInteraction(m_Tamer, eTerminateType::FROM_INTERACTION, m_Parent->GetObjectID());
|
GameMessages::SendTerminateInteraction(m_Tamer, eTerminateType::FROM_INTERACTION, m_Parent->GetObjectID());
|
||||||
|
@ -112,6 +112,31 @@ void dNavMesh::LoadNavmesh() {
|
|||||||
m_NavMesh = mesh;
|
m_NavMesh = mesh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NiPoint3 dNavMesh::NearestPoint(const NiPoint3& location, const float halfExtent) const {
|
||||||
|
NiPoint3 toReturn = location;
|
||||||
|
if (m_NavMesh != nullptr) {
|
||||||
|
float pos[3];
|
||||||
|
pos[0] = location.x;
|
||||||
|
pos[1] = location.y;
|
||||||
|
pos[2] = location.z;
|
||||||
|
|
||||||
|
dtPolyRef nearestRef = 0;
|
||||||
|
float polyPickExt[3] = { halfExtent, halfExtent, halfExtent };
|
||||||
|
float nearestPoint[3] = { 0.0f, 0.0f, 0.0f };
|
||||||
|
dtQueryFilter filter{};
|
||||||
|
|
||||||
|
auto hasPoly = m_NavQuery->findNearestPoly(pos, polyPickExt, &filter, &nearestRef, nearestPoint);
|
||||||
|
if (hasPoly != DT_SUCCESS) {
|
||||||
|
toReturn = location;
|
||||||
|
} else {
|
||||||
|
toReturn.x = nearestPoint[0];
|
||||||
|
toReturn.y = nearestPoint[1];
|
||||||
|
toReturn.z = nearestPoint[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return toReturn;
|
||||||
|
}
|
||||||
|
|
||||||
float dNavMesh::GetHeightAtPoint(const NiPoint3& location, const float halfExtentsHeight) const {
|
float dNavMesh::GetHeightAtPoint(const NiPoint3& location, const float halfExtentsHeight) const {
|
||||||
if (m_NavMesh == nullptr) {
|
if (m_NavMesh == nullptr) {
|
||||||
return location.y;
|
return location.y;
|
||||||
|
@ -21,7 +21,7 @@ public:
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the height at a point
|
* Get the height at a point
|
||||||
*
|
*
|
||||||
* @param location The location to check for height at. This is the center of the search area.
|
* @param location The location to check for height at. This is the center of the search area.
|
||||||
* @param halfExtentsHeight The half extents height of the search area. This is the distance from the center to the top and bottom of the search area.
|
* @param halfExtentsHeight The half extents height of the search area. This is the distance from the center to the top and bottom of the search area.
|
||||||
* The larger the value of halfExtentsHeight is, the larger the performance cost of the query.
|
* The larger the value of halfExtentsHeight is, the larger the performance cost of the query.
|
||||||
@ -29,7 +29,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
float GetHeightAtPoint(const NiPoint3& location, const float halfExtentsHeight = 32.0f) const;
|
float GetHeightAtPoint(const NiPoint3& location, const float halfExtentsHeight = 32.0f) const;
|
||||||
std::vector<NiPoint3> GetPath(const NiPoint3& startPos, const NiPoint3& endPos, float speed = 10.0f);
|
std::vector<NiPoint3> GetPath(const NiPoint3& startPos, const NiPoint3& endPos, float speed = 10.0f);
|
||||||
|
NiPoint3 NearestPoint(const NiPoint3& location, const float halfExtent = 32.0f) const;
|
||||||
bool IsNavmeshLoaded() { return m_NavMesh != nullptr; }
|
bool IsNavmeshLoaded() { return m_NavMesh != nullptr; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Loading…
Reference in New Issue
Block a user