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

📄 clientbloodtrail.cpp

📁 Blood 2全套源码
💻 CPP
字号:

 /****************************************************************************
 ;
 ;	MODULE:		ClientBloodTrail.cpp
 ;
 ;	PURPOSE:	server side blood trail object
 ;
 ;	HISTORY:	Created by SCHLEGZ on 5/21/98 1:48:35 PM
 ;
 ;	COMMENT:	Copyright (c) 1998, Monolith Productions Inc.
 ;
 ****************************************************************************/

#include "ClientBloodTrail.h"
#include "cpp_server_de.h"
#include "SFXMsgIds.h"
#include "clientsplatfx.h"

BEGIN_CLASS(CClientBloodTrail)
END_CLASS_DEFAULT_FLAGS(CClientBloodTrail, CClientSFX, NULL, NULL, CF_HIDDEN)


// ----------------------------------------------------------------------- //
// ROUTINE		: CClientBloodTrail::Setup
// DESCRIPTION	: 
// RETURN TYPE	: void 
// PARAMS		: DVector vVel
// PARAMS		: DBOOL bSmall
// PARAMS		: DVector vColor
// ----------------------------------------------------------------------- //

void CClientBloodTrail::Setup(DVector vVel, DVector vColor)
{ 
	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE) return;

	// Tell the clients about the SmokeTrail, and remove thyself...

	HMESSAGEWRITE hMessage = pServerDE->StartSpecialEffectMessage(this);
	pServerDE->WriteToMessageByte(hMessage, SFX_PARTICLEEXPLOSION_ID);
	pServerDE->WriteToMessageVector(hMessage, &vVel);
	pServerDE->WriteToMessageVector(hMessage, &vColor);
	pServerDE->EndMessage(hMessage);

	m_fScale = 0.2f;
}

// ----------------------------------------------------------------------- //
// ROUTINE		: CClientBloodTrail::EngineMessageFn
// DESCRIPTION	: 
// RETURN TYPE	: DDWORD 
// PARAMS		: DDWORD messageID
// PARAMS		: void *pData
// PARAMS		: DFLOAT fData
// ----------------------------------------------------------------------- //

DDWORD CClientBloodTrail::EngineMessageFn(DDWORD messageID, void *pData, DFLOAT fData)
{
	switch(messageID)
	{
		case MID_INITIALUPDATE:
		{
			CServerDE* pServerDE = GetServerDE();
			if (!pServerDE) return 0;

			pServerDE->SetNextUpdate(m_hObject, 0.02f);
			break;
		}

		case MID_UPDATE:
		{
			Update();

			break;
		}

		case MID_PARENTATTACHMENTREMOVED:
		{
			GetServerDE()->RemoveObject(m_hObject);
			break;
		}

		default : break;
	}

	return CClientSFX::EngineMessageFn(messageID, pData, fData);
}

// ----------------------------------------------------------------------- //
// ROUTINE		: CClientBloodTrail::Update
// DESCRIPTION	: 
// RETURN TYPE	: void 
// ----------------------------------------------------------------------- //

void CClientBloodTrail::Update()
{
	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE) return;

	DVector vPos,vU,vR,vF;
	DRotation rRot;
	IntersectQuery IQuery;
	IntersectInfo	IInfo;

	pServerDE->GetObjectPos(m_hObject, &vPos);
	pServerDE->GetObjectRotation(m_hObject,&rRot);
	pServerDE->GetRotationVectors(&rRot,&vU,&vR,&vF);

	IQuery.m_Flags	  = INTERSECT_OBJECTS | IGNORE_NONSOLID | INTERSECT_HPOLY;
	IQuery.m_FilterFn = DNULL;
	IQuery.m_pUserData = DNULL;

	VEC_COPY(IQuery.m_From,vPos);
	VEC_MULSCALAR(vU,vU,-5.0f);
	VEC_ADD(IQuery.m_To,IQuery.m_From,vU);

	if(pServerDE->IntersectSegment(&IQuery,&IInfo))
	{
		ObjectCreateStruct ocStruct;
		INIT_OBJECTCREATESTRUCT(ocStruct);

		DVector vTmp;
		VEC_MULSCALAR(vTmp, IInfo.m_Plane.m_Normal, 0.5f);
		VEC_COPY(ocStruct.m_Pos, IInfo.m_Point);
		VEC_ADD(ocStruct.m_Pos, ocStruct.m_Pos, vTmp);

		HCLASS hClass = pServerDE->GetClass("CClientSplatFX");

		CClientSplatFX *pSplat = DNULL;

		if (hClass)
		{
			pSplat = (CClientSplatFX *)pServerDE->CreateObject(hClass, &ocStruct);
		}

		if (pSplat)
		{
			HSTRING hstrSprite = DNULL;

			switch(pServerDE->IntRandom(1,3))
			{
				case 1:		hstrSprite = pServerDE->CreateString("sprites\\blood1.spr");	break;
				case 2:		hstrSprite = pServerDE->CreateString("sprites\\blood2.spr");	break;
				case 3:		hstrSprite = pServerDE->CreateString("sprites\\blood3.spr");	break;
				default:	hstrSprite = pServerDE->CreateString("sprites\\blood1.spr");	break;
			}

			pSplat->Setup( &IInfo.m_Point, &IInfo.m_Plane.m_Normal,m_fScale, 0.01f);

			pServerDE->FreeString(hstrSprite);
		}

		pServerDE->SetNextUpdate(m_hObject, 0.1f);
	}
	else
		pServerDE->SetNextUpdate(m_hObject, 0.2f);

	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -