void CRadioactiveZone::Affect(SZoneObjectInfo* O) { // вермя срабатывания не чаще, чем заданный период if(m_dwDeltaTime < m_dwPeriod) return; //. m_dwDeltaTime = 0; CGameObject *GO = O->object; if(GO) { Fvector pos; XFORM().transform_tiny(pos,CFORM()->getSphere().P); #ifdef DEBUG char pow[255]; sprintf(pow, "zone hit. %.3f", Power(GO->Position().distance_to(pos))); if(bDebug) Msg("%s %s", *GO->cName(), pow); #endif Fvector dir; dir.set(0,0,0); Fvector position_in_bone_space; float power = (GameID() == GAME_SINGLE) ? Power(GO->Position().distance_to(pos)) : 0.0f; float impulse = 0.f; if(power > EPS) { //. m_dwDeltaTime = 0; position_in_bone_space.set(0.f,0.f,0.f); CreateHit(GO->ID(),ID(),dir,power,BI_NONE,position_in_bone_space,impulse,ALife::eHitTypeRadiation); } } }
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 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 CRadioactiveZone::feel_touch_new (CObject* O ) { inherited::feel_touch_new(O); if (GameID() != eGameIDSingle) { if (smart_cast<CActor*>(O)) { CreateHit(O->ID(),ID(),Fvector().set(0, 0, 0),0.0f,BI_NONE,Fvector().set(0, 0, 0),0.0f,m_eHitTypeBlowout);// ALife::eHitTypeRadiation } }; };
void CRadioactiveZone::feel_touch_new (CObject* O ) { inherited::feel_touch_new(O); if (GameID() != GAME_SINGLE) { if (O->CLS_ID == CLSID_OBJECT_ACTOR) { CreateHit(O->ID(),ID(),Fvector().set(0, 0, 0),0.0f,BI_NONE,Fvector().set(0, 0, 0),0.0f,ALife::eHitTypeRadiation); } }; };
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 CMincer::AffectPullAlife(CEntityAlive* EA,const Fvector& throw_in_dir,float dist) { float power = Power(dist, Radius()); //Fvector dir; //dir.random_dir(throw_in_dir,2.f*M_PI); if(!smart_cast<CActor*>(EA)) { Fvector pos_in_bone_space; pos_in_bone_space.set(0,0,0); CreateHit(EA->ID(),ID(),throw_in_dir,power,0,pos_in_bone_space,0.0f,m_eHitTypeBlowout); } inherited::AffectPullAlife(EA,throw_in_dir,dist); }
void CMincer::AffectPullAlife(CEntityAlive* EA,const Fvector& throw_in_dir,float dist) { float power=Power(dist); //Fvector dir; //dir.random_dir(throw_in_dir,2.f*M_PI); if(EA->CLS_ID!=CLSID_OBJECT_ACTOR) { Fvector pos_in_bone_space; pos_in_bone_space.set(0,0,0); CreateHit(EA->ID(),ID(),throw_in_dir,power,0,pos_in_bone_space,0.0f,m_eHitTypeBlowout); } inherited::AffectPullAlife(EA,throw_in_dir,dist); }
void CRadioactiveZone::Affect(SZoneObjectInfo* O) { float one = 0.1f; float tg = Device.fTimeGlobal; if(!O->object || O->f_time_affected+one > Device.fTimeGlobal) return; clamp (O->f_time_affected, tg-(one*3), tg); Fvector pos; XFORM().transform_tiny (pos,CFORM()->getSphere().P); Fvector dir ={0,0,0}; float power = Power(O->object->Position().distance_to(pos),nearest_shape_radius(O)); float impulse = 0.0f; if(power < EPS) { O->f_time_affected = tg; return; } float send_power = power*one; while(O->f_time_affected+one < tg) { CreateHit ( O->object->ID(), ID(), dir, send_power, BI_NONE, Fvector().set(0.0f,0.0f,0.0f), impulse, m_eHitTypeBlowout); #ifdef DEBUG // if(bDebug) /* Msg ( "Zone[%s]-hit->[%s] Power=%3.3f Frame=%d Time=%3.3f", cName().c_str(), O->object->cName().c_str(), send_power, Device.dwFrame, tg);*/ /// Msg( "Zone hit ___ damage = %.4f Frame=%d ", send_power, Device.dwFrame ); #endif O->f_time_affected += one; }//while }
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 CMosquitoBald::UpdateSecondaryHit() { if(m_dwAffectFrameNum == Device.dwFrame) return; m_dwAffectFrameNum = Device.dwFrame; if(Device.dwPrecacheFrame) return; OBJECT_INFO_VEC_IT it; for(it = m_ObjectInfoMap.begin(); m_ObjectInfoMap.end() != it; ++it) { if(!(*it).object->getDestroy()) { CPhysicsShellHolder *pGameObject = smart_cast<CPhysicsShellHolder*>((&(*it))->object); if(!pGameObject) return; if((&(*it))->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 = m_fSecondaryHitPower * RelativePower(dist>0.f?dist:0.f, Radius()); if(power<0.0f) return; float impulse = m_fHitImpulseScale*power*pGameObject->GetMass(); 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); } } }
void CMincer::NotificateDestroy (CPHDestroyableNotificate *dn) { Fvector dir = {0,0,0}; float impulse = 0; //if(!m_telekinetics.has_impacts()) return; //CObject* obj=Level().Objects.net_Find(id); CPhysicsShellHolder* obj=dn->PPhysicsShellHolder(); m_telekinetics.draw_out_impact(dir,impulse); CParticlesPlayer* PP = smart_cast<CParticlesPlayer*>(obj); if(PP && *m_torn_particles) { PP->StartParticles(m_torn_particles,Fvector().set(0,1,0),ID()); } m_tearing_sound.play_at_pos(0,m_telekinetics.Center()); Fvector position_in_bone_space, throw_in_dir; position_in_bone_space.set (0.0f, 0.0f, 0.0f); throw_in_dir.set (1.0f, 0.0f, 1.0f); CreateHit(obj->ID(),ID(),throw_in_dir,0.0f,0,position_in_bone_space,impulse,ALife::eHitTypeExplosion); }
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); } }