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

📄 rain.cpp

📁 Blood 2全套源码
💻 CPP
字号:
// ----------------------------------------------------------------------- //
//
// MODULE  : Rain.cpp
//
// PURPOSE : Rain - Implementation
//
// CREATED : 10/23/97
//
// ----------------------------------------------------------------------- //

#include "Rain.h"
#include "cpp_server_de.h"
#include "SFXMsgIds.h"
#include "generic_msg_de.h"
#include "ClientServerShared.h"

void BPrint(char*);

// Static global variables..
static char *g_szTriggerOn = "TRIGGER"; 
static char *g_szTriggerOff = "TRIGGEROFF";



BEGIN_CLASS(Rain)
	ADD_REALPROP(Density, 0.0f)
	ADD_VECTORPROP_FLAG(Dims, PF_DIMS)
	ADD_REALPROP(Lifetime, 1.0f)
	ADD_VECTORPROP(Direction)
	ADD_BOOLPROP(AddGravity, DTRUE)
	ADD_REALPROP(ParticleScale, 1.0f)
	ADD_REALPROP(Spread, 0.0f)
	ADD_BOOLPROP(Triggered, DFALSE)
	ADD_COLORPROP(Color1, 200.0f, 255.0f, 255.0f)
	ADD_COLORPROP(Color2, 40.0f, 50.0f, 50.0f)
	ADD_REALPROP(TimeLimit, 0.0f)
	ADD_REALPROP(Pulse, 0.0f)
END_CLASS_DEFAULT(Rain, CClientSFX, NULL, NULL)


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	Rain::Rain
//
//	PURPOSE:	Initialize
//
// ----------------------------------------------------------------------- //

Rain::Rain() : CClientSFX()
{ 
	m_dwFlags  = 0;
	m_fDensity = 0.0f;
	VEC_INIT(m_vDims);
	m_fLifetime = 1.0f;
	m_bGravity = DTRUE;
	m_fParticleScale = 1.0f;
	m_bTriggered = DFALSE;
	VEC_INIT(m_vDirection);
	VEC_SET(m_vColor1, 200.0f, 255.0f, 255.0f);
	VEC_SET(m_vColor2, 40.0f, 50.0f, 50.0f);
	m_fTimeLimit = 0.0f;
	m_fPulse = 0.0f;
}

// ----------------------------------------------------------------------- //
// ROUTINE		: Rain::Setup
// DESCRIPTION	: 
// RETURN TYPE	: void 
// PARAMS		: DFLOAT fDensity
// PARAMS		: DVector vDims
// PARAMS		: DFLOAT fLifeTime
// PARAMS		: DVector vDir
// PARAMS		: DBOOL bGravity
// PARAMS		: DFLOAT fScale
// PARAMS		: DFLOAT fSpread
// PARAMS		: DVector vColor1
// PARAMS		: DVector vColor2
// ----------------------------------------------------------------------- //

void Rain::Setup(DFLOAT fDensity, DVector vDims, DFLOAT fLifeTime, DVector vDir, DBOOL bGravity, DFLOAT fScale, 
				 DFLOAT fSpread, DVector vColor1, DVector vColor2, DFLOAT fTimeLimit, DFLOAT fPulse)
{
	m_fDensity = fDensity;
	VEC_COPY(m_vDims,vDims);
	m_fLifetime = fLifeTime;
	m_bGravity = bGravity;
	m_fParticleScale = fScale;
	m_fSpread = fSpread;
	VEC_COPY(m_vDirection,vDir);
	VEC_COPY(m_vColor1,vColor1);
	VEC_COPY(m_vColor2,vColor2);
	m_fTimeLimit = fTimeLimit;
	m_fPulse = fPulse;

	SendEffectMessage();

	return;
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	Rain::EngineMessageFn
//
//	PURPOSE:	Handle engine messages
//
// ----------------------------------------------------------------------- //

DDWORD Rain::EngineMessageFn(DDWORD messageID, void *pData, DFLOAT fData)
{
	switch(messageID)
	{
		case MID_PRECREATE:
		{
			if (fData == PRECREATE_WORLDFILE)
				ReadProp((ObjectCreateStruct *)pData);
			break;
		}

		case MID_INITIALUPDATE:
		{
			if (fData != INITIALUPDATE_SAVEGAME)
				InitialUpdate((DVector *)pData);
			break;
		}

		case MID_SAVEOBJECT:
			Save((HMESSAGEWRITE)pData, (DDWORD)fData);
			break;

		case MID_LOADOBJECT:
			Load((HMESSAGEREAD)pData, (DDWORD)fData);
			break;

		//SCHLEGZ 5/3/98 11:29:45 PM: if parent is gone, remove this
		case MID_PARENTATTACHMENTREMOVED:
			GetServerDE()->RemoveObject(m_hObject);
			break;

		default : break;
	}

	return CClientSFX::EngineMessageFn(messageID, pData, fData);
}


// --------------------------------------------------------------------------- //
//
//	ROUTINE:	Rain::ObjectMessageFn()
//
//	PURPOSE:	Handler for server object messages.
//
// --------------------------------------------------------------------------- //

DDWORD Rain::ObjectMessageFn(HOBJECT hSender, DDWORD messageID, HMESSAGEREAD hRead)
{
	CServerDE* pServerDE = GetServerDE();
	switch (messageID)
	{
		case MID_TRIGGER:
			HSTRING hMsg = pServerDE->ReadFromMessageHString(hRead);
			TriggerMsg(hSender, hMsg);
			pServerDE->FreeString(hMsg);
			break;
	}
	
	return CClientSFX::ObjectMessageFn(hSender, messageID, hRead);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	Rain::ReadProp
//
//	PURPOSE:	Set property value
//
// ----------------------------------------------------------------------- //

DBOOL Rain::ReadProp(ObjectCreateStruct *pStruct)
{
	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE || !pStruct) return DFALSE;

	pServerDE->GetPropVector("Dims", &m_vDims);
	pServerDE->GetPropReal("Density", &m_fDensity);
	pServerDE->GetPropReal("Lifetime", &m_fLifetime);
	pServerDE->GetPropVector("Direction", &m_vDirection);
	pServerDE->GetPropBool("AddGravity", &m_bGravity);
	pServerDE->GetPropReal("ParticleScale", &m_fParticleScale);
	pServerDE->GetPropReal("Spread", &m_fSpread);
	pServerDE->GetPropBool("Triggered", &m_bTriggered);
	pServerDE->GetPropVector("Color1", &m_vColor1);
	pServerDE->GetPropVector("Color2", &m_vColor2);
	pServerDE->GetPropReal("TimeLimit", &m_fTimeLimit);
	pServerDE->GetPropReal("Pulse", &m_fPulse);

	return DTRUE;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	Rain::InitialUpdate
//
//	PURPOSE:	Handle initial Update
//
// ----------------------------------------------------------------------- //

void Rain::InitialUpdate(DVector *pMovement)
{
	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE) return;

	DVector vPos;
	pServerDE->GetObjectPos(m_hObject, &vPos);

	// Mark this object as savable
	DDWORD dwFlags = pServerDE->GetObjectUserFlags(m_hObject);
	dwFlags |= USRFLG_SAVEABLE;
	pServerDE->SetObjectUserFlags(m_hObject, dwFlags);

	// Tell the clients about the Rain
	if (!m_bTriggered)
		SendEffectMessage();
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	Rain::SendEffectMessage
//
//	PURPOSE:	Sends a message to the client to start a rain effect
//
// ----------------------------------------------------------------------- //

void Rain::SendEffectMessage()
{
	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE) return;

	HMESSAGEWRITE hMessage = pServerDE->StartSpecialEffectMessage(this);
	pServerDE->WriteToMessageByte(hMessage, SFX_RAIN_ID);
/*
	if(m_fTimeLimit)	//SCHLEGZ 5/3/98 11:36:00 PM: remove object if the server object disappears (HACK!!)
		pServerDE->WriteToMessageByte(hMessage, DFALSE);
	else
//pServerDE->WriteToMessageByte(hMessage, DTRUE);
*/
	pServerDE->WriteToMessageFloat(hMessage, (DFLOAT)m_dwFlags);
	pServerDE->WriteToMessageFloat(hMessage, m_fDensity);
	pServerDE->WriteToMessageFloat(hMessage, m_fLifetime);
	pServerDE->WriteToMessageByte(hMessage, (DBYTE)m_bGravity);
	pServerDE->WriteToMessageFloat(hMessage, m_fParticleScale);
	pServerDE->WriteToMessageFloat(hMessage, m_fSpread);
	pServerDE->WriteToMessageVector(hMessage, &m_vDims);
	pServerDE->WriteToMessageVector(hMessage, &m_vDirection);
	pServerDE->WriteToMessageVector(hMessage, &m_vColor1);
	pServerDE->WriteToMessageVector(hMessage, &m_vColor2);
	pServerDE->WriteToMessageFloat(hMessage, m_fTimeLimit);
	pServerDE->WriteToMessageFloat(hMessage, m_fPulse);
	pServerDE->EndMessage(hMessage);
}


// --------------------------------------------------------------------------- //
//
//	ROUTINE:	Rain::TriggerMsg()
//
//	PURPOSE:	Handler for rain trigger messages.
//
// --------------------------------------------------------------------------- //

void Rain::TriggerMsg(HOBJECT hSender, HSTRING hMsg)
{
	CServerDE* pServerDE = GetServerDE();
	HSTRING hstr;

	hstr = pServerDE->CreateString(g_szTriggerOn);
	if (pServerDE->CompareStringsUpper(hMsg, hstr))
		SendEffectMessage();
	pServerDE->FreeString(hstr);
}

	

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

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

	pServerDE->WriteToMessageDWord(hWrite, m_dwFlags);
	pServerDE->WriteToMessageFloat(hWrite, m_fDensity);
	pServerDE->WriteToMessageFloat(hWrite, m_fLifetime);
	pServerDE->WriteToMessageByte(hWrite, m_bGravity);
	pServerDE->WriteToMessageFloat(hWrite, m_fParticleScale);
	pServerDE->WriteToMessageFloat(hWrite, m_fSpread);
	pServerDE->WriteToMessageByte(hWrite, m_bTriggered);
	pServerDE->WriteToMessageVector(hWrite, &m_vDims);
	pServerDE->WriteToMessageVector(hWrite, &m_vDirection);
	pServerDE->WriteToMessageVector(hWrite, &m_vColor1);
	pServerDE->WriteToMessageVector(hWrite, &m_vColor2);
	pServerDE->WriteToMessageFloat(hWrite, m_fTimeLimit);
	pServerDE->WriteToMessageFloat(hWrite, m_fPulse);
}


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

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

	m_dwFlags		= pServerDE->ReadFromMessageDWord(hRead);
	m_fDensity		= pServerDE->ReadFromMessageFloat(hRead);
	m_fLifetime		= pServerDE->ReadFromMessageFloat(hRead);
	m_bGravity		= pServerDE->ReadFromMessageByte(hRead);
	m_fParticleScale= pServerDE->ReadFromMessageFloat(hRead);
	m_fSpread		= pServerDE->ReadFromMessageFloat(hRead);
	m_bTriggered	= pServerDE->ReadFromMessageByte(hRead);
	pServerDE->ReadFromMessageVector(hRead, &m_vDims);
	pServerDE->ReadFromMessageVector(hRead, &m_vDirection);
	pServerDE->ReadFromMessageVector(hRead, &m_vColor1);
	pServerDE->ReadFromMessageVector(hRead, &m_vColor2);
	m_fTimeLimit	= pServerDE->ReadFromMessageFloat(hRead);	
	m_fPulse		= pServerDE->ReadFromMessageFloat(hRead);	

	// Tell the clients about the Rain
	if (!m_bTriggered)
		SendEffectMessage();
}



⌨️ 快捷键说明

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