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

📄 gameinvitems.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//----------------------------------------------------------
//
// MODULE  : GameInvItems.cpp
//
// PURPOSE : Inventory items
//
// CREATED : 2/25/98
//
//----------------------------------------------------------

// Includes....
#include <stdlib.h>
#include "GameInvItems.h"
#include "PlayerObj.h"
#include "SeeingEye.h"
#include "LightFX.h"
#include "Gib.h"
#include "SfxMsgIDs.h"
#include "ClientServerShared.h"
#include "ClientRes.h"


// *********************************************************************** //
//
//	CLASS:		CInvFlashlight
//
//	PURPOSE:	Flashlight inventory item
//
// *********************************************************************** //


CInvFlashlight::CInvFlashlight() : CInvItem(INV_FLASHLIGHT)
{
	m_hLight = DNULL;
	m_fDischargeTime = FLASHLIGHTCHARGETIME;
	m_nCount = FLASHLIGHTCHARGE;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvFlashlight::Term()
//
//	PURPOSE:	Terminates the flashlight
//
// ----------------------------------------------------------------------- //

void CInvFlashlight::Init(HOBJECT hOwner)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return;

	CInvItem::Init(hOwner);

	m_hstrItemName = pServerDE->FormatString(IDS_ITEM_FLASHLIGHT);
	m_hstrDisplayName = pServerDE->CopyString( m_hstrItemName );

	m_hstrPic = pServerDE->CreateString("flashlight.pcx");
	m_hstrPicH = pServerDE->CreateString("flashlight_h.pcx");

	m_nCount = FLASHLIGHTCHARGE; 
	m_fDischargeTime = FLASHLIGHTCHARGETIME;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvFlashlight::CreateLight()
//
//	PURPOSE:	Creates the light object for the special effect
//
// ----------------------------------------------------------------------- //

DBOOL CInvFlashlight::CreateLight()
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return DFALSE;

	if( m_hLight )
	{
		pServerDE->RemoveObject( m_hLight );
		m_hLight = DNULL;
	}

	ObjectCreateStruct ocStruct;
	INIT_OBJECTCREATESTRUCT(ocStruct);

	ocStruct.m_Flags = FLAG_FORCECLIENTUPDATE;
	ocStruct.m_ObjectType = OT_NORMAL; 

	HCLASS hClass = pServerDE->GetClass("BaseClass");
	LPBASECLASS	pLight = pServerDE->CreateObject(hClass, &ocStruct);

	if (pLight)
	{
		m_hLight = pLight->m_hObject;

		// Send special effect message
		HMESSAGEWRITE hMessage = pServerDE->StartSpecialEffectMessage(pLight);
		pServerDE->WriteToMessageByte(hMessage, SFX_FLASHLIGHT_ID);
		pServerDE->EndMessage(hMessage);
		return DTRUE;
	}
	return DFALSE;
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvFlashlight::AddItem()
//
//	PURPOSE:	Try to recharge the flashlight
//
// ----------------------------------------------------------------------- //

DBOOL CInvFlashlight::AddItem(DBYTE nCount)
{
	DBOOL bRet = DFALSE;
	if (m_nCount < FLASHLIGHTCHARGE)
	{
		m_nCount = FLASHLIGHTCHARGE;
		m_fDischargeTime = FLASHLIGHTCHARGETIME;
		bRet = DTRUE;
	}
	return bRet;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvFlashlight::Activate()
//
//	PURPOSE:	Activates the item
//
// ----------------------------------------------------------------------- //

int CInvFlashlight::Activate()
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return DFALSE;

	if (!m_hLight)
	{
		if (!CreateLight())
			return DFALSE;
	}

	if( m_fDischargeTime <= 0.0f )
		return DFALSE;
	
	DDWORD dwUsrFlags = pServerDE->GetObjectUserFlags(m_hLight);
	dwUsrFlags |= USRFLG_VISIBLE;
	pServerDE->SetObjectUserFlags(m_hLight, dwUsrFlags);

	m_bIsActive = DTRUE;
	SendActionMessage( );		
	return m_bIsActive;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvFlashlight::Deactivate()
//
//	PURPOSE:	Deactivates the item
//
// ----------------------------------------------------------------------- //

int CInvFlashlight::Deactivate()
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE || !m_hLight) return DFALSE;
	
	DDWORD dwUsrFlags = pServerDE->GetObjectUserFlags(m_hLight);
	dwUsrFlags &= ~USRFLG_VISIBLE;
	pServerDE->SetObjectUserFlags(m_hLight, dwUsrFlags);

	m_bIsActive = DFALSE;
	SendActionMessage( );		
	return m_bIsActive;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvFlashlight::Update()
//
//	PURPOSE:	Updates this item's position
//
// ----------------------------------------------------------------------- //

void CInvFlashlight::Update()
{
	DFLOAT fFrameTime;
	CPlayerObj* pPlayer;
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return;

	CInvItem::Update();

	if( IsPlayer( m_hOwner ))
		pPlayer = (CPlayerObj*)pServerDE->HandleToObject(m_hOwner);
	else
		pPlayer = NULL;

	if (m_hLight)
	{
		// Move the item's position to the same place as it's owner
		DVector vPos;
		pServerDE->GetObjectPos(m_hOwner, &vPos);
		pServerDE->TeleportObject(m_hLight, &vPos);
		DRotation rRot;
		if( pPlayer )
		{
			// Set the rotation to the player's internal rotation
			pPlayer->GetPlayerRotation(&rRot);
		}
		else
		{
			pServerDE->GetObjectRotation(m_hOwner, &rRot);
		}
		pServerDE->SetObjectRotation(m_hLight, &rRot);

	}

	if( m_bIsActive )
	{
		fFrameTime = pServerDE->GetFrameTime( );
		m_fDischargeTime -= fFrameTime;
		if( m_fDischargeTime <= 0.0f )
		{
			m_nCount = 0;
			if( pPlayer )
				pPlayer->m_InventoryMgr.SetActiveItem(INV_FLASHLIGHT);
			else
				Deactivate( );
		}
		else
		{
			m_nCount = ( DBYTE )(( FLASHLIGHTCHARGE * m_fDischargeTime / FLASHLIGHTCHARGETIME ) + 0.5f );
		}
	}
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvFlashlight::Save
//
//	PURPOSE:	Save the object
//
// ----------------------------------------------------------------------- //

void CInvFlashlight::Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE || !hWrite) return;

	CInvItem::Save(hWrite, dwSaveFlags);

	pServerDE->WriteToMessageFloat(hWrite, m_fDischargeTime);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvFlashlight::Load
//
//	PURPOSE:	Load the object
//
// ----------------------------------------------------------------------- //

void CInvFlashlight::Load(HMESSAGEREAD hRead, DDWORD dwLoadFlags)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE || !hRead) return;

	CInvItem::Load(hRead, dwLoadFlags);

	m_fDischargeTime = pServerDE->ReadFromMessageFloat(hRead);

	CreateLight();

	// deactivate now if keepalive restore
	DDWORD dwUsrFlags = pServerDE->GetObjectUserFlags(m_hLight);
	dwUsrFlags &= ~USRFLG_VISIBLE;
}


// *********************************************************************** //
//
//	CLASS:		CInvMedkit
//
//	PURPOSE:	Medkit inventory item
//
// *********************************************************************** //


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvMedkit::Init()
//
//	PURPOSE:	Initialize
//
// ----------------------------------------------------------------------- //

void CInvMedkit::Init(HOBJECT hOwner)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return;

	CInvItem::Init(hOwner);

	m_nCount = 100; 
	m_hstrItemName = pServerDE->FormatString(IDS_ITEM_MEDKIT);
	m_hstrDisplayName = pServerDE->CopyString( m_hstrItemName );
	m_hstrPic = pServerDE->CreateString("medkit.pcx");
	m_hstrPicH = pServerDE->CreateString("medkit_h.pcx");
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvMedkit::AddItem()
//
//	PURPOSE:	Try to recharge the medkit
//
// ----------------------------------------------------------------------- //

DBOOL CInvMedkit::AddItem(DBYTE nCount)
{
	DBOOL bRet = DFALSE;
	if (m_nCount < 100)
	{
		m_nCount = 100;
		bRet = DTRUE;
	}
	return bRet;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvMedkit::Activate()
//
//	PURPOSE:	Activates the item
//
// ----------------------------------------------------------------------- //

int CInvMedkit::Activate()
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return 0;

	// Make sure it's a character
	HCLASS hOwnerClass = pServerDE->GetObjectClass(m_hOwner);
	if(pServerDE->IsKindOf(hOwnerClass, pServerDE->GetClass("CBaseCharacter"))) 
	{
		CBaseCharacter *pObj = (CBaseCharacter*)pServerDE->HandleToObject(m_hOwner);
		CDestructable *pDest = pObj->GetDestructable();

		DFLOAT fHitPoints = pDest->GetHitPoints();
		DFLOAT fHealthGain = __min( 100.0f - fHitPoints, (DFLOAT)m_nCount);

		if( fHealthGain > 0.0f )
		{
			pDest->Heal(fHealthGain);

			// If this is a player, then play the use sound with CLIENTLOCAL flag...
			if( IsPlayer( m_hOwner ))
			{
				SendActionMessage( );		
			}
			
			m_nCount -= (int)fHealthGain;
			
		}
		return (int)fHealthGain;
	}
	return 0;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvMedkit::ActivateItem()
//
//	PURPOSE:	default activate item behavior
//
// ----------------------------------------------------------------------- //

DBOOL CInvMedkit::ActivateItem(char *msgbuf)
{
	if ( !Activate( ))
		return DFALSE;

	_mbscpy((unsigned char*)msgbuf, (const unsigned char*)GetDisplayName());
	return DTRUE;
}



// *********************************************************************** //
//
//	CLASS:		CInvNightGoggles
//
//	PURPOSE:	Night Goggles inventory item
//
// *********************************************************************** //


CInvNightGoggles::CInvNightGoggles() : CInvItem(INV_NIGHTGOGGLES)
{
	m_fDischargeTime = GOGGLESCHARGETIME;
	m_nCount = GOGGLESCHARGE;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvNightGoggles::Activate()
//
//	PURPOSE:	Activates the item
//
// ----------------------------------------------------------------------- //

void CInvNightGoggles::Init(HOBJECT hOwner)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return;

	CInvItem::Init(hOwner);

	m_hstrItemName = pServerDE->FormatString(IDS_ITEM_GOGGLES);
	m_hstrDisplayName = pServerDE->CopyString( m_hstrItemName );

	m_hstrPic = pServerDE->CreateString("night_vision.pcx");
	m_hstrPicH = pServerDE->CreateString("night_vision_h.pcx");

	m_nCount = GOGGLESCHARGE; 
	m_fDischargeTime = GOGGLESCHARGETIME;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvFlashlight::AddItem()
//
//	PURPOSE:	Try to recharge the flashlight
//
// ----------------------------------------------------------------------- //

DBOOL CInvNightGoggles::AddItem(DBYTE nCount)
{
	DBOOL bRet = DFALSE;
	if (m_nCount < GOGGLESCHARGE)
	{
		m_nCount = GOGGLESCHARGE;
		m_fDischargeTime = GOGGLESCHARGETIME;
		bRet = DTRUE;
	}
	return bRet;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvNightGoggles::Activate()
//
//	PURPOSE:	Activates the item
//
// ----------------------------------------------------------------------- //

int CInvNightGoggles::Activate()
{
	if( m_fDischargeTime <= 0.0f )
		return DFALSE;
	
	m_bIsActive = DTRUE;
	SendActionMessage( );		
	return m_bIsActive;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvNightGoggles::Deactivate()
//
//	PURPOSE:	Deactivates the item
//
// ----------------------------------------------------------------------- //

int CInvNightGoggles::Deactivate()
{
	m_bIsActive = DFALSE;
	SendActionMessage( );		
	return m_bIsActive;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvNightGoggles::Update()
//
//	PURPOSE:	Updates this item's position
//
// ----------------------------------------------------------------------- //

void CInvNightGoggles::Update()
{
	DFLOAT fFrameTime;
	CPlayerObj* pPlayer;
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return;

	CInvItem::Update();

	if( IsPlayer( m_hOwner ))
		pPlayer = (CPlayerObj*)pServerDE->HandleToObject(m_hOwner);
	else
		pPlayer = NULL;

	if( m_bIsActive )
	{
		fFrameTime = pServerDE->GetFrameTime( );
		m_fDischargeTime -= fFrameTime;
		if( m_fDischargeTime <= 0.0f )
		{
			m_nCount = 0;
			if( pPlayer )
				pPlayer->m_InventoryMgr.SetActiveItem(INV_NIGHTGOGGLES);
			else
				Deactivate( );
		}
		else
		{
			m_nCount = ( DBYTE )(( GOGGLESCHARGE * m_fDischargeTime / GOGGLESCHARGETIME ) + 0.5f );
		}
	}
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvNightGoggles::Save
//
//	PURPOSE:	Save the object
//
// ----------------------------------------------------------------------- //

void CInvNightGoggles::Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE || !hWrite) return;

	CInvItem::Save(hWrite, dwSaveFlags);

	pServerDE->WriteToMessageFloat(hWrite, m_fDischargeTime);

}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvNightGoggles::Load
//
//	PURPOSE:	Load the object
//
// ----------------------------------------------------------------------- //

void CInvNightGoggles::Load(HMESSAGEREAD hRead, DDWORD dwLoadFlags)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE || !hRead) return;

	CInvItem::Load(hRead, dwLoadFlags);

	m_fDischargeTime = pServerDE->ReadFromMessageFloat(hRead);
}


// *********************************************************************** //
//

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -