mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-10-02 10:53:44 +00:00
Volumes on the server touched far more than in the client: - An enemy's body in the physics world was a sphere the size of its aggro radius, so trigger and damage volumes caught enemies from far away (Cavalry Hill enemies taking damage on spawn). It is now the enemy's own radius and collision group from its physics component. - Trigger volumes ignored their collision group and caught everything. dpEntity now filters with the client's collision filter (PeCollisionFilter, 1.10.64 0x00fb6940, group table from 0x00fcf9a0): POI walls ignore enemies, threat clearing walls ignore players, and so on. The aggro sensor keeps seeing only players. - Rotated boxes were tested as the axis aligned box around them, which for a turned wall covers a big square (the AG survival boundary). Sphere and point tests now use the box's own axes. Proximity monitors take an optional collision group like live's SetProximityRadius; the AM shield generators use live's (10 finds enemies, 1 finds players). Fixes #1127 Refs #1971 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
84 lines
2.8 KiB
C++
84 lines
2.8 KiB
C++
/*
|
|
* Darkflame Universe
|
|
* Copyright 2018
|
|
*/
|
|
|
|
#ifndef PROXIMITYMONITORCOMPONENT_H
|
|
#define PROXIMITYMONITORCOMPONENT_H
|
|
|
|
#include <unordered_set>
|
|
|
|
#include "BitStream.h"
|
|
#include "Entity.h"
|
|
#include "dpWorld.h"
|
|
#include "dpEntity.h"
|
|
#include "Component.h"
|
|
#include "eReplicaComponentType.h"
|
|
|
|
/**
|
|
* Utility component for detecting how close entities are to named proximities for this entity. Allows you to store
|
|
* proximity checks for multiple ojects.
|
|
*/
|
|
class ProximityMonitorComponent final : public Component {
|
|
public:
|
|
static constexpr eReplicaComponentType ComponentType = eReplicaComponentType::PROXIMITY_MONITOR;
|
|
|
|
ProximityMonitorComponent(Entity* parentEntity, const int32_t componentID, int smallRadius = -1, int largeRadius = -1);
|
|
~ProximityMonitorComponent() override;
|
|
void Update(float deltaTime) override;
|
|
|
|
/**
|
|
* Creates an entry to check proximity for, given a name
|
|
* @param proxRadius the radius to use for the physics entity we use to detect proximity
|
|
* @param name the name of this check
|
|
*/
|
|
/**
|
|
* Adds a sphere that reports what enters and leaves it
|
|
* @param collisionGroup the collision group it filters on like the client's (see dpCollisionFilter), 0 for everything
|
|
*/
|
|
void SetProximityRadius(float proxRadius, const std::string& name, uint32_t collisionGroup = 0);
|
|
|
|
/**
|
|
* 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);
|
|
|
|
/**
|
|
* Returns the last of entities that are used to check proximity, given a name
|
|
* @param name the proximity name to retrieve physics objects for
|
|
* @return a set of physics entity object IDs for this name
|
|
*/
|
|
const std::unordered_set<LWOOBJID>& GetProximityObjects(const std::string& name) const;
|
|
|
|
/**
|
|
* Checks if the passed object is in proximity of the named proximity sensor
|
|
* @param name the name of the sensor to check proximity for
|
|
* @param objectID the entity to check if they're in proximity
|
|
* @return true if the object is in proximity, false otherwise
|
|
*/
|
|
bool IsInProximity(const std::string& name, LWOOBJID objectID);
|
|
|
|
/**
|
|
* Returns all the proximity sensors stored on this component, indexed by name
|
|
* @return all the proximity sensors stored on this component
|
|
*/
|
|
const std::map<std::string, dpEntity*>& GetProximitiesData() const { return m_ProximitiesData; }
|
|
|
|
private:
|
|
|
|
bool OnGetObjectReportInfo(GameMessages::GetObjectReportInfo& reportInfo);
|
|
/**
|
|
* All the proximity sensors for this component, indexed by name
|
|
*/
|
|
std::map<std::string, dpEntity*> m_ProximitiesData = {};
|
|
|
|
/**
|
|
* Default value for the proximity data
|
|
*/
|
|
static const std::unordered_set<LWOOBJID> m_EmptyObjectSet;
|
|
};
|
|
|
|
#endif // PROXIMITYMONITORCOMPONENT_H
|