void t4p::FindInFilesResultsPanelClass::FindInOpenedFiles() { FinderClass finder; FindInFiles.CopyFinder(finder); if (FindInFiles.Prepare() && finder.Prepare()) { // search the opened files std::vector<t4p::CodeControlClass*> codeCtrls = View.AllCodeControls(); for (size_t i = 0; i < codeCtrls.size(); ++i) { CodeControlClass* codeControl = codeCtrls[i]; wxString fileName = codeControl->GetFileName(); // make sure to respect the wildcard filter and the find path here too if (FindInFiles.Source.Contains(fileName)) { UnicodeString text = codeControl->GetSafeText(); int32_t next = 0; int32_t charPos = 0, length = 0; std::vector<t4p::FindInFilesHitClass> hits; while (finder.FindNext(text, next)) { if (finder.GetLastMatch(charPos, length)) { int lineNumber = codeControl->LineFromCharacter(charPos); int start = codeControl->PositionFromLine(lineNumber); int end = codeControl->GetLineEndPosition(lineNumber); wxString lineText = codeControl->GetTextRange(start, end); // lineNumber is zero-based but we want to display it as 1-based lineNumber++; t4p::FindInFilesHitClass hit( fileName, lineText, lineNumber, charPos - start, next, length); hits.push_back(hit); next = charPos + length; } else { break; } } if (!hits.empty()) { t4p::FindInFilesHitEventClass hitEvent(FindInFilesGaugeId, hits); wxPostEvent(this, hitEvent); } } } } }
bool CGameRulesMPDamageHandling::SvOnHitScaled( const HitInfo &hitInfo ) { bool bReturnDied = false; IEntity *pTarget = gEnv->pEntitySystem->GetEntity(hitInfo.targetId); CActor *pActor = static_cast<CActor*>(g_pGame->GetIGameFramework()->GetIActorSystem()->GetActor(hitInfo.targetId)); if(!pActor) { IVehicle* pVictimVehicle = g_pGame->GetIGameFramework()->GetIVehicleSystem()->GetVehicle(hitInfo.targetId); if(pVictimVehicle) { float vehicleDamageMultiplier = 1.f; //Additional damage scaling check for vehicles with associated body damage files CBodyDamageManager *pBodyDamageManager = g_pGame->GetBodyDamageManager(); TBodyDamageProfileId bodyDamageProfileId; TVehicleBodyDamageMap::const_iterator iter = m_vehicleBodyDamageMap.find( hitInfo.targetId ); if( iter != m_vehicleBodyDamageMap.end() ) { bodyDamageProfileId = iter->second; } else { bodyDamageProfileId = pBodyDamageManager->GetBodyDamage( *pTarget ); m_vehicleBodyDamageMap[hitInfo.targetId] = bodyDamageProfileId; } if(bodyDamageProfileId != INVALID_BODYDAMAGEPROFILEID) { vehicleDamageMultiplier *= pBodyDamageManager->GetDamageMultiplier(bodyDamageProfileId, *pTarget, hitInfo); } float fPreviousHealth = pVictimVehicle->GetStatus().health; // for vehicles, no need to call lua any more, we can just apply the hit directly to the vehicle { HitInfo hitInfoTemp = hitInfo; hitInfoTemp.damage *= vehicleDamageMultiplier; hitInfoTemp.explosion = false; pVictimVehicle->OnHit(hitInfoTemp); } float fNewHealth = pVictimVehicle->GetStatus().health; //Hit indicator for driver // Health check is required to take into account damage removal due to friendly fire. if(fNewHealth != fPreviousHealth) { if(IActor* pDriver = pVictimVehicle->GetDriver()) { if(IEntity* pShooterEntity = gEnv->pEntitySystem->GetEntity(hitInfo.shooterId)) { Vec3 shooterPos = pShooterEntity->GetWorldPos(); if(pDriver->IsClient()) { SHUDEvent hitEvent(eHUDEvent_OnShowHitIndicatorPlayerUpdated); hitEvent.ReserveData(3); hitEvent.AddData(shooterPos.x); hitEvent.AddData(shooterPos.y); hitEvent.AddData(shooterPos.z); CHUDEventDispatcher::CallEvent(hitEvent); } else { m_pGameRules->GetGameObject()->InvokeRMI( CGameRules::ClActivateHitIndicator(), CGameRules::ActivateHitIndicatorParams(shooterPos), eRMI_ToClientChannel, pDriver->GetChannelId() ); } } } } // no need for further processing, or calling OnEntityKilled, so just return early. if(pVictimVehicle->GetDamageRatio() >= 1.f) { if(fNewHealth != fPreviousHealth) { SVehicleDestroyedParams params(hitInfo.targetId, hitInfo.weaponId, hitInfo.type, hitInfo.projectileClassId); if(hitInfo.shooterId == g_pGame->GetClientActorId()) { CPersistantStats::GetInstance()->OnClientDestroyedVehicle(params); } else if(IGameObject * pShooterGameObject = g_pGame->GetIGameFramework()->GetGameObject(hitInfo.shooterId)) { m_pGameRules->GetGameObject()->InvokeRMIWithDependentObject(CGameRules::ClVehicleDestroyed(), params, eRMI_ToClientChannel, hitInfo.shooterId, pShooterGameObject->GetChannelId()); } } m_pGameRules->OnEntityKilled(hitInfo); return true; } else { return false; } } } if (pTarget) { IScriptTable *pTargetScript = pTarget->GetScriptTable(); if (pTargetScript) { m_pGameRules->CreateScriptHitInfo(m_scriptHitInfo, hitInfo); bool isDead = false; if (pActor) { if (pActor->IsDead()) { isDead = true; // Target is already dead HSCRIPTFUNCTION pfnOnDeadHit = 0; if (pActor->GetActorStats()->isRagDoll && pTargetScript->GetValue("OnDeadHit", pfnOnDeadHit)) { Script::CallMethod(pTargetScript, pfnOnDeadHit, m_scriptHitInfo); gEnv->pScriptSystem->ReleaseFunc(pfnOnDeadHit); } } } if (!isDead) { SmartScriptTable targetServerScript; if (pTargetScript->GetValue("Server", targetServerScript)) { HSCRIPTFUNCTION pfnOnHit = 0; if (targetServerScript->GetValue("OnHit", pfnOnHit)) { if (Script::CallReturn(gEnv->pScriptSystem, pfnOnHit, pTargetScript, m_scriptHitInfo, bReturnDied)) { if (bReturnDied) { if (pActor) { ProcessDeath(hitInfo, *pActor); } else { m_pGameRules->OnEntityKilled(hitInfo); } } } gEnv->pScriptSystem->ReleaseFunc(pfnOnHit); } } } } } return bReturnDied; }