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

📄 viewcreature.cpp

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

//----------------------------------------------------------
//
// MODULE  : ViewCreature.cpp
//
// PURPOSE : Handles the positioning of the view creature on 
//           The client side.
//
// CREATED : 9/22/97
//
//----------------------------------------------------------

// Includes...

#include <crtdbg.h>
#include "ViewCreature.h"
#include "BloodClientShell.h"
#include "commands.h"


extern CBloodClientShell* g_pBloodClientShell;


// --------------------------------------------------------------------------- //
//
//	ROUTINE:	CViewCreature::CViewCreature()
//
//	PURPOSE:	Constructor
//
// --------------------------------------------------------------------------- //

CViewCreature::CViewCreature()
{
	m_dwType = 0;
	m_fDmgTime = 0.0f;
	m_nNumUseHits = 0;
	m_nTotalNumUseHits = 0;
	m_fLastHitUse = 0.0f;

	return;
}

// --------------------------------------------------------------------------- //
//	ROUTINE:	CViewCreature::~CViewCreature()
//	PURPOSE:	Deletes this weapon object.
// --------------------------------------------------------------------------- //

CViewCreature::~CViewCreature()
{
	Term();
}

// --------------------------------------------------------------------------- //
//
//	ROUTINE:	CViewCreature::Create()
//
//	PURPOSE:	Create the object
//
// --------------------------------------------------------------------------- //

HLOCALOBJ CViewCreature::Create(CClientDE* pClientDE, DDWORD dwType, HLOCALOBJ hServer, HLOCALOBJ hEnemy)
{
	m_pClientDE	= pClientDE;

	m_hServerObject = hServer;
	m_hEnemyObject = hEnemy;
	m_dwType = dwType;

	VEC_COPY(m_vLightScale, g_pBloodClientShell->GetLightScale());

	pClientDE->SetObjectClientFlags(m_hEnemyObject, CF_NOTIFYREMOVE);
	pClientDE->SetObjectClientFlags(m_hServerObject, CF_NOTIFYREMOVE);

	return DNULL;
}

// --------------------------------------------------------------------------- //
//
//	ROUTINE:	CViewCreature::Term()
//
//	PURPOSE:	
//
// --------------------------------------------------------------------------- //

void CViewCreature::Term()
{
	return;
}

// --------------------------------------------------------------------------- //
//
//	ROUTINE:	CViewCreature::Detach()
//
//	PURPOSE:	
//
// --------------------------------------------------------------------------- //

void CViewCreature::Detach()
{
	HMESSAGEWRITE hMessage = m_pClientDE->StartMessage(CMSG_DETACH_AI);
	m_pClientDE->WriteToMessageObject(hMessage, m_hServerObject);
	m_pClientDE->EndMessage(hMessage);
	
	g_pBloodClientShell->RemoveCreature();

	return;
}

// --------------------------------------------------------------------------- //
//
//	ROUTINE:	CViewCreature::UseKeyHit()
//
//	PURPOSE:	
//
// --------------------------------------------------------------------------- //

void CViewCreature::UseKeyHit()
{
	DFLOAT fTime = m_pClientDE->GetTime();

	m_nTotalNumUseHits++;
	if((fTime - m_fLastHitUse) < 0.5f)
	{
		m_nNumUseHits++;
	}
	else
	{
		m_nNumUseHits = 0;	
	}
	
	m_fLastHitUse = m_pClientDE->GetTime();

	if(m_nNumUseHits >= NUM_USE_HITS || m_nTotalNumUseHits >= MAXNUM_USE_HITS )
	{
		Detach();

		m_fLastHitUse = 0.0f;
		m_nNumUseHits = 0;
		m_nTotalNumUseHits = 0;

		return;
	}

	return;
}

// --------------------------------------------------------------------------- //
//
//	ROUTINE:	CViewCreature::Update()
//
//	PURPOSE:	Updates the creature's position and animation state.
//
// --------------------------------------------------------------------------- //

void CViewCreature::Update(DFLOAT fPitch, DFLOAT fYaw, DVector *pos)
{
	DRotation rRot;
	DVector vR;
	DVector vU;
	DVector vF;
	DVector myPos;

	m_pClientDE->SetupEuler(&rRot, fPitch, fYaw, (float)0);
	m_pClientDE->SetObjectRotation(m_hServerObject, &rRot);

	m_pClientDE->GetRotationVectors(&rRot, &vU, &vR, &vF);

	VEC_COPY(myPos, *pos)

	switch(m_dwType)
	{
		case SMSG_HAND_ATTACH:		VEC_MULSCALAR(vU, vU, HAND_OFFSET_U);
									VEC_MULSCALAR(vR, vR, HAND_OFFSET_R);
									VEC_MULSCALAR(vF, vF, HAND_OFFSET_F);
									break;

		case SMSG_BONELEECH_ATTACH:	VEC_MULSCALAR(vU, vU, BONE_OFFSET_U);
									VEC_MULSCALAR(vR, vR, BONE_OFFSET_R);
									VEC_MULSCALAR(vF, vF, BONE_OFFSET_F);
									break;

		case SMSG_THIEF_ATTACH:		VEC_MULSCALAR(vU, vU, THIEF_OFFSET_U);
									VEC_MULSCALAR(vR, vR, THIEF_OFFSET_R);
									VEC_MULSCALAR(vF, vF, THIEF_OFFSET_F);
									break;
	}

	VEC_ADD(myPos, myPos, vU);
	VEC_ADD(myPos, myPos, vR);
	VEC_ADD(myPos, myPos, vF);

	m_pClientDE->SetObjectPos(m_hServerObject, &myPos);

	switch(m_dwType)
	{
		case SMSG_HAND_ATTACH:
		{
			if(m_pClientDE->GetTime() - m_fDmgTime >= 1.0f)
			{
				m_fDmgTime = m_pClientDE->GetTime();

				VEC_MULSCALAR(m_vLightScale, m_vLightScale, 0.9f);
			}

			break;
		}

		case SMSG_BONELEECH_ATTACH:
		{
			if(m_pClientDE->GetTime() - m_fDmgTime >= 1.0f)
			{
				m_fDmgTime = m_pClientDE->GetTime();

				VEC_MULSCALAR(m_vLightScale, m_vLightScale, 0.9f);
			}

			break;
		}
	}

	return;
}

⌨️ 快捷键说明

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