Files
GTASource/game/event/EventEditable.cpp
expvintl 419f2e4752 init
2025-02-23 17:40:52 +08:00

168 lines
8.4 KiB
C++

// File header
#include "Event/EventEditable.h"
// Framework headers
#include "ai/aichannel.h"
// Game headers
#include "Event/Decision/EventDecisionMaker.h"
#include "Event/EventSource.h"
#include "PedGroup/PedGroup.h"
#include "Peds/Ped.h"
#include "Event/System/EventDataManager.h"
#include "Peds/PedIntelligence.h"
#include "Vehicles/Vehicle.h"
AI_OPTIMISATIONS()
CEventEditableResponse::CEventEditableResponse()
: m_iTaskType(CTaskTypes::TASK_INVALID_ID)
, m_bWitnessedFirstHand(true)
, m_FleeFlags(0)
{
}
CEvent* CEventEditableResponse::Clone() const
{
CEventEditableResponse* pClone = CloneEditable();
pClone->m_iTaskType = m_iTaskType;
pClone->m_bWitnessedFirstHand = m_bWitnessedFirstHand;
pClone->m_FleeFlags = m_FleeFlags;
pClone->m_SpeechHash = m_SpeechHash;
return pClone;
}
void CEventEditableResponse::ComputeResponseTaskType(CPed* pPed)
{
if(aiVerifyf(m_iTaskType == CTaskTypes::TASK_INVALID_ID, "m_iTaskType already computed, value is [%d]", m_iTaskType))
{
m_iTaskType = CTaskTypes::TASK_NONE;
CPedEventDecisionMaker& rPedDecisionMaker = pPed->GetPedIntelligence()->GetPedDecisionMaker();
CEventResponseTheDecision decision;
rPedDecisionMaker.MakeDecision(pPed, this, decision);
const CTaskTypes::eTaskType taskType = (CTaskTypes::eTaskType)decision.GetTaskType();
if(taskType != CTaskTypes::TASK_INVALID_ID)
{
Assign(m_FleeFlags,decision.GetFleeFlags());
m_iTaskType = taskType;
m_SpeechHash = decision.GetSpeechHash();
}
}
}
CTaskTypes::eTaskType CEventEditableResponse::FindTaskTypeForResponse(u32 taskHash)
{
CTaskTypes::eTaskType taskType = CTaskTypes::TASK_INVALID_ID;
const CEventDataResponseTask* pEventResponseTaskData = CEventDataManager::GetInstance().GetEventResponseTask(taskHash);
if(pEventResponseTaskData)
{
const void * pResponseParserType = pEventResponseTaskData->parser_GetStructure();
if (pResponseParserType == CEventDataResponseTaskCombat::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_COMBAT;
else if (pResponseParserType == CEventDataResponseTaskThreat::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_THREAT_RESPONSE;
else if (pResponseParserType == CEventDataResponseTaskCower::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_COWER;
else if (pResponseParserType == CEventDataResponseTaskHandsUp::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_HANDS_UP;
else if (pResponseParserType == CEventDataResponseTaskGunAimedAt::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_REACT_TO_GUN_AIMED_AT;
else if (pResponseParserType == CEventDataResponseTaskFlee::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_SMART_FLEE;
else if (pResponseParserType == CEventDataResponseTaskTurnToFace::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_MOVE_ACHIEVE_HEADING;
else if (pResponseParserType == CEventDataResponseTaskCrouch::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_CROUCH;
else if (pResponseParserType == CEventDataResponseTaskLeaveCarAndFlee::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_COMPLEX_LEAVE_CAR_AND_FLEE;
else if (pResponseParserType == CEventDataResponseTaskWalkRoundFire::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_WALK_ROUND_FIRE;
else if (pResponseParserType == CEventDataResponsePoliceTaskWanted::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_POLICE_WANTED_RESPONSE;
else if (pResponseParserType == CEventDataResponseSwatTaskWanted::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_SWAT_WANTED_RESPONSE;
else if (pResponseParserType == CEventDataResponseTaskScenarioFlee::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_SCENARIO_FLEE;
else if (pResponseParserType == CEventDataResponseTaskFlyAway::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_FLY_AWAY;
else if (pResponseParserType == CEventDataResponseTaskWalkRoundEntity::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_WALK_ROUND_ENTITY;
else if (pResponseParserType == CEventDataResponseTaskHeadTrack::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_AMBIENT_LOOK_AT_EVENT;
else if (pResponseParserType == CEventDataResponseTaskShockingEventGoto::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_SHOCKING_EVENT_GOTO;
else if (pResponseParserType == CEventDataResponseTaskShockingEventHurryAway::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_SHOCKING_EVENT_HURRYAWAY;
else if (pResponseParserType == CEventDataResponseTaskShockingEventWatch::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_SHOCKING_EVENT_WATCH;
else if (pResponseParserType == CEventDataResponseTaskShockingPoliceInvestigate::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_SHOCKING_POLICE_INVESTIGATE;
else if (pResponseParserType == CEventDataResponseTaskEvasiveStep::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_COMPLEX_EVASIVE_STEP;
else if (pResponseParserType == CEventDataResponseTaskEscapeBlast::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_ESCAPE_BLAST;
else if (pResponseParserType == CEventDataResponseTaskAgitated::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_AGITATED;
else if (pResponseParserType == CEventDataResponseTaskExplosion::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_REACT_TO_EXPLOSION;
else if (pResponseParserType == CEventDataResponseTaskDuckAndCover::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_ON_FOOT_DUCK_AND_COVER;
else if (pResponseParserType == CEventDataResponseTaskShockingEventReactToAircraft::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_SHOCKING_EVENT_REACT_TO_AIRCRAFT;
else if (pResponseParserType == CEventDataResponseTaskShockingEventReact::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_SHOCKING_EVENT_REACT;
else if (pResponseParserType == CEventDataResponseTaskShockingEventBackAway::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_SHOCKING_EVENT_BACK_AWAY;
else if (pResponseParserType == CEventDataResponseTaskShockingEventStopAndStare::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_SHOCKING_EVENT_STOP_AND_STARE;
else if (pResponseParserType == CEventDataResponseTaskSharkAttack::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_SHARK_ATTACK;
else if (pResponseParserType == CEventDataResponseTaskExhaustedFlee::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_EXHAUSTED_FLEE;
else if (pResponseParserType == CEventDataResponseTaskGrowlAndFlee::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_GROWL_AND_FLEE;
else if (pResponseParserType == CEventDataResponseTaskWalkAway::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_WALK_AWAY;
else if (pResponseParserType == CEventDataResponseAggressiveRubberneck::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_AGGRESSIVE_RUBBERNECK;
else if (pResponseParserType == CEventDataResponseTaskShockingNiceCar::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_SHOCKING_NICE_CAR_PICTURE;
else if (pResponseParserType == CEventDataResponseFriendlyNearMiss::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_FRIENDLY_FIRE_NEAR_MISS;
else if (pResponseParserType == CEventDataResponseFriendlyAimedAt::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_FRIENDLY_AIMED_AT;
else if (pResponseParserType == CEventDataResponseDeferToScenarioPointFlags::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_DEFER_TO_SCENARIO;
else if (pResponseParserType == CEventDataResponseTaskShockingEventThreatResponse::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_SHOCKING_EVENT_THREAT_RESPONSE;
else if (pResponseParserType == CEventDataResponsePlayerDeath::parser_GetStaticStructure())
taskType = CTaskTypes::TASK_PLAYER_DEATH_REACT;
else
{
aiAssertf(0, "Unhandled case [%s] as part of CEventEditableResponse::FindTaskTypeForResponse", pEventResponseTaskData->parser_GetStructure()->GetName());
}
}
return taskType;
}
CEventEditableResponse* CEventEditableResponse::CloneWithDefaultParams() const
{
CEventEditableResponse* pClone = static_cast<CEventEditableResponse*>(Clone());
pClone->m_iTaskType = CTaskTypes::TASK_INVALID_ID;
pClone->m_bWitnessedFirstHand = false;
pClone->m_FleeFlags = 0;
return pClone;
}
bool CEventEditableResponse::WillRespond() const
{
return CTaskTypes::TASK_NONE != m_iTaskType || ((GetEventType() == EVENT_DAMAGE || GetEventType() == EVENT_MELEE_ACTION) && GetWitnessedFirstHand());
}