USING "Commands_entity.sch" USING "Commands_ped.sch" USING "script_ped.sch" USING "commands_fire.sch" USING "dialogue_public.sch" USING "rGeneral_include.sch" USING "usefulCommands.sch" USING "commands_event.sch" int iNextArrayToFill bool bAlertEveryone bool bHearExplosion bool bWarningDialoguePLaying bool bPlayerSeen bool bAPedIsReacting int iNextAlertCheckPed int iWarningDialogueTriggerTime int highestPriorityDialogue=0, highestPrioritySpeaker = -1 int pedRespondingToAlert = -1 int alertBulletFlag,alertBuddyFlag,alertSeenFlag int iCheckDefAreasCounter int reactionDialogueFlag int lastDialogue,lastSpeaker float fDefAreaSize vector vActionCheckCore float fActionCheckRange ENUM ALERT_MESSAGE ALERT_NONE, ALERT_HEAR_PLAYER, ALERT_NEARBY_PED_REACTION, ALERT_EXPLOSION, ALERT_SOMEONE_ALERTING_EVERYONE, ALERT_DEAD_BODY_SEEN, ALERT_PLAYER_SEEN, ALERT_BULLET_IMPACT, ALERT_SEEKING, ALERT_PLAYER_FOUND, ALERT_COMBAT ENDENUM ENUM enum_state state_NONE, STATE_SPAWN, STATE_RESTART_AMBIENT, STATE_AMBIENT, STATE_REACT, STATE_SEEK, STATE_COMBAT, STATE_FLEE ENDENUM struct structCheckState ped_index id ALERT_MESSAGE alertMessage ALERT_MESSAGE lastAlertMessage enum_state state int actionFlag int subFlag bool bSetToAttackClose //sets if this ped will move to a defensive area close to the player or not. Used to avoid crowding bool nearbyreactingPed bool canRespondToHearingPlayer bool shortDetectionRange = TRUE int pedOfInterest int timer vector vpos vector vPosB float floatA float investigateRange bool scriptControlledCombat bool scriptReactionFirst int nearbyPedA=-1,nearbyPedB=-1 endstruct struct diaData STRING sPedNameForDialogue STRING sDialogueToPlay int iDiaIndex endstruct bool bPlayerMakingNoiseInVehicle bool bBlockUnseenReactionDialogue bool bEnableReactionDialogue = TRUE ped_index pedInSlot[10] structPedsForConversation CONVSTRUCT string rConvBlock int irConvoLastAttmpetTime, irConvoAttempts #if is_debug_build bool ShowSpecifcPedData int pedDataToShow #endif func PED_INDEX ped_in_slot(int slot) return pedInSlot[slot] ENDFUNC PROC rADD_PED_FOR_DIALOGUE_EXTRA(int speakerIndex, ped_index speaker, string speakerLabel) //may be a problem if aped gets added multiple times in different slots. Fix below: int iJ repeat count_of(pedInSlot) iJ if pedInSlot[iJ] = speaker //there should never be more than one situation for this REMOVE_PED_FOR_DIALOGUE(CONVSTRUCT,iJ) pedInSlot[iJ] = null endif endrepeat if pedInSlot[speakerIndex] != null REMOVE_PED_FOR_DIALOGUE(CONVSTRUCT,speakerIndex) ENDIF //if speakerIndex = 0 //SCRIPT_ASSERT("Use a non-zero speaker index") //cos this function won't work otherwise //ENDIF ADD_PED_FOR_DIALOGUE(CONVSTRUCT,speakerIndex,speaker, speakerLabel) pedInSlot[speakerIndex] = speaker ENDPROC PROC REMOVE_INACTIVE_SPEAKERS(string thisConv, int iSp1,int iSp2, int iSp3, int iSp4) cprintln(debug_trevor3, isp1," ",isp2," ",isp3," ",isp4) int i IF IS_STRING_NULL_OR_EMPTY(remlastConv) OR NOT ARE_STRINGS_EQUAL(remlastConv,thisConv) remlastConv = thisConv FOR i = 0 to 15 IF CONVSTRUCT.PedInfo[i].ActiveInConversation IF i != iSp1 AND i != iSp2 AND i != iSp3 AND i != isp4 CPRINTLN(DEBUG_TREVOR3,"remove pexd at dialogue: ",I," label: ",CONVSTRUCT.PedInfo[i].VoiceID) REMOVE_PED_FOR_DIALOGUE(CONVSTRUCT,i) ENDIF ENDIF ENDFOR ENDIF ENDPROC func bool rCREATE_CONVERSATION_EXTRA(string Label, int speakerOne, ped_index pedSpeakerOne, string speakerOneLabel, int speakerTwo=-1, ped_index pedSpeakerTwo=null, string speakerTwoLabel = null, int speakerThree=-1, ped_index pedSpeakerThree=null, string speakerThreeLabel = null, int speakerFour=-1, ped_index pedSpeakerFour=null, string speakerFourLabel = null, enumConversationPriority convPriority = CONV_PRIORITY_HIGH) REMOVE_INACTIVE_SPEAKERS(Label,speakerOne,speakerTwo,speakerThree,speakerFour) rADD_PED_FOR_DIALOGUE_EXTRA(speakerOne,pedSpeakerOne,speakerOneLabel) if speakerTwo != -1 rADD_PED_FOR_DIALOGUE_EXTRA(speakerTwo,pedSpeakerTwo,speakerTwoLabel) ENDIF if speakerThree != -1 rADD_PED_FOR_DIALOGUE_EXTRA(speakerThree,pedSpeakerThree,speakerThreeLabel) ENDIF if speakerFour != -1 rADD_PED_FOR_DIALOGUE_EXTRA(speakerFour,pedSpeakerFour,speakerFourLabel) ENDIF IF NOT IS_PHONE_ACTIVE_OR_OVERLAPPING_HUD_ITEMS() IF NOT IS_MESSAGE_BEING_DISPLAYED() if CREATE_CONVERSATION(CONVSTRUCT, rConvBlock, Label, convPriority) irConvoAttempts = 0 return true ELSE //backup method in case dialogue just fails to start IF irConvoLastAttmpetTime != GET_GAME_TIMER() irConvoAttempts++ irConvoLastAttmpetTime = GET_GAME_TIMER() IF irConvoAttempts >= 10 irConvoAttempts = 0 RETURN TRUE ENDIF ENDIF ENDIF else return true //abort endif else return true //abort endif return FALSE ENDFUNC SEQUENCE_INDEX aSequence proc startSeq() OPEN_SEQUENCE_TASK(aSequence) ENDPROC proc endSeq(PED_INDEX &aPed, bool MakeRepeat=FALSE) if MakeRepeat SET_SEQUENCE_TO_REPEAT(aSequence,REPEAT_FOREVER) ENDIF CLOSE_SEQUENCE_TASK(aSequence) if not IS_PED_DEAD_OR_DYING(aPed) TASK_PERFORM_SEQUENCE(aPed,aSequence) ENDIF CLEAR_SEQUENCE_TASK(aSequence) ENDPROC func bool IS_CONV_ROOT_PLAYING(string conv_root_to_check) TEXT_LABEL_23 txt txt = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT() IF ARE_STRINGS_EQUAL(txt,conv_root_to_check) RETURN TRUE ENDIF RETURN FALSE endfunc FUNC float GET_RELATIVE_ANGLE_FROM_ENTITY_TO_COORD(ENTITY_INDEX ent, vector lookAtCoord) if DOES_ENTITY_EXIST(ent) if not IS_ENTITY_DEAD(ent) float fHeading = GET_HEADING_FROM_COORDS(GET_ENTITY_COORDS(ent,FALSE),lookAtCoord) RETURN fHeading-GET_ENTITY_HEADING(ent) endif ELSE SCRIPT_ASSERT("GET_RELATIVE_ANGLE_FROM_ENTITY_TO_COORD(), entity does not exist.") ENDIF RETURN 0.0 ENDFUNC FUNC float GET_RELATIVE_ANGLE_FROM_ENTITY_TO_ENTITY(ENTITY_INDEX ent, ENTITY_INDEX entLookAt) if DOES_ENTITY_EXIST(ent) and DOES_ENTITY_EXIST(entLookAt) RETURN GET_RELATIVE_ANGLE_FROM_ENTITY_TO_COORD(ent,GET_ENTITY_COORDS(entLookAt,FALSE)) ENDIF RETURN 0.0 ENDFUNC FUNC INT DO_TURN_IN_PANIC() int i int iLAst=-1 int iRand int iTime,iTotaltime CPRINTLN(debug_trevor3,"REACT: DO_TURN_IN_PANIC()") TASK_PLAY_ANIM(null,"misschinese2_bank1", "reaction_forward_big_intro_a",SLOW_BLEND_IN,-2,1400) for i = 0 to 3 iRand = GET_RANDOM_INT_IN_RANGE(0,3) iTime = GET_RANDOM_INT_IN_RANGE(1100,1800) itotalTime += iTime IF iRand = iLast iRand += 1 IF iRand > 2 iRand = 0 ENDIF ENDIF iLast=iRand SWITCH iRand CASE 0 iRand = GET_RANDOM_INT_IN_RANGE(0,4) SWITCH iRAnd CASE 0 TASK_PLAY_ANIM(null,"reaction@male_stand@big_intro@left", "reaction_left_big_intro_a",SLOW_BLEND_IN,-2,iTime)//,AF_NOT_INTERRUPTABLE) BREAK CASE 1 TASK_PLAY_ANIM(null,"reaction@male_stand@big_intro@left", "reaction_left_big_intro_b",SLOW_BLEND_IN,-2,iTime)//,AF_NOT_INTERRUPTABLE) BREAK CASE 2 TASK_PLAY_ANIM(null,"reaction@male_stand@big_intro@left", "reaction_left_big_intro_c",SLOW_BLEND_IN,-2,iTime)//,AF_NOT_INTERRUPTABLE) BREAK ENDSWITCH BREAK CASE 1 iRand = GET_RANDOM_INT_IN_RANGE(0,4) SWITCH iRAnd CASE 0 TASK_PLAY_ANIM(null,"reaction@male_stand@big_intro@right", "reaction_right_big_intro_a",SLOW_BLEND_IN,-2,iTime)//,AF_NOT_INTERRUPTABLE) BREAK CASE 1 TASK_PLAY_ANIM(null,"reaction@male_stand@big_intro@right", "reaction_right_big_intro_b",SLOW_BLEND_IN,-2,iTime)//,AF_NOT_INTERRUPTABLE) BREAK CASE 2 TASK_PLAY_ANIM(null,"reaction@male_stand@big_intro@right", "reaction_right_big_intro_c",SLOW_BLEND_IN,-2,iTime)//,AF_NOT_INTERRUPTABLE) BREAK ENDSWITCH BREAK CASE 2 iRand = GET_RANDOM_INT_IN_RANGE(0,4) SWITCH iRAnd CASE 0 TASK_PLAY_ANIM(null,"reaction@male_stand@big_intro@backward", "reaction_backward_big_intro_a",SLOW_BLEND_IN,-2,iTime)//,AF_NOT_INTERRUPTABLE) BREAK CASE 1 TASK_PLAY_ANIM(null,"reaction@male_stand@big_intro@backward", "reaction_backward_big_intro_b",SLOW_BLEND_IN,-2,iTime)//,AF_NOT_INTERRUPTABLE) BREAK CASE 2 TASK_PLAY_ANIM(null,"reaction@male_stand@big_intro@backward", "reaction_backward_big_intro_c",SLOW_BLEND_IN,-2,iTime)//,AF_NOT_INTERRUPTABLE) BREAK ENDSWITCH BREAK ENDSWITCH ENDFOR RETURN iTotaltime ENDFUNC FUNC BOOL DO_TURN_TO_NEARBY_DEAD_PED(int iD, structCheckState& peds[], bool isInSequence = TRUe) int iJ float fRange = 1000 float thisRange int iClosest = -1 IF NOT IS_PED_DEAD_OR_DYING(peds[iD].id) REPEAT COUNT_OF(peds) ij IF IS_PED_DEAD_OR_DYING(peds[iJ].id) AND DOES_ENTITY_EXIST(peds[iJ].id) thisRange = GET_DISTANCE_BETWEEN_ENTITIES(peds[ij].id,peds[iD].id) IF thisRange < fRange fRange = thisRange iClosest = iJ ENDIF ENDIF ENDREPEAT IF iClosest = -1 RETURN FALSE ELSE peds[iD].floatA = GET_RELATIVE_ANGLE_FROM_ENTITY_TO_ENTITY(peds[iD].id,peds[iClosest].id) IF ABSF(peds[iD].floatA) > 20 IF isInSequence TASK_TURN_PED_TO_FACE_ENTITY(null,peds[iClosest].id,0) ELSE TASK_TURN_PED_TO_FACE_ENTITY(peds[iD].id,peds[iClosest].id,0) ENDIF peds[iD].floatA = GET_HEADING_FROM_ENTITIES(peds[iD].id,peds[iClosest].id) RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC FUNC FLOAT MINMAX(float fValue,float minValue,float maxValue) IF fValue < minValue RETURN minValue ENDIF IF fValue > maxValue RETURN maxValue ENDIF RETURN fValue ENDFUNC FUNC BOOL IS_PED_PLAYING_REACTION_ANIM(ped_index pedID) IF IS_ENTITY_PLAYING_ANIM(pedID,"misschinese2_bank1","alert_gunshot") RETURN TRUE ENDIF IF IS_ENTITY_PLAYING_ANIM(pedID,"misschinese2_bank1","buddy_shot_b") RETURN TRUE ENDIF IF IS_ENTITY_PLAYING_ANIM(pedID,"misschinese2_bank1","reaction_forward_big_intro_a") RETURN TRUE ENDIF IF IS_ENTITY_PLAYING_ANIM(pedID,"misschinese2_bank1","alert_body") RETURN TRUE ENDIF IF IS_ENTITY_PLAYING_ANIM(pedID,"misschinese2_bank1","react_forward_small_intro_a") RETURN TRUE ENDIF IF IS_ENTITY_PLAYING_ANIM(pedID,"misschinese2_bank1","react_backward_small_intro_a") RETURN TRUE ENDIF IF IS_ENTITY_PLAYING_ANIM(pedID,"misschinese2_bank1","react_left_small_intro_a") RETURN TRUE ENDIF IF IS_ENTITY_PLAYING_ANIM(pedID,"misschinese2_bank1","react_right_small_intro_a") RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC INT GET_REACTION_ARRAY_ENTRY(ped_index pedID,structCheckState& zped[]) int i REPEAT COUNT_OF(zped) i IF zped[i].id = pedID RETURN i ENDIF ENDREPEAT RETURN -1 ENDFUNC PROC setReactDialogue(diaData &dataToSet,STRING dialogueConvRoot, int iDiaPedEntry, STRING diaPedName) dataToSet.sPedNameForDialogue = diaPedName dataToSet.sDialogueToPlay = dialogueConvRoot dataToSet.iDiaIndex = iDiaPedEntry ENDPROC FUNC BOOL DO_PLAYER_NOISE_REACTION(int pedID, structCheckState& zped[], STRING returnToScenario, diaData dHearPlayer, diaData dHearPlayerAgain, diaData dPlayerNotSeen, bool bAlertEveryoneIfNotSeen) SWITCH zPED[pedID].subFlag case 0 //reaction for hearing player IF NOT ARE_STRINGS_EQUAL("chi2_hear",dHearPlayer.sDialogueToPlay) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF NOT IS_CONV_ROOT_PLAYING(dHearPlayer.sDialogueToPlay) cprintln(debug_trevor3,"ped_reaction script kill dialogue 1") KILL_FACE_TO_FACE_CONVERSATION() ENDIF ENDIF IF rCREATE_CONVERSATION_EXTRA(dHearPlayer.sDialogueToPlay,dHearPlayer.iDiaIndex,zPED[pedID].id,dHearPlayer.sPedNameForDialogue) zPED[pedID].vpos = GET_ENTITY_COORDS(zPED[pedID].id) zPED[pedID].floatA = GET_ENTITY_HEADING(zPED[pedID].id) zPED[pedID].subFlag = 0 zPED[pedID].subFlag++ zPED[pedID].timer = GET_GAME_TIMER() + 1000 ENDIF ELSE zPED[pedID].vpos = GET_ENTITY_COORDS(zPED[pedID].id) zPED[pedID].floatA = GET_ENTITY_HEADING(zPED[pedID].id) zPED[pedID].subFlag++ ENDIF BREAK CASE 1 IF GET_GAME_TIMER() > zPED[pedID].timer TASK_TURN_PED_TO_FACE_COORD(zped[pedID].id,GET_ENTITY_COORDS(player_ped_id()),5000) zPED[pedID].subFlag++ zPED[pedID].timer = GET_GAME_TIMER() + 5000 ENDIF BREAK CASE 2 IF NOT ARE_STRINGS_EQUAL("chi2_hear",dHearPlayer.sDialogueToPlay) IF (CAN_PED_HEAR_PLAYER(player_id(),zPED[pedID].id) OR bPlayerMakingNoiseInVehicle=TRUE) AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(zped[pedID].id,zPED[pedID].vpos) < zPED[pedID].investigateRange IF GET_GAME_TIMER() > zPED[pedID].timer - 3000 TASK_FOLLOW_NAV_MESH_TO_COORD(zped[pedID].id,GET_ENTITY_COORDS(player_ped_id()),pedmove_walk,DEFAULT_TIME_BEFORE_WARP,0.1) zPED[pedID].vposB = GET_ENTITY_COORDS(player_ped_id()) zPED[pedID].subFlag=5 ENDIF ELSE IF GET_GAME_TIMER() > zPED[pedID].timer IF rCREATE_CONVERSATION_EXTRA(dPlayerNotSeen.sDialogueToPlay,dPlayerNotSeen.iDiaIndex,zPED[pedID].id,dPlayerNotSeen.sPedNameForDialogue) IF bAlertEveryoneIfNotSeen // RETURN TRUE ENDIF zPED[pedID].subFlag++ ENDIF ENDIF ENDIF ELSE IF GET_GAME_TIMER() > zPED[pedID].timer TASK_ACHIEVE_HEADING(zped[pedID].id,zPED[pedID].floatA,2000) zPED[pedID].subFlag=4 ENDIF ENDIF BREAK CASE 3 startSeq() TASK_FOLLOW_NAV_MESH_TO_COORD(null,zPED[pedID].vpos,pedmove_walk,DEFAULT_TIME_BEFORE_WARP,0.2,ENAV_DONT_ADJUST_TARGET_POSITION) TASK_ACHIEVE_HEADING(null,zPED[pedID].floatA,2000) endseq(zped[pedID].id) zPED[pedID].timer = GET_GAME_TIMER() + 3000 zPED[pedID].subFlag++ BREAK CASE 4 //IF GET_GAME_TIMER() > zPED[pedID].subFlag IF GET_SCRIPT_TASK_STATUS(zped[pedID].id,SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK OR (ARE_STRINGS_EQUAL("chi2_hear",dHearPlayer.sDialogueToPlay) AND GET_SCRIPT_TASK_STATUS(zped[pedID].id,SCRIPT_TASK_ACHIEVE_HEADING) = FINISHED_TASK) IF NOT ARE_STRINGS_EQUAL(returnToScenario,"") TASK_START_SCENARIO_IN_PLACE(zPED[pedID].id,returnToScenario,0,TRUE) ENDIf zPED[pedID].actionFlag = 0 zPED[pedID].subFlag = 0 zPED[pedID].alertMessage = ALERT_NONE zPED[pedID].lastalertMessage = ALERT_NONE IF ARE_STRINGS_EQUAL("chi2_hear",dHearPlayer.sDialogueToPlay) zPed[pedID].state = STATE_AMBIENT ELSE zPed[pedID].state = STATE_RESTART_AMBIENT ENDIF pedRespondingToAlert = -1 ENDIF BREAK case 5 IF rCREATE_CONVERSATION_EXTRA(dHearPlayer.sDialogueToPlay,dHearPlayerAgain.iDiaIndex,zPED[pedID].id,dHearPlayer.sPedNameForDialogue) zPED[pedID].subFlag++ ENDIF BREAK CASE 6 IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(zPED[pedID].id,zPED[pedID].vposB) < 2.0 OR GET_SCRIPT_TASK_STATUS(zped[pedID].id,SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) = FINISHED_TASK IF NOT IS_PED_INJURED(zPED[pedID].id) CLEAR_PED_TASKS(zPED[pedID].id) startSeq() TASK_LOOK_AT_COORD(null,GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(zped[pedID].id,<<-5,3,0>>),2500) TASK_LOOK_AT_COORD(null,GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(zped[pedID].id,<<5,3,0>>),2500) endseq(zped[pedID].id) zPED[pedID].timer = GET_GAME_TIMER() + 3000 zPED[pedID].subFlag=2 ENDIF ENDIF break endswitch RETURN FALSE ENDFUNC PROC TERMINATE_REACTIONS() UNBLOCK_DECISION_MAKER_EVENT(DECISION_MAKER_DEFAULT, EVENT_INJURED_CRY_FOR_HELP) ENDPROC PROC RESET_REACT_ARRAY(structCheckState& peds[],structPedsForConversation &convo, string thisConvBlock, float DefAreaSize, vector vCenterOfAction, float fReactionRange, enum_state defaultState=STATE_AMBIENT) int i bAPedIsReacting=bAPedIsReacting fDefAreaSize = DefAreaSize vActionCheckCore = vCenterOfAction fActionCheckRange = fReactionRange CONVSTRUCT = convo rConvBlock = thisConvBlock REPEAT COUNT_OF(peds) i peds[i].alertMessage = ALERT_NONE peds[i].lastAlertMessage = ALERT_NONE peds[i].state = defaultState peds[i].actionFlag = 0 peds[i].subFlag = 0 peds[i].nearbyreactingPed = FALSE peds[i].canRespondToHearingPlayer = FALSE peds[i].pedOfInterest = 0 peds[i].timer = 0 peds[i].vpos = <<0,0,0>> peds[i].vPosB = <<0,0,0>> peds[i].floatA = 0 ENDREPEAT bAlertEveryone = FALSE bHearExplosion = FALSE bWarningDialoguePLaying = FALSE bPlayerSeen = FALSE bAPedIsReacting = FALSE bEnableReactionDialogue = TRUE bBlockUnseenReactionDialogue = FALSE iNextAlertCheckPed = 0 highestPriorityDialogue=0 highestPrioritySpeaker = -1 pedRespondingToAlert = -1 alertBulletFlag = 0 alertBuddyFlag = 0 alertSeenFlag = 0 iCheckDefAreasCounter = 0 reactionDialogueFlag = 0 lastDialogue = 0 lastSpeaker = 0 BLOCK_DECISION_MAKER_EVENT(DECISION_MAKER_DEFAULT, EVENT_INJURED_CRY_FOR_HELP) iNextArrayToFill = 0 ENDPROC PROC ADD_PED_TO_REACT_ARRAY(structCheckState& pedCheckState[], ped_index pedID, bool canHearPlayer, bool scriptControlledCombat = FALSE, bool scriptControlledResponse = FALSE) pedCheckState[iNextArrayToFill].id = pedID pedCheckState[iNextArrayToFill].canRespondToHearingPlayer = canHearPlayer pedCheckState[iNextArrayToFill].scriptControlledCombat = scriptControlledCombat pedCheckState[iNextArrayToFill].scriptReactionFirst = scriptControlledResponse iNextArrayToFill++ ENDPROC PROC ADD_PED_TO_REACT_ARRAY_AT_ENTRY(structCheckState& pedCheckState[], int index, ped_index pedID, bool canHearPlayer, bool scriptControlledCombat = FALSE, bool scriptControlledResponse = FALSE) pedCheckState[index].id = pedID pedCheckState[index].canRespondToHearingPlayer = canHearPlayer pedCheckState[index].scriptControlledCombat = scriptControlledCombat pedCheckState[index].scriptReactionFirst = scriptControlledResponse IF index > iNextArrayToFill iNextArrayToFill = index+1 ENDIF //cprintln(debug_trevor3,"index = ",index," pedID = ",native_to_int(pedCheckState[index].id)) ENDPROC PROC REMOVE_PED_FROM_REACT_ARRAY(structCheckState& pedCheckState[], int index) pedCheckState[index].alertMessage = ALERT_NONE pedCheckState[index].lastAlertMessage = ALERT_NONE pedCheckState[index].state = state_NONE pedCheckState[index].actionFlag = 0 pedCheckState[index].subFlag = 0 pedCheckState[index].nearbyreactingPed = FALSE pedCheckState[index].canRespondToHearingPlayer = FALSE pedCheckState[index].pedOfInterest = 0 pedCheckState[index].timer = 0 pedCheckState[index].vpos = <<0,0,0>> pedCheckState[index].vPosB = <<0,0,0>> pedCheckState[index].floatA = 0 pedCheckState[index].id = null ENDPROC bool bPedJustKilled int lastLivingCount PROC DO_ALERT_CHECKS(structCheckState& pedCheckState[],diaData dAlertAllSeen,diaData dAlertAllunSeen, diaData dSeePlayer, diaData dFoundPlayer) int i //check if any peds reacting - if true, find peds close to that one and inform them of a nearby reacting ped IF NOT bAlertEveryone = TRUE bPedJustKilled = FALSE if IS_PED_SHOOTING(PLAYER_PED_ID()) OR IS_CONTROL_PRESSED(PLAYER_CONTROL,INPUT_ATTACK) INT iLivingCount REPEAT COUNT_OF(pedCheckState) i IF NOT IS_PED_DEAD_OR_DYING(pedCheckState[i].id) iLivingCount++ ENDIF ENDREPEAT IF lastLivingCount = 0 lastLivingCount = iLivingCount ENDIF IF iLivingCount < lastLivingCount lastLivingCount = iLivingCount bPedJustKilled = TRUE ENDIF endif int iCheckCount = 4 WHILE iCheckCount > 0 IF NOT IS_PED_DEAD_OR_DYING(pedCheckState[iNextAlertCheckPed].id) IF pedCheckState[iNextAlertCheckPed].state > STATE_AMBIENT AND pedCheckState[iNextAlertCheckPed].alertMessage > ALERT_HEAR_Player REPEAT COUNT_OF(pedCheckState) i IF NOT IS_PED_DEAD_OR_DYING(pedCheckState[i].id) IF i != iNextAlertCheckPed IF pedCheckState[i].state <= STATE_REACT IF GET_DISTANCE_BETWEEN_ENTITIES(pedCheckState[i].id,pedCheckState[iNextAlertCheckPed].id) < 8 IF (GET_INTERIOR_FROM_ENTITY(pedCheckState[iNextAlertCheckPed].id) != NULL AND GET_INTERIOR_FROM_ENTITY(pedCheckState[i].id) != NULL) OR (GET_INTERIOR_FROM_ENTITY(pedCheckState[iNextAlertCheckPed].id) = NULL AND GET_INTERIOR_FROM_ENTITY(pedCheckState[i].id) = NULL) vector v1,v2 v1 = GET_ENTITY_COORDS(pedCheckState[i].id) v2 = GET_ENTITY_COORDS(pedCheckState[iNextAlertCheckPed].id,false) if absf(v1.z - v2.z) < 2 pedCheckState[i].nearbyreactingPed = TRUE pedCheckState[i].pedOfInterest = iNextAlertCheckPed endif ENDIF ENDIF ENDIF ENDIF ENDIF ENDREPEAT ELSE float closeA,closeB, thisClose, fRelAngle closeA = 10 closeB = 11 pedCheckState[iNextAlertCheckPed].nearbyPedA = -1 pedCheckState[iNextAlertCheckPed].nearbyPedB = -1 REPEAT COUNT_OF(pedCheckState) i IF i != iNextAlertCheckPed IF DOES_ENTITY_EXIST(pedCheckState[i].id) thisClose = GET_DISTANCE_BETWEEN_ENTITIES(pedCheckState[i].id,pedCheckState[iNextAlertCheckPed].id) IF thisClose < 10 fRelAngle = GET_RELATIVE_ANGLE_FROM_ENTITY_TO_ENTITY(pedCheckState[iNextAlertCheckPed].id,pedCheckState[i].id) IF fRelAngle > -90 and fRelAngle < 90 IF thisClose < closeA pedCheckState[iNextAlertCheckPed].nearbyPedB = pedCheckState[iNextAlertCheckPed].nearbyPedA pedCheckState[iNextAlertCheckPed].nearbyPedA = i closeB = closeA closeA = thisClose ELIF thisClose < closeB closeB = thisClose pedCheckState[iNextAlertCheckPed].nearbyPedB = i ENDIF ENDIF ENDIF ENDIF ENDIF ENDREPEAT //IF iNextAlertCheckPed = 4 or iNextAlertCheckPed = 5 // //cprintln(DEBUG_TREVOR3,"nearby a: ",pedCheckState[iNextAlertCheckPed].nearbyPedA,"nearby b: ",pedCheckState[iNextAlertCheckPed].nearbyPedB) //ENDIF ENDIF ENDIF iNextAlertCheckPed++ If iNextAlertCheckPed >= count_of(pedCheckState) iNextAlertCheckPed = 0 ENDIF iCheckCount-- ENDWHILE ENDIF vehicle_index vehTemp bool bPlayerInChopper IF IS_PED_IN_ANY_HELI(player_ped_id()) vehTemp = GET_VEHICLE_PED_IS_IN(player_ped_id()) IF IS_VEHICLE_DRIVEABLE(vehtemp) IF GET_IS_VEHICLE_ENGINE_RUNNING(vehTemp) bPlayerInChopper = TRUE ENDIF ENDIF ENDIF IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE,vActionCheckCore,fActionCheckRange) bHearExplosion = TRUE ENDIF IF NOT bWarningDialoguePLaying IF IS_CONV_ROOT_PLAYING(dAlertAllSeen.sDialogueToPlay) OR IS_CONV_ROOT_PLAYING(dAlertAllunSeen.sDialogueToPlay) iWarningDialogueTriggerTime = GET_GAME_TIMER() + 1000 bWarningDialoguePLaying=TRUE ENDIF IF IS_CONV_ROOT_PLAYING(dSeePlayer.sDialogueToPlay) OR IS_CONV_ROOT_PLAYING(dFoundPlayer.sDialogueToPlay) iWarningDialogueTriggerTime = GET_GAME_TIMER() + 1000 bWarningDialoguePLaying=TRUE ENDIF ELSE IF NOT IS_CONV_ROOT_PLAYING(dAlertAllSeen.sDialogueToPlay) AND NOT IS_CONV_ROOT_PLAYING(dAlertAllunSeen.sDialogueToPlay) AND NOT IS_CONV_ROOT_PLAYING(dSeePlayer.sDialogueToPlay) AND NOT IS_CONV_ROOT_PLAYING(dFoundPlayer.sDialogueToPlay) bWarningDialoguePLaying=FALSE ELSE IF GET_GAME_TIMER() > iWarningDialogueTriggerTime IF IS_CONV_ROOT_PLAYING(dAlertAllSeen.sDialogueToPlay) OR IS_CONV_ROOT_PLAYING(dAlertAllunSeen.sDialogueToPlay) bAlertEveryone = TRUE ENDIF IF IS_CONV_ROOT_PLAYING(dSeePlayer.sDialogueToPlay) OR IS_CONV_ROOT_PLAYING(dFoundPlayer.sDialogueToPlay) bPlayerSeen = TRUE //bAlertEveryone = TRUE ENDIF ENDIF ENDIF ENDIF highestPriorityDialogue = 0 int iClosestPedHearingPlayer = -1 float fclosestHearingRange = 13 //iClosePedCount=0 bAPedIsReacting = FALSE vehicle_index playerVeh IF IS_PED_IN_ANY_VEHICLE(player_ped_id()) playerVeh = GET_VEHICLE_PED_IS_USING(player_ped_id()) ENDIf IF pedRespondingToAlert = -1 bPlayerMakingNoiseInVehicle=FALSE ENDIF REPEAT COUNT_OF(pedCheckState) i IF NOT IS_PED_DEAD_OR_DYING(pedCheckState[i].id) IF pedCheckState[i].state != STATE_FLEE //combat range check count deals with player crowding /* IF pedCheckState[i].state >= STATE_SEEK IF GET_DISTANCE_BETWEEN_ENTITIES(player_ped_id(),pedCheckState[i].id) < 40 iClosePedCount++ ENDIF ENDIF */ pedCheckState[i].lastAlertMessage = pedCheckState[i].AlertMessage pedCheckState[i].AlertMessage = ALERT_NONE IF pedCheckState[i].state <= STATE_REACT //hear player IF pedRespondingToAlert = -1 IF IS_VEHICLE_DRIVEABLE(playerVeh) IF GET_IS_VEHICLE_ENGINE_RUNNING(playerVeh) bPlayerMakingNoiseInVehicle=TRUE fclosestHearingRange = 20 ENDIF IF IS_VEHICLE_SIREN_ON(playerVeh) bPlayerMakingNoiseInVehicle=TRUE fclosestHearingRange = 50 ENDIF ENDIF IF CAN_PED_HEAR_PLAYER(player_id(),pedCheckState[i].id) OR (IS_VEHICLE_DRIVEABLE(playerVeh) AND GET_IS_VEHICLE_ENGINE_RUNNING(playerVeh)) IF GET_DISTANCE_BETWEEN_ENTITIES(player_ped_id(),pedCheckState[i].id) < fclosestHearingRange IF pedCheckState[i].canRespondToHearingPlayer IF GET_INTERIOR_FROM_ENTITY(player_ped_id()) = GET_INTERIOR_FROM_ENTITY(pedCheckState[i].id) fclosestHearingRange = GET_DISTANCE_BETWEEN_ENTITIES(player_ped_id(),pedCheckState[i].id) iClosestPedHearingPlayer = i pedCheckState[i].alertMessage = ALERT_HEAR_PLAYER pedCheckState[i].investigateRange = fclosestHearingRange + 5 ENDIF ENDIF ENDIF ENDIF ENDIF //see/hear nearby ped seeking or reacting IF pedCheckState[i].nearbyreactingPed pedCheckState[i].nearbyreactingPed=FALSE pedCheckState[i].alertMessage = ALERT_NEARBY_PED_REACTION ENDIF IF bHearExplosion pedCheckState[i].alertMessage = ALERT_EXPLOSION ENDIF //Heard Warning IF bAlertEveryone pedCheckState[i].alertMessage = ALERT_SOMEONE_ALERTING_EVERYONE ENDIF //hear bullet IF bPedJustKilled //cprintln(debug_trevor3,"PEd just killed: ",get_Game_timer()) ENDIf IF NOT bPedJustKilled //to stop a ped reacting to another ped being shot nearby. AND NOT IS_PED_RAGDOLL(pedCheckState[i].id) IF IS_PED_RESPONDING_TO_EVENT(pedCheckState[i].id,EVENT_SHOT_FIRED_BULLET_IMPACT) pedCheckState[i].alertMessage = ALERT_BULLET_IMPACT //cprintln(debug_Trevor3,"ALERT_BULLET_IMPACT 1") ENDIF IF HAS_PED_RECEIVED_EVENT(pedCheckState[i].id,EVENT_SHOT_FIRED_BULLET_IMPACT) pedCheckState[i].alertMessage = ALERT_BULLET_IMPACT IF IS_PED_RESPONDING_TO_EVENT(pedCheckState[i].id,EVENT_DAMAGE) //cprintln(debug_Trevor3,"Im damaged") ENDIF //cprintln(debug_Trevor3,"ALERT_BULLET_IMPACT 2") ENDIF IF pedCheckState[i].shortDetectionRange IF HAS_BULLET_IMPACTED_IN_AREA(GET_ENTITY_COORDS(pedCheckState[i].id),4.0,TRUE) pedCheckState[i].alertMessage = ALERT_BULLET_IMPACT cprintln(debug_Trevor3,"ALERT_BULLET_IMPACT 3a: ",get_Game_timer()) ENDIF ELSE IF HAS_BULLET_IMPACTED_IN_AREA(GET_ENTITY_COORDS(pedCheckState[i].id),6.0,TRUE) pedCheckState[i].alertMessage = ALERT_BULLET_IMPACT cprintln(debug_Trevor3,"ALERT_BULLET_IMPACT 3b") ENDIF ENDIF IF IS_PED_RESPONDING_TO_EVENT(pedCheckState[i].id,EVENT_SHOT_FIRED_WHIZZED_BY) pedCheckState[i].alertMessage = ALERT_BULLET_IMPACT cprintln(debug_Trevor3,"ALERT_BULLET_IMPACT 4") ENDIF IF IS_BULLET_IN_AREA(GET_ENTITY_COORDS(pedCheckState[i].id),1.0) pedCheckState[i].alertMessage = ALERT_BULLET_IMPACT cprintln(debug_Trevor3,"ALERT_BULLET_IMPACT 5") ENDIF ENDIF //see dead ped //if IS_PED_RESPONDING_TO_EVENT(pedCheckState[i].id,EVENT_ACQUAINTANCE_PED_DEAD) //OR HAS_PED_RECEIVED_EVENT(pedCheckState[i].id,EVENT_ACQUAINTANCE_PED_DEAD) IF pedCheckState[i].state < STATE_REACT IF pedCheckState[i].nearbyPedA != -1 IF DOES_ENTITY_EXIST(pedCheckState[pedCheckState[i].nearbyPedA].id) IF IS_PED_DEAD_OR_DYING(pedCheckState[pedCheckState[i].nearbyPedA].id) IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY_IN_FRONT(pedCheckState[i].id,pedCheckState[pedCheckState[i].nearbyPedA].id) pedCheckState[i].alertMessage = ALERT_DEAD_BODY_SEEN ENDIF ENDIF ENDIF ENDIF IF pedCheckState[i].nearbyPedB != -1 IF DOES_ENTITY_EXIST(pedCheckState[pedCheckState[i].nearbyPedB].id) IF IS_PED_DEAD_OR_DYING(pedCheckState[pedCheckState[i].nearbyPedB].id) IF HAS_ENTITY_CLEAR_LOS_TO_ENTITY_IN_FRONT(pedCheckState[i].id,pedCheckState[pedCheckState[i].nearbyPedB].id) pedCheckState[i].alertMessage = ALERT_DEAD_BODY_SEEN ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF pedCheckState[i].state <= STATE_SEEK //in combat / seeking If pedCheckState[i].alertMessage = ALERT_NONE IF pedCheckState[i].state > STATE_REACT OR IS_PED_IN_COMBAT(pedCheckState[i].id) pedCheckState[i].alertMessage = ALERT_SEEKING ENDIF ENDIF //see player far /* if IS_PED_RESPONDING_TO_EVENT(pedCheckState[i].id,EVENT_ACQUAINTANCE_PED_HATE) cprintln(debug_trevor3,"ALERT A ",i) ENDIF IF IS_PED_IN_COMBAT(pedCheckState[i].id) IF CAN_PED_IN_COMBAT_SEE_TARGET(pedCheckState[i].id,PLAYER_PED_ID()) cprintln(debug_trevor3,"ALERT B ",i) ENDIF ENDIF IF (IS_PED_PLAYING_REACTION_ANIM(pedCheckState[i].id) AND HAS_PED_RECEIVED_EVENT(pedCheckState[i].id,EVENT_ACQUAINTANCE_PED_HATE)) cprintln(debug_trevor3,"ALERT C ",i) ENDIF */ if IS_PED_RESPONDING_TO_EVENT(pedCheckState[i].id,EVENT_ACQUAINTANCE_PED_HATE) or HAS_PED_RECEIVED_EVENT(pedCheckState[i].id,EVENT_ACQUAINTANCE_PED_HATE) OR (IS_PED_IN_COMBAT(pedCheckState[i].id) AND CAN_PED_IN_COMBAT_SEE_TARGET(pedCheckState[i].id,PLAYER_PED_ID())) OR (IS_PED_PLAYING_REACTION_ANIM(pedCheckState[i].id) AND HAS_PED_RECEIVED_EVENT(pedCheckState[i].id,EVENT_ACQUAINTANCE_PED_HATE)) IF pedCheckState[i].state > STATE_REACT //cprintln(debug_trevor3,"Found you!!!") pedCheckState[i].alertMessage = ALERT_PLAYER_FOUND ELSE //cprintln(debug_trevor3,"See you!!!") pedCheckState[i].alertMessage = ALERT_PLAYER_SEEN ENDIF ENDIF ENDIF IF bPlayerInChopper AND GET_DISTANCE_BETWEEN_ENTITIES(player_ped_id(),pedCheckState[i].id) < 50 //cprintln(debug_trevor3,"See you chopper!!!") pedCheckState[i].alertMessage = ALERT_PLAYER_SEEN ENDIF IF pedCheckState[i].state <= STATE_COMBAT IF bPlayerSeen pedCheckState[i].alertMessage = ALERT_COMBAT ENDIF ENDIF //ensures only the closest ped hearing the player will react IF pedCheckState[i].alertMessage <= pedCheckState[i].lastAlertMessage pedCheckState[i].alertMessage = pedCheckState[i].lastAlertMessage ELSE pedCheckState[i].state = STATE_REACT pedCheckState[i].actionFlag = 0 pedCheckState[i].subFlag = 0 ENDIF IF enum_to_int(pedCheckState[i].alertMessage) > highestPriorityDialogue highestPriorityDialogue = enum_to_int(pedCheckState[i].alertMessage) highestPrioritySpeaker = i //highestPriorityTriggerTime = GET_GAME_TIMER() ENDIF /* IF pedCheckState[i].alertMessage != ALERT_NONE IF pedCheckState[i].state != STATE_REACT pedCheckState[i].state = STATE_REACT pedCheckState[i].actionFlag = 0 pedCheckState[i].subFlag = -1 ENDIF ENDIF*/ ELSE pedCheckState[i].state = state_NONE pedCheckState[i].alertMessage = ALERT_NONE ENDIF IF pedCheckState[i].state > STATE_AMBIENT bAPedIsReacting = TRUE ENDIF ENDIF ENDREPEAT //check if any ped has an alert state and set a bool accordingly... IF pedRespondingToAlert = -1 IF iClosestPedHearingPlayer != -1 IF ALERT_HEAR_PLAYER > pedCheckState[iClosestPedHearingPlayer].alertMessage pedCheckState[iClosestPedHearingPlayer].alertMessage = ALERT_HEAR_PLAYER pedRespondingToAlert = iClosestPedHearingPlayer ENDIF ENDIF ELSE IF IS_PED_DEAD_OR_DYING(pedCheckState[pedRespondingToAlert].id) pedRespondingToAlert = -1 ENDIF ENDIF ENDPROC PROC DO_REACTIONS(structCheckState& pedCheckState[],vector& vDefAreas[], diaData dHearPlayer,diaData dHearPlayerAgain, diaData dLostPlayer) // diaData dSeePlayer, diaData dHearBullet int i float fFloatA REPEAT COUNT_OF(pedCheckState) i IF NOT IS_PED_DEAD_OR_DYING(pedCheckState[i].id) AND NOT IS_PED_BEING_STEALTH_KILLED(pedCheckState[i].id) IF NOT pedCheckState[i].scriptReactionFirst SWITCH pedCheckState[i].state CASE STATE_REACT IF IS_PED_USING_SCENARIO(pedCheckState[i].id,"PROP_HUMAN_SEAT_CHAIR") OR IS_PED_USING_SCENARIO(pedCheckState[i].id,"PROP_HUMAN_SEAT_ARMCHAIR") OR GET_SCRIPT_TASK_STATUS(pedCheckState[i].id,SCRIPT_TASK_SYNCHRONIZED_SCENE) = PERFORMING_TASK //SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedCheckState[i].id,true) cprintln(debug_trevor3,"HIT sync scene") IF NOT IS_PED_INJURED(pedCheckState[i].id) CLEAR_PED_TASKS(pedCheckState[i].id) ENDIF IF NOT IS_PED_DEAD_OR_DYING(pedCheckState[i].id) SET_PED_SHOULD_PLAY_IMMEDIATE_SCENARIO_EXIT(pedCheckState[i].id) ENDIF ELIF GET_SCRIPT_TASK_STATUS(pedCheckState[i].id,SCRIPT_TASK_USE_NEAREST_SCENARIO_TO_POS) = finished_task SWITCH pedCheckState[i].actionFlag CASE 0 //cprintln(debug_trevor3,"HIT A") IF NOT IS_PED_DEAD_OR_DYING(pedCheckState[i].id) //CPRINTLN(debug_trevor3,"Play immediate scenario exit") SET_PED_SHOULD_PLAY_IMMEDIATE_SCENARIO_EXIT(pedCheckState[i].id) ENDIF IF NOT IS_PED_USING_SCENARIO(pedCheckState[i].id,"PROP_HUMAN_SEAT_CHAIR") AND NOT IS_PED_USING_SCENARIO(pedCheckState[i].id,"PROP_HUMAN_SEAT_ARMCHAIR") //cprintln(debug_trevor3,"HIT B") IF IS_PED_IN_ANY_VEHICLE(pedCheckState[i].id) cprintln(debug_trevor3,"HIT C") vehicle_index vehTemp vehTemp = GET_VEHICLE_PED_IS_USING(pedCheckState[i].id) IF IS_VEHICLE_DRIVEABLE(vehtemp) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehTemp) cprintln(debug_trevor3,"HIT D") vector vSpeed vSpeed = GET_ENTITY_VELOCITY(vehTemp) STOP_PLAYBACK_RECORDED_VEHICLE(vehtemp) SET_ENTITY_VELOCITY(vehtemp,vSpeed) TASK_LEAVE_ANY_VEHICLE(pedCheckState[i].id) ENDIF ENDIF ENDIF IF NOT IS_PED_IN_ANY_VEHICLE(pedCheckState[i].id) SWITCH pedCheckState[i].alertMessage CASE ALERT_NEARBY_PED_REACTION SWITCH pedCheckState[i].subFlag CASE 0 IF pedCheckState[i].pedOfInterest >= 0 IF DOES_ENTITY_EXIST(pedCheckState[pedCheckState[i].pedOfInterest].id) fFloatA = GET_RELATIVE_ANGLE_FROM_ENTITY_TO_ENTITY(pedCheckState[i].ID,pedCheckState[pedCheckState[i].pedOfInterest].id) IF fFloatA > -45 and fFloatA < 45 pedCheckState[i].subFlag = 1 ELIF fFloatA > -135 AND fFloatA <= -45 pedCheckState[i].subFlag = 2 ELIF fFloatA >= 45 AND fFloatA <= 135 pedCheckState[i].subFlag = 3 ELSE pedCheckState[i].subFlag = 4 ENDIF pedCheckState[i].timer = get_game_timer() + 500 ELSE pedCheckState[i].alertMessage = ALERT_NONE ENDIF ENDIF BREAK CASE 1 IF get_game_timer() > pedCheckState[i].timer startSeq() TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(null,true) TASK_PLAY_ANIM(null,"misschinese2_bank1", "react_forward_small_intro_a",SLOW_BLEND_IN,SLOW_BLEND_OUT,-1)//,AF_NOT_INTERRUPTABLE) TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(null,false) endseq(pedCheckState[i].id) pedCheckState[i].actionFlag++ ENDIF BREAK CASE 2 IF get_game_timer() > pedCheckState[i].timer startSeq() TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(null,true) TASK_PLAY_ANIM(null,"misschinese2_bank1", "react_left_small_intro_a",SLOW_BLEND_IN,SLOW_BLEND_OUT,-1)//,AF_NOT_INTERRUPTABLE) TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(null,false) endseq(pedCheckState[i].id) pedCheckState[i].actionFlag++ ENDIF BREAK CASE 3 IF get_game_timer() > pedCheckState[i].timer startSeq() TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(null,true) TASK_PLAY_ANIM(null,"misschinese2_bank1", "react_right_small_intro_a",SLOW_BLEND_IN,SLOW_BLEND_OUT,-1)//,AF_NOT_INTERRUPTABLE) TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(null,false) endseq(pedCheckState[i].id) pedCheckState[i].actionFlag++ ENDIF BREAK CASE 4 IF get_game_timer() > pedCheckState[i].timer startSeq() TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(null,true) TASK_PLAY_ANIM(null,"misschinese2_bank1", "react_backward_small_intro_a",SLOW_BLEND_IN,SLOW_BLEND_OUT,-1)//,AF_NOT_INTERRUPTABLE) TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(null,false) endseq(pedCheckState[i].id) pedCheckState[i].actionFlag++ ENDIF BREAK ENDSWITCH BREAK CASE ALERT_BULLET_IMPACT //CPRINTLN(debug_trevor3,"REACT: ALERT BULLET IMPACT: subflag = ",pedCheckState[i].subFlag) IF pedCheckState[i].subFlag < 2 // CPRINTLN(debug_trevor3,"Clear tasks") CLEAR_PED_TASKS(pedCheckState[i].id) pedCheckState[i].subFlag = alertBulletFlag alertBulletFlag++ //makes sure subsequent peds eon't play the same reaction anim IF alertBulletFlag = 2 alertBulletFlag = 0 ENDIF ENDIF SWITCH pedCheckState[i].subFlag CASE 0 SET_CURRENT_PED_WEAPON(pedCheckState[i].id,GET_BEST_PED_WEAPON(pedCheckState[i].id),TRUE) startSeq() IF NOT IS_PED_IN_ANY_VEHICLE(pedCheckState[i].id,true) TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(null,true) TASK_PLAY_ANIM(null,"misschinese2_bank1", "buddy_shot_b",SLOW_BLEND_IN,SLOW_BLEND_OUT,-1)//,AF_NOT_INTERRUPTABLE) TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(null,false) ELSE pedCheckState[i].actionFlag++ ENDIF TASK_COMBAT_HATED_TARGETS_AROUND_PED(null,200) endseq(pedCheckState[i].id) pedCheckState[i].subFlag = GET_GAME_TIMER() + 3000 //pedCheckState[i].actionFlag++ cprintln(debug_Trevor3,"BULLET IMPACT ANIM") BREAK CASE 1 int itimer startSeq() TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(null,true) itimer = DO_TURN_IN_PANIC() TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(null,false) TASK_COMBAT_HATED_TARGETS_AROUND_PED(null,200) endseq(pedCheckState[i].id) pedCheckState[i].subFlag = GET_GAME_TIMER() + itimer //pedCheckState[i].actionFlag++ BREAK DEFAULT cprintln(debug_Trevor3,"Is playing buller anim?") IF IS_ENTITY_PLAYING_ANIM(pedCheckState[i].id,"misschinese2_bank1", "buddy_shot_b") cprintln(debug_Trevor3,"Yes") IF GET_ENTITY_ANIM_CURRENT_TIME(pedCheckState[i].id,"misschinese2_bank1", "buddy_shot_b") < 0.2 cprintln(debug_Trevor3,"Update time") SET_ENTITY_ANIM_CURRENT_TIME(pedCheckState[i].id,"misschinese2_bank1", "buddy_shot_b",0.2) ENDIF ENDIF IF GET_GAME_TIMER() > pedCheckState[i].subFlag pedCheckState[i].actionFlag++ ENDIF BREAK ENDSWITCH BREAK CASE ALERT_DEAD_BODY_SEEN IF pedCheckState[i].subFlag <= 2 pedCheckState[i].subFlag = alertBuddyFlag alertBuddyFlag++ IF alertBuddyFlag = 2 alertBuddyFlag = 0 ENDIF ENDIF IF NOT IS_PED_IN_ANY_VEHICLE(pedCheckState[i].id,true) SWITCH pedCheckState[i].subFlag CASE 0 SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedCheckState[i].id,TRUE) TASK_PLAY_ANIM(pedCheckState[i].id,"misschinese2_bank1", "alert_gunshot",SLOW_BLEND_IN,SLOW_BLEND_OUT,-1,AF_NOT_INTERRUPTABLE) pedCheckState[i].subFlag=3 BREAK CASE 1 SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedCheckState[i].id,TRUE) TASK_PLAY_ANIM(pedCheckState[i].id,"misschinese2_bank1", "buddy_shot_b",SLOW_BLEND_IN,SLOW_BLEND_OUT,-1,AF_NOT_INTERRUPTABLE) SET_CURRENT_PED_WEAPON(pedCheckState[i].id,GET_BEST_PED_WEAPON(pedCheckState[i].id),TRUE) pedCheckState[i].subFlag=3 BREAK CASE 3 //reacted IF IS_ENTITY_PLAYING_ANIM(pedCheckState[i].id,"misschinese2_bank1", "alert_gunshot") IF GET_ENTITY_ANIM_CURRENT_TIME(pedCheckState[i].id,"misschinese2_bank1", "alert_gunshot") > 0.95 IF DO_TURN_TO_NEARBY_DEAD_PED(i,pedCheckState,FALSE) pedCheckState[i].subFlag=4 ELSE TASK_PLAY_ANIM(pedCheckState[i].id,"reaction@male_stand@big_variations@b", "react_big_variations_d",SLOW_BLEND_IN,-2,GET_RANDOM_INT_IN_RANGE(4000,6000),AF_NOT_INTERRUPTABLE) pedCheckState[i].subFlag=6 ENDIF ENDIF ENDIF IF IS_ENTITY_PLAYING_ANIM(pedCheckState[i].id,"misschinese2_bank1", "buddy_shot_b") IF GET_ENTITY_ANIM_CURRENT_TIME(pedCheckState[i].id,"misschinese2_bank1", "buddy_shot_b") > 0.95 IF DO_TURN_TO_NEARBY_DEAD_PED(i,pedCheckState,FALSE) pedCheckState[i].subFlag=5 ELSE TASK_PLAY_ANIM(pedCheckState[i].id,"reaction@male_stand@big_variations@b", "react_big_variations_e",SLOW_BLEND_IN,-2,GET_RANDOM_INT_IN_RANGE(4000,6000),AF_NOT_INTERRUPTABLE) pedCheckState[i].subFlag=6 ENDIF ENDIF ENDIF BREAK case 4 IF ABSF(GET_ENTITY_HEADING(pedCheckState[i].id) - pedCheckState[i].floatA) < 10 TASK_PLAY_ANIM(pedCheckState[i].id,"reaction@male_stand@big_variations@b", "react_big_variations_d",SLOW_BLEND_IN,-2,GET_RANDOM_INT_IN_RANGE(6000,9000),AF_NOT_INTERRUPTABLE) pedCheckState[i].subFlag=6 ENDIF break case 5 IF ABSF(GET_ENTITY_HEADING(pedCheckState[i].id) - pedCheckState[i].floatA) < 10 TASK_PLAY_ANIM(pedCheckState[i].id,"reaction@male_stand@big_variations@b", "react_big_variations_f",SLOW_BLEND_IN,-2,GET_RANDOM_INT_IN_RANGE(6000,9000),AF_NOT_INTERRUPTABLE) pedCheckState[i].subFlag=6 ENDIF break case 6 IF GET_SCRIPT_TASK_STATUS(pedCheckState[i].id,SCRIPT_TASK_PLAY_ANIM) = FINISHED_TASK pedCheckState[i].subFlag = 0 pedCheckState[i].actionFlag++ ENDIF break ENDSWITCH ELSE pedCheckState[i].subFlag = 0 pedCheckState[i].actionFlag++ ENDIF BREAK CASE ALERT_SOMEONE_ALERTING_EVERYONE SWITCH pedCheckState[i].subFlag CASE 0 pedCheckState[i].subFlag = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(0,2000) BREAK DEFAULT IF GET_GAME_TIMER() > pedCheckState[i].subFlag pedCheckState[i].state = STATE_SEEK pedCheckState[i].alertMessage = ALERT_NONE pedCheckState[i].actionFlag=0 ENDIF BREAK ENDSWITCH BREAK CASE ALERT_SEEKING IF pedCheckState[i].state != STATE_COMBAT AND pedCheckState[i].state != STATE_SEEK pedCheckState[i].state = STATE_SEEK pedCheckState[i].actionFlag=0 ENDIF //pedCheckState[i].alertMessage = ALERT_NONE //don't uncomment as the ped will lost their seek status BREAK CASE ALERT_COMBAT IF pedCheckState[i].state != STATE_COMBAT pedCheckState[i].state = STATE_COMBAT //pedCheckState[i].alertMessage = ALERT_NONE //don't uncomment as the ped will lost their seek status pedCheckState[i].actionFlag=0 ENDIF BREAK CASE ALERT_EXPLOSION SWITCH pedCheckState[i].subFlag CASE 0 pedCheckState[i].subFlag = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(0,2000) BREAK DEFAULT IF GET_GAME_TIMER() > pedCheckState[i].subFlag IF pedCheckState[i].state != STATE_COMBAT AND pedCheckState[i].state != STATE_SEEK pedCheckState[i].state = STATE_SEEK pedCheckState[i].alertMessage = ALERT_NONE pedCheckState[i].actionFlag=0 ENDIF ENDIF BREAK ENDSWITCH BREAK CASE ALERT_HEAR_PLAYER pedRespondingToAlert = i IF DO_PLAYER_NOISE_REACTION(i,pedCheckState,"",dHearPlayer,dHearPlayerAgain,dLostPlayer,FALSE) //if true, it means the ped will alert buddies if the player is seen pedCheckState[i].state = STATE_SEEK pedCheckState[i].alertMessage = ALERT_NONE pedCheckState[i].actionFlag=0 ENDIF BREAK CASE ALERT_PLAYER_SEEN SWITCH pedCheckState[i].subFlag CASE 0 IF alertSeenFlag = 0 IF NOT IS_PED_IN_ANY_VEHICLE(pedCheckState[i].id,true) vector vh1,vh2 vh1 = GET_ENTITY_COORDS(pedCheckState[i].id) vh2 = GET_ENTITY_COORDS(player_ped_id()) float fVAng fVAng = atan((vh2.z-vh1.z)/GET_DISTANCE_BETWEEN_ENTITIES(pedCheckState[i].id,player_ped_id(),false)) IF fVAng > 20 pedCheckState[i].subFlag = 1 ELIF fVAng < -20 pedCheckState[i].subFlag = 2 ELSE pedCheckState[i].subFlag = 3 ENDIF ELSE pedCheckState[i].state = STATE_COMBAT pedCheckState[i].alertMessage = ALERT_COMBAT pedCheckState[i].actionFlag=0 ENDIF alertSeenFlag++ ELSE pedCheckState[i].state = STATE_COMBAT pedCheckState[i].alertMessage = ALERT_COMBAT pedCheckState[i].actionFlag=0 ENDIF BREAK CASE 1 startSeq() TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(null,TRUE) TASK_TURN_PED_TO_FACE_ENTITY(null,player_ped_id(),1000) TASK_PLAY_ANIM(null,"misschinese2_bank1", "spot_high",SLOW_BLEND_IN,NORMAL_BLEND_OUT,-1)//,AF_NOT_INTERRUPTABLE) TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(null,FALSE) endseq(pedCheckState[i].id) pedCheckState[i].subFlag = 4 BREAK CASE 2 startSeq() TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(null,TRUE) TASK_TURN_PED_TO_FACE_ENTITY(null,player_ped_id(),1000) TASK_PLAY_ANIM(null,"misschinese2_bank1", "spot_low",SLOW_BLEND_IN,NORMAL_BLEND_OUT,-1)//,AF_NOT_INTERRUPTABLE) TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(null,FALSE) endseq(pedCheckState[i].id) pedCheckState[i].subFlag = 4 BREAK CASE 3 startSeq() TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(null,TRUE) TASK_TURN_PED_TO_FACE_ENTITY(null,player_ped_id(),1000) TASK_PLAY_ANIM(null,"misschinese2_bank1", "spot_mid",SLOW_BLEND_IN,NORMAL_BLEND_OUT,-1)//)//,AF_NOT_INTERRUPTABLE) TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(null,FALSE) endseq(pedCheckState[i].id) pedCheckState[i].subFlag = 4 BREAK CASE 4 IF bPlayerSeen //ensure the seen dialogue plays out IF absf(GET_RELATIVE_ANGLE_FROM_ENTITY_TO_ENTITY(pedCheckState[i].id,player_ped_id())) < 20 IF IS_ENTITY_PLAYING_ANIM(pedCheckState[i].id,"misschinese2_bank1","spot_high") IF GET_ENTITY_ANIM_CURRENT_TIME(pedCheckState[i].id,"misschinese2_bank1","spot_high") > MINMAX(((GET_DISTANCE_BETWEEN_ENTITIES(pedCheckState[i].id,player_ped_id())+5)/35.0),0.27,0.9) pedCheckState[i].state = STATE_COMBAT pedCheckState[i].alertMessage = ALERT_COMBAT pedCheckState[i].actionFlag=0 ENDIF ENDIF IF IS_ENTITY_PLAYING_ANIM(pedCheckState[i].id,"misschinese2_bank1","spot_mid") IF GET_ENTITY_ANIM_CURRENT_TIME(pedCheckState[i].id,"misschinese2_bank1","spot_mid") > MINMAX(((GET_DISTANCE_BETWEEN_ENTITIES(pedCheckState[i].id,player_ped_id())+5)/35.0),0.27,0.9) pedCheckState[i].state = STATE_COMBAT pedCheckState[i].alertMessage = ALERT_COMBAT pedCheckState[i].actionFlag=0 ENDIF ENDIF IF IS_ENTITY_PLAYING_ANIM(pedCheckState[i].id,"misschinese2_bank1","spot_low") IF GET_ENTITY_ANIM_CURRENT_TIME(pedCheckState[i].id,"misschinese2_bank1","spot_low") > MINMAX(((GET_DISTANCE_BETWEEN_ENTITIES(pedCheckState[i].id,player_ped_id())+5)/35.0),0.27,0.9) pedCheckState[i].state = STATE_COMBAT pedCheckState[i].alertMessage = ALERT_COMBAT pedCheckState[i].actionFlag=0 ENDIF ENDIF ELSE pedCheckState[i].state = STATE_COMBAT pedCheckState[i].alertMessage = ALERT_COMBAT pedCheckState[i].actionFlag=0 ENDIF ENDIF BREAK ENDSWITCH BREAK ENDSWITCH ELSE pedCheckState[i].actionFlag++ ENDIF ENDIF BREAK CASE 1 IF NOT pedCheckState[i].scriptReactionFirst //IF GET_SCRIPT_TASK_STATUS(pedCheckState[i].id,SCRIPT_TASK_PLAY_ANIM) = PERFORMING_TASK bool animPlaying IF IS_ENTITY_PLAYING_ANIM(pedCheckState[i].id,"misschinese2_bank1","alert_gunshot") animPlaying=true IF GET_ENTITY_ANIM_CURRENT_TIME(pedCheckState[i].id,"misschinese2_bank1","alert_gunshot") > 0.9 animPlaying=false ENDIF ENDIF IF IS_ENTITY_PLAYING_ANIM(pedCheckState[i].id,"misschinese2_bank1","buddy_shot_b") animPlaying = true IF GET_ENTITY_ANIM_CURRENT_TIME(pedCheckState[i].id,"misschinese2_bank1","buddy_shot_b") > 0.9 animPlaying = false ENDIF ENDIF IF IS_ENTITY_PLAYING_ANIM(pedCheckState[i].id,"misschinese2_bank1","reaction_forward_big_intro_a") animPlaying = true IF GET_ENTITY_ANIM_CURRENT_TIME(pedCheckState[i].id,"misschinese2_bank1","reaction_forward_big_intro_a") > 0.9 animPlaying = false ENDIF ENDIF IF IS_ENTITY_PLAYING_ANIM(pedCheckState[i].id,"misschinese2_bank1","alert_body") animPlaying = true IF GET_ENTITY_ANIM_CURRENT_TIME(pedCheckState[i].id,"misschinese2_bank1","alert_body") > 0.9 animPlaying = false ENDIF ENDIF IF IS_ENTITY_PLAYING_ANIM(pedCheckState[i].id,"misschinese2_bank1","react_forward_small_intro_a") animPlaying = true IF GET_ENTITY_ANIM_CURRENT_TIME(pedCheckState[i].id,"misschinese2_bank1","react_forward_small_intro_a") > 0.9 animPlaying=false ENDIF ENDIF IF IS_ENTITY_PLAYING_ANIM(pedCheckState[i].id,"misschinese2_bank1","react_backward_small_intro_a") animPlaying=true IF GET_ENTITY_ANIM_CURRENT_TIME(pedCheckState[i].id,"misschinese2_bank1","react_backward_small_intro_a") > 0.9 animPlaying=false ENDIF ENDIF IF IS_ENTITY_PLAYING_ANIM(pedCheckState[i].id,"misschinese2_bank1","react_left_small_intro_a") animPlaying=true IF GET_ENTITY_ANIM_CURRENT_TIME(pedCheckState[i].id,"misschinese2_bank1","react_left_small_intro_a") > 0.9 animPlaying=false ENDIF ENDIF IF IS_ENTITY_PLAYING_ANIM(pedCheckState[i].id,"misschinese2_bank1","react_right_small_intro_a") animPlaying=true IF GET_ENTITY_ANIM_CURRENT_TIME(pedCheckState[i].id,"misschinese2_bank1","react_right_small_intro_a") > 0.9 animPlaying=false ENDIF ENDIF if not animPlaying pedCheckState[i].actionFlag=2 pedCheckState[i].subFlag = GET_GAME_TIMER() + 2000 TASK_COMBAT_PED(pedCheckState[i].id,player_ped_id()) SET_ENTITY_LOAD_COLLISION_FLAG(pedCheckState[i].id,TRUE) SET_PED_TARGET_LOSS_RESPONSE(pedCheckState[i].id,TLR_NEVER_LOSE_TARGET) endif ENDIF BREAK CASE 2 IF GET_GAME_TIMER() > pedCheckState[i].subFlag pedCheckState[i].state = STATE_SEEK pedCheckState[i].alertMessage = ALERT_NONE pedCheckState[i].actionFlag=0 ENDIF BREAK ENDSWITCH ENDIF BREAK CASE STATE_SEEK FALLTHRU CASE STATE_COMBAT IF IS_PED_USING_SCENARIO(pedCheckState[i].id,"PROP_HUMAN_SEAT_CHAIR") OR IS_PED_USING_ANY_SCENARIO(pedCheckState[i].id) IF NOT IS_PED_INJURED(pedCheckState[i].id) //added for bug 1695190 CLEAR_PED_TASKS(pedCheckState[i].id) ENDIF ELSE SWITCH pedCheckState[i].actionFlag CASE 0 pedCheckState[i].timer = 0 IF i = 12 OR i = 13 OR i = 14 cprintln(debug_trevor3,"In TO COMBAT ",i) ENDIF SET_CURRENT_PED_WEAPON(pedCheckState[i].id,GET_BEST_PED_WEAPON(pedCheckState[i].id),TRUE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedCheckState[i].id,false) // SET_PED_SHOULD_PLAY_IMMEDIATE_SCENARIO_EXIT(pedCheckState[i].id) SET_PED_SHOULD_PLAY_NORMAL_SCENARIO_EXIT(pedCheckState[i].id) SET_PED_COMBAT_ATTRIBUTES(pedCheckState[i].id,CA_CAN_CHARGE,TRUE) SET_PED_FLEE_ATTRIBUTES(pedCheckState[i].id,FA_NEVER_FLEE,TRUE) pedCheckState[i].actionFlag++ //CLEAR_PED_TASKS(pedCheckState[i].id) BREAK CASE 1 if not pedCheckState[i].scriptControlledCombat vDefAreas[0] = vDefAreas[0] iCheckDefAreasCounter=iCheckDefAreasCounter fDefAreaSize=fDefAreaSize /* IF GET_GAME_TIMER() > pedCheckState[i].timer //check how many peds are set to be close to the player and how many far away. int iC int iClosePeds iClosePeds = 0 REPEAT COUNT_OF(pedCheckState) iC IF iC != i IF NOT IS_PED_DEAD_OR_DYING(pedCheckState[iC].id) IF pedCheckState[iC].bSetToAttackClose iclosePeds++ ENDIF ENDIF ENDIF ENDREPEAT IF iClosePeds < 3 pedCheckState[i].bSetToAttackClose = TRUE ENDIF float fAngPlayer,fAngDef, fAngDiff fAngPlayer = GET_HEADING_FROM_COORDS(GET_ENTITY_COORDS(pedCheckState[i].id),GET_ENTITY_COORDS(player_ped_id()),FALSE) int iDefCount iDefCount = GET_RANDOM_INT_IN_RANGE(0,10) int iChosen,iTotalChecks iTotalChecks = 0 iChosen = -1 bool bAbortSearch bAbortSearch = FALSE WHILE iDefCount >= 0 AND bAbortSearch = FALSE fAngDef = GET_HEADING_FROM_COORDS(GET_ENTITY_COORDS(pedCheckState[i].id),vDefAreas[iCheckDefAreasCounter],FALSE) fAngDiff = absf(fAngDef - fAngPlayer) // //cprintln(debug_trevor3,"fAngPlayer = ",fAngPlayer," fAngDef = ",fAngDef," fAngDiff = ",fAngDiff) If fAngDiff > 180 fAngDiff -= 360 fAngDiff = absf(fAngDiff) ENDIF IF fAngDiff < 70 IF (pedCheckState[i].bSetToAttackClose and GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(player_ped_id(),vDefAreas[iCheckDefAreasCounter]) < 40) OR (pedCheckState[i].bSetToAttackClose = FALSE AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(player_ped_id(),vDefAreas[iCheckDefAreasCounter]) > 40 AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(player_ped_id(),vDefAreas[iCheckDefAreasCounter]) < 90) IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(pedCheckState[i].id,vDefAreas[iCheckDefAreasCounter]) < 50 iDefCount-- iChosen = iCheckDefAreasCounter ENDIF ENDIF ENDIF iCheckDefAreasCounter++ iTotalChecks++ IF iCheckDefAreasCounter >= COUNT_OF(vDefAreas) iCheckDefAreasCounter=0 ENDIF IF iTotalChecks >= COUNT_OF(vDefAreas) bAbortSearch = TRUE ENDIF ENDWHILE IF iChosen != -1 SET_PED_SPHERE_DEFENSIVE_AREA(pedCheckState[i].id,vDefAreas[iChosen],fDefAreaSize) ENDIF */ TASK_COMBAT_PED(pedCheckState[i].id,player_ped_id()) SET_ENTITY_LOAD_COLLISION_FLAG(pedCheckState[i].id,TRUE) SET_PED_TARGET_LOSS_RESPONSE(pedCheckState[i].id,TLR_NEVER_LOSE_TARGET) pedCheckState[i].actionFlag++ pedCheckState[i].timer = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(20000,35000) // ENDIF endif BREAK ENDSWITCH ENDIF BREAK ENDSWITCH ENDIF ENDIF ENDREPEAT ENDPROC PROC DO_DIALOGUE(structCheckState& pedCheckState[], diaData dHearBullet, diaData dSeePlayer, diaData dFoundPlayer, diaData dAlertAllseen,diaData dAlertAllunseen , diaData dDeadBody, diaData dExplosion) IF IS_GAMEPLAY_CAM_RENDERING() IF bEnableReactionDialogue IF highestPriorityDialogue > lastDialogue OR lastSpeaker != highestPrioritySpeaker OR (highestPriorityDialogue < lastDialogue AND highestPriorityDialogue = enum_to_int(ALERT_SEEKING)) OR (highestPriorityDialogue = enum_to_int(ALERT_COMBAT) AND bAlertEveryone = FALSE) reactionDialogueFlag = 1 lastDialogue = highestPriorityDialogue lastSpeaker = highestPrioritySpeaker ENDIF SWITCH reactionDialogueFlag CASE 1 IF highestPrioritySpeaker > -1 IF NOT IS_PED_DEAD_OR_DYING(pedCheckState[highestPrioritySpeaker].id) SWITCH int_to_enum(ALERT_MESSAGE,highestPriorityDialogue) CASE ALERT_SEEKING IF NOT bAlertEveryone IF NOT bPlayerSeen IF NOT bBlockUnseenReactionDialogue IF NOT IS_CONV_ROOT_PLAYING(dAlertAllunseen.sDialogueToPlay) cprintln(debug_trevor3,"ped_reaction script kill dialogue 2") KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() IF rCREATE_CONVERSATION_EXTRA(dAlertAllunseen.sDialogueToPlay,dAlertAllunseen.iDiaIndex,pedCheckState[highestPrioritySpeaker].id,dAlertAllunseen.sPedNameForDialogue) //cprintln(DEBUG_TREVOR3,"a) dAlertAllunseen") reactionDialogueFlag=2 ENDIF ENDIF ELSE reactionDialogueFlag=2 ENDIF else IF NOT IS_CONV_ROOT_PLAYING(dAlertAllseen.sDialogueToPlay) cprintln(debug_trevor3,"ped_reaction script kill dialogue 3") KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() IF rCREATE_CONVERSATION_EXTRA(dAlertAllseen.sDialogueToPlay,dAlertAllseen.iDiaIndex,pedCheckState[highestPrioritySpeaker].id,dAlertAllseen.sPedNameForDialogue) //cprintln(DEBUG_TREVOR3,"b) dAlertAllunseen") reactionDialogueFlag=2 ENDIF ENDIF endif ELSE reactionDialogueFlag=2 ENDIF BREAK CASE ALERT_BULLET_IMPACT cprintln(debug_trevor3,"ped_reaction script kill dialogue 4") bBlockUnseenReactionDialogue=FALSE KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() IF rCREATE_CONVERSATION_EXTRA(dHearBullet.sDialogueToPlay,dHearBullet.iDiaIndex,pedCheckState[highestPrioritySpeaker].id,dHearBullet.sPedNameForDialogue) //cprintln(DEBUG_TREVOR3,"c) dHearBullet") //SET_CONDITION_STATE(COND_ENEMY_PED_REACTING,TRUE) reactionDialogueFlag=2 ENDIF BREAK CASE ALERT_DEAD_BODY_SEEN cprintln(debug_trevor3,"ped_reaction script kill dialogue 5") bBlockUnseenReactionDialogue = FALSE KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() IF rCREATE_CONVERSATION_EXTRA(dDeadBody.sDialogueToPlay,dDeadBody.iDiaIndex,pedCheckState[highestPrioritySpeaker].id,dDeadBody.sPedNameForDialogue) //cprintln(DEBUG_TREVOR3,"d) dDeadBody") //SET_CONDITION_STATE(COND_ENEMY_PED_REACTING,TRUE) reactionDialogueFlag=2 ENDIF BREAK CASE ALERT_EXPLOSION IF NOT bAlertEveryone AND NOT bBlockUnseenReactionDialogue cprintln(debug_trevor3,"ped_reaction script kill dialogue 6") KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() IF rCREATE_CONVERSATION_EXTRA(dExplosion.sDialogueToPlay,dExplosion.iDiaIndex,pedCheckState[highestPrioritySpeaker].id,dExplosion.sPedNameForDialogue) //cprintln(DEBUG_TREVOR3,"e) dExplosion") reactionDialogueFlag=2 ENDIF ELSE reactionDialogueFlag=2 ENDIF BREAK CASE ALERT_PLAYER_SEEN IF NOT bPlayerSeen IF NOT IS_CONV_ROOT_PLAYING(dSeePlayer.sDialogueToPlay) AND NOT IS_CONV_ROOT_PLAYING(dFoundPlayer.sDialogueToPlay) AND NOT IS_CONV_ROOT_PLAYING(dAlertAllseen.sDialogueToPlay) AND NOT IS_CONV_ROOT_PLAYING(dAlertAllunseen.sDialogueToPlay) bBlockUnseenReactionDialogue=FALSE cprintln(debug_trevor3,"ped_reaction script kill dialogue 7") KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() IF rCREATE_CONVERSATION_EXTRA(dSeePlayer.sDialogueToPlay,dSeePlayer.iDiaIndex,pedCheckState[highestPrioritySpeaker].id,dSeePlayer.sPedNameForDialogue) reactionDialogueFlag=2 ENDIF ENDIF else reactionDialogueFlag=2 endif BREAK CASE ALERT_COMBAT FALLTHRU CASE ALERT_PLAYER_FOUND IF NOT bPlayerSeen IF NOT IS_CONV_ROOT_PLAYING(dSeePlayer.sDialogueToPlay) AND NOT IS_CONV_ROOT_PLAYING(dFoundPlayer.sDialogueToPlay) AND NOT IS_CONV_ROOT_PLAYING(dAlertAllseen.sDialogueToPlay) AND NOT IS_CONV_ROOT_PLAYING(dAlertAllunseen.sDialogueToPlay) cprintln(debug_trevor3,"ped_reaction script kill dialogue 8") bBlockUnseenReactionDialogue=FALSE KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() IF rCREATE_CONVERSATION_EXTRA(dFoundPlayer.sDialogueToPlay,dFoundPlayer.iDiaIndex,pedCheckState[highestPrioritySpeaker].id,dFoundPlayer.sPedNameForDialogue) //cprintln(DEBUG_TREVOR3,"g) dFoundPlayer") reactionDialogueFlag=2 ENDIF ENDIF else IF NOT bAlertEveryone IF rCREATE_CONVERSATION_EXTRA(dalertAllSeen.sDialogueToPlay,dalertAllSeen.iDiaIndex,pedCheckState[highestPrioritySpeaker].id,dalertAllSeen.sPedNameForDialogue) bBlockUnseenReactionDialogue = FALSE //cprintln(DEBUG_TREVOR3,"h) dalertAllSeen") reactionDialogueFlag=2 ENDIF ENDIF reactionDialogueFlag=2 endif BREAK ENDSWITCH ELSE reactionDialogueFlag = 2 ENDIF ELSE reactionDialogueFlag = 2 ENDIF BREAK CASE 2 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() reactionDialogueFlag = 0 ENDIF BREAK ENDSWITCH ENDIF ENDIF ENDPROC PROC handlePedReactions(structCheckState& pedCheckState[], vector& vDefAreas[], diaData dHearPlayer,diaData dHearPlayerAgain, diaData dLostPlayer, diaData dHearBullet, diaData dSeePlayer, diaData dFoundPlayer, diaData dAlertAllSeen,diaData dAlertAllUnSeen , diaData dDeadBody, diaData dExplosion) IF iNextArrayToFill > 0 DO_ALERT_CHECKS(pedCheckState,dAlertAllSeen,dAlertAllUnSeen,dSeePlayer,dFoundPlayer) DO_REACTIONS(pedCheckState,vDefAreas,dHearPlayer,dHearPlayerAgain,dLostPlayer) DO_DIALOGUE(pedCheckState,dHearBullet,dSeePlayer,dFoundPlayer, dAlertAllSeen,dAlertAllUnSeen,dDeadBody,dExplosion) ENDIF ENDPROC #if is_debug_build bool bShowAlerts WIDGET_GROUP_ID newWidget FUNC STRING GET_ALERTED_STRING(structCheckState& pedCheckState[], int iPed, bool bShowLastAlert=FALSE) ALERT_MESSAGE checkAlert IF bShowLastAlert = FALSE checkAlert = pedCheckState[iPed].alertMessage ELSE checkAlert = pedCheckState[iPed].lastAlertMessage ENDIF switch checkAlert case ALERT_NONE RETURN "ALERT_NONE" case ALERT_NEARBY_PED_REACTION RETURN "ALERT_NEARBY_PED_REACTION" case ALERT_BULLET_IMPACT RETURN "ALERT_BULLET_IMPACT" case ALERT_DEAD_BODY_SEEN RETURN "ALERT_DEAD_BODY_SEEN" case ALERT_EXPLOSION RETURN "ALERT_EXPLOSION" case ALERT_PLAYER_SEEN RETURN "ALERT_PLAYER_SEEN" case ALERT_HEAR_PLAYER RETURN "ALERT_HEAR_PLAYER" case ALERT_SEEKING RETURN "ALERT_SEEKING" case ALERT_SOMEONE_ALERTING_EVERYONE RETURN "ALERT_SOMEONE_ALERTING_EVERYONE" case ALERT_PLAYER_FOUND RETURN "ALERT_PLAYER_FOUND" CASE ALERT_COMBAT RETURN "ALERT_COMBAT" ENDSWITCH return "" ENDFUNC FUNC STRING GET_STATE_STRING(structCheckState& pedCheckState[], int iPED) SWITCH pedCheckState[iPed].state CASE STATE_AMBIENT RETURN("STATE_AMBIENT") BREAK CASE STATE_COMBAT RETURN("STATE_COMBAT") BREAK CASE STATE_REACT RETURN("STATE_REACT") BREAK CASE STATE_SEEK RETURN("STATE_SEEK") BREAK CASE STATE_SPAWN RETURN("STATE_SPAWN") BREAK ENDSWITCH return("") ENDFUNC PROC pedReactionsDebug(structCheckState& pedCheckState[], WIDGET_GROUP_ID &thisWidget) int iR IF DOES_WIDGET_GROUP_EXIST(thisWidget) IF NOT DOES_WIDGET_GROUP_EXIST(newWidget) //cprintln(DEBUG_TREVOR3,"PEd reactions version 1.0") SET_CURRENT_WIDGET_GROUP(thisWidget) newWidget = START_WIDGET_GROUP("Ped Reactions") ADD_WIDGET_BOOL("bShowAlerts",bShowAlerts) ADD_WIDGET_BOOL("Show ped data",ShowSpecifcPedData) ADD_WIDGET_INT_SLIDER("PEd to show",pedDataToShow,0,COUNT_OF(pedCheckState),1) START_WIDGET_GROUP("Dialogue") ADD_WIDGET_INT_READ_ONLY("highestPriorityDialogue",highestPriorityDialogue) ADD_WIDGET_INT_READ_ONLY("lastDialogue",lastDialogue) ADD_WIDGET_INT_READ_ONLY("reactionDialogueFlag",reactionDialogueFlag) ADD_WIDGET_INT_READ_ONLY("highestPrioritySpeaker",highestPrioritySpeaker) ADD_WIDGET_BOOL("bWarningDialoguePLaying",bWarningDialoguePLaying) ADD_WIDGET_BOOL("bAPedIsReacting",bAPedIsReacting) STOP_WIDGET_GROUP() STOP_WIDGET_GROUP() CLEAR_CURRENT_WIDGET_GROUP(thisWidget) ENDIF ENDIF /* peds[i].alertMessage = ALERT_NONE peds[i].lastAlertMessage = ALERT_NONE peds[i].state = STATE_AMBIENT peds[i].actionFlag = 0 peds[i].subFlag = 0 peds[i].nearbyreactingPed = FALSE peds[i].canRespondToHearingPlayer = FALSE peds[i].pedOfInterest = 0 peds[i].timer = 0 peds[i].vpos = <<0,0,0>> peds[i].vPosB = <<0,0,0>> peds[i].floatA = 0 */ IF bShowAlerts SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE) DRAW_RECT_FROM_CORNER(0.03,0.08,0.3,0.66,0,0,0,180) float fx,fy TEXT_LABEL_63 txtlbl REPEAT COUNT_OF(pedCheckState) iR txtlbl = "" txtlbl += GET_ALERTED_STRING(pedCheckState,iR) txtlbl += " " txtlbl += GET_STATE_STRING(pedCheckState,iR) txtlbl += " " txtlbl += pedCheckState[iR].actionFlag txtlbl += " " txtlbl += pedCheckState[iR].subFlag txtlbl += " " IF pedCheckState[iR].scriptReactionFirst txtlbl += " TRUE" ELSE txtlbl += " FALSE" ENDIF SET_TEXT_SCALE(0.3,0.3) IF IS_PED_DEAD_OR_DYING(pedCheckState[iR].id) SET_TEXT_COLOUR(255,0,0,255) ELSE SET_TEXT_COLOUR(255,255,255,255) ENDIF DISPLAY_TEXT_WITH_LITERAL_STRING(0.04,0.1+(iR*0.02),"STRING",txtlbl) SET_TEXT_COLOUR(255,255,255,255) //DISPLAY_TEXT_WITH_LITERAL_STRING(0.04,0.1+(iR*0.02),"STRING",GET_ALERTED_STRING(pedCheckState,iR)) //SET_TEXT_SCALE(0.3,0.3) //DISPLAY_TEXT_WITH_LITERAL_STRING(0.19,0.1+(iR*0.02),"STRING",GET_STATE_STRING(pedCheckState,iR)) //SET_TEXT_SCALE(0.3,0.3) //showIntOnScreen(0.28,0.1+(iR*0.02),pedCheckState[iR].actionFlag) //showIntOnScreen(0.3,0.1+(iR*0.02),pedCheckState[iR].subFlag) IF DOES_ENTITY_EXIST(pedCheckState[iR].id) IF GET_SCREEN_COORD_FROM_WORLD_COORD(GET_ENTITY_COORDS(pedCheckState[iR].id,FALSE),fx,fy) DRAW_DEBUG_LINE_2D(<<0.312,0.12+(iR*0.02),0>>,<>) DRAW_DEBUG_LINE_2D(<<0.312,0.12+(iR*0.02),0>>,<<0,0.12+(iR*0.02),0>>) ENDIF ENDIF ENDREPEAT SET_TEXT_SCALE(0.3,0.3) DISPLAY_TEXT_WITH_LITERAL_STRING(0.04,0.65,"STRING","bAlertEveryone: ") SET_TEXT_SCALE(0.3,0.3) IF bAlertEveryone DISPLAY_TEXT_WITH_LITERAL_STRING(0.11,0.65,"STRING","YES") ELSE DISPLAY_TEXT_WITH_LITERAL_STRING(0.11,0.65,"STRING","NO") ENDIF SET_TEXT_SCALE(0.3,0.3) DISPLAY_TEXT_WITH_LITERAL_STRING(0.04,0.67,"STRING","bPlayerSeen: ") SET_TEXT_SCALE(0.3,0.3) IF bPlayerSeen DISPLAY_TEXT_WITH_LITERAL_STRING(0.11,0.67,"STRING","YES") ELSE DISPLAY_TEXT_WITH_LITERAL_STRING(0.11,0.67,"STRING","NO") ENDIF ENDIF IF ShowSpecifcPedData cprintln(debug_Trevor3,"Alert message: ",GET_ALERTED_STRING(pedCheckState,pedDataToShow)," last: ",GET_ALERTED_STRING(pedCheckState,pedDataToShow,true)," state: ",GET_STATE_STRING(pedCheckState,pedDataToShow)," action flag: ",pedCheckState[pedDataToShow].actionFlag," sub flag: ",pedCheckState[pedDataToShow].subFlag) IF NOT IS_PED_DEAD_OR_DYING(pedCheckState[pedDataToShow].id) DRAW_DEBUG_SPHERE(GET_ENTITY_COORDS(pedCheckState[pedDataToShow].id)+<<0,0,1>>,0.3) ENDIF ENDIF ENDPROC #endif