void CAIGroupProxy::SetBehaviour(const char* behaviour, bool callCDtors) { if (m_behavior && callCDtors) CallScript(m_behavior, "Destructor"); m_prevBehavior = m_behavior; m_behavior = 0; m_behaviorName.clear(); if (m_behaviorsTable) { if (!m_behaviorsTable->GetValue(behaviour, m_behavior)) m_behaviorsTable->GetValue("DEFAULT", m_behavior); } if (m_behavior) { m_behaviorName = behaviour; m_script->SetValue("Behavior", m_behavior); if (callCDtors) CallScript(m_behavior, "Constructor"); } else m_script->SetToNull("Behavior"); }
/* ================ idTrigger_Multi::TriggerAction ================ */ void idTrigger_Multi::TriggerAction( idEntity *activator ) { // RAVEN BEGIN // jdischler: added for Aweldon. The trigger, when activated, will call the listed func with all attached targets, then return. if ( spawnArgs.GetBool( "_callWithTargets", "0" )) { idEntity *ent; for( int i = 0; i < targets.Num(); i++ ) { ent = targets[ i ].GetEntity(); if ( !ent ) { continue; } CallScript( ent ); } return; } // RAVEN END ActivateTargets( triggerWithSelf ? this : activator ); CallScript( triggerWithSelf ? this : activator ); if ( wait >= 0 ) { nextTriggerTime = gameLocal.time + SEC2MS( wait + random * gameLocal.random.CRandomFloat() ); } else { // we can't just remove (this) here, because this is a touch function // called while looping through area links... nextTriggerTime = gameLocal.time + 1; PostEventMS( &EV_Remove, 0 ); } }
/* ================ idTrigger_Hurt::Event_Touch ================ */ void idTrigger_Hurt::Event_Touch( idEntity* other, trace_t* trace ) { const char* damage; if( common->IsClient() ) { return; } if( on && other && gameLocal.time >= nextTime ) { bool playerOnly = spawnArgs.GetBool( "playerOnly" ); if( playerOnly ) { if( !other->IsType( idPlayer::Type ) ) { return; } } damage = spawnArgs.GetString( "def_damage", "damage_painTrigger" ); idVec3 dir = vec3_origin; if( spawnArgs.GetBool( "kick_from_center", "0" ) ) { dir = other->GetPhysics()->GetOrigin() - GetPhysics()->GetOrigin(); dir.Normalize(); } other->Damage( NULL, NULL, dir, damage, 1.0f, INVALID_JOINT ); ActivateTargets( other ); CallScript(); nextTime = gameLocal.time + SEC2MS( delay ); } }
/* ================ idTrigger_Count::Event_TriggerAction ================ */ void idTrigger_Count::Event_TriggerAction( idEntity *activator ) { ActivateTargets( activator ); CallScript( activator ); if ( goal == -1 ) { PostEventMS( &EV_Remove, 0 ); } }
void COptionDlg::InitDialogComplete() { DebugPrint(_T("InitDialogComplete")); CString cstr; m_FlagShowWindow = TRUE; m_LabelThreshold = i18n(_T("Dialog"), _T("LIST_THRESHOLD")); m_LabelLineColor = i18n(_T("Customize"), _T("LINE_COLOR")); m_LabelBgImage = i18n(_T("Customize"), _T("BACKGROUND_IMAGE")); m_Reset = i18n(_T("Graph"), _T("RESET")); TCHAR str[256]; GetPrivateProfileString(_T("Customize"), _T("GraphBgImage"), _T(""), str, 256, m_Ini); m_BgImage = str; SetElementPropertyEx(_T("GraphBgImage"), DISPID_IHTMLELEMENT_TITLE, m_BgImage); for(int i = 0; i <= CAtaSmart::MAX_DISK; i++) { cstr.Format(_T("%d"), i); m_ColorCode[i].Format(_T("#%02x%02x%02x"), GetRValue(m_CurrentLineColor[i]), GetGValue(m_CurrentLineColor[i]), GetBValue(m_CurrentLineColor[i])); CallScript(_T("changeBackgroundColor"), cstr + _T(", ") + m_ColorCode[i]); } UpdateData(FALSE); ChangeZoomType(m_ZoomType); SetClientRect((DWORD)(SIZE_X * m_ZoomRatio), (DWORD)(SIZE_Y * m_ZoomRatio), 0); ShowWindow(SW_SHOW); }
//------------------------------------------------------------------------ IMPLEMENT_RMI(CGameRules, ClSetTeam) { if (!params.entityId) // ignore these for now return true; int oldTeam = GetTeam(params.entityId); if (oldTeam==params.teamId) return true; TEntityTeamIdMap::iterator it=m_entityteams.find(params.entityId); if (it!=m_entityteams.end()) m_entityteams.erase(it); IActor *pActor=m_pActorSystem->GetActor(params.entityId); bool isplayer=pActor!=0; if (isplayer && oldTeam) { TPlayerTeamIdMap::iterator pit=m_playerteams.find(oldTeam); assert(pit!=m_playerteams.end()); stl::find_and_erase(pit->second, params.entityId); } if (params.teamId) { m_entityteams.insert(TEntityTeamIdMap::value_type(params.entityId, params.teamId)); if (isplayer) { TPlayerTeamIdMap::iterator pit=m_playerteams.find(params.teamId); assert(pit!=m_playerteams.end()); pit->second.push_back(params.entityId); } } if(IActor *pClient = g_pGame->GetIGameFramework()->GetClientActor()) { if(GetTeam(pClient->GetEntityId()) == params.teamId) { if(params.entityId == pClient->GetGameObject()->GetWorldQuery()->GetLookAtEntityId()) { if(g_pGame->GetHUD()) { g_pGame->GetHUD()->GetCrosshair()->SetUsability(0); } } } } if(isplayer) { ReconfigureVoiceGroups(params.entityId,oldTeam,params.teamId); if (pActor->IsClient()) m_pRadio->SetTeam(GetTeamName(params.teamId)); } ScriptHandle handle(params.entityId); CallScript(m_clientStateScript, "OnSetTeam", handle, params.teamId); return true; }
//------------------------------------------------------------------------ void CGameRules::ClientHit(const HitInfo &hitInfo) { FUNCTION_PROFILER(GetISystem(), PROFILE_GAME); IActor *pClientActor = g_pGame->GetIGameFramework()->GetClientActor(); IActor *pActor = g_pGame->GetIGameFramework()->GetIActorSystem()->GetActor(hitInfo.targetId); if(pActor == pClientActor) if (gEnv->pInput) gEnv->pInput->ForceFeedbackEvent( SFFOutputEvent(eDI_XI, eFF_Rumble_Basic, 0.5f * hitInfo.damage * 0.01f, hitInfo.damage * 0.02f, 0.0f)); CreateScriptHitInfo(m_scriptHitInfo, hitInfo); CallScript(m_clientStateScript, "OnHit", m_scriptHitInfo); bool backface = hitInfo.dir.Dot(hitInfo.normal)>0; if (!hitInfo.remote && hitInfo.targetId && !backface) { if (!gEnv->bServer) { GetGameObject()->InvokeRMI(SvRequestHit(), hitInfo, eRMI_ToServer); } else { ServerHit(hitInfo); } if(gEnv->IsClient()) ProcessLocalHit(hitInfo); } }
/* ================ idTrigger_Hurt::Event_Touch ================ */ void idTrigger_Hurt::Event_Touch( idEntity *other, trace_t *trace ) { const char *damage; if( on && other && gameLocal.time >= nextTime ) { damage = spawnArgs.GetString( "def_damage", "damage_painTrigger" ); other->Damage( NULL, NULL, vec3_origin, damage, 1.0f, INVALID_JOINT ); ActivateTargets( other ); CallScript(); nextTime = gameLocal.time + SEC2MS( delay ); } }
//------------------------------------------------------------------------ void CGameRules::ProcessServerHit(const HitInfo &hitInfo) { bool ok=true; // check if shooter is alive CActor *pShooter=GetActorByEntityId(hitInfo.shooterId); if (hitInfo.shooterId) { if (pShooter && pShooter->GetHealth()<=0) ok=false; } if (hitInfo.targetId) { CActor *pTarget=GetActorByEntityId(hitInfo.targetId); if (pTarget && pTarget->GetSpectatorMode()) ok=false; } if (ok) { CreateScriptHitInfo(m_scriptHitInfo, hitInfo); CallScript(m_serverStateScript, "OnHit", m_scriptHitInfo); // call hit listeners if any if (m_hitListeners.empty() == false) { for (size_t i = 0; i < m_hitListeners.size(); ) { size_t count = m_hitListeners.size(); m_hitListeners[i]->OnHit(hitInfo); if (count == m_hitListeners.size()) i++; else continue; } } if (pShooter && hitInfo.shooterId!=hitInfo.targetId && hitInfo.weaponId!=hitInfo.shooterId && hitInfo.weaponId!=hitInfo.targetId && hitInfo.damage>=0) { EntityId params[2]; params[0] = hitInfo.weaponId; params[1] = hitInfo.targetId; m_pGameplayRecorder->Event(pShooter->GetEntity(), GameplayEvent(eGE_WeaponHit, 0, 0, (void *)params)); } if (pShooter) m_pGameplayRecorder->Event(pShooter->GetEntity(), GameplayEvent(eGE_Hit, 0, 0, (void *)hitInfo.weaponId)); if (pShooter) m_pGameplayRecorder->Event(pShooter->GetEntity(), GameplayEvent(eGE_Damage, 0, hitInfo.damage, (void *)hitInfo.weaponId)); } }
/* ================ idTrigger_EntityName::TriggerAction ================ */ void idTrigger_EntityName::TriggerAction( idEntity *activator ) { ActivateTargets( activator ); CallScript(); if( wait >= 0 ) { nextTriggerTime = gameLocal.time + SEC2MS( wait + random * gameLocal.random.CRandomFloat() ); } else { // we can't just remove (this) here, because this is a touch function // called while looping through area links... nextTriggerTime = gameLocal.time + 1; PostEventMS( &EV_Remove, 0 ); } }
//------------------------------------------------------------------------ IMPLEMENT_RMI(CGameRules, ClSetTeam) { if (!params.entityId) // ignore these for now { return true; } int oldTeam = GetTeam(params.entityId); if (oldTeam == params.teamId) { return true; } TEntityTeamIdMap::iterator it = m_entityteams.find(params.entityId); if (it != m_entityteams.end()) { m_entityteams.erase(it); } IActor *pActor = m_pActorSystem->GetActor(params.entityId); bool isplayer = pActor != 0; if (isplayer && oldTeam) { TPlayerTeamIdMap::iterator pit = m_playerteams.find(oldTeam); assert(pit != m_playerteams.end()); stl::find_and_erase(pit->second, params.entityId); } if (params.teamId) { m_entityteams.insert(TEntityTeamIdMap::value_type(params.entityId, params.teamId)); if (isplayer) { TPlayerTeamIdMap::iterator pit = m_playerteams.find(params.teamId); assert(pit != m_playerteams.end()); pit->second.push_back(params.entityId); } } if(isplayer) { ReconfigureVoiceGroups(params.entityId, oldTeam, params.teamId); } ScriptHandle handle(params.entityId); CallScript(m_clientStateScript, "OnSetTeam", handle, params.teamId); return true; }
//------------------------------------------------------------------------ void CGameRules::ProcessServerHit(const HitInfo &hitInfo) { bool ok=true; // check if shooter is alive CActor *pShooter=GetActorByEntityId(hitInfo.shooterId); if (hitInfo.shooterId) { if (pShooter && pShooter->GetHealth()<=0) ok=false; } if (hitInfo.targetId) { CActor *pTarget=GetActorByEntityId(hitInfo.targetId); if (pTarget && pTarget->GetSpectatorMode()) ok=false; } if (ok) { CreateScriptHitInfo(m_scriptHitInfo, hitInfo); CallScript(m_serverStateScript, "OnHit", m_scriptHitInfo); // call hit listeners if any if (m_hitListeners.empty() == false) { THitListenerVec::iterator iter = m_hitListeners.begin(); while (iter != m_hitListeners.end()) { (*iter)->OnHit(hitInfo); ++iter; } } if (pShooter && hitInfo.shooterId!=hitInfo.targetId && hitInfo.weaponId!=hitInfo.shooterId && hitInfo.weaponId!=hitInfo.targetId && hitInfo.damage>=0) { EntityId params[2]; params[0] = hitInfo.weaponId; params[1] = hitInfo.targetId; m_pGameplayRecorder->Event(pShooter->GetEntity(), GameplayEvent(eGE_WeaponHit, 0, 0, (void *)params)); } if (pShooter) m_pGameplayRecorder->Event(pShooter->GetEntity(), GameplayEvent(eGE_Hit, 0, 0, (void *)hitInfo.weaponId)); if (pShooter) m_pGameplayRecorder->Event(pShooter->GetEntity(), GameplayEvent(eGE_Damage, 0, hitInfo.damage, (void *)hitInfo.weaponId)); } }
/* ================ idTrigger_Multi::TriggerAction ================ */ void idTrigger_Multi::TriggerAction( idEntity *activator ) { ActivateTargets( triggerWithSelf ? this : activator ); CallScript(); if ( wait >= 0 ) { nextTriggerTime = gameLocal.time + SEC2MS( wait + random * gameLocal.random.CRandomFloat() ); } else { // we can't just remove (this) here, because this is a touch function // called while looping through area links... // If the player spawned inside the trigger, the player Spawn function called Think directly, // allowing for multiple triggers on a trigger_once. Increasing the nextTriggerTime prevents it. nextTriggerTime = gameLocal.time + 99999; PostEventMS( &EV_Remove, 0 ); } }
/* ================ idTrigger_EntityName::TriggerAction ================ */ void idTrigger_EntityName::TriggerAction( idEntity *activator ) { // RAVEN BEGIN // abahr: want same functionality as trigger_multi. Need to move this code into these two function calls idEntity* scriptEntity = spawnArgs.GetBool("triggerWithSelf") ? this : activator; ActivateTargets( scriptEntity ); CallScript( scriptEntity ); // RAVEN END if ( wait >= 0 ) { nextTriggerTime = gameLocal.time + SEC2MS( wait + random * gameLocal.random.CRandomFloat() ); } else { // we can't just remove (this) here, because this is a touch function // called while looping through area links... nextTriggerTime = gameLocal.time + 1; PostEventMS( &EV_Remove, 0 ); } }
void COptionDlg::SelectColor(DWORD i) { CColorDialog dlg; if(dlg.DoModal() == IDOK) { COLORREF color = dlg.GetColor(); CString cstr1, cstr2; cstr1.Format(_T("%d"), i); cstr2.Format(_T("#%02x%02x%02x"), GetRValue(color), GetGValue(color), GetBValue(color)); WritePrivateProfileString(_T("LineColor"), cstr1, cstr2, m_Ini); m_ColorCode[i] = cstr2; CallScript(_T("changeBackgroundColor"), cstr1 + _T(", ") + cstr2); UpdateData(FALSE); ::PostMessage(m_ParentWnd->GetSafeHwnd(), MY_UPDATE_LINE_COLOR, NULL, NULL); } }
HRESULT COptionDlg::OnReset(IHTMLElement* /*pElement*/) { for(int i = 0; i <= CAtaSmart::MAX_DISK; i++) { COLORREF color = m_DefaultLineColor[i]; CString cstr1, cstr2; cstr1.Format(_T("%d"), i); cstr2.Format(_T("#%02x%02x%02x"), GetRValue(color), GetGValue(color), GetBValue(color)); WritePrivateProfileString(_T("LineColor"), cstr1, cstr2, m_Ini); m_ColorCode[i] = cstr2; CallScript(_T("changeBackgroundColor"), cstr1 + _T(", ") + cstr2); } ::PostMessage(m_ParentWnd->GetSafeHwnd(), MY_UPDATE_LINE_COLOR, NULL, NULL); UpdateData(FALSE); return S_FALSE; }
//------------------------------------------------------------------------ void CGameRules::ClientHit(const HitInfo &hitInfo) { FUNCTION_PROFILER(GetISystem(), PROFILE_GAME); IActor *pClientActor = g_pGame->GetIGameFramework()->GetClientActor(); IEntity *pTarget = m_pEntitySystem->GetEntity(hitInfo.targetId); IEntity *pShooter = m_pEntitySystem->GetEntity(hitInfo.shooterId); IVehicle *pVehicle = g_pGame->GetIGameFramework()->GetIVehicleSystem()->GetVehicle(hitInfo.targetId); IActor *pActor = g_pGame->GetIGameFramework()->GetIActorSystem()->GetActor(hitInfo.targetId); bool dead = pActor?(pActor->GetHealth()<=0):false; if((pClientActor && pClientActor->GetEntity()==pShooter) && pTarget && (pVehicle || pActor) && !dead) { SAFE_HUD_FUNC(GetCrosshair()->CrosshairHit()); SAFE_HUD_FUNC(GetTagNames()->AddEnemyTagName(pActor?pActor->GetEntityId():pVehicle->GetEntityId())); } if(pActor == pClientActor) if (gEnv->pInput) gEnv->pInput->ForceFeedbackEvent( SFFOutputEvent(eDI_XI, eFF_Rumble_Basic, 0.5f * hitInfo.damage * 0.01f, hitInfo.damage * 0.02f, 0.0f)); /* if (gEnv->pAISystem && !gEnv->bMultiplayer) { static int htMelee = GetHitTypeId("melee"); if (pShooter && hitInfo.type != htMelee) { ISurfaceType *pSurfaceType = GetHitMaterial(hitInfo.material); const ISurfaceType::SSurfaceTypeAIParams* pParams = pSurfaceType ? pSurfaceType->GetAIParams() : 0; const float radius = pParams ? pParams->fImpactRadius : 5.0f; gEnv->pAISystem->BulletHitEvent(hitInfo.pos, radius, pShooter->GetAI()); } }*/ CreateScriptHitInfo(m_scriptHitInfo, hitInfo); CallScript(m_clientStateScript, "OnHit", m_scriptHitInfo); bool backface = hitInfo.dir.Dot(hitInfo.normal)>0; if (!hitInfo.remote && hitInfo.targetId && !backface) { if (!gEnv->bServer) GetGameObject()->InvokeRMI(SvRequestHit(), hitInfo, eRMI_ToServer); else ServerHit(hitInfo); } }
/* ================ idTrigger_Hurt::Event_Touch ================ */ void idTrigger_Hurt::Event_Touch( idEntity *other, trace_t *trace ) { const char *damage; // RAVEN BEGIN // kfuller: playeronly flag // jnewquist: Use accessor for static class type if ( playerOnly && !other->IsType( idPlayer::GetClassType() ) ) { return; } // RAVEN END if ( on && other && gameLocal.time >= nextTime ) { damage = spawnArgs.GetString( "def_damage", "damage_painTrigger" ); other->Damage( this, NULL, vec3_origin, damage, 1.0f, INVALID_JOINT ); ActivateTargets( other ); CallScript( other ); nextTime = gameLocal.time + SEC2MS( delay ); } }
//------------------------------------------------------------------------ void CGameRules::ClientExplosion(const ExplosionInfo &explosionInfo) { // let 3D engine know about explosion (will create holes and remove vegetation) //if (explosionInfo.hole_size > 0.0f) //{ //gEnv->p3DEngine->OnExplosion(explosionInfo.pos, explosionInfo.hole_size, true); //} TExplosionAffectedEntities affectedEntities; if (gEnv->bServer) { CullEntitiesInExplosion(explosionInfo); pe_explosion explosion; explosion.epicenter = explosionInfo.pos; explosion.rmin = explosionInfo.minRadius; explosion.rmax = explosionInfo.radius; if (explosion.rmax==0) explosion.rmax=0.0001f; explosion.r = explosion.rmin; explosion.impulsivePressureAtR = explosionInfo.pressure; explosion.epicenterImp = explosionInfo.pos; explosion.explDir = explosionInfo.dir; explosion.nGrow = 2; explosion.rminOcc = 0.07f; // we separate the calls to SimulateExplosion so that we can define different radii for AI and physics bodies explosion.holeSize = 0.0f; explosion.nOccRes = explosion.rmax>50.0f ? 0:32; gEnv->pPhysicalWorld->SimulateExplosion( &explosion, 0, 0, ent_living); CreateScriptExplosionInfo(m_scriptExplosionInfo, explosionInfo); UpdateAffectedEntitiesSet(affectedEntities, &explosion); // check vehicles IVehicleSystem *pVehicleSystem = g_pGame->GetIGameFramework()->GetIVehicleSystem(); uint32 vcount = pVehicleSystem->GetVehicleCount(); if (vcount > 0) { IVehicleIteratorPtr iter = g_pGame->GetIGameFramework()->GetIVehicleSystem()->CreateVehicleIterator(); while (IVehicle* pVehicle = iter->Next()) { if(IEntity *pEntity = pVehicle->GetEntity()) { AABB aabb; pEntity->GetWorldBounds(aabb); IPhysicalEntity* pEnt = pEntity->GetPhysics(); if (pEnt && aabb.GetDistanceSqr(explosionInfo.pos) <= explosionInfo.radius*explosionInfo.radius) { float affected = gEnv->pPhysicalWorld->CalculateExplosionExposure(&explosion, pEnt); AddOrUpdateAffectedEntity(affectedEntities, pEntity, affected); } } } } explosion.rmin = explosionInfo.minPhysRadius; explosion.rmax = explosionInfo.physRadius; if (explosion.rmax==0) explosion.rmax=0.0001f; explosion.r = explosion.rmin; explosion.holeSize = explosionInfo.hole_size; explosion.nOccRes = -1; // makes second call re-use occlusion info gEnv->pPhysicalWorld->SimulateExplosion( &explosion, 0, 0, ent_rigid|ent_sleeping_rigid|ent_independent|ent_static ); UpdateAffectedEntitiesSet(affectedEntities, &explosion); CommitAffectedEntitiesSet(m_scriptExplosionInfo, affectedEntities); float fSuitEnergyBeforeExplosion = 0.0f; float fHealthBeforeExplosion = 0.0f; IActor *pClientActor = g_pGame->GetIGameFramework()->GetClientActor(); if(pClientActor) { fSuitEnergyBeforeExplosion = static_cast<CPlayer *>(pClientActor)->GetNanoSuit()->GetSuitEnergy(); fHealthBeforeExplosion = pClientActor->GetHealth(); } CallScript(m_serverStateScript, "OnExplosion", m_scriptExplosionInfo); if(pClientActor) { float fDeltaSuitEnergy = fSuitEnergyBeforeExplosion - static_cast<CPlayer *>(pClientActor)->GetNanoSuit()->GetSuitEnergy(); float fDeltaHealth = fHealthBeforeExplosion - pClientActor->GetHealth(); if(fDeltaSuitEnergy >= 50.0f || fDeltaHealth >= 20.0f) { SAFE_SOUNDMOODS_FUNC(AddSoundMood(SOUNDMOOD_EXPLOSION,MIN(fDeltaSuitEnergy+fDeltaHealth,100.0f))); } } // call hit listeners if any if (m_hitListeners.empty() == false) { THitListenerVec::iterator iter = m_hitListeners.begin(); while (iter != m_hitListeners.end()) { (*iter)->OnServerExplosion(explosionInfo); ++iter; } } } if (gEnv->bClient) { if (explosionInfo.pParticleEffect) explosionInfo.pParticleEffect->Spawn(true, IParticleEffect::ParticleLoc(explosionInfo.pos, explosionInfo.dir, explosionInfo.effect_scale)); if (!gEnv->bServer) { CreateScriptExplosionInfo(m_scriptExplosionInfo, explosionInfo); } else { affectedEntities.clear(); CommitAffectedEntitiesSet(m_scriptExplosionInfo, affectedEntities); } CallScript(m_clientStateScript, "OnExplosion", m_scriptExplosionInfo); // call hit listeners if any if (m_hitListeners.empty() == false) { THitListenerVec::iterator iter = m_hitListeners.begin(); while (iter != m_hitListeners.end()) { (*iter)->OnExplosion(explosionInfo); ++iter; } } } ProcessClientExplosionScreenFX(explosionInfo); ProcessExplosionMaterialFX(explosionInfo); IEntity *pShooter = m_pEntitySystem->GetEntity(explosionInfo.shooterId); if (gEnv->pAISystem && !gEnv->bMultiplayer) { IAIObject *pShooterAI(pShooter!=NULL ? pShooter->GetAI() : NULL); gEnv->pAISystem->ExplosionEvent(explosionInfo.pos,explosionInfo.radius, pShooterAI); } }
//------------------------------------------------------------------------ void CGameRules::ClientExplosion(const ExplosionInfo &explosionInfo) { // let 3D engine know about explosion (will create holes and remove vegetation) if (explosionInfo.hole_size > 1.0f && gEnv->p3DEngine->GetIVoxTerrain()) { gEnv->p3DEngine->OnExplosion(explosionInfo.pos, explosionInfo.hole_size, true); } TExplosionAffectedEntities affectedEntities; if (gEnv->bServer) { CullEntitiesInExplosion(explosionInfo); pe_explosion explosion; explosion.epicenter = explosionInfo.pos; explosion.rmin = explosionInfo.minRadius; explosion.rmax = explosionInfo.radius; if (explosion.rmax==0) explosion.rmax=0.0001f; explosion.r = explosion.rmin; explosion.impulsivePressureAtR = explosionInfo.pressure; explosion.epicenterImp = explosionInfo.pos; explosion.explDir = explosionInfo.dir; explosion.nGrow = 0; explosion.rminOcc = 0.07f; // we separate the calls to SimulateExplosion so that we can define different radii for AI and physics bodies explosion.holeSize = 0.0f; explosion.nOccRes = explosion.rmax>50.0f ? 0:16; gEnv->pPhysicalWorld->SimulateExplosion( &explosion, 0, 0, ent_living); CreateScriptExplosionInfo(m_scriptExplosionInfo, explosionInfo); UpdateAffectedEntitiesSet(affectedEntities, &explosion); // check vehicles IVehicleSystem *pVehicleSystem = g_pGame->GetIGameFramework()->GetIVehicleSystem(); uint32 vcount = pVehicleSystem->GetVehicleCount(); if (vcount > 0) { IVehicleIteratorPtr iter = g_pGame->GetIGameFramework()->GetIVehicleSystem()->CreateVehicleIterator(); while (IVehicle* pVehicle = iter->Next()) { if(IEntity *pEntity = pVehicle->GetEntity()) { AABB aabb; pEntity->GetWorldBounds(aabb); IPhysicalEntity* pEnt = pEntity->GetPhysics(); if (pEnt && aabb.GetDistanceSqr(explosionInfo.pos) <= explosionInfo.radius*explosionInfo.radius) { float affected = gEnv->pPhysicalWorld->CalculateExplosionExposure(&explosion, pEnt); AddOrUpdateAffectedEntity(affectedEntities, pEntity, affected); } } } } explosion.rmin = explosionInfo.minPhysRadius; explosion.rmax = explosionInfo.physRadius; if (explosion.rmax==0) explosion.rmax=0.0001f; explosion.r = explosion.rmin; explosion.holeSize = explosionInfo.hole_size; if (explosion.nOccRes>0) explosion.nOccRes = -1; // makes second call re-use occlusion info gEnv->pPhysicalWorld->SimulateExplosion( &explosion, 0, 0, ent_rigid|ent_sleeping_rigid|ent_independent|ent_static | ent_delayed_deformations); UpdateAffectedEntitiesSet(affectedEntities, &explosion); CommitAffectedEntitiesSet(m_scriptExplosionInfo, affectedEntities); float fSuitEnergyBeforeExplosion = 0.0f; float fHealthBeforeExplosion = 0.0f; IActor *pClientActor = g_pGame->GetIGameFramework()->GetClientActor(); if(pClientActor) { fHealthBeforeExplosion = (float)pClientActor->GetHealth(); } CallScript(m_serverStateScript, "OnExplosion", m_scriptExplosionInfo); if(pClientActor) { float fDeltaHealth = fHealthBeforeExplosion - static_cast<CPlayer *>(pClientActor)->GetHealth(); if(fDeltaHealth >= 20.0f) { SAFE_GAMEAUDIO_SOUNDMOODS_FUNC(AddSoundMood(SOUNDMOOD_EXPLOSION, MIN(fDeltaHealth, 100.0f) )); } } // call hit listeners if any if (m_hitListeners.empty() == false) { for (size_t i = 0; i < m_hitListeners.size(); ) { size_t count = m_hitListeners.size(); m_hitListeners[i]->OnServerExplosion(explosionInfo); if (count == m_hitListeners.size()) i++; else continue; } } } if (gEnv->IsClient()) { if (explosionInfo.pParticleEffect) explosionInfo.pParticleEffect->Spawn(true, IParticleEffect::ParticleLoc(explosionInfo.pos, explosionInfo.dir, explosionInfo.effect_scale)); if (!gEnv->bServer) { CreateScriptExplosionInfo(m_scriptExplosionInfo, explosionInfo); } else { affectedEntities.clear(); CommitAffectedEntitiesSet(m_scriptExplosionInfo, affectedEntities); } CallScript(m_clientStateScript, "OnExplosion", m_scriptExplosionInfo); // call hit listeners if any if (m_hitListeners.empty() == false) { THitListenerVec::iterator iter = m_hitListeners.begin(); while (iter != m_hitListeners.end()) { (*iter)->OnExplosion(explosionInfo); ++iter; } } } ProcessClientExplosionScreenFX(explosionInfo); ProcessExplosionMaterialFX(explosionInfo); if (gEnv->pAISystem && !gEnv->bMultiplayer) { // Associate event with vehicle if the shooter is in a vehicle (tank cannon shot, etc) EntityId ownerId = explosionInfo.shooterId; IActor* pActor = g_pGame->GetIGameFramework()->GetIActorSystem()->GetActor(ownerId); if (pActor && pActor->GetLinkedVehicle() && pActor->GetLinkedVehicle()->GetEntityId()) ownerId = pActor->GetLinkedVehicle()->GetEntityId(); if (ownerId != 0) { SAIStimulus stim(AISTIM_EXPLOSION, 0, ownerId, 0, explosionInfo.pos, ZERO, explosionInfo.radius); gEnv->pAISystem->RegisterStimulus(stim); SAIStimulus stimSound(AISTIM_SOUND, AISOUND_EXPLOSION, ownerId, 0, explosionInfo.pos, ZERO, explosionInfo.radius * 3.0f, AISTIMPROC_FILTER_LINK_WITH_PREVIOUS); gEnv->pAISystem->RegisterStimulus(stimSound); } } }
/* ================ idTrigger_Touch::TouchEntities ================ */ void idTrigger_Touch::TouchEntities( void ) { int numClipModels, i; idBounds bounds; idClipModel *cm, *clipModelList[ MAX_GENTITIES ]; // RAVEN BEGIN // abahr: now scriptFunction list if ( clipModel == NULL || !scriptFunctions.Num() ) { // RAVEN END return; } bounds.FromTransformedBounds( clipModel->GetBounds(), GetBindMaster()!=NULL?GetPhysics()->GetOrigin():clipModel->GetOrigin(), GetBindMaster()!=NULL?GetPhysics()->GetAxis():clipModel->GetAxis() ); // RAVEN BEGIN // MCG: filterTeam if ( filterTeam != -1 ) { idActor* actor; // Iterate through the filter team for( actor = aiManager.GetAllyTeam ( (aiTeam_t)filterTeam ); actor; actor = actor->teamNode.Next() ) { // Skip hidden actors and actors that can't be targeted if( actor->fl.notarget || actor->fl.isDormant || ( actor->IsHidden ( ) && !actor->IsInVehicle() ) ) { continue; } if ( !bounds.IntersectsBounds ( actor->GetPhysics()->GetAbsBounds ( ) ) ) { continue; } cm = actor->GetPhysics()->GetClipModel(); if ( !cm || !cm->IsTraceModel() ) { continue; } if ( !gameLocal.ContentsModel( this, cm->GetOrigin(), cm, cm->GetAxis(), -1, clipModel->GetCollisionModel(), GetBindMaster()!=NULL?GetPhysics()->GetOrigin():clipModel->GetOrigin(), GetBindMaster()!=NULL?GetPhysics()->GetAxis():clipModel->GetAxis() ) ) { continue; } ActivateTargets( (idEntity*)actor ); CallScript( (idEntity*)actor ); } return; } // ddynerman: multiple clip worlds numClipModels = gameLocal.ClipModelsTouchingBounds( this, bounds, -1, clipModelList, MAX_GENTITIES ); // RAVEN END for ( i = 0; i < numClipModels; i++ ) { cm = clipModelList[ i ]; if ( !cm->IsTraceModel() ) { continue; } idEntity *entity = cm->GetEntity(); if ( !entity ) { continue; } // RAVEN BEGIN // ddynerman: multiple clip worlds if ( !gameLocal.ContentsModel( this, cm->GetOrigin(), cm, cm->GetAxis(), -1, clipModel->GetCollisionModel(), clipModel->GetOrigin(), clipModel->GetAxis() ) ) { // RAVEN END continue; } ActivateTargets( entity ); // RAVEN BEGIN // abahr: changed to be compatible with new script function utility CallScript( entity ); // RAVEN END } }