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

📄 clientexplosionsfx.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -