From 372402291f6fe00b86a0d03005a6ae3f1d9378f6 Mon Sep 17 00:00:00 2001 From: revolucas Date: Sat, 10 Sep 2016 06:06:41 -0400 Subject: [PATCH] CBulletManager::test_callback: move object verification to much earlier in method --- src/xrGame/Level_bullet_manager_firetrace.cpp | 155 +++++++++--------- 1 file changed, 78 insertions(+), 77 deletions(-) diff --git a/src/xrGame/Level_bullet_manager_firetrace.cpp b/src/xrGame/Level_bullet_manager_firetrace.cpp index d83cf0fd701..c1900b99615 100644 --- a/src/xrGame/Level_bullet_manager_firetrace.cpp +++ b/src/xrGame/Level_bullet_manager_firetrace.cpp @@ -36,6 +36,9 @@ extern float gCheckHitK; //return TRUE-тестировать объект / FALSE-пропустить объект BOOL CBulletManager::test_callback(const collide::ray_defs& rd, IGameObject* object, LPVOID params) { + if (!object) + return TRUE; + bullet_test_callback_data* pData = (bullet_test_callback_data*)params; SBullet* bullet = pData->pBullet; @@ -44,97 +47,95 @@ BOOL CBulletManager::test_callback(const collide::ray_defs& rd, IGameObject* obj (!bullet->flags.ricochet_was)) return FALSE; BOOL bRes = TRUE; - if (object){ - CEntity* entity = smart_cast(object); - if (entity&&entity->g_Alive()&&(entity->ID()!=bullet->parent_id)){ - ICollisionForm* cform = entity->GetCForm(); - if ((NULL!=cform) && (cftObject==cform->Type())){ - CActor* actor = smart_cast(entity); - CAI_Stalker* stalker= smart_cast(entity); - // в кого попали? - if (actor && IsGameTypeSingle()/**/||stalker/**/){ - // попали в актера или сталкера - Fsphere S = cform->getSphere(); - entity->XFORM().transform_tiny (S.P) ; - float dist = rd.range; - // проверим попали ли мы в описывающую сферу - if (Fsphere::rpNone!=S.intersect_full(bullet->bullet_pos, bullet->dir, dist)) - { - // да попали, найдем кто стрелял - bool play_whine = true; - IGameObject* initiator = Level().Objects.net_Find (bullet->parent_id); - if (actor){ - // попали в актера - float hpf = 1.f; - float ahp = actor->HitProbability(); + CEntity* entity = smart_cast(object); + if (entity&&entity->g_Alive()&&(entity->ID()!=bullet->parent_id)){ + ICollisionForm* cform = entity->GetCForm(); + if ((NULL!=cform) && (cftObject==cform->Type())){ + CActor* actor = smart_cast(entity); + CAI_Stalker* stalker= smart_cast(entity); + // в кого попали? + if (actor && IsGameTypeSingle()/**/||stalker/**/){ + // попали в актера или сталкера + Fsphere S = cform->getSphere(); + entity->XFORM().transform_tiny (S.P) ; + float dist = rd.range; + // проверим попали ли мы в описывающую сферу + if (Fsphere::rpNone!=S.intersect_full(bullet->bullet_pos, bullet->dir, dist)) + { + // да попали, найдем кто стрелял + bool play_whine = true; + IGameObject* initiator = Level().Objects.net_Find (bullet->parent_id); + if (actor){ + // попали в актера + float hpf = 1.f; + float ahp = actor->HitProbability(); #if 1 # if 0 - IGameObject *weapon_object = Level().Objects.net_Find (bullet->weapon_id); - if (weapon_object) { - CWeapon *weapon = smart_cast(weapon_object); - if (weapon) { - float fly_dist = bullet->fly_dist+dist; - float dist_factor = _min(1.f,fly_dist/Level().BulletManager().m_fHPMaxDist); - ahp = dist_factor*weapon->hit_probability() + (1.f-dist_factor)*1.f; - } + IGameObject *weapon_object = Level().Objects.net_Find (bullet->weapon_id); + if (weapon_object) { + CWeapon *weapon = smart_cast(weapon_object); + if (weapon) { + float fly_dist = bullet->fly_dist+dist; + float dist_factor = _min(1.f,fly_dist/Level().BulletManager().m_fHPMaxDist); + ahp = dist_factor*weapon->hit_probability() + (1.f-dist_factor)*1.f; } + } # else - float game_difficulty_hit_probability = actor->HitProbability(); - CAI_Stalker *stalker = smart_cast(initiator); - if (stalker) - hpf = stalker->SpecificCharacter().hit_probability_factor(); - - float dist_factor = 1.f; - IGameObject *weapon_object = Level().Objects.net_Find (bullet->weapon_id); - if (weapon_object) { - CWeapon *weapon = smart_cast(weapon_object); - if (weapon) { - game_difficulty_hit_probability = weapon->hit_probability(); - float fly_dist = bullet->fly_dist+dist; - dist_factor = _min(1.f,fly_dist/Level().BulletManager().m_fHPMaxDist); - } + float game_difficulty_hit_probability = actor->HitProbability(); + CAI_Stalker *stalker = smart_cast(initiator); + if (stalker) + hpf = stalker->SpecificCharacter().hit_probability_factor(); + + float dist_factor = 1.f; + IGameObject *weapon_object = Level().Objects.net_Find (bullet->weapon_id); + if (weapon_object) { + CWeapon *weapon = smart_cast(weapon_object); + if (weapon) { + game_difficulty_hit_probability = weapon->hit_probability(); + float fly_dist = bullet->fly_dist+dist; + dist_factor = _min(1.f,fly_dist/Level().BulletManager().m_fHPMaxDist); } + } - ahp = dist_factor*game_difficulty_hit_probability + (1.f-dist_factor)*1.f; + ahp = dist_factor*game_difficulty_hit_probability + (1.f-dist_factor)*1.f; # endif #else - CAI_Stalker* i_stalker = smart_cast(initiator); - // если стрелял сталкер, учитываем - hit_probability_factor сталкерa иначе - 1.0 - if (i_stalker) { - hpf = i_stalker->SpecificCharacter().hit_probability_factor(); - float fly_dist = bullet->fly_dist+dist; - float dist_factor = _min(1.f,fly_dist/Level().BulletManager().m_fHPMaxDist); - ahp = dist_factor*actor->HitProbability() + (1.f-dist_factor)*1.f; - } + CAI_Stalker* i_stalker = smart_cast(initiator); + // если стрелял сталкер, учитываем - hit_probability_factor сталкерa иначе - 1.0 + if (i_stalker) { + hpf = i_stalker->SpecificCharacter().hit_probability_factor(); + float fly_dist = bullet->fly_dist+dist; + float dist_factor = _min(1.f,fly_dist/Level().BulletManager().m_fHPMaxDist); + ahp = dist_factor*actor->HitProbability() + (1.f-dist_factor)*1.f; + } #endif - if (Random.randF(0.f,1.f)>(ahp*hpf)){ - bRes = FALSE; // don't hit actor - play_whine = true; // play whine sound + if (Random.randF(0.f,1.f)>(ahp*hpf)){ + bRes = FALSE; // don't hit actor + play_whine = true; // play whine sound + }else{ + // real test actor CFORM + Level().BulletManager().m_rq_results.r_clear(); + + if (cform->_RayQuery(rd,Level().BulletManager().m_rq_results)){ + bRes = TRUE; // hit actor + play_whine = false; // don't play whine sound }else{ - // real test actor CFORM - Level().BulletManager().m_rq_results.r_clear(); - - if (cform->_RayQuery(rd,Level().BulletManager().m_rq_results)){ - bRes = TRUE; // hit actor - play_whine = false; // don't play whine sound - }else{ - bRes = FALSE; // don't hit actor - play_whine = true; // play whine sound - } + bRes = FALSE; // don't hit actor + play_whine = true; // play whine sound } } - // play whine sound - if (play_whine){ - Fvector pt; - pt.mad (bullet->bullet_pos, bullet->dir, dist); - Level().BulletManager().PlayWhineSound (bullet,initiator,pt); - } - }else{ - // don't test this object again (return FALSE) - bRes = FALSE; } - + // play whine sound + if (play_whine){ + Fvector pt; + pt.mad (bullet->bullet_pos, bullet->dir, dist); + Level().BulletManager().PlayWhineSound (bullet,initiator,pt); + } + }else{ + // don't test this object again (return FALSE) + bRes = FALSE; } + } } }