void CDestroyablePhysicsObject::Destroy() { VERIFY(!physics_world()->Processing()); const CGameObject *who_object = smart_cast<const CGameObject*>(FatalHit().initiator()); callback(GameObject::eDeath)(lua_game_object(),who_object ? who_object : 0); CPHDestroyable::Destroy(ID(),"physic_destroyable_object"); if(m_destroy_sound._handle()) { m_destroy_sound.play_at_pos(this,Position()); } if(*m_destroy_particles) { //Fvector dir;dir.set(0,1,0); Fmatrix m;m.identity(); ///////////////////////////////////////////////// m.j.set(0,1.f,0); /////////////////////////////////////////////// Fvector hdir;hdir.set(CPHDestroyable::FatalHit().direction()); if(fsimilar(_abs(m.j.dotproduct(hdir)),1.f,EPS_L)) { do { hdir.random_dir(); } while(fsimilar(_abs(m.j.dotproduct(hdir)),1.f,EPS_L)); } m.i.crossproduct(m.j,hdir);m.i.normalize(); m.k.crossproduct(m.i,m.j); StartParticles(m_destroy_particles,m,ID()); } SheduleRegister(); }
void CShootingObject::StartShotParticles () { CParticlesObject* pSmokeParticles = NULL; StartParticles(pSmokeParticles, *m_sShotParticles, m_vCurrentShootPos, m_vCurrentShootDir, true); }
void CParticlesPlayer::StartParticles(const shared_str& ps_name, const Fvector& dir, u16 sender_id, int life_time, bool auto_stop) { Fmatrix xform; generate_orthonormal_basis(dir,xform); StartParticles(ps_name,xform,sender_id,life_time,auto_stop); }
//партиклы дыма void CShootingObject::StartSmokeParticles (const Fvector& play_pos, const Fvector& parent_vel) { CParticlesObject* pSmokeParticles = NULL; StartParticles(pSmokeParticles, *m_sSmokeParticlesCurrent, play_pos, parent_vel, true); }