📄 destructable.h
字号:
//----------------------------------------------------------
//
// MODULE : Destructable.h
//
// PURPOSE : Destructable class
//
// CREATED : 9/23/97
//
//----------------------------------------------------------
#ifndef __DESTRUCTABLE_H
#define __DESTRUCTABLE_H
#include "cpp_aggregate_de.h"
#include "cpp_engineobjects_de.h"
#include "DLink.h"
// Use ADD_DESTRUCTABLE_AGGREGATE() in your class definition to enable
// the following properties in the editor. For example:
//
//BEGIN_CLASS(CMyCoolObj)
// ADD_DESTRUCTABLE_AGGREGATE()
// ADD_STRINGPROP(Filename, "")
// ...
//
#define ADD_DESTRUCTABLE_AGGREGATE() \
ADD_STRINGPROP(DamageTriggerTarget, "") \
ADD_STRINGPROP(DamageTriggerMessage, "") \
ADD_STRINGPROP(DeathTriggerTarget, "") \
ADD_STRINGPROP(DeathTriggerMessage, "") \
ADD_BOOLPROP(TriggerDestroyOnly, DFALSE) \
ADD_STRINGPROP(SpawnObject, "") \
ADD_VECTORPROP(SpawnObjectVel) \
ADD_BOOLPROP(CanDamage, DTRUE)
class CBaseCharacter;
class CInventoryMgr;
class CAnim_Sound;
class CDestructable : public Aggregate
{
public :
CDestructable();
virtual ~CDestructable();
DBOOL Init(HOBJECT hObject, CInventoryMgr* pInv = DNULL, CAnim_Sound* pAnimSound = DNULL);
HOBJECT GetObject() { return m_hObject; }
void Reset();
DBOOL AddWard(DFLOAT fAmount);
DBOOL AddNecroWard(DFLOAT fAmount);
DBOOL Heal(DFLOAT fAmount);
DBOOL MegaHeal(DFLOAT fAmount);
// @cmember Handle object destruction
virtual void HandleDestruction();
void SetMass(DFLOAT fMass);
void SetMaxHitPoints(DFLOAT fmhp) { m_fMaxHitPoints = fmhp; }
void SetMaxMegaHitPoints(DFLOAT fmhp) { m_fMaxMegaHitPoints = fmhp; }
void SetHitPoints(DFLOAT fhp) { if (m_fHitPoints = fhp) m_bDead = DFALSE; }
void SetMaxArmorPoints(DFLOAT fmap) { m_fMaxArmorPoints = fmap; }
void SetMaxNecroArmorPoints(DFLOAT fmnwp) { m_fMaxNecroArmorPoints = fmnwp; }
void SetArmorPoints(DFLOAT fap) { m_fArmorPoints = fap; }
void CalculateResistance(DBYTE nResistValue);
void SetApplyDamagePhysics(DBOOL bApply) { m_bApplyDamagePhysics = bApply; }
void SetDestructable( DBOOL bDestructable ) { m_bDestructable = bDestructable; }
DBOOL IsDestructable( ) const { return m_bDestructable; }
DFLOAT GetMass() const { return m_fMass; }
DFLOAT GetMaxHitPoints() const { return m_fMaxHitPoints; }
DFLOAT GetHitPoints() const { return m_fHitPoints; }
DFLOAT GetDeathHitPoints() const { return m_fDeathHitPoints; }
DFLOAT GetMaxArmorPoints() const { return m_fMaxArmorPoints; }
DFLOAT GetArmorPoints() const { return m_fArmorPoints; }
DBYTE GetLastDamageType() const { return m_nLastDamageType; }
DBOOL GetApplyDamagePhysics() const { return m_bApplyDamagePhysics; }
int GetSideHit() const { return m_nSideHit; }
int GetNodeHit() const { return m_nNodeHit; }
DBYTE GetLastDamageLocation() const { return m_nLastDamageLocation; }
DFLOAT GetLastDamagePercent() const { return m_fLastDamagePercent; }
DFLOAT GetLastDamageAmount() const { return m_fLastDamageAmount; }
void GetLastDamageDirection(DVector *vDir) { VEC_COPY(*vDir, m_vLastDamageDirection); }
void SetDead(DBOOL bDead) {m_bDead = bDead;}
DBOOL IsDead() const { return (m_fDeathDelay > 0) ? DFALSE : m_bDead; }
void SetGodMode(DBOOL bGodMode) { m_bGodMode = bGodMode; }
void SetNighInvulnerable(DBOOL bValue) { m_bNighInvulnerable = bValue; }
HOBJECT GetWhoKilledMeLast() const { return m_hWhoKilledMeLast; }
HOBJECT GetLastDamager() const { return m_hLastDamager; }
void ClearLastDamager() { m_hLastDamager = DNULL; }
void SetDeathDelay(DFLOAT fDelay) { m_fDeathDelay = fDelay; }
//efficient means to track destructable objects in a level
static DLink m_DestructableHead;
static DDWORD m_dwNumDestructables;
DLink m_Link;
DBOOL IsAddedVelocity() const { return m_bAddVelocity; }
void GetAddedVelocity(DVector *pVel)
{
VEC_COPY(*pVel, m_vAddVelocity);
VEC_INIT(m_vAddVelocity);
m_bAddVelocity = DFALSE;
}
DBOOL IsPlayerToPlayerDamageOk(HOBJECT hDamager, HOBJECT hOwner);
void SetStartingCharacterValues();
protected:
DDWORD EngineMessageFn(LPBASECLASS pObject, DDWORD messageID, void *pData, DFLOAT lData);
DDWORD ObjectMessageFn(LPBASECLASS pObject, HOBJECT hSender, DDWORD messageID, HMESSAGEREAD hRead);
void Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags);
void Load(HMESSAGEREAD hWrite, DDWORD dwLoadFlags);
private:
// Handle reading the destructable's properties...
DBOOL ReadProp(LPBASECLASS pObject, ObjectCreateStruct *pStruct);
void HandleDamage(HOBJECT hSender, HMESSAGEREAD hRead);
void ApplyDamagePhysics(DFLOAT fDamage, DVector *pvDir);
void HandleHeal(HOBJECT hSender, HMESSAGEREAD hRead);
void HandleRepair(HOBJECT hSender, HMESSAGEREAD hRead);
void HandleTrigger(HOBJECT hSender, HMESSAGEREAD hRead);
int SetProperNode(int nNode);
int CalculateHitLimb(DVector vDir, DVector vPos, DFLOAT fDamage = 10.0f);
// pointer to the owner's object (if it's a base character)
// CBaseCharacter* m_pOwner;
// @cmember should we apply physics to object when damaged?
DBOOL m_bApplyDamagePhysics;
// @cmember mass of the object
DFLOAT m_fMass;
// @cmember Maximum damage this thing can take
DFLOAT m_fMaxHitPoints;
// @cmember Maximum damage this thing can take
DFLOAT m_fMaxMegaHitPoints;
// @cmember current strength of the item
DFLOAT m_fHitPoints;
// @cmember current strength of the item
DFLOAT m_fDeathHitPoints;
// @cmember Maximum amount of armor on this thing
DFLOAT m_fMaxArmorPoints;
// @cmember Maximum amount of armor on this thing
DFLOAT m_fMaxNecroArmorPoints;
// @cmember current amount of armor on this thing
DFLOAT m_fArmorPoints;
// @cmember player's resistance value
DFLOAT m_fResistance;
// @cmember the object I am associated with
HOBJECT m_hObject;
// @cmember a flag to tell me if I've been destroyed
DBOOL m_bDead;
DBOOL m_bNighInvulnerable;
DBYTE m_nLastDamageType;
DBYTE m_nLastDamageLocation;
DVector m_vLastDamageDirection;
DFLOAT m_fLastDamageAmount;
DFLOAT m_fLastDamagePercent; // Percentage of Damage
HOBJECT m_hWhoKilledMeLast;
HSTRING m_hstrDamageTriggerTarget;
HSTRING m_hstrDamageTriggerMessage;
HSTRING m_hstrDeathTriggerTarget;
HSTRING m_hstrDeathTriggerMessage;
HSTRING m_hstrSpawnObject;
DVector m_vSpawnObjectVel;
DBOOL m_bGodMode;
DBOOL m_bTriggerOnly;
DFLOAT m_fDeathDelay;
//for characters/AI
CInventoryMgr* m_pInventoryMgr;
CAnim_Sound* m_pAnim_Sound;
HOBJECT m_hLastDamager;
int m_nSideHit; // 0=front,6=back
int m_nNodeHit;
DBOOL m_bAddVelocity;
DVector m_vAddVelocity;
DBOOL m_bDestructable;
};
#endif // __DESTRUCTABLE_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -