mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-10-02 10:53:44 +00:00
A fixed simple physics object, or a phantom volume, that its data marks as a wall for enemies (a navmesh carver, or solid with a group only enemies touch) adds its shape to the world's movement blockers, and takes it out again when it goes away. Only shapes the server knows are used; an unknown asset's stand in cube would be a guess, so it is logged and left out. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
68 lines
2.2 KiB
C++
68 lines
2.2 KiB
C++
#ifndef __PHYSICSCOMPONENT__H__
|
|
#define __PHYSICSCOMPONENT__H__
|
|
|
|
#include "Component.h"
|
|
#include "NiPoint3.h"
|
|
#include "NiQuaternion.h"
|
|
|
|
namespace GameMessages {
|
|
struct GetObjectReportInfo;
|
|
struct GetPosition;
|
|
};
|
|
|
|
namespace Raknet {
|
|
class BitStream;
|
|
};
|
|
|
|
enum class eReplicaComponentType : uint32_t;
|
|
|
|
class dpEntity;
|
|
|
|
class PhysicsComponent : public Component {
|
|
public:
|
|
PhysicsComponent(Entity* parent, const int32_t componentID);
|
|
virtual ~PhysicsComponent();
|
|
|
|
void Serialize(RakNet::BitStream& outBitStream, bool bIsInitialUpdate) override;
|
|
|
|
const NiPoint3& GetPosition() const noexcept { return m_Position; }
|
|
virtual void SetPosition(const NiPoint3& pos) { if (m_Position == pos) return; m_Position = pos; m_DirtyPosition = true; }
|
|
|
|
const NiQuaternion& GetRotation() const { return m_Rotation; }
|
|
virtual void SetRotation(const NiQuaternion& rot) { if (m_Rotation == rot) return; m_Rotation = rot; m_DirtyPosition = true; }
|
|
|
|
int32_t GetCollisionGroup() const noexcept { return m_CollisionGroup; }
|
|
void SetCollisionGroup(int32_t group) noexcept { m_CollisionGroup = group; }
|
|
protected:
|
|
bool OnGetObjectReportInfo(GameMessages::GetObjectReportInfo& msg);
|
|
|
|
// isFallback, when given, says whether the asset had no known shape and got a stand in cube
|
|
dpEntity* CreatePhysicsEntity(eReplicaComponentType type, bool* isFallback = nullptr);
|
|
|
|
/**
|
|
* Makes this object a wall the server's movers can't walk through when its data says it is one
|
|
* (dpMovementBlockers::BlockingFilter: a navmesh carver, or a solid object only enemies collide with). Only
|
|
* shapes the server knows are used; a stand in cube would be a guess.
|
|
*/
|
|
void RegisterMovementBlocker(eReplicaComponentType type, bool solid, float scale);
|
|
|
|
dpEntity* CreatePhysicsLnv(const float scale, const eReplicaComponentType type) const;
|
|
|
|
void SpawnVertices(dpEntity* entity) const;
|
|
|
|
bool OnGetPosition(GameMessages::GetPosition& msg);
|
|
|
|
NiPoint3 m_Position;
|
|
|
|
NiQuaternion m_Rotation = QuatUtils::IDENTITY;
|
|
|
|
bool m_DirtyPosition;
|
|
|
|
int32_t m_CollisionGroup{};
|
|
|
|
// This object's shape as a movement blocker, owned here and not stepped with the physics world
|
|
dpEntity* m_MovementBlocker{};
|
|
};
|
|
|
|
#endif //!__PHYSICSCOMPONENT__H__
|