📄 clientparticlestreamsfx.cpp
字号:
// ----------------------------------------------------------------------- //
//
// MODULE : ClientParticleStreamSFX.cpp
//
// PURPOSE : CClientParticleStreamSFX - Definition
//
// CREATED : 7-1-98
//
// ----------------------------------------------------------------------- //
#include "ClientParticleStreamSFX.h"
#include "ClientServerShared.h"
#include "ObjectUtilities.h"
#include "cpp_server_de.h"
#include "SFXMsgIds.h"
#include <mbstring.h>
BEGIN_CLASS(CClientParticleStreamSFX)
ADD_REALPROP(SystemRadius, 1000.0f)
ADD_REALPROP_FLAG(PositionRadius, 1.0f, PF_RADIUS)
ADD_REALPROP(MinVelocity, 0.0f)
ADD_REALPROP(MaxVelocity, 25.0f)
ADD_LONGINTPROP(NumParticles, 1)
ADD_REALPROP(VelSpread, 0.0f)
ADD_COLORPROP(MinColor, 255.0f, 255.0f, 255.0f)
ADD_COLORPROP(MaxColor, 255.0f, 255.0f, 255.0f)
ADD_REALPROP(SystemAlpha, 1.0f)
ADD_REALPROP(MinLifetime, 1.0f)
ADD_REALPROP(MaxLifetime, 2.0f)
ADD_REALPROP(RampTime, 0.0f)
ADD_REALPROP(AddDelay, 0.1f)
ADD_REALPROP(Gravity, 15.0f)
ADD_BOOLPROP(RampAmount, DFALSE)
ADD_BOOLPROP(RampOffset, DFALSE)
ADD_BOOLPROP(RampVelocity, DFALSE)
ADD_BOOLPROP(RampLifetime, DFALSE)
ADD_BOOLPROP(InitiallyOn, DFALSE)
ADD_STRINGPROP(ParticleFile, "SpriteTextures\\drop32_1.dtx")
ADD_REALPROP(SoundRadius, 200.0f)
ADD_STRINGPROP(RampUpSound, "")
ADD_STRINGPROP(LoopSound, "")
ADD_STRINGPROP(RampDownSound, "")
END_CLASS_DEFAULT(CClientParticleStreamSFX, CClientSFX, NULL, NULL)
// ----------------------------------------------------------------------- //
void CClientParticleStreamSFX::SetupFX()
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return;
HMESSAGEWRITE hMessage = pServerDE->StartSpecialEffectMessage(this);
pServerDE->WriteToMessageByte(hMessage, SFX_PARTICLESTREAM_ID);
pServerDE->WriteToMessageFloat(hMessage, fRadius);
pServerDE->WriteToMessageFloat(hMessage, fPosRadius);
pServerDE->WriteToMessageFloat(hMessage, fMinVel);
pServerDE->WriteToMessageFloat(hMessage, fMaxVel);
pServerDE->WriteToMessageDWord(hMessage, nNumParticles);
pServerDE->WriteToMessageFloat(hMessage, fSpread);
pServerDE->WriteToMessageVector(hMessage, &vColor1);
pServerDE->WriteToMessageVector(hMessage, &vColor2);
pServerDE->WriteToMessageFloat(hMessage, fAlpha);
pServerDE->WriteToMessageFloat(hMessage, fMinLife);
pServerDE->WriteToMessageFloat(hMessage, fMaxLife);
pServerDE->WriteToMessageFloat(hMessage, fRampTime);
pServerDE->WriteToMessageFloat(hMessage, fDelay);
pServerDE->WriteToMessageFloat(hMessage, fGravity);
pServerDE->WriteToMessageByte(hMessage, bRampFlags);
pServerDE->WriteToMessageByte(hMessage, bOn);
pServerDE->WriteToMessageHString(hMessage, hstrTexture);
pServerDE->WriteToMessageFloat(hMessage, fSoundRadius);
pServerDE->WriteToMessageHString(hMessage, hstrSound1);
pServerDE->WriteToMessageHString(hMessage, hstrSound2);
pServerDE->WriteToMessageHString(hMessage, hstrSound3);
pServerDE->EndMessage(hMessage);
}
// ----------------------------------------------------------------------- //
DDWORD CClientParticleStreamSFX::ObjectMessageFn(HOBJECT hSender, DDWORD messageID, HMESSAGEREAD hRead)
{
switch(messageID)
{
case MID_TRIGGER:
{
HandleTrigger(hSender, hRead);
break;
}
default : break;
}
return CClientSFX::ObjectMessageFn(hSender, messageID, hRead);
}
// ----------------------------------------------------------------------- //
DDWORD CClientParticleStreamSFX::EngineMessageFn(DDWORD messageID, void *pData, DFLOAT fData)
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return 0;
switch(messageID)
{
case MID_PRECREATE:
{
// Only read properties if object was created from a world file.
if (fData == PRECREATE_WORLDFILE)
{
ReadProp((ObjectCreateStruct*)pData);
}
break;
}
case MID_INITIALUPDATE:
{
if (fData != INITIALUPDATE_SAVEGAME)
{
pServerDE->SetNextUpdate(m_hObject, 0.0f);
DDWORD dwFlags = g_pServerDE->GetObjectFlags(m_hObject);
dwFlags &= ~FLAG_GRAVITY;
dwFlags |= FLAG_FORCECLIENTUPDATE;
g_pServerDE->SetObjectFlags(m_hObject, dwFlags);
DDWORD dwUsrFlags = g_pServerDE->GetObjectUserFlags(m_hObject);
dwUsrFlags |= USRFLG_SAVEABLE;
if(bOn) dwUsrFlags |= USRFLG_VISIBLE;
else dwUsrFlags &= ~USRFLG_VISIBLE;
pServerDE->SetObjectUserFlags(m_hObject, dwUsrFlags);
SetupFX();
}
CacheFiles();
break;
}
/* No updates necessary for this object, since it the flags can be set by the trigger fn.
GK 8/20/98
case MID_UPDATE:
{
DDWORD dwUsrFlags = g_pServerDE->GetObjectUserFlags(m_hObject);
if(bOn) dwUsrFlags |= USRFLG_VISIBLE;
else dwUsrFlags &= ~USRFLG_VISIBLE;
pServerDE->SetObjectUserFlags(m_hObject, dwUsrFlags);
pServerDE->SetNextUpdate(m_hObject, 0.1f);
if(!pServerDE) pServerDE->RemoveObject(m_hObject);
break;
}
*/
case MID_SAVEOBJECT:
{
Save((HMESSAGEWRITE)pData, (DDWORD)fData);
}
break;
case MID_LOADOBJECT:
{
Load((HMESSAGEREAD)pData, (DDWORD)fData);
}
break;
default : break;
}
return CClientSFX::EngineMessageFn(messageID, pData, fData);
}
// ----------------------------------------------------------------------- //
void CClientParticleStreamSFX::ReadProp(ObjectCreateStruct *pData)
{
CServerDE* pServerDE = GetServerDE();
if(!pServerDE || !pData) return;
char szString[MAX_CS_FILENAME_LEN];
long tempLong;
DBOOL temp;
pServerDE->GetPropReal("SystemRadius", &fRadius);
pServerDE->GetPropReal("PositionRadius", &fPosRadius);
pServerDE->GetPropReal("MinVelocity", &fMinVel);
pServerDE->GetPropReal("MaxVelocity", &fMaxVel);
pServerDE->GetPropLongInt("NumParticles", &tempLong);
nNumParticles = (DDWORD)tempLong;
pServerDE->GetPropReal("VelSpread", &fSpread);
pServerDE->GetPropColor("MinColor", &vColor1);
pServerDE->GetPropColor("MaxColor", &vColor2);
pServerDE->GetPropReal("SystemAlpha", &fAlpha);
pServerDE->GetPropReal("MinLifetime", &fMinLife);
pServerDE->GetPropReal("MaxLifetime", &fMaxLife);
pServerDE->GetPropReal("RampTime", &fRampTime);
pServerDE->GetPropReal("AddDelay", &fDelay);
pServerDE->GetPropReal("Gravity", &fGravity);
bRampFlags = 0;
pServerDE->GetPropBool("RampAmount", &temp);
if(temp) bRampFlags |= 0x01;
pServerDE->GetPropBool("RampOffset", &temp);
if(temp) bRampFlags |= 0x02;
pServerDE->GetPropBool("RampVelocity", &temp);
if(temp) bRampFlags |= 0x04;
pServerDE->GetPropBool("RampLifetime", &temp);
if(temp) bRampFlags |= 0x08;
pServerDE->GetPropBool("InitiallyOn", &bOn);
pServerDE->GetPropString("ParticleFile", szString, MAX_CS_FILENAME_LEN);
hstrTexture = pServerDE->CreateString(szString);
pServerDE->GetPropReal("SoundRadius", &fSoundRadius);
pServerDE->GetPropString("RampUpSound", szString, MAX_CS_FILENAME_LEN);
hstrSound1 = pServerDE->CreateString(szString);
pServerDE->GetPropString("LoopSound", szString, MAX_CS_FILENAME_LEN);
hstrSound2 = pServerDE->CreateString(szString);
pServerDE->GetPropString("RampDownSound", szString, MAX_CS_FILENAME_LEN);
hstrSound3 = pServerDE->CreateString(szString);
return;
}
// ----------------------------------------------------------------------- //
void CClientParticleStreamSFX::HandleTrigger(HOBJECT hSender, HMESSAGEREAD hRead)
{
HSTRING hMsg = g_pServerDE->ReadFromMessageHString(hRead);
char *pszMessage = g_pServerDE->GetStringData(hMsg);
DDWORD dwUsrFlags = g_pServerDE->GetObjectUserFlags(m_hObject);
if( _mbsncmp((const unsigned char*)pszMessage, (const unsigned char*)"TOGGLE", 6) == 0)
bOn = !bOn;
else if( _mbsncmp((const unsigned char*)pszMessage, (const unsigned char*)"ON", 2) == 0)
bOn = DTRUE;
else if( _mbsncmp((const unsigned char*)pszMessage, (const unsigned char*)"OFF", 3) == 0)
bOn = DFALSE;
if(bOn)
dwUsrFlags |= USRFLG_VISIBLE;
else
dwUsrFlags &= ~USRFLG_VISIBLE;
g_pServerDE->SetObjectUserFlags(m_hObject, dwUsrFlags);
g_pServerDE->FreeString(hMsg);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CClientParticleStreamSFX::Save
//
// PURPOSE: Save the object
//
// ----------------------------------------------------------------------- //
void CClientParticleStreamSFX::Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags)
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE || !hWrite) return;
// Only need to save the data that changes (all the data in the
// special fx message is saved/loaded for us)...
pServerDE->WriteToMessageByte(hWrite, bOn);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CClientParticleStreamSFX::Load
//
// PURPOSE: Load the object
//
// ----------------------------------------------------------------------- //
void CClientParticleStreamSFX::Load(HMESSAGEREAD hRead, DDWORD dwLoadFlags)
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE || !hRead) return;
bOn = (DBOOL) pServerDE->ReadFromMessageByte(hRead);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CClientParticleStreamSFX::CacheFiles
//
// PURPOSE: Cache resources used by the object
//
// ----------------------------------------------------------------------- //
void CClientParticleStreamSFX::CacheFiles()
{
if (!g_pServerDE) return;
// {MD 9/23/98}
if(!(g_pServerDE->GetServerFlags() & SS_CACHING))
return;
char* pFile = DNULL;
if (hstrSound1)
{
if (pFile = g_pServerDE->GetStringData(hstrSound1))
g_pServerDE->CacheFile(FT_SOUND ,pFile);
}
if (hstrSound2)
{
if (pFile = g_pServerDE->GetStringData(hstrSound2))
g_pServerDE->CacheFile(FT_SOUND ,pFile);
}
if (hstrSound3)
{
if (pFile = g_pServerDE->GetStringData(hstrSound3))
g_pServerDE->CacheFile(FT_SOUND ,pFile);
}
if (hstrTexture)
{
if (pFile = g_pServerDE->GetStringData(hstrTexture))
g_pServerDE->CacheFile(FT_TEXTURE ,pFile);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -