| 660 | pos.add(m_vExplodePos); |
| 661 | } |
| 662 | void CExplosive::ExplodeWaveProcessObject(collide::rq_results& storage, CPhysicsShellHolder* l_pGO) |
| 663 | { |
| 664 | Fvector l_goPos; |
| 665 | if (l_pGO->Visual()) |
| 666 | l_pGO->Center(l_goPos); |
| 667 | else |
| 668 | return; //мне непонятно зачем наносить хит от взрыва по объектам не имеющим вижуал - поэтому игнорируем |
| 669 | |
| 670 | #ifdef DEBUG |
| 671 | if (ph_dbg_draw_mask.test(phDbgDrawExplosions)) |
| 672 | { |
| 673 | DBG_OpenCashedDraw(); |
| 674 | } |
| 675 | #endif |
| 676 | |
| 677 | float l_effect = ExplosionEffect(storage, this, l_pGO, m_vExplodePos, m_fBlastRadius); |
| 678 | float l_impuls = m_fBlastHitImpulse * l_effect; |
| 679 | float l_hit = m_fBlastHit * l_effect; |
| 680 | |
| 681 | if (l_impuls > .001f || l_hit > 0.001) |
| 682 | { |
| 683 | Fvector l_dir; |
| 684 | l_dir.sub(l_goPos, m_vExplodePos); |
| 685 | |
| 686 | float rmag = _sqrt(m_fUpThrowFactor * m_fUpThrowFactor + 1.f + 2.f * m_fUpThrowFactor * l_dir.y); |
| 687 | l_dir.y += m_fUpThrowFactor; |
| 688 | // rmag -модуль l_dir после l_dir.y += m_fUpThrowFactor, модуль=_sqrt(l_dir^2+y^2+2.*(l_dir,y)),y=(0,m_fUpThrowFactor,0) (до этого модуль l_dir =1) |
| 689 | l_dir.mul(1.f / rmag); //перенормировка |
| 690 | NET_Packet P; |
| 691 | SHit HS; |
| 692 | HS.GenHeader(GE_HIT, l_pGO->ID()); // cast_game_object()->u_EventGen (P,GE_HIT,l_pGO->ID()); |
| 693 | HS.whoID = Initiator(); // P.w_u16 (Initiator()); |
| 694 | HS.weaponID = cast_game_object()->ID(); // P.w_u16 (cast_game_object()->ID()); |
| 695 | HS.dir = l_dir; // P.w_dir (l_dir); |
| 696 | HS.power = l_hit; // P.w_float (l_hit); |
| 697 | HS.p_in_bone_space = l_goPos; // P.w_vec3 (l_goPos); |
| 698 | HS.impulse = l_impuls; // P.w_float (l_impuls); |
| 699 | HS.hit_type = (m_eHitTypeBlast); // P.w_u16 (u16(m_eHitTypeBlast)); |
| 700 | HS.boneID = 0; // P.w_s16 (0); |
| 701 | HS.Write_Packet(P); |
| 702 | cast_game_object()->u_EventSend(P); |
| 703 | } |
| 704 | #ifdef DEBUG |
| 705 | if (ph_dbg_draw_mask.test(phDbgDrawExplosions)) |
| 706 | { |
| 707 | DBG_ClosedCashedDraw(100000); |
| 708 | } |
| 709 | #endif |
| 710 | } |
| 711 | struct SRemovePred |
| 712 | { |
| 713 | bool operator()(CGameObject* O) { return !!O->getDestroy(); } |
nothing calls this directly
no test coverage detected