⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 destructable.h

📁 Blood 2全套源码
💻 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 + -