From 68a5cc1d89959a4647df3855cd26811ccd55200d Mon Sep 17 00:00:00 2001 From: David Markowitz Date: Fri, 16 Jun 2023 19:53:22 -0700 Subject: [PATCH] Use better API terminology for radii - SetProximityRadius just calls AddProximityRadius so its clear what is going on. - created struct BoxDimensions for clear reading of what the floats are --- dGame/dComponents/PhantomPhysicsComponent.cpp | 4 ++-- .../dComponents/ProximityMonitorComponent.cpp | 19 ++++++++++--------- dGame/dComponents/ProximityMonitorComponent.h | 4 ++-- dGame/dEntity/Entity.cpp | 11 ++++------- dGame/dEntity/Entity.h | 12 +++++++++--- dPhysics/dpEntity.cpp | 8 ++++---- dPhysics/dpEntity.h | 4 +++- dPhysics/dpShapeBox.cpp | 8 ++++---- dPhysics/dpShapeBox.h | 9 ++++++++- .../02_server/Map/AM/AmSkullkinDrillStand.cpp | 4 ++-- 10 files changed, 48 insertions(+), 35 deletions(-) diff --git a/dGame/dComponents/PhantomPhysicsComponent.cpp b/dGame/dComponents/PhantomPhysicsComponent.cpp index 76ccf08e..56b49163 100644 --- a/dGame/dComponents/PhantomPhysicsComponent.cpp +++ b/dGame/dComponents/PhantomPhysicsComponent.cpp @@ -279,7 +279,7 @@ void PhantomPhysicsComponent::CreatePhysics() { switch (type) { case 1: { //Make a new box shape - NiPoint3 boxSize(x, y, z); + BoxDimensions boxSize(x, y, z); if (x == 0.0f) { //LU has some weird values, so I think it's best to scale them down a bit if (height < 0.5f) height = 2.0f; @@ -289,7 +289,7 @@ void PhantomPhysicsComponent::CreatePhysics() { width = width * m_Scale; height = height * m_Scale; - boxSize = NiPoint3(width, height, width); + boxSize = BoxDimensions(width, height, width); } m_dpEntity = new dpEntity(m_ParentEntity->GetObjectID(), boxSize); diff --git a/dGame/dComponents/ProximityMonitorComponent.cpp b/dGame/dComponents/ProximityMonitorComponent.cpp index 2a345eca..00c8232b 100644 --- a/dGame/dComponents/ProximityMonitorComponent.cpp +++ b/dGame/dComponents/ProximityMonitorComponent.cpp @@ -36,23 +36,24 @@ void ProximityMonitorComponent::LoadTemplateData() { GeneralUtils::TryParse(proximitySplit.at(0), radiusSmall); GeneralUtils::TryParse(proximitySplit.at(1), radiusLarge); if (radiusSmall != -1.0f && radiusLarge != -1.0f) { - SetProximityRadius(radiusSmall, "rocketSmall"); - SetProximityRadius(radiusLarge, "rocketLarge"); + AddProximityRadius(radiusSmall, "rocketSmall"); + AddProximityRadius(radiusLarge, "rocketLarge"); } } } -void ProximityMonitorComponent::SetProximityRadius(float proxRadius, const std::string& name) { - dpEntity* en = new dpEntity(m_ParentEntity->GetObjectID(), proxRadius); - en->SetPosition(m_ParentEntity->GetPosition()); +void ProximityMonitorComponent::AddProximityRadius(float proxRadius, const std::string& name) { + dpEntity* entity = new dpEntity(m_ParentEntity->GetObjectID(), proxRadius); + entity->SetPosition(m_ParentEntity->GetPosition()); - dpWorld::Instance().AddEntity(en); - m_ProximitiesData.insert(std::make_pair(name, en)); + dpWorld::Instance().AddEntity(entity); + m_ProximitiesData.insert(std::make_pair(name, entity)); } -void ProximityMonitorComponent::SetProximityRadius(dpEntity* entity, const std::string& name) { - dpWorld::Instance().AddEntity(entity); +void ProximityMonitorComponent::AddProximityRadius(const BoxDimensions& dimensions, const std::string& name) { + dpEntity* entity = new dpEntity(m_ParentEntity->GetObjectID(), dimensions); entity->SetPosition(m_ParentEntity->GetPosition()); + dpWorld::Instance().AddEntity(entity); m_ProximitiesData.insert(std::make_pair(name, entity)); } diff --git a/dGame/dComponents/ProximityMonitorComponent.h b/dGame/dComponents/ProximityMonitorComponent.h index 365eabe6..b56da89b 100644 --- a/dGame/dComponents/ProximityMonitorComponent.h +++ b/dGame/dComponents/ProximityMonitorComponent.h @@ -32,14 +32,14 @@ public: * @param proxRadius the radius to use for the physics entity we use to detect proximity * @param name the name of this check */ - void SetProximityRadius(float proxRadius, const std::string& name); + void AddProximityRadius(float proxRadius, const std::string& name); /** * Creates an entry to check proximity for, given a name * @param entity the physics entity to add to our proximity sensors * @param name the name of this check */ - void SetProximityRadius(dpEntity* entity, const std::string& name); + void AddProximityRadius(const BoxDimensions& entity, const std::string& name); /** * Returns the last of entities that are used to check proximity, given a name diff --git a/dGame/dEntity/Entity.cpp b/dGame/dEntity/Entity.cpp index 2511ca32..8dbbbc58 100644 --- a/dGame/dEntity/Entity.cpp +++ b/dGame/dEntity/Entity.cpp @@ -559,17 +559,14 @@ void Entity::IsGhosted() { } } -// Move to header bool Entity::operator==(const Entity& other) const { return other.m_ObjectID == m_ObjectID; } -// Move to header bool Entity::operator!=(const Entity& other) const { return !(other.m_ObjectID == m_ObjectID); } -// Move to header bool Entity::HasComponent(const eReplicaComponentType componentId) const { return m_Components.find(componentId) != m_Components.end(); } @@ -593,15 +590,15 @@ void Entity::Unsubscribe(CppScripts::Script* scriptToRemove, const std::string& } // Fine -void Entity::SetProximityRadius(const float proxRadius, const std::string& name) { +void Entity::AddProximityRadius(const float proxRadius, const std::string& name) { auto* proximityMonitorComponent = AddComponent(); - if (proximityMonitorComponent) proximityMonitorComponent->SetProximityRadius(proxRadius, name); + if (proximityMonitorComponent) proximityMonitorComponent->AddProximityRadius(proxRadius, name); } // Remove in favor of a square constructor -void Entity::SetProximityRadius(dpEntity* entity, const std::string& name) { +void Entity::AddProximityRadius(const BoxDimensions& dimensions, const std::string& name) { auto* proximityMonitorComponent = AddComponent(); - if (proximityMonitorComponent) proximityMonitorComponent->SetProximityRadius(entity, name); + if (proximityMonitorComponent) proximityMonitorComponent->AddProximityRadius(dimensions, name); } void Entity::SetGMLevel(eGameMasterLevel value) { diff --git a/dGame/dEntity/Entity.h b/dGame/dEntity/Entity.h index 1fcadbc4..1faed1c8 100644 --- a/dGame/dEntity/Entity.h +++ b/dGame/dEntity/Entity.h @@ -35,6 +35,7 @@ class Item; class Character; class EntityCallbackTimer; class LDFBaseData; +class BoxDimensions; enum class eTriggerEventType; enum class eGameMasterLevel : uint8_t; enum class eReplicaComponentType : uint32_t; @@ -168,9 +169,14 @@ public: * no longer be notified of notificationName events */ void Unsubscribe(CppScripts::Script* scriptToRemove, const std::string& notificationName); -// ### STOPPED HERE ### - void SetProximityRadius(const float proxRadius, const std::string& name); - void SetProximityRadius(dpEntity* entity, const std::string& name); + + void AddProximityRadius(const float proxRadius, const std::string& name); + void AddProximityRadius(const BoxDimensions& dimensions, const std::string& name); + + // Technically this is the live accrate API, however what it does is not setting the proximity radius, but rather + // adding a new one to the list of proximity radii. For that reason we will have the old API just call AddProximityRadius. + inline void SetProximityRadius(const float proxRadius, const std::string& name) { this->AddProximityRadius(proxRadius, name); } + inline void SetProximityRadius(const BoxDimensions& dimensions, const std::string& name) { this->AddProximityRadius(dimensions, name); } void AddChild(Entity* child); void RemoveChild(Entity* child); diff --git a/dPhysics/dpEntity.cpp b/dPhysics/dpEntity.cpp index c7ed56f8..df002609 100644 --- a/dPhysics/dpEntity.cpp +++ b/dPhysics/dpEntity.cpp @@ -18,7 +18,7 @@ dpEntity::dpEntity(const LWOOBJID& objectID, dpShapeType shapeType, bool isStati break; case dpShapeType::Box: - m_CollisionShape = new dpShapeBox(this, 1.0f, 1.0f, 1.0f); + m_CollisionShape = new dpShapeBox(this, BoxDimensions(1.0f, 1.0f, 1.0f)); break; default: @@ -26,14 +26,14 @@ dpEntity::dpEntity(const LWOOBJID& objectID, dpShapeType shapeType, bool isStati } } -dpEntity::dpEntity(const LWOOBJID& objectID, NiPoint3 boxDimensions, bool isStatic) { +dpEntity::dpEntity(const LWOOBJID& objectID, const BoxDimensions& boxDimensions, bool isStatic) { m_ObjectID = objectID; m_IsStatic = isStatic; m_CollisionShape = nullptr; m_Scale = 1.0f; m_CollisionGroup = COLLISION_GROUP_ALL; - m_CollisionShape = new dpShapeBox(this, boxDimensions.x, boxDimensions.y, boxDimensions.z); + m_CollisionShape = new dpShapeBox(this, boxDimensions); } dpEntity::dpEntity(const LWOOBJID& objectID, float width, float height, float depth, bool isStatic) { @@ -43,7 +43,7 @@ dpEntity::dpEntity(const LWOOBJID& objectID, float width, float height, float de m_Scale = 1.0f; m_CollisionGroup = COLLISION_GROUP_ALL; - m_CollisionShape = new dpShapeBox(this, width, height, depth); + m_CollisionShape = new dpShapeBox(this, BoxDimensions(width, height, depth)); } dpEntity::dpEntity(const LWOOBJID& objectID, float radius, bool isStatic) { diff --git a/dPhysics/dpEntity.h b/dPhysics/dpEntity.h index ea7a49b2..8d2cce82 100644 --- a/dPhysics/dpEntity.h +++ b/dPhysics/dpEntity.h @@ -10,12 +10,14 @@ #include "dpCollisionGroups.h" #include "dpGrid.h" +class BoxDimensions; + class dpEntity { friend class dpGrid; //using friend here for now so grid can access everything public: dpEntity(const LWOOBJID& objectID, dpShapeType shapeType, bool isStatic = true); - dpEntity(const LWOOBJID& objectID, NiPoint3 boxDimensions, bool isStatic = true); + dpEntity(const LWOOBJID& objectID, const BoxDimensions& boxDimensions, bool isStatic = true); dpEntity(const LWOOBJID& objectID, float width, float height, float depth, bool isStatic = true); dpEntity(const LWOOBJID& objectID, float radius, bool isStatic = true); diff --git a/dPhysics/dpShapeBox.cpp b/dPhysics/dpShapeBox.cpp index b40be6af..74d5c52a 100644 --- a/dPhysics/dpShapeBox.cpp +++ b/dPhysics/dpShapeBox.cpp @@ -9,11 +9,11 @@ #include -dpShapeBox::dpShapeBox(dpEntity* parentEntity, float width, float height, float depth) : +dpShapeBox::dpShapeBox(dpEntity* parentEntity, const BoxDimensions& dimensions) : dpShapeBase(parentEntity), - m_Width(width / 2), - m_Height(height / 2), - m_Depth(depth / 2), + m_Width(dimensions.width / 2), + m_Height(dimensions.height / 2), + m_Depth(dimensions.depth / 2), m_Scale(1.0f) { m_ShapeType = dpShapeType::Box; diff --git a/dPhysics/dpShapeBox.h b/dPhysics/dpShapeBox.h index 4af0396e..9a8474cd 100644 --- a/dPhysics/dpShapeBox.h +++ b/dPhysics/dpShapeBox.h @@ -4,9 +4,16 @@ #include "NiPoint3.h" #include "NiQuaternion.h" +struct BoxDimensions { + BoxDimensions(float width, float height, float depth) : width(width), height(height), depth(depth) { } + float width; + float height; + float depth; +}; + class dpShapeBox : public dpShapeBase { public: - dpShapeBox(dpEntity* parentEntity, float width, float height, float depth); + dpShapeBox(dpEntity* parentEntity, const BoxDimensions& dimensions); ~dpShapeBox(); bool IsColliding(dpShapeBase* other); diff --git a/dScripts/02_server/Map/AM/AmSkullkinDrillStand.cpp b/dScripts/02_server/Map/AM/AmSkullkinDrillStand.cpp index 1961f1c8..9cf43ab0 100644 --- a/dScripts/02_server/Map/AM/AmSkullkinDrillStand.cpp +++ b/dScripts/02_server/Map/AM/AmSkullkinDrillStand.cpp @@ -1,13 +1,13 @@ #include "AmSkullkinDrillStand.h" #include "GameMessages.h" -#include "dpEntity.h" +#include "dpShapeBox.h" #include "Entity.h" #include "RenderComponent.h" void AmSkullkinDrillStand::OnStartup(Entity* self) { self->SetVar(u"bActive", true); - self->SetProximityRadius(new dpEntity(self->GetObjectID(), { 6, 14, 6 }), "knockback"); + self->SetProximityRadius(BoxDimensions(6.0f, 14.0f, 6.0f), "knockback"); } void AmSkullkinDrillStand::OnNotifyObject(Entity* self, Entity* sender, const std::u16string& name, int32_t param1, int32_t param2) {