📄 pickupobject.cpp
字号:
// ----------------------------------------------------------------------- //
//
// MODULE : PickupObject.cpp
//
// PURPOSE : Item that any player can walk across and potentially pick up -
// Implementation
//
// CREATED : 10/27/97
//
// ----------------------------------------------------------------------- //
#include "generic_msg_de.h"
#include "PickupObject.h"
#include "cpp_server_de.h"
#include "trigger.h"
#include "ObjectUtilities.h"
#include "ClientServerShared.h"
#include "SfxMsgIds.h"
#include "BloodServerShell.h"
#include <mbstring.h>
#include "SoundTypes.h"
// ----------------------------------------------------------------------- //
//
// CLASS: PickupObject
//
// PURPOSE: Any in-game object that the player can pick up
//
// ----------------------------------------------------------------------- //
BEGIN_CLASS(PickupObject)
ADD_STRINGPROP(PickupTriggerTarget, "")
ADD_STRINGPROP(PickupTriggerMessage, "")
END_CLASS_DEFAULT(PickupObject, B2BaseClass, NULL, NULL)
// ----------------------------------------------------------------------- //
//
// ROUTINE: PickupObject::PickupObject()
//
// PURPOSE: Initialize object
//
// ----------------------------------------------------------------------- //
PickupObject::PickupObject() : B2BaseClass (OT_MODEL)
{
m_nType = 0;
m_fValue = 0;
m_fValueMult = 1.0f;
m_fRespawnTime = 0.0f;
m_bRotate = DFALSE;
m_bBounce = DFALSE;
m_fYaw = 0.0f;
m_fLastTime = 0.0f;
m_fBounce = 0.0f;
m_bBouncing = DFALSE;
m_hstrPickupTriggerTarget = DNULL;
m_hstrPickupTriggerMessage = DNULL;
m_hstrObjectName = DNULL;
m_hstrDisplayName = DNULL;
m_szObjectName = DNULL;
m_nNameID = 0;
m_szFile = DNULL;
// Set respawn sound...
m_szRespawnSound = "sounds\\powerups\\powerup2.wav";
// Set pickup sound...
m_szPickupSound = "sounds\\powerups\\powerup4.wav";
m_bFirstUpdate = DTRUE;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: PickupObject::~PickupObject()
//
// PURPOSE: Deallocate object
//
// ----------------------------------------------------------------------- //
PickupObject::~PickupObject()
{
if( !g_pServerDE ) return;
if (m_hstrPickupTriggerTarget)
{
g_pServerDE->FreeString(m_hstrPickupTriggerTarget);
}
if (m_hstrPickupTriggerMessage)
{
g_pServerDE->FreeString(m_hstrPickupTriggerMessage);
}
if (m_hstrObjectName)
{
g_pServerDE->FreeString(m_hstrObjectName);
}
if( m_hstrDisplayName )
{
g_pServerDE->FreeString( m_hstrDisplayName );
}
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: PickupObject::EngineMessageFn
//
// PURPOSE: Handle engine messages
//
// ----------------------------------------------------------------------- //
DDWORD PickupObject::EngineMessageFn(DDWORD messageID, void *pData, DFLOAT fData)
{
if( g_pServerDE )
{
switch(messageID)
{
case MID_UPDATE:
{
Update((DVector *)pData);
break;
}
case MID_TOUCHNOTIFY:
{
ObjectTouch((HOBJECT)pData);
break;
}
case MID_PRECREATE:
{
DDWORD dwRet = B2BaseClass::EngineMessageFn(messageID, pData, fData);
if (fData == PRECREATE_WORLDFILE )
ReadProp((ObjectCreateStruct*)pData);
if( fData == PRECREATE_STRINGPROP)
{
ReadProp((ObjectCreateStruct*)pData);
}
PostPropRead((ObjectCreateStruct*)pData);
return dwRet;
}
case MID_INITIALUPDATE:
{
if (fData != INITIALUPDATE_SAVEGAME)
{
InitialUpdate((DVector *)pData);
}
if (fData == INITIALUPDATE_WORLDFILE)
{
MoveObjectToGround(m_hObject);
}
else if( fData == PRECREATE_STRINGPROP)
{
DVector vPos;
g_pServerDE->GetObjectPos(m_hObject, &vPos);
SpawnItem( &vPos );
}
CacheFiles();
break;
}
case MID_SAVEOBJECT:
{
Save((HMESSAGEWRITE)pData, (DDWORD)fData);
break;
}
case MID_LOADOBJECT:
{
Load((HMESSAGEREAD)pData, (DDWORD)fData);
break;
}
default : break;
}
}
return B2BaseClass::EngineMessageFn(messageID, pData, fData);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: PickupObject::ObjectMessageFn
//
// PURPOSE: Handle object messages
//
// ----------------------------------------------------------------------- //
DDWORD PickupObject::ObjectMessageFn(HOBJECT hSender, DDWORD messageID, HMESSAGEREAD hRead)
{
if( g_pServerDE )
{
switch(messageID)
{
case MID_PICKEDUP:
{
PickedUp (hRead);
break;
}
/*
case MID_TRIGGER:
{
HandleTrigger(hSender, hRead);
break;
}
*/
default: break;
}
}
return B2BaseClass::ObjectMessageFn (hSender, messageID, hRead);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: PickupObject::ReadProp
//
// PURPOSE: Set property value
//
// ----------------------------------------------------------------------- //
DBOOL PickupObject::ReadProp(ObjectCreateStruct *pStruct)
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE || !pStruct) return DFALSE;
GenericProp genProp;
if (g_pServerDE->GetPropGeneric("PickupTriggerTarget", &genProp) == DE_OK)
{
if (genProp.m_String[0]) m_hstrPickupTriggerTarget = g_pServerDE->CreateString(genProp.m_String);
}
if (g_pServerDE->GetPropGeneric("PickupTriggerMessage", &genProp) == DE_OK)
{
if (genProp.m_String[0]) m_hstrPickupTriggerMessage = g_pServerDE->CreateString(genProp.m_String);
}
/*
if (g_pServerDE->GetPropGeneric("Rotate", &genProp) == DE_OK)
{
m_bRotate = genProp.m_Bool;
}
*/
return DTRUE;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: PickupObject::PostPropRead()
//
// PURPOSE: Update Properties
//
// ----------------------------------------------------------------------- //
void PickupObject::PostPropRead(ObjectCreateStruct *pStruct)
{
if (!pStruct) return;
pStruct->m_Flags |= FLAG_TOUCH_NOTIFY | FLAG_VISIBLE | FLAG_GRAVITY;
pStruct->m_Flags &= ~FLAG_SHADOW;
m_dwFlags = pStruct->m_Flags;
if (!m_hstrObjectName && m_szObjectName)
m_hstrObjectName = g_pServerDE->CreateString(m_szObjectName);
#ifdef _ADD_ON
if(m_nType == WEAP_COMBATSHOTGUN || m_nType == WEAP_FLAYER)
{
if (m_szFile)
{
_mbscpy((unsigned char*)pStruct->m_Filename, (const unsigned char*)"Models_ao/Powerups_ao/");
_mbscat((unsigned char*)pStruct->m_Filename, (const unsigned char*)m_szFile);
_mbscat((unsigned char*)pStruct->m_Filename, (const unsigned char*)".abc");
}
// Set the skin filename
if (m_szFile)
{
_mbscpy((unsigned char*)pStruct->m_SkinName, (const unsigned char*)"Skins_ao/Powerups_ao/");
_mbscat((unsigned char*)pStruct->m_SkinName, (const unsigned char*)m_szFile);
_mbscat((unsigned char*)pStruct->m_SkinName, (const unsigned char*)".dtx");
}
}
else
{
if (m_szFile)
{
_mbscpy((unsigned char*)pStruct->m_Filename, (const unsigned char*)"Models/Powerups/");
_mbscat((unsigned char*)pStruct->m_Filename, (const unsigned char*)m_szFile);
_mbscat((unsigned char*)pStruct->m_Filename, (const unsigned char*)".abc");
}
// Set the skin filename
if (m_szFile)
{
_mbscpy((unsigned char*)pStruct->m_SkinName, (const unsigned char*)"Skins/Powerups/");
_mbscat((unsigned char*)pStruct->m_SkinName, (const unsigned char*)m_szFile);
_mbscat((unsigned char*)pStruct->m_SkinName, (const unsigned char*)".dtx");
}
}
#else
// Set the model filename
if (m_szFile)
{
_mbscpy((unsigned char*)pStruct->m_Filename, (const unsigned char*)"Models/Powerups/");
_mbscat((unsigned char*)pStruct->m_Filename, (const unsigned char*)m_szFile);
_mbscat((unsigned char*)pStruct->m_Filename, (const unsigned char*)".abc");
}
// Set the skin filename
if (m_szFile)
{
_mbscpy((unsigned char*)pStruct->m_SkinName, (const unsigned char*)"Skins/Powerups/");
_mbscat((unsigned char*)pStruct->m_SkinName, (const unsigned char*)m_szFile);
_mbscat((unsigned char*)pStruct->m_SkinName, (const unsigned char*)".dtx");
}
#endif
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: PickupObject::InitialUpdate()
//
// PURPOSE: First update
//
// ----------------------------------------------------------------------- //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -