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

📄 fanatic.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		case 4:		if(m_fStimuli[SIGHT] > (m_fSeeingDist * 0.75))
					{
						MC_FaceTarget();
						Metacmd--;

						if(!IsLedge(m_MoveObj.GetForwardVector()) && fHeight <= m_vDims.y
							&& m_nCurMetacmd != MC_FIRE_CROUCH)
						{
							if(m_nInjuredLeg)
								MC_Walk();
							else
								MC_Fire_Run();
						}
						else
						{
							MC_Fire_Crouch();
						}
					}
					else
						Metacmd++;

					break;
		case 5:		ComputeState();		break;
	}

	return;
}

// ----------------------------------------------------------------------- //
// ROUTINE		: Fanatic::AI_STATE_Escape
// DESCRIPTION	: 
// RETURN TYPE	: void 
// ----------------------------------------------------------------------- //

void Fanatic::AI_STATE_Escape_RunAway()
{
	int nStimType = ComputeStimuli();

	if(nStimType > 0)
	{
		SetNewState(STATE_Special1);
		return;
	}

	DFLOAT fDim = (DFLOAT)sqrt((m_vDims.x * m_vDims.x) + (m_vDims.z * m_vDims.z)) + 0.1f;

	switch(Metacmd)
	{
		case 1:		m_hTrackObject = FindObjectInRadius(m_pServerDE->GetClass("ExitHint"), m_fSeeingDist, FIND_VISIBLE | FIND_AVOID_TARGET);

					if(m_hTrackObject)
					{
						m_pServerDE->GetObjectPos(m_hTrackObject,&m_vTrackObjPos);

						DVector vPos;
						VEC_SET(vPos, m_vTrackObjPos.x, m_MoveObj.GetPos().y, m_vTrackObjPos.z);

						if(VEC_DIST(vPos, m_MoveObj.GetPos()) <= fDim)
							SetNewState(STATE_Special1);
						else
						{
							MC_FacePos(m_vTrackObjPos);

							if(!m_MoveObj.CalculatePath(m_vTrackObjPos))
								SetNewState(STATE_Special1);
						}
					}
					else
						SetNewState(STATE_Special1);
					
					break;
		case 2:	
		{
					DVector* pvPos = m_MoveObj.GetNextPathPoint();
					
					if(pvPos)
						MC_FacePos(*pvPos);	
					else
						SetNewState(STATE_Escape_RunAway);

					break;
		}
		case 3:		
		{
					DVector vPoint = *m_MoveObj.GetNextPathPoint();
					vPoint.y = m_MoveObj.GetPos().y;

					if(VEC_DIST(vPoint, m_MoveObj.GetPos()) <= fDim/2)
					{
						if(!m_MoveObj.MoveToNextPathPoint())
						{
							MC_FacePos(m_vTargetPos);
						}
						else
						{
							Metacmd = 2;
						}
					}
					else
						MC_Run();

					break;
		}
		case 4:		ComputeState();			break;
	}

	return;
}

// ----------------------------------------------------------------------- //
// ROUTINE		: Fanatic::AI_STATE_Escape
// DESCRIPTION	: 
// RETURN TYPE	: void 
// ----------------------------------------------------------------------- //

void Fanatic::AI_STATE_Escape_Hide()
{
	switch(Metacmd)
	{
		case 1:		m_hTrackObject = FindObjectInRadius(m_pServerDE->GetClass("ExitHint"), m_fSeeingDist);

					if(m_hTrackObject)
					{
						m_pServerDE->GetObjectPos(m_hTrackObject,&m_vDestPos);
						SetNewState(STATE_RunToPos);
					}
					else
						SetNewState(STATE_AttackClose);
					
					break;
	}

	return;

}

// ----------------------------------------------------------------------- //
// ROUTINE		: Fanatic::AI_STATE_Dodge
// DESCRIPTION	: 
// RETURN TYPE	: void 
// ----------------------------------------------------------------------- //

void Fanatic::AI_STATE_Dodge()
{
	switch(Metacmd)
	{
		case 1:		m_nDodgeFlags = CalculateDodge(m_vTrackObjPos);
					Metacmd++;		break;
		case 2:		if(m_nDodgeFlags & ROLL)
					{
						if(m_nDodgeFlags & RIGHT)
							MC_Roll_Right();
						else if(m_nDodgeFlags & LEFT)
							MC_Roll_Left();
						else if(m_nDodgeFlags & FORWARD)
							MC_Roll_Forward();
						else
							MC_Roll_Backward();
					}
					else
					{
						Metacmd++;
					}

					break;
		case 3:		ComputeState();	break;
	}

	return;
}

// ----------------------------------------------------------------------- //
// ROUTINE		: Fanatic::AI_STATE_Special
// DESCRIPTION	: 
// RETURN TYPE	: void 
// ----------------------------------------------------------------------- //

void Fanatic::AI_STATE_Special1()
{
	switch(Metacmd)
	{
		case 1:		MC_Special();		
					break;
		case 2:		
		{
					m_pServerDE->SetModelNodeHideStatus(m_hObject, "torso_extra1", DTRUE);
			
					m_damage.SetHitPoints(50.0f);
					m_damage.SetArmorPoints(50.0f);
					m_fStartTime = m_pServerDE->GetTime();

					//create the smoke object
					ObjectCreateStruct ocStruct;
					INIT_OBJECTCREATESTRUCT(ocStruct);

					ocStruct.m_ObjectType = OT_NORMAL;
					ocStruct.m_NextUpdate = 0.01f;
					g_pServerDE->GetModelNodeTransform(m_hObject, "torso_extra1",&ocStruct.m_Pos,&ocStruct.m_Rotation);
					ocStruct.m_Flags = FLAG_FORCECLIENTUPDATE;
					
					HCLASS hClass = g_pServerDE->GetClass("BaseClass");
					BaseClass* pObj = g_pServerDE->CreateObject(hClass, &ocStruct);

					if(pObj)
					{
						m_hSmokeSource = pObj->m_hObject;
					}

					Metacmd++;			
					break;
		}
		case 3:		m_fStimuli[SIGHT] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);
			
					if(m_fStimuli[SIGHT] <= 100.0f || 
						m_pServerDE->GetTime() - m_fStartTime >= 30.0f)
					{
						Metacmd++;
					}
					else
					{
						MC_FaceTarget();
						Metacmd--;

						MC_Run();
					}
					break;
		case 4:		
		{
					ObjectCreateStruct ocStruct;
					INIT_OBJECTCREATESTRUCT(ocStruct);

					ROT_COPY(ocStruct.m_Rotation, m_MoveObj.GetRotation());
					VEC_COPY(ocStruct.m_Pos, m_MoveObj.GetPos());

					CProjectile	*pProject = NULL;

					HCLASS hClass = m_pServerDE->GetClass("CHowitzerShell");
					DFLOAT fVelocity = 250.0f;
					int nRadius = 200;

					if (hClass)
					{
						DVector vDown;
						VEC_MULSCALAR(vDown, m_MoveObj.GetUpVector(), -1.0f);

						if (pProject = (CProjectile*)m_pServerDE->CreateObject(hClass, &ocStruct))
							pProject->Setup(&vDown,	WEAP_HOWITZER, 50.0f, fVelocity, nRadius, m_hObject);
					}

					CreateGibs(m_MoveObj.GetUpVector(), ((int)m_damage.GetMass())>>5, 
								DAMAGE_TYPE_EXPLODE, 50.0f);

					if(m_hAttach && m_hSmokeSource)
					{
						m_pServerDE->RemoveAttachment(m_hAttach);
						m_pServerDE->RemoveObject(m_hSmokeSource);

						m_hSmokeSource = DNULL;
						m_hAttach = DNULL;
					}

					m_bRemoveMe = DTRUE;
					Metacmd++;

					break;
		}
		case 5:		break;
	}

	return;
}

// ----------------------------------------------------------------------- //
// ROUTINE		: Fanatic::AI_STATE_Dying
// DESCRIPTION	: 
// RETURN TYPE	: void 
// ----------------------------------------------------------------------- //

void Fanatic::AI_STATE_Dying()
{
	if(m_fStartTime)
	{
		ObjectCreateStruct ocStruct;
		INIT_OBJECTCREATESTRUCT(ocStruct);

		ROT_COPY(ocStruct.m_Rotation, m_MoveObj.GetRotation());
		VEC_COPY(ocStruct.m_Pos, m_MoveObj.GetPos());

		CProjectile	*pProject = NULL;

		HCLASS hClass = m_pServerDE->GetClass("CHowitzerShell");
		DFLOAT fVelocity = 250.0f;
		int nRadius = 200;

		if (hClass)
		{
			DVector vDown;
			VEC_MULSCALAR(vDown, m_MoveObj.GetUpVector(), -1.0f);

			if (pProject = (CProjectile*)m_pServerDE->CreateObject(hClass, &ocStruct))
				pProject->Setup(&vDown,	WEAP_HOWITZER, 50.0f, fVelocity, nRadius, m_hObject);
		}

		CreateGibs(m_MoveObj.GetUpVector(), ((int)m_damage.GetMass())>>5, 
					DAMAGE_TYPE_EXPLODE, 50.0f);

		if(m_hAttach && m_hSmokeSource)
		{
			m_pServerDE->RemoveAttachment(m_hAttach);
			m_pServerDE->RemoveObject(m_hSmokeSource);

			m_hSmokeSource = DNULL;
			m_hAttach = DNULL;
		}

		m_bRemoveMe = DTRUE;
	}
	else
		AI_Mgr::AI_STATE_Dying();

	return;
}

void Fanatic::Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return;

	pServerDE->WriteToMessageFloat(hWrite, m_fStartTime);
}

void Fanatic::Load(HMESSAGEREAD hRead, DDWORD dwLoadFlags)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return;

	m_fStartTime = pServerDE->ReadFromMessageFloat(hRead);

	if(m_fStartTime)
	{
		//create the smoke object
		ObjectCreateStruct ocStruct;
		INIT_OBJECTCREATESTRUCT(ocStruct);

		ocStruct.m_ObjectType = OT_NORMAL;
		ocStruct.m_NextUpdate = 0.01f;
		g_pServerDE->GetModelNodeTransform(m_hObject, "torso_extra1",&ocStruct.m_Pos,&ocStruct.m_Rotation);
		ocStruct.m_Flags = FLAG_FORCECLIENTUPDATE;
		
		HCLASS hClass = g_pServerDE->GetClass("BaseClass");
		BaseClass* pObj = g_pServerDE->CreateObject(hClass, &ocStruct);

		if(pObj)
		{
			m_hSmokeSource = pObj->m_hObject;
		}

		m_bStartSmoke = DTRUE;
	}
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CacheFiles
//
//	PURPOSE:	Cache resources used by the object
//
// ----------------------------------------------------------------------- //

void Fanatic::CacheFiles()
{
	// Sanity checks...

	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE) return;

	if(!(pServerDE->GetServerFlags() & SS_CACHING))
	{
		return;
	}

	if (!m_hObject) return;


	// Get the model filenames...

	char sModel[256] = { "" };
	char sSkin[256]  = { "" };

	pServerDE->GetModelFilenames(m_hObject, sModel, 255, sSkin, 255);


	// Cache models...

	pServerDE->CacheFile(FT_MODEL, sModel);


	// Cache textures...

	pServerDE->CacheFile(FT_TEXTURE, sSkin);


	// Cache sounds...

	SetCacheDirectory("sounds\\enemies\\fanatic");

	CacheSoundFileRange("death", 1, 3);
	CacheSoundFileRange("fear", 1, 3);
	CacheSoundFileRange("fire", 1, 3);
	CacheSoundFileRange("idle", 1, 3);
	CacheSoundFileRange("pain", 1, 3);
	CacheSoundFileRange("scream", 1, 3);
	CacheSoundFileRange("spot", 1, 3);

	CacheSoundFile("footstep");
}

⌨️ 快捷键说明

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