Files
gtav-src/script/dev_ng/Code/GunFightTest.sc
T
2025-09-29 00:52:08 +02:00

424 lines
13 KiB
Python
Executable File

// Do nothing in release mode
#IF IS_FINAL_BUILD
SCRIPT
ENDSCRIPT
#ENDIF
// Only include in debug mode
#IF IS_DEBUG_BUILD
//
// Author: Jorge O'Valle Date: 25/03/11 │
//
//
// Testing the V ambisonics
//
//
//
USING "rage_builtins.sch"
USING "globals.sch"
USING "commands_audio.sch"
USING "commands_camera.sch"
USING "commands_clock.sch"
USING "commands_debug.sch"
USING "commands_graphics.sch"
USING "commands_hud.sch"
USING "commands_misc.sch"
USING "commands_object.sch"
USING "commands_pad.sch"
USING "commands_ped.sch"
USING "commands_player.sch"
USING "commands_script.sch"
USING "commands_streaming.sch"
USING "commands_task.sch"
USING "commands_vehicle.sch"
USING "commands_interiors.sch"
USING "commands_weapon.sch"
USING "commands_fire.sch"
USING "flow_public_core_override.sch"
USING "model_enums.sch"
USING "script_player.sch"
USING "selector_public.sch"
USING "player_ped_public.sch"
//Variables etc
MODEL_NAMES modelShooter = G_M_M_ChiBoss_01//A_M_Y_GENASIAN01
MODEL_NAMES lastModelShooter = G_M_M_ChiBoss_01//A_M_Y_GENASIAN01
WEAPON_TYPE shooterGun
WIDGET_GROUP_ID widgetDebug
//BOOL b_shooter_respawning = FALSE
BOOL weaponsAllowed[8]
//BOOL finish = FALSE
VECTOR playerPos
INT testSoundId = GET_SOUND_ID()
//INT i_GunManRespawnTime = 5
INT shooterTimeToNewTarget = 10
INT i
INT modelNumber = 0
//INT currentShooter
CONST_INT numberOfShooters 2
FLOAT f_shooter_min_dist = 5.0
FLOAT f_shooter_max_dist = 15.0
FLOAT shooterBurstLength = 3.0
FLOAT shooterAimOffset = 1.0
PED_INDEX ShootersPedIndex[numberOfShooters]
BLIP_INDEX ShootersBlipIndex[numberOfShooters]
BOOL ShootersArmed[numberOfShooters]
// -----------------------------------------------------------------------------------------------------------
// Init Camera
// -----------------------------------------------------------------------------------------------------------
PROC InitCamera()
SET_DEBUG_CAM_ACTIVE(TRUE)
SET_CAM_COORD(GET_DEBUG_CAM (),GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<0.0,0.0,288.0>>)
SET_CAM_ROT(GET_DEBUG_CAM (), <<270.0,0.0,0.0>>)
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Aux
// -----------------------------------------------------------------------------------------------------------
PROC CreateWidgets()
//SETUP INITIAL WEAPONS FOR GUNMEN
//"WEAPONTYPE_PISTOL"
weaponsAllowed[0] = TRUE
//"WEAPONTYPE_SMG"
weaponsAllowed[1] = TRUE
//"WEAPONTYPE_ASSAULTRIFLE"
weaponsAllowed[2] = TRUE
//"WEAPONTYPE_PUMPSHOTGUN"
weaponsAllowed[3] = TRUE
//"WEAPONTYPE_HEAVYSNIPER"
weaponsAllowed[4] = TRUE
//"WEAPONTYPE_GRENADELAUNCHER"
weaponsAllowed[5] = FALSE
//"WEAPONTYPE_RPG"
weaponsAllowed[6] = FALSE
//"WEAPONTYPE_STUNGUN"
weaponsAllowed[7] = FALSE
widgetDebug = START_WIDGET_GROUP("Audio Test")
START_WIDGET_GROUP("Shooters")
START_NEW_WIDGET_COMBO()
ADD_TO_WIDGET_COMBO("A_M_Y_MUSCLBEAC_01")
ADD_TO_WIDGET_COMBO("S_M_M_HighSec_01")
ADD_TO_WIDGET_COMBO("S_M_M_UPS_01")
ADD_TO_WIDGET_COMBO("S_M_M_HighSec_01")
ADD_TO_WIDGET_COMBO("A_F_Y_BEACH_01")
ADD_TO_WIDGET_COMBO("A_F_M_BevHills_02")
ADD_TO_WIDGET_COMBO("A_M_Y_CYCLIST_01")
ADD_TO_WIDGET_COMBO("S_M_Y_COP_01")
ADD_TO_WIDGET_COMBO("S_F_Y_HOOKER_01")
ADD_TO_WIDGET_COMBO("S_M_Y_MARINE_01")
ADD_TO_WIDGET_COMBO("S_M_Y_SWAT_01")
ADD_TO_WIDGET_COMBO("S_M_Y_SWAT_01")
STOP_WIDGET_COMBO("Enemy Ped", modelNumber)
ADD_WIDGET_FLOAT_SLIDER("Min Distance", f_shooter_min_dist, 0.0, 200.0, 1)
ADD_WIDGET_FLOAT_SLIDER("Max Distance", f_shooter_max_dist, 0.0, 200.0, 1)
START_WIDGET_GROUP("Multiple Shooters")
// ADD_WIDGET_BOOL("Timed Respawns", b_shooter_respawning)
// ADD_WIDGET_INT_SLIDER("Respawn Time", i_GunManRespawnTime, 1, 20, 1)
ADD_WIDGET_INT_SLIDER("Time before target change", shooterTimeToNewTarget, 1, 20, 1)
ADD_WIDGET_BOOL("WEAPONTYPE_PISTOL",weaponsAllowed[0])
ADD_WIDGET_BOOL("WEAPONTYPE_SMG",weaponsAllowed[1])
ADD_WIDGET_BOOL("WEAPONTYPE_ASSAULTRIFLE",weaponsAllowed[2])
ADD_WIDGET_BOOL("WEAPONTYPE_PUMPSHOTGUN",weaponsAllowed[3])
ADD_WIDGET_BOOL("WEAPONTYPE_HEAVYSNIPER",weaponsAllowed[4])
ADD_WIDGET_BOOL("WEAPONTYPE_GRENADELAUNCHER",weaponsAllowed[5])
ADD_WIDGET_BOOL("WEAPONTYPE_RPG",weaponsAllowed[6])
ADD_WIDGET_BOOL("WEAPONTYPE_STUNGUN",weaponsAllowed[7])
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ENDPROC
PROC DestroyWidgets()
IF DOES_WIDGET_GROUP_EXIST(widgetDebug)
DELETE_WIDGET_GROUP(widgetDebug)
ENDIF
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Weapons
// -----------------------------------------------------------------------------------------------------------
FUNC WEAPON_TYPE GetWeaponType(INT k)
WEAPON_TYPE chosenGun
SWITCH k
CASE 0
chosenGun = WEAPONTYPE_PISTOL
BREAK
CASE 1
chosenGun = WEAPONTYPE_SMG
BREAK
CASE 2
chosenGun = WEAPONTYPE_ASSAULTRIFLE
BREAK
CASE 3
chosenGun = WEAPONTYPE_PUMPSHOTGUN
BREAK
CASE 4
chosenGun = WEAPONTYPE_HEAVYSNIPER
BREAK
CASE 5
chosenGun = WEAPONTYPE_GRENADELAUNCHER
BREAK
CASE 6
chosenGun = WEAPONTYPE_RPG
BREAK
CASE 7
chosenGun = WEAPONTYPE_STUNGUN
BREAK
ENDSWITCH
RETURN chosenGun
ENDFUNC
FUNC WEAPON_TYPE GetAGunForShooter()
BOOL NotAGoodGun = TRUE
INT TriesToGetAGoodGun = 0
INT temp
WHILE NotAGoodGun
temp = GET_RANDOM_INT_IN_RANGE(0,7)
IF weaponsAllowed[temp]
NotAGoodGun = FALSE
ELSE
IF TriesToGetAGoodGun > 10
//FALL BACK TO PISTOL
temp = 0
NotAGoodGun = FALSE
ENDIF
temp++
ENDIF
ENDWHILE
RETURN GetWeaponType(temp)
ENDFUNC
// -----------------------------------------------------------------------------------------------------------
// Shooters
// -----------------------------------------------------------------------------------------------------------
PROC InitShooters()
WHILE NOT HAS_MODEL_LOADED(modelShooter)
REQUEST_MODEL(modelShooter)
WAIT(0)
ENDWHILE
ENDPROC
PROC CleanupShooters()
FOR i = 0 to numberOfShooters - 1
IF DOES_BLIP_EXIST(ShootersBlipIndex[i])
REMOVE_BLIP(ShootersBlipIndex[i])
ENDIF
IF DOES_ENTITY_EXIST(ShootersPedIndex[i])
DELETE_PED(ShootersPedIndex[i])
ENDIF
ENDFOR
SET_MODEL_AS_NO_LONGER_NEEDED(modelShooter)
ENDPROC
FUNC BOOL IsShooting(PED_INDEX shooter)
IF NOT IS_PED_INJURED(shooter)
SCRIPTTASKSTATUS taskStatus = GET_SCRIPT_TASK_STATUS(shooter, SCRIPT_TASK_PERFORM_SEQUENCE)
IF taskStatus = FINISHED_TASK
RETURN FALSE
ENDIF
ENDIF
RETURN TRUE
ENDFUNC
FUNC FLOAT GetHeadingBetweenVectors(VECTOR A, VECTOR B)
RETURN GET_HEADING_FROM_VECTOR_2D(B.x-A.x,B.y-A.y)
ENDFUNC
PROC updateTheModel()
lastModelShooter = modelShooter
SWITCH modelNumber
CASE 0
modelShooter = A_M_Y_MUSCLBEAC_01
BREAK
CASE 1
modelShooter = S_M_M_HighSec_01//A_M_M_BUSINESS01
BREAK
CASE 2
modelShooter = S_M_M_UPS_01//A_M_O_GENLATINO01
BREAK
CASE 3
modelShooter = S_M_M_HighSec_01
BREAK
CASE 4
modelShooter = A_F_Y_BEACH_01
BREAK
CASE 5
modelShooter = A_F_M_BevHills_02
BREAK
CASE 6
modelShooter = A_M_Y_CYCLIST_01
BREAK
CASE 7
modelShooter = S_M_Y_COP_01
BREAK
CASE 8
modelShooter = S_F_Y_HOOKER_01
BREAK
CASE 9
modelShooter = S_M_Y_MARINE_01
BREAK
CASE 10
modelShooter = S_M_Y_SWAT_01
BREAK
CASE 11
modelShooter = S_M_Y_SWAT_01
BREAK
ENDSWITCH
IF modelShooter != lastModelShooter
SET_MODEL_AS_NO_LONGER_NEEDED(lastModelShooter)
ENDIF
IF NOT HAS_MODEL_LOADED(modelShooter)
REQUEST_MODEL(modelShooter)
ENDIF
ENDPROC
PROC makeMeAShooter(INT k)
playerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
VECTOR newShooterPos = SHOOTER_POS_IN_SECTOR(2,7)//(GET_RANDOM_INT_IN_RANGE(1,8),GET_RANDOM_INT_IN_RANGE(1,8))
ShootersPedIndex[k] = CREATE_PED(PEDTYPE_CRIMINAL, modelShooter, newShooterPos,GetHeadingBetweenVectors(newShooterPos, playerPos))
ShootersArmed[k] = FALSE
ENDPROC
PROC removeDeadGunMenBlips()
FOR i = 0 to numberOfShooters - 1
IF DOES_BLIP_EXIST(ShootersBlipIndex[i])
IF IS_ENTITY_DEAD(ShootersPedIndex[i])
PRINTSTRING("PED ")
PRINTINT(i)
PRINTSTRING(" IS DEAD - REMOVING BLIP")
PRINTNL()
REMOVE_BLIP(ShootersBlipIndex[i])
ENDIF
ENDIF
ENDFOR
ENDPROC
FUNC PED_INDEX getSafeCombatTarget(INT j)
INT fightTarget
INT guesses = 0
WHILE guesses < 10
fightTarget = GET_RANDOM_INT_IN_RANGE(0,COUNT_OF(ShootersPedIndex))
IF DOES_ENTITY_EXIST(ShootersPedIndex[fightTarget])
IF NOT(fightTarget = COUNT_OF(ShootersPedIndex) OR fightTarget = j OR IS_ENTITY_DEAD(ShootersPedIndex[fightTarget]))
RETURN ShootersPedIndex[fightTarget]
ENDIF
ENDIF
ENDWHILE
RETURN PLAYER_PED_ID()
ENDFUNC
// -----------------------------------------------------------------------------------------------------------
// Finish script
// -----------------------------------------------------------------------------------------------------------
PROC CleanUp()
CleanupShooters()
RELEASE_SOUND_ID(testSoundId)
UNREGISTER_SCRIPT_WITH_AUDIO()
DestroyWidgets()
TERMINATE_THIS_THREAD()
ENDPROC
PROC FinishScript()
Mission_Flow_Mission_Failed()
CleanUp()
ENDPROC
PROC UpdateGunFight()
updateTheModel()
IF HAS_MODEL_LOADED(modelShooter)
// IF shooterRespawning
// IF TIMERA()>i_GunManRespawnTime*1000
// MakeAGunMan()
// ENDIF
// removeDeadGunMenBlips()
// ELSE
FOR i = 0 to numberOfShooters -1
IF DOES_ENTITY_EXIST(ShootersPedIndex[i])
IF IS_ENTITY_DEAD(ShootersPedIndex[i])
SET_PED_AS_NO_LONGER_NEEDED(ShootersPedIndex[i])
IF DOES_BLIP_EXIST(ShootersBlipIndex[i])
REMOVE_BLIP(ShootersBlipIndex[i])
ENDIF
makeMeAShooter(i)
ELSE
IF NOT ShootersArmed[i]
//shooterGun = GetAGunForShooter()
shooterGun = GetWeaponType(0)
ShootersBlipIndex[i] = ADD_BLIP_FOR_ENTITY(ShootersPedIndex[i])
SET_PED_ACCURACY(ShootersPedIndex[i],GET_RANDOM_INT_IN_RANGE(0,100))
GIVE_WEAPON_TO_PED(ShootersPedIndex[i], shooterGun, 100, true)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(ShootersPedIndex[i], true)
SET_CURRENT_PED_WEAPON(ShootersPedIndex[i], shooterGun, true)
SET_PED_CURRENT_WEAPON_VISIBLE(ShootersPedIndex[i],TRUE)
SET_PED_SHOOT_RATE(ShootersPedIndex[i],100)
SET_PED_INFINITE_AMMO(ShootersPedIndex[i],TRUE)
SET_PED_COMBAT_ABILITY(ShootersPedIndex[i], CAL_PROFESSIONAL)
// SET_ENTITY_INVINCIBLE(ShootersPedIndex[i],TRUE)
//TASK_COMBAT_PED_TIMED(ShootersPedIndex[i],getSafeCombatTarget(i),shooterTimeToNewTarget*1000)
//WAIT( 5000)
TASK_SHOOT_AT_COORD(ShootersPedIndex[i],playerPos + <<0,0,shooterAimOffset>>, floor(shooterBurstLength*1000), FIRING_TYPE_1_THEN_AIM)
ShootersArmed[i] = TRUE
ELSE
//IF GET_SCRIPT_TASK_STATUS(ShootersPedIndex[i],SCRIPT_TASK_COMBAT)= FINISHED_TASK
// TASK_COMBAT_PED_TIMED(ShootersPedIndex[i],getSafeCombatTarget(i),shooterTimeToNewTarget*1000)
IF GET_SCRIPT_TASK_STATUS(ShootersPedIndex[i],SCRIPT_TASK_SHOOT_AT_COORD)= FINISHED_TASK
TASK_SHOOT_AT_COORD(ShootersPedIndex[i],playerPos + <<0,0,shooterAimOffset>>, floor(shooterBurstLength*1000), FIRING_TYPE_1_BURST)
//EXPLODE_PED_HEAD(ShootersPedIndex[i])
// finish = TRUE
ENDIF
ENDIF
ENDIF
ELSE
makeMeAShooter(i)
ENDIF
ENDFOR
ENDIF
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Init
// -----------------------------------------------------------------------------------------------------------
PROC Init()
REGISTER_SCRIPT_WITH_AUDIO()
CreateWidgets()
InitCamera()
InitShooters()
ENDPROC
// ===========================================================================================================
// Script Loop
// ===========================================================================================================
SCRIPT
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(500)
ENDIF
Init()
IF HAS_FORCE_CLEANUP_OCCURRED()
PRINTSTRING("...Placeholder Mission Force Cleanup")
PRINTNL()
Mission_Flow_Mission_Force_Cleanup()
CleanUp()
ENDIF
WHILE (TRUE)
DRAW_GUN_FIGHT_GRID()
// IF NOT finish
UpdateGunFight()
// ENDIF
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
FinishScript()
ENDIF
WAIT(0)
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
ENDSCRIPT
#ENDIF // IS_DEBUG_BUILD