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); } }
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); } }
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); } }
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); } }
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); } }
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; } }