📄 clientlightfx.cpp
字号:
g_pServerDE->SetObjectUserFlags(m_hObject, dwUsrFlags);
g_pServerDE->FreeString( hMsg );
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: ClientLightFX::ReadProp
//
// PURPOSE: Set property value
//
// ----------------------------------------------------------------------- //
DBOOL ClientLightFX::ReadProp(ObjectCreateStruct *)
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return DFALSE;
GenericProp genProp;
if (pServerDE->GetPropGeneric("HitPoints", &genProp) == DE_OK)
m_fHitPts = genProp.m_Float;
if (pServerDE->GetPropGeneric("LightSwitch", &genProp) == DE_OK)
m_bOn = genProp.m_Bool;
if (pServerDE->GetPropGeneric("LifeTime", &genProp) == DE_OK)
m_fLifeTime = genProp.m_Float;
if (m_fLifeTime < 0.0f) m_fLifeTime = 0.0f;
if (pServerDE->GetPropGeneric("Color", &genProp) == DE_OK)
VEC_COPY(m_vColor, genProp.m_Color);
if (pServerDE->GetPropGeneric("IntensityMin", &genProp) == DE_OK)
m_fIntensityMin = genProp.m_Float;
if (m_fIntensityMin < 0.0f) m_fIntensityMin = 0.0f;
if (pServerDE->GetPropGeneric("IntensityMax", &genProp) == DE_OK)
m_fIntensityMax = genProp.m_Float;
if (m_fIntensityMax > 255.0f) m_fIntensityMax = 255.0f;
if (pServerDE->GetPropGeneric("IntensityWaveform", &genProp) == DE_OK)
m_nIntensityWaveform = (DBYTE) genProp.m_Long;
if (pServerDE->GetPropGeneric("IntensityFreq", &genProp) == DE_OK)
m_fIntensityFreq = genProp.m_Float;
if (pServerDE->GetPropGeneric("IntensityPhase", &genProp) == DE_OK)
m_fIntensityPhase = genProp.m_Float;
if (pServerDE->GetPropGeneric("RadiusMin", &genProp) == DE_OK)
m_fRadiusMin = genProp.m_Float;
if (m_fRadiusMin < 0.0f) m_fRadiusMin = 0.0f;
if (pServerDE->GetPropGeneric("RadiusMax", &genProp) == DE_OK)
m_fRadiusMax = genProp.m_Float;
if (pServerDE->GetPropGeneric("RadiusWaveform", &genProp) == DE_OK)
m_nRadiusWaveform = (DBYTE) genProp.m_Long;
if (pServerDE->GetPropGeneric("RadiusFreq", &genProp) == DE_OK)
m_fRadiusFreq = genProp.m_Float;
if (pServerDE->GetPropGeneric("RadiusPhase", &genProp) == DE_OK)
m_fRadiusPhase = genProp.m_Float;
if (pServerDE->GetPropGeneric("RampUpSound", &genProp) == DE_OK)
{
if (genProp.m_String[0])
m_hstrRampUpSound = pServerDE->CreateString(genProp.m_String);
}
if (pServerDE->GetPropGeneric("RampDownSound", &genProp) == DE_OK)
{
if (genProp.m_String[0])
m_hstrRampDownSound = pServerDE->CreateString(genProp.m_String);
}
if (pServerDE->GetPropGeneric("CastShadowsFlag", &genProp) == DE_OK)
{
m_dwLightFlags |= genProp.m_Bool ? FLAG_CASTSHADOWS : 0;
}
if (pServerDE->GetPropGeneric("SolidLightFlag", &genProp) == DE_OK)
{
m_dwLightFlags |= genProp.m_Bool ? FLAG_SOLIDLIGHT : 0;
}
if (pServerDE->GetPropGeneric("OnlyLightWorldFlag", &genProp) == DE_OK)
{
m_dwLightFlags |= genProp.m_Bool ? FLAG_ONLYLIGHTWORLD : 0;
}
if (pServerDE->GetPropGeneric("DontLightBackfacingFlag", &genProp) == DE_OK)
{
m_dwLightFlags |= genProp.m_Bool ? FLAG_DONTLIGHTBACKFACING : 0;
}
if (pServerDE->GetPropGeneric("FogLightFlag", &genProp) == DE_OK)
{
m_dwLightFlags |= genProp.m_Bool ? FLAG_FOGLIGHT : 0;
}
return DTRUE;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: PostPropRead()
//
// PURPOSE: Update properties
//
// ----------------------------------------------------------------------- //
void ClientLightFX::PostPropRead(ObjectCreateStruct *pStruct)
{
if (!pStruct) return;
// Set the Update!
if (m_bOn)
{
pStruct->m_NextUpdate = 0.01f;
pStruct->m_Flags = FLAG_VISIBLE;
}
else
{
pStruct->m_NextUpdate = 0.0f;
}
pStruct->m_Flags |= FLAG_GOTHRUWORLD;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: InitialUpdate()
//
// PURPOSE: Handle initial update
//
// ----------------------------------------------------------------------- //
DBOOL ClientLightFX::InitialUpdate(DVector *pMovement)
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return DFALSE;
m_damage.Init(m_hObject);
m_damage.SetMaxHitPoints(m_fHitPts);
m_damage.SetHitPoints(m_fHitPts);
// Set Next update (randomize it if this object was loaded from the
// level - so we don't have all the lights updating on the same frame)...
DFLOAT fOffset = 0.0f;
if (!m_bDynamic) fOffset = pServerDE->Random(0.01f, 0.5f);
if (m_bOn)
{
pServerDE->SetNextUpdate(m_hObject, UPDATE_DELTA + fOffset);
}
Init();
SendEffectMessage();
return DTRUE;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: Init()
//
// PURPOSE: Initialize data members
//
// ----------------------------------------------------------------------- //
DBOOL ClientLightFX::Init()
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return DFALSE;
VEC_DIVSCALAR(m_vColor, m_vColor, 511.0f);
m_fStartTime = pServerDE->GetTime();
m_fIntensityPhase = DEG2RAD(m_fIntensityPhase);
m_fRadiusPhase = DEG2RAD(m_fRadiusPhase);
if (m_bOn)
{
DDWORD dwUsrFlags = pServerDE->GetObjectUserFlags(m_hObject);
dwUsrFlags |= USRFLG_VISIBLE | USRFLG_SAVEABLE;
pServerDE->SetObjectUserFlags(m_hObject, dwUsrFlags);
}
return DTRUE;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: ClientLightFX::Update
//
// PURPOSE:
//
// ----------------------------------------------------------------------- //
DBOOL ClientLightFX::Update()
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return DFALSE;
pServerDE->SetNextUpdate(m_hObject, UPDATE_DELTA);
DBOOL bRemove = DFALSE;
if (m_fLifeTime > 0 && (pServerDE->GetTime() - m_fStartTime) >= m_fLifeTime)
{
bRemove = DTRUE;
}
return (!bRemove);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: ClientLightFX::SendEffectMessage
//
// PURPOSE: Sends a message to the client to start a light effect
//
// ----------------------------------------------------------------------- //
void ClientLightFX::SendEffectMessage()
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return;
HMESSAGEWRITE hMessage = pServerDE->StartSpecialEffectMessage(this);
pServerDE->WriteToMessageByte(hMessage, SFX_LIGHT_ID);
pServerDE->WriteToMessageVector(hMessage, &m_vColor);
pServerDE->WriteToMessageDWord(hMessage, m_dwLightFlags);
pServerDE->WriteToMessageFloat(hMessage, m_fIntensityMin);
pServerDE->WriteToMessageFloat(hMessage, m_fIntensityMax);
pServerDE->WriteToMessageByte(hMessage, m_nIntensityWaveform);
pServerDE->WriteToMessageFloat(hMessage, m_fIntensityFreq);
pServerDE->WriteToMessageFloat(hMessage, m_fIntensityPhase);
pServerDE->WriteToMessageFloat(hMessage, m_fRadiusMin);
pServerDE->WriteToMessageFloat(hMessage, m_fRadiusMax);
pServerDE->WriteToMessageByte(hMessage, m_nRadiusWaveform);
pServerDE->WriteToMessageFloat(hMessage, m_fRadiusFreq);
pServerDE->WriteToMessageFloat(hMessage, m_fRadiusPhase);
pServerDE->WriteToMessageHString(hMessage, m_hstrRampUpSound);
pServerDE->WriteToMessageHString(hMessage, m_hstrRampDownSound);
pServerDE->EndMessage(hMessage);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: ClientLightFX::Save
//
// PURPOSE: Save the object
//
// ----------------------------------------------------------------------- //
void ClientLightFX::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, m_bOn);
pServerDE->WriteToMessageByte(hWrite, m_bDynamic);
pServerDE->WriteToMessageFloat(hWrite, m_fLifeTime);
pServerDE->WriteToMessageFloat(hWrite, m_fStartTime);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: ClientLightFX::Load
//
// PURPOSE: Load the object
//
// ----------------------------------------------------------------------- //
void ClientLightFX::Load(HMESSAGEREAD hRead, DDWORD dwLoadFlags)
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE || !hRead) return;
m_bOn = (DBOOL) pServerDE->ReadFromMessageByte(hRead);
m_bDynamic = (DBOOL) pServerDE->ReadFromMessageByte(hRead);
m_fLifeTime = pServerDE->ReadFromMessageFloat(hRead);
m_fStartTime = pServerDE->ReadFromMessageFloat(hRead);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: ClientLightFX::CacheFiles
//
// PURPOSE: Cache resources used by the object
//
// ----------------------------------------------------------------------- //
void ClientLightFX::CacheFiles()
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return;
// {MD 9/23/98}
if(!(pServerDE->GetServerFlags() & SS_CACHING))
return;
char* pFile = DNULL;
if (m_hstrRampUpSound)
{
pFile = g_pServerDE->GetStringData(m_hstrRampUpSound);
if (pFile)
{
g_pServerDE->CacheFile(FT_SOUND ,pFile);
}
}
if (m_hstrRampDownSound)
{
pFile = g_pServerDE->GetStringData(m_hstrRampDownSound);
if (pFile)
{
g_pServerDE->CacheFile(FT_SOUND ,pFile);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -