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

📄 pickupobject.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ----------------------------------------------------------------------- //
//
// 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 + -