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

📄 ikchainfx.cpp

📁 Blood 2全套源码
💻 CPP
字号:
// ----------------------------------------------------------------------- //
//
// MODULE  : IKChainFX.cpp
//
// PURPOSE : Chain special fx class - Implementation
//
// CREATED : 2/3/99
//
// ----------------------------------------------------------------------- //

#include "IKChainFX.h"
#include "cpp_client_de.h"
#include "ClientUtilities.h"
#include "BloodClientShell.h"

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CIKChainFX::CIKChainFX
//
//	PURPOSE:	Init the system
//
// ----------------------------------------------------------------------- //

CIKChainFX::CIKChainFX()
{
	for(DBYTE i = 0; i < IKCHAIN_MAX_LINKS; i++)
		m_hLinks[i] = DNULL;

	m_byNumLinks = 15;
	m_fScale = 1.0f;
	m_fTime = 1.0f;
	m_byFXType = IKCHAIN_FXTYPE_STRAIGHT;
	m_byFXFlags = 0;
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CIKChainFX::~CIKChainFX
//
//	PURPOSE:	Init the system
//
// ----------------------------------------------------------------------- //

CIKChainFX::~CIKChainFX()
{
	if(m_pClientDE)
	{
		for(DBYTE i = 0; i < IKCHAIN_MAX_LINKS; i++)
		{
			if(m_hLinks[i])
			{
				m_pClientDE->DeleteObject(m_hLinks[i]);
				m_hLinks[i] = DNULL;
			}
		}
	}
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CIKChainFX::Init
//
//	PURPOSE:	Init the system
//
// ----------------------------------------------------------------------- //

DBOOL CIKChainFX::Init(SFXCREATESTRUCT* psfxCreateStruct)
{
	if (!psfxCreateStruct)		return	DFALSE;

	IKCHAINCS* ikc = (IKCHAINCS*)psfxCreateStruct;

	m_hServerObject		= ikc->hServerObj;
	m_byNumLinks		= ikc->byNumLinks;
	m_fScale			= ikc->fScale;
	m_fTime				= ikc->fTime;
	m_byFXType			= ikc->byFXType;
	m_byFXFlags			= ikc->byFXFlags;

	return DTRUE;
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CIKChainFX::CreateObject
//
//	PURPOSE:	Create object associated the particle system.
//
// ----------------------------------------------------------------------- //

DBOOL CIKChainFX::CreateObject(CClientDE *pClientDE)
{
	if(!pClientDE || !m_hServerObject) return DFALSE;

	// Call the base CreateObject function
	CSpecialFX::CreateObject(pClientDE);

	// Add in all the links
	for(DBYTE i = 0; i < m_byNumLinks; i++)
	{
		m_hLinks[i] = AddLink();

		if(!m_hLinks[i])
			return DFALSE;
	}

	// Get the server object position
	DVector		vPos, vU, vR, vF;
	DRotation	rRot;
	m_pClientDE->GetObjectPos(m_hServerObject, &vPos);
	m_pClientDE->GetObjectRotation(m_hServerObject, &rRot);
	m_pClientDE->GetRotationVectors(&rRot, &vU, &vR, &vF);

	VEC_MULSCALAR(vF, vF, -m_fScale);

	// Init the points
	if(m_byFXType == IKCHAIN_FXTYPE_STRAIGHT)
	{
		VEC_COPY(m_pPoints[0], vPos);

		for(i = 1; i < m_byNumLinks + 1; i++)
		{
			VEC_ADD(m_pPoints[i], m_pPoints[i-1], vF);
		}
	}
	else if(m_byFXType == IKCHAIN_FXTYPE_BUNCHED)
	{
		for(i = 0; i < m_byNumLinks + 1; i++)
		{
			if(i & 0x01)
				{ VEC_ADD(m_pPoints[i], vPos, vF); }
			else
				{ VEC_COPY(m_pPoints[i], vPos); }
		}
	}

	return DTRUE;
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CIKChainFX::Update
//
//	PURPOSE:	Update the particles
//
// ----------------------------------------------------------------------- //

DBOOL CIKChainFX::Update()
{
	if(!m_pClientDE || !m_hServerObject)
		return DFALSE;

	DVector		vPos, vAngle, vU, vR, vF;
	DRotation	rRot;
	DBYTE		i = 0;

	// Move the first point to match up with the server object location
	m_pClientDE->GetObjectPos(m_hServerObject, &(m_pPoints[0]));

	// Calculate any new point locations
	for(i = 0; i < m_byNumLinks; i++)
	{
		VEC_SUB(vAngle, m_pPoints[i+1], m_pPoints[i]);
		VEC_NORM(vAngle);
		VEC_MULSCALAR(vAngle, vAngle, m_fScale);
		VEC_ADD(m_pPoints[i+1], m_pPoints[i], vAngle);
	}

	// Move the links into their positions
	for(i = 0; i < m_byNumLinks; i++)
	{
		if(m_hLinks[i])
		{
			VEC_SUB(vAngle, m_pPoints[i+1], m_pPoints[i]);

			m_pClientDE->GetObjectRotation(m_hLinks[i], &rRot);
			m_pClientDE->GetRotationVectors(&rRot, &vU, &vR, &vF);
			m_pClientDE->AlignRotation(&rRot, &vAngle, &vU);

			m_pClientDE->SetObjectPosAndRotation(m_hLinks[i], &(m_pPoints[i]), &rRot);
		}
	}

	return DTRUE;
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CIKChainFX::AddLink
//
//	PURPOSE:	Update the particles
//
// ----------------------------------------------------------------------- //

HLOCALOBJ CIKChainFX::AddLink()
{
	if(!m_pClientDE || !m_hServerObject)
		return DNULL;

	DRotation	rTemp;
	DVector		vU, vR, vF;

	ObjectCreateStruct createStruct;
	INIT_OBJECTCREATESTRUCT(createStruct);

	createStruct.m_ObjectType = OT_MODEL;
	createStruct.m_Flags = FLAG_VISIBLE | FLAG_UPDATEUNSEEN;
	strcpy(createStruct.m_Filename, "Models_ao\\Ammo_ao\\chainlink.abc");
	strcpy(createStruct.m_SkinName, "Skins_ao\\Ammo_ao\\chainlink.dtx");

	m_pClientDE->GetObjectPos(m_hServerObject, &(createStruct.m_Pos));
	m_pClientDE->GetObjectRotation(m_hServerObject, &rTemp);

	// Randomly rotate it so they're not all the same direction
	m_pClientDE->GetRotationVectors(&rTemp, &vU, &vR, &vF);
	m_pClientDE->RotateAroundAxis(&rTemp, &vF, GetRandom(-MATH_PI, MATH_PI));
	ROT_COPY(createStruct.m_Rotation, rTemp);

	VEC_SET(createStruct.m_Scale, m_fScale, m_fScale, m_fScale);

	return m_pClientDE->CreateObject(&createStruct);
}

⌨️ 快捷键说明

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