📄 rain.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 + -