📄 clientexplosionsfx.cpp
字号:
if (!pServerDE) return;
HSTRING hszModel, hszModelSkin;
if(szModel) hszModel = pServerDE->CreateString(szModel);
else hszModel = pServerDE->CreateString("Models\\Explosions\\exp_sphere.abc");
if(szSkin) hszModelSkin = pServerDE->CreateString(szSkin);
else hszModelSkin = pServerDE->CreateString("Skins\\Explosions\\Explosion_1.dtx");
// Tell the clients about the light...
HMESSAGEWRITE hMessage = pServerDE->StartInstantSpecialEffectMessage(&m_vPos);
pServerDE->WriteToMessageByte(hMessage, SFX_EXPLOSIONFRAG_ID);
// pServerDE->WriteToMessageByte(hMessage, DFALSE);
pServerDE->WriteToMessageVector(hMessage, &m_vPos);
pServerDE->WriteToMessageVector(hMessage, &m_vNormal);
pServerDE->WriteToMessageVector(hMessage, vScale);
pServerDE->WriteToMessageVector(hMessage, vRotateMax);
pServerDE->WriteToMessageFloat(hMessage, fSpread);
pServerDE->WriteToMessageFloat(hMessage, fDuration);
pServerDE->WriteToMessageFloat(hMessage, fVelocity);
pServerDE->WriteToMessageFloat(hMessage, fBounceMod);
pServerDE->WriteToMessageFloat(hMessage, fGravity);
pServerDE->WriteToMessageFloat(hMessage, fFadeTime);
pServerDE->WriteToMessageByte(hMessage, bRandDir);
pServerDE->WriteToMessageHString(hMessage, hszModel);
pServerDE->WriteToMessageHString(hMessage, hszModelSkin);
pServerDE->EndMessage(hMessage);
pServerDE->FreeString( hszModel );
pServerDE->FreeString( hszModelSkin );
}
// ----------------------------------------------------------------------- //
void CClientExplosionSFX::SetupFX(DVector *vPos, DVector *vNormal, DDWORD nType)
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return;
HMESSAGEWRITE hMessage = pServerDE->StartInstantSpecialEffectMessage(&m_vPos);
pServerDE->WriteToMessageByte(hMessage, SFX_EXPLOSIONFX_ID);
pServerDE->WriteToMessageVector(hMessage, vPos);
pServerDE->WriteToMessageVector(hMessage, vNormal);
pServerDE->WriteToMessageDWord(hMessage, nType);
pServerDE->EndMessage(hMessage);
}
// ----------------------------------------------------------------------- //
void CClientExplosionSFX::SetupFX()
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return;
HMESSAGEWRITE hMessage = pServerDE->StartInstantSpecialEffectMessage(&m_vPos);
pServerDE->WriteToMessageByte(hMessage, SFX_EXPLOSIONFX_ID);
pServerDE->WriteToMessageVector(hMessage, &m_vPos);
pServerDE->WriteToMessageVector(hMessage, &m_vNormal);
pServerDE->WriteToMessageDWord(hMessage, m_nType);
pServerDE->EndMessage(hMessage);
DamageObjectsInRadius(m_hObject, NULL, m_vPos, m_fDamageRadius, m_fDamage);
if (m_hstrSound)
PlaySoundFromPos(&m_vPos, pServerDE->GetStringData(m_hstrSound), 1000.0f, SOUNDPRIORITY_MISC_HIGH );
}
// ----------------------------------------------------------------------- //
DDWORD CClientExplosionSFX::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 CClientExplosionSFX::EngineMessageFn(DDWORD messageID, void *pData, DFLOAT fData)
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return 0;
switch(messageID)
{
case MID_PRECREATE:
{
ReadProp((ObjectCreateStruct*)pData);
break;
}
case MID_INITIALUPDATE:
{
pServerDE->SetNextUpdate(m_hObject, 0.1f);
pServerDE->GetObjectPos(m_hObject, &m_vPos);
DDWORD dwUserFlags = pServerDE->GetObjectUserFlags(m_hObject);
pServerDE->SetObjectUserFlags(m_hObject, dwUserFlags | USRFLG_SAVEABLE);
break;
}
case MID_UPDATE:
{
pServerDE->SetNextUpdate(m_hObject, 0.1f);
if(m_bTriggered) 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 CClientExplosionSFX::ReadProp(ObjectCreateStruct *pData)
{
CServerDE* pServerDE = GetServerDE();
if(!pServerDE || !pData) return;
long temp;
pServerDE->GetPropLongInt("ExplosionType", &temp);
m_nType = (DDWORD)temp;
pServerDE->GetPropReal("Damage", &m_fDamage);
pServerDE->GetPropReal("DamageRadius", &m_fDamageRadius);
pServerDE->GetPropVector("Direction", &m_vNormal);
char buf[MAX_CS_FILENAME_LEN];
buf[0] = '\0';
pServerDE->GetPropString("WaveFile", buf, MAX_CS_FILENAME_LEN);
if (buf[0]) m_hstrSound = pServerDE->CreateString(buf);
}
// ----------------------------------------------------------------------- //
void CClientExplosionSFX::HandleTrigger(HOBJECT hSender, HMESSAGEREAD hRead)
{
CServerDE* pServerDE = GetServerDE();
if(!pServerDE) return;
HSTRING hMsg = pServerDE->ReadFromMessageHString(hRead);
if(!hMsg) return;
HSTRING hstr = pServerDE->CreateString("TRIGGER");
if(pServerDE->CompareStringsUpper(hMsg, hstr))
{
SetupFX();
m_bTriggered = 1;
}
pServerDE->FreeString(hMsg);
pServerDE->FreeString(hstr);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CClientExplosionSFX::Save
//
// PURPOSE: Save the object
//
// ----------------------------------------------------------------------- //
void CClientExplosionSFX::Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE || !hWrite) return;
pServerDE->WriteToMessageVector(hWrite, &m_vPos);
pServerDE->WriteToMessageVector(hWrite, &m_vNormal);
pServerDE->WriteToMessageFloat(hWrite, m_fOffset);
pServerDE->WriteToMessageFloat(hWrite, m_fDamage);
pServerDE->WriteToMessageFloat(hWrite, m_fDamageRadius);
pServerDE->WriteToMessageDWord(hWrite, m_nType);
pServerDE->WriteToMessageHString(hWrite, m_hstrSound);
pServerDE->WriteToMessageByte(hWrite, m_bTriggered);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CClientExplosionSFX::Load
//
// PURPOSE: Load the object
//
// ----------------------------------------------------------------------- //
void CClientExplosionSFX::Load(HMESSAGEREAD hRead, DDWORD dwLoadFlags)
{
CServerDE* pServerDE = BaseClass::GetServerDE();
if (!pServerDE || !hRead) return;
pServerDE->ReadFromMessageVector(hRead, &m_vPos);
pServerDE->ReadFromMessageVector(hRead, &m_vNormal);
m_fOffset = pServerDE->ReadFromMessageFloat(hRead);
m_fDamage = pServerDE->ReadFromMessageFloat(hRead);
m_fDamageRadius = pServerDE->ReadFromMessageFloat(hRead);
m_nType = pServerDE->ReadFromMessageDWord(hRead);
m_hstrSound = pServerDE->ReadFromMessageHString(hRead);
m_bTriggered = pServerDE->ReadFromMessageByte(hRead);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -