void CBoidFish::Kill( const Vec3 &hitPoint,const Vec3 &force ) { m_flock->m_bAnyKilled = true; SBoidContext bc; m_flock->GetBoidSettings(bc); IEntity *pEntity = gEnv->pEntitySystem->GetEntity(m_entity); if (pEntity) { SpawnParams params; params.eAttachForm = GeomForm_Surface; params.eAttachType = GeomType_Render; gEnv->pEntitySystem->GetBreakableManager()->AttachSurfaceEffect( pEntity,0,SURFACE_BREAKAGE_TYPE("destroy"),params,ePEF_Independent ); } /* // Can`t Kill fish in MP game. IGame *pGame = gEnv->pGame; if (pGame && pGame->GetModuleState( EGameMultiplayer ) ) return; */ float boxSize = bc.fBoidRadius/2; float mass = ((boxSize/4)*boxSize*boxSize)*FISH_PHYSICS_DENSITY; // box volume * density Vec3 impulse = force * mass * 0.1f; if (!m_physicsControlled) { CreateRigidBox( bc,Vec3(boxSize/4,boxSize,boxSize),-1,950 ); //impulse += m_heading*m_speed*mass; m_physicsControlled = true; } if (m_physicsControlled) { // Apply force on this body. pe_action_impulse theAction; theAction.impulse = impulse; theAction.point = hitPoint; theAction.iApplyTime = 0; m_pPhysics->Action(&theAction); } if (m_object && !m_dead && !m_dying) { //m_object->ResetAnimations(); //m_object->StartAnimation( "death" ); m_object->SetAnimationSpeed( 1 ); } m_dying = true; m_dyingTime = 0; }
void CBoidBird::Kill( const Vec3 &hitPoint,const Vec3 &force ) { if (m_dead) return; m_status = Bird::DEAD; m_flock->m_bAnyKilled = true; IEntity *pEntity = gEnv->pEntitySystem->GetEntity(m_entity); if (pEntity) { SpawnParams params; params.eAttachForm = GeomForm_Surface; params.eAttachType = GeomType_Render; gEnv->pEntitySystem->GetBreakableManager()->AttachSurfaceEffect( pEntity,0,SURFACE_BREAKAGE_TYPE("destroy"),params,ePEF_Independent ); } if (CFlock::m_e_flocks_hunt == 0) { m_physicsControlled = false; m_dead = true; m_nodraw = true; if (pEntity) { pEntity->Hide(true); } if (!m_dead && m_pPhysics) { if (pEntity) { pEntity->UnphysicalizeSlot(0); } m_pPhysics = 0; } // No physics at all. return; } SBoidContext bc; m_flock->GetBoidSettings(bc); Vec3 impulse = force; if (impulse.GetLength() > 100.0f) { impulse.Normalize(); impulse *= 100.0f; } //if (!m_physicsControlled) { if (!m_object) return; AABB aabb = m_object->GetAABB( ); Vec3 size = ((aabb.max - aabb.min)/2.2f)*m_scale; CreateArticulatedCharacter( bc, size, bc.fBoidMass ); m_physicsControlled = true; // Small impulse. // Apply force on this body. pe_action_impulse theAction; Vec3 someforce; someforce = impulse; //someforce.Normalize(); theAction.impulse = someforce; theAction.ipart = 0; theAction.iApplyTime = 0; if (m_pPhysics) m_pPhysics->Action(&theAction); } if (m_object && !m_dying && !m_dead) { m_object->GetISkeletonAnim()->StopAnimationsAllLayers(); } m_dead = true; }