void CMosquitoBald::Affect(SZoneObjectInfo* O) 
{
	CPhysicsShellHolder *pGameObject = smart_cast<CPhysicsShellHolder*>(O->object);
	if(!pGameObject) return;

	if(O->zone_ignore) return;

	Fvector P; 
	XFORM().transform_tiny(P,CFORM()->getSphere().P);

	Fvector hit_dir; 
	hit_dir.set(	::Random.randF(-.5f,.5f), 
					::Random.randF(.0f,1.f), 
					::Random.randF(-.5f,.5f)); 
	hit_dir.normalize();

	Fvector position_in_bone_space;

	VERIFY(!pGameObject->getDestroy());

	float dist = pGameObject->Position().distance_to(P) - pGameObject->Radius();
	float power = Power(dist>0.f?dist:0.f, Radius());
	float impulse = m_fHitImpulseScale*power*pGameObject->GetMass();

	if(power > 0.01f) 
	{
		position_in_bone_space.set(0.f,0.f,0.f);
		CreateHit(pGameObject->ID(),ID(),hit_dir,power,0,position_in_bone_space,impulse,m_eHitTypeBlowout);
		PlayHitParticles(pGameObject);
	}
}
Exemple #2
0
void CBaseGraviZone ::	AffectThrow(SZoneObjectInfo* O, CPhysicsShellHolder* GO,const Fvector& throw_in_dir,float dist)
{

	Fvector position_in_bone_space;

	float power = Power(dist);//Power(GO->Position().distance_to(zone_center));
	float impulse = m_fHitImpulseScale*power*GO->GetMass();

	//if(fis_zero(dist))
	//{
	//	impulse = 0.f;
	//	throw_in_dir.set(0,1,0);
	//}
	//else
	//	throw_in_dir.normalize();


	//статистика по объекту
	O->total_damage += power;
	O->hit_num++;

	if(power > 0.01f) 
	{
		m_dwDeltaTime = 0;
		position_in_bone_space.set(0.f,0.f,0.f);
		CreateHit(GO->ID(),ID(),throw_in_dir,power,0,position_in_bone_space,impulse,m_eHitTypeBlowout);
		PlayHitParticles(GO);
	}
}
Exemple #3
0
void CBaseGraviZone::AffectThrow(SZoneObjectInfo* O, CPhysicsShellHolder* GO,const Fvector& throw_in_dir,float dist)
{
	Fvector position_in_bone_space;

	float power = Power(dist, Radius()); //Power(GO->Position().distance_to(zone_center));
	float impulse = m_fHitImpulseScale*power*GO->GetMass();

	if(power > 0.01f) 
	{
		position_in_bone_space.set(0.f,0.f,0.f);
		CreateHit(GO->ID(),ID(),throw_in_dir,power,0,position_in_bone_space,impulse,m_eHitTypeBlowout);
		PlayHitParticles(GO);
	}
}
Exemple #4
0
void CMosquitoBald::Affect(SZoneObjectInfo* O) 
{
	CPhysicsShellHolder *pGameObject = smart_cast<CPhysicsShellHolder*>(O->object);
	if(!pGameObject) return;

	if(O->zone_ignore) return;

	Fvector P; 
	XFORM().transform_tiny(P,CFORM()->getSphere().P);

#ifdef DEBUG
	char l_pow[255]; 
	sprintf_s(l_pow, "zone hit. %.1f", Power(pGameObject->Position().distance_to(P)));
	if(bDebug) Msg("%s %s",*pGameObject->cName(), l_pow);
#endif

	Fvector hit_dir; 
	hit_dir.set(::Random.randF(-.5f,.5f), 
		::Random.randF(.0f,1.f), 
		::Random.randF(-.5f,.5f)); 
	hit_dir.normalize();


	Fvector position_in_bone_space;

	VERIFY(!pGameObject->getDestroy());

	float dist = pGameObject->Position().distance_to(P) - pGameObject->Radius();
	float power = Power(dist>0.f?dist:0.f);
	float impulse = m_fHitImpulseScale*power*pGameObject->GetMass();

	//статистика по объекту
	O->total_damage += power;
	O->hit_num++;

	if(power > 0.01f) 
	{
		m_dwDeltaTime = 0;
		position_in_bone_space.set(0.f,0.f,0.f);

		CreateHit(pGameObject->ID(),ID(),hit_dir,power,0,position_in_bone_space,impulse,m_eHitTypeBlowout);

		PlayHitParticles(pGameObject);
	}
}
Exemple #5
0
void  CAmebaZone::Affect(SZoneObjectInfo* O) 
{
	CPhysicsShellHolder *pGameObject = smart_cast<CPhysicsShellHolder*>(O->object);
	if(!pGameObject) return;

	if(O->zone_ignore) return;

#ifdef DEBUG
	char l_pow[255]; 
	sprintf_s(l_pow, "zone hit. %.1f", Power(distance_to_center(O->object)));
	if(bDebug) Msg("%s %s",*pGameObject->cName(), l_pow);
#endif
	Fvector hit_dir; 
	hit_dir.set(::Random.randF(-.5f,.5f), 
		::Random.randF(.0f,1.f), 
		::Random.randF(-.5f,.5f)); 
	hit_dir.normalize();


	Fvector position_in_bone_space;

	float power = Power(distance_to_center(O->object));
	float impulse = m_fHitImpulseScale*power*pGameObject->GetMass();

	//статистика по объекту
	O->total_damage += power;
	O->hit_num++;

	if(power > 0.01f) 
	{
		m_dwDeltaTime = 0;
		position_in_bone_space.set(0.f,0.f,0.f);

		CreateHit(pGameObject->ID(),ID(),hit_dir,power,0,position_in_bone_space,impulse,m_eHitTypeBlowout);

		PlayHitParticles(pGameObject);
	}
}
Exemple #6
0
void CSkeleton::EnterSubState()
{
	switch (m_eCurrState)
	{
	case FOLLOW:
		BuildPathToPlayer();
		SwitchAnimation(CSkeleton::eBlockWalkAnim);
		GetCurrAnimation()->SetScale(1.0f);
		break;
	case MANUVERING:
	{
		/*GetShieldRenderMesh(0)->GetRender() = false;
		GetShieldRenderMesh(1)->GetRender() = false;*/
		m_nMaxManuver = (rand() % 3) + 1;
		m_nManuverCount = 0;
		m_nChance = rand() % 2;

		SwitchAnimation(CSkeleton::eBlockWalkAnim);
		GetCurrAnimation()->SetScale(0.8f);
		m_fExitTimer = 2.0f;

	}
	break;
	case CSkeleton::MOVING_IN:
		SwitchAnimation(CSkeleton::eBlockWalkAnim);
		GetCurrAnimation()->SetScale(1.0f);
		m_fExitTimer = 2.0f;
		/*GetShieldRenderMesh(0)->GetRender() = false;
		GetShieldRenderMesh(1)->GetRender() = false;*/
		break;
	case CSkeleton::RETREAT:
		SwitchAnimation(CSkeleton::eBlockWalkAnim);
		GetCurrAnimation()->SetScale(1.0f);
		BuildPathHome();
		/*GetShieldRenderMesh(0)->GetRender() = false;
		GetShieldRenderMesh(1)->GetRender() = false;*/
		break;
	case CSkeleton::BACKING_OUT:
		SwitchAnimation(CSkeleton::eBlockWalkAnim);
		GetCurrAnimation()->SetScale(-1.0f);
		m_fExitTimer = 2.0f;
		/*GetShieldRenderMesh(0)->GetRender() = false;
		GetShieldRenderMesh(1)->GetRender() = false;*/
		break;
	case CSkeleton::SWINGING:
	{
		SwitchAnimation(CSkeleton::eAttackAnim);

		const XMFLOAT3& skelPosition = *GetPosition();
		GetAttack()->Attack(GetWeapon()->GetDamage());
		AudioSystemWwise::Get()->PostEvent(AK::EVENTS::SKELETONATTACK, XMFLOAT3(skelPosition.x, skelPosition.y, skelPosition.z));
		// Set the timer
		m_fExitTimer = GetCurrAnimation()->GetDuration();
		/*GetShieldRenderMesh(0)->GetRender() = false;
		GetShieldRenderMesh(1)->GetRender() = false;*/
	}
	break;
	case CSkeleton::SPAWN:
	{
		SwitchAnimation(CSkeleton::eSpawnAnim);
		m_cpAnimations[eSpawnAnim].IntializeAnimation();
		m_cpAnimations[eSpawnAnim].SetScale(1.0f);
		m_fExitTimer = m_cpAnimations[eSpawnAnim].GetDuration() - 0.25f;
		/*GetShieldRenderMesh(0)->GetRender() = false;
		GetShieldRenderMesh(1)->GetRender() = false;*/
	}
	break;
	/*case CSkeleton::BLOCKING:
	{
	SwitchAnimation(CSkeleton::eBlockAnim);
	int nBlockSide = (int)CheckBlockSide();


	GetShieldRenderMesh(nBlockSide)->GetRender() = true;
	m_nShieldIndex = nBlockSide;

	m_fExitTimer = GetCurrAnimation()->GetDuration();

	}
	break;*/
	case CSkeleton::HURT:
	{
		const XMFLOAT3& skelPosition = *GetPosition();

		if (GetHealth() > 0)
		{
			int rndHitAnim = rand() % 2;

			switch (rndHitAnim)
			{
			case 0:
				SwitchAnimation(CSkeleton::eHurtAnim);
				break;
			case 1:
				SwitchAnimation(CSkeleton::eHurt2Anim);
				break;
			}
			AudioSystemWwise::Get()->PostEvent(AK::EVENTS::SKELETONATTACK, XMFLOAT3(skelPosition.x, skelPosition.y, skelPosition.z));
			AudioSystemWwise::Get()->PostEvent(AK::EVENTS::SKELETONHURT, XMFLOAT3(skelPosition.x, skelPosition.y, skelPosition.z));
			m_fExitTimer = GetCurrAnimation()->GetDuration();
		}
		else
		{
			PlayParticle(eFadeAway, XMFLOAT3{ 0.0f, -50.0f, 0.0f });

			SwitchAnimation(CSkeleton::eDeathAnim);
			AudioSystemWwise::Get()->PostEvent(AK::EVENTS::SKELETONHURT, XMFLOAT3(skelPosition.x, skelPosition.y, skelPosition.z));
			AudioSystemWwise::Get()->PostEvent(AK::EVENTS::SKELETONDEATH, XMFLOAT3(skelPosition.x, skelPosition.y, skelPosition.z));
			m_fExitTimer = GetCurrAnimation()->GetDuration();
		}
		PlayHitParticles();
		XMFLOAT3 tVelocity(0.0f, 0.0f, 0.0f);
		SetWorldVelocity(tVelocity);
	}

	break;
	case DEATH:
	{
		m_cpAttack->SetIsActive(false);
		break;
	}
	default:
		break;
	}
}