📄 gameinvitems.cpp
字号:
//----------------------------------------------------------
//
// 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 + -