Files
gtav-src/script/dev_ng/multiplayer/scripts/modes/MPTestbed.sc
T
2025-09-29 00:52:08 +02:00

1545 lines
50 KiB
Python
Executable File

// ________________________________________
//
// Game: GTAV - Testbed.sc
// Script: Testbed.sc
// Author: Robert Wright
// Description: Testbed mode
// ___________________________________________
#if IS_DEBUG_BUILD
USING "globals.sch"
USING "net_reset_MP_Globals.sch"
USING "freemode_header.sch"
USING "net_bot_utils.sch"
USING "net_bots.sch"
USING "net_stat_generator.sch"
USING "net_main_client.sch"
USING "net_main_server.sch"
//USING "freemode_stunt_jumps.sch"
USING "net_vote_at_blip.sch"
//USING "net_spectator_hud.sch"
USING "shop_private.sch"
USING "net_freemode_cut.sch"
#IF IS_DEBUG_BUILD
USING "net_debug.sch"
#ENDIF
// ----------------------------------- VARIABLES ---------------------------------------------------------------------
REL_GROUP_HASH rgFM_Default
REL_GROUP_HASH lrgFM_Team[NUM_NETWORK_PLAYERS]
BOOL bSetUpPlayer
//INT iAskForHelpTimer
//BOOL iIsNetPlayerOK
HEIST_ISLAND_TRAVEL_STRUCT sHeistIslandTravel
FM_RANDOM_EVENT_LOCAL_SCRIPT_EVENT sFMREScriptEventdata
// Widgets & Debug.
#IF IS_DEBUG_BUILD
MODEL_NAMES RandomModel
//For prints
TEXT_LABEL_31 tl31MissionName = " TestBed"
// BOOL bHasPlayerSwapped
BOOL bSetUpUsjs
// WIDGET_GROUP_ID missionTab
BOOL bHostEndGameNow
// BOOL bHostDoNotEndGame
// BOOL bHostAllLeave
BOOL bSwapSetUp
//sequence_index script variable
SEQUENCE_INDEX SequenceIndex
#ENDIF
// ----------------------------------- MAIN PROCS ----------------------------------------------------------------------
//Set Teams to Hate each other
PROC SET_TEAM_RELATIONSHIPS(RELATIONSHIP_TYPE relType, REL_GROUP_HASH relGroup)
INT i
REPEAT NUM_NETWORK_PLAYERS i
IF relGroup <> lrgFM_Team[i]
SET_RELATIONSHIP_BETWEEN_GROUPS(relType, relGroup, lrgFM_Team[i])
ENDIF
ENDREPEAT
ENDPROC
// ----------------------------------- DEBUGGERY ----------------------------------------------------------------------
#IF IS_DEBUG_BUILD
PROC UPDATE_DEBUG
ENDPROC
/// PURPOSE:
/// Temporary hacky way of dealing with launching mission from debug menu. When the proper mission launching system is in place this will be removed.
PROC HANDLE_LAUNCHING_MISSIONS()
// STRING scriptName
// INT stackSize = MINI_STACK_SIZE
// SWITCH g_iDebugSelectedMission
// CASE 0
// // To keep it from spamming when there is no valid mission
// EXIT
// BREAK
// CASE 1
// scriptName = "FM_YOGA"
// BREAK
// CASE 2
// scriptName = "GOLF_MP_LAUNCHER"
// stackSize = DEFAULT_STACK_SIZE
// BREAK
// CASE 3
// scriptName = "RANGE_MODERN_MP"
// stackSize = SCRIPT_XML_STACK_SIZE
// BREAK
// CASE 4
// scriptName = "AM_Armwrestling"
// stackSize = SCRIPT_XML_STACK_SIZE
// BREAK
// CASE 5
// scriptName = "FM_Mission_Controller"
// stackSize = MULTIPLAYER_MISSION_STACK_SIZE
// BREAK
// CASE 6
// scriptName = "TENNIS_NETWORK_MP"
// stackSize = DEFAULT_STACK_SIZE
// BREAK
// CASE 7
// scriptName = "MPR_race_editor"
// stackSize = SCRIPT_XML_STACK_SIZE
// BREAK
// CASE 8
// scriptName = "MP_Races"
// stackSize = DEBUG_SCRIPT_STACK_SIZE
// BREAK
// CASE 10
// scriptName = "POOL_MP_LAUNCHER"
// stackSize = SCRIPT_XML_STACK_SIZE
// BREAK
// CASE 11
// scriptName = "AM_Darts"
// stackSize = SCRIPT_XML_STACK_SIZE
// BREAK
// DEFAULT
// NET_PRINT("Tried to start a mission that doesn't exist")PRINTNL()
// EXIT
// BREAK
// ENDSWITCH
// g_iDebugSelectedMission = 0
//
// EXIT
//
// IF GET_NUMBER_OF_THREADS_RUNNING_THIS_SCRIPT(scriptName) <= 0
// IF ARE_STRINGS_EQUAL(scriptName, "FM_Mission_Controller")
// MP_MISSION_DATA fmmcMissionData
// fmmcMissionData.iInstanceId = -1
// IF NET_LOAD_AND_LAUNCH_SCRIPT_FM(scriptName,stackSize, fmmcMissionData)
// g_iDebugSelectedMission = 0
// ENDIF
// ELSE
// IF NET_LOAD_AND_LAUNCH_SCRIPT(scriptName,stackSize)
// g_iDebugSelectedMission = 0
// ENDIF
// ENDIF
// ELSE
// //this script is already running reseting the g_iDebugSelectedMission variable
// g_iDebugSelectedMission = 0
// ENDIF
ENDPROC
PROC UPDATE_WIDGETS()
//Update Player Damage Modifier
IF lw_bSetPlayerWeaponDamageModifier = TRUE
BROADCAST_UPDATE_PLAYER_WEAPON_DAMAGE_MODIFIER(lw_fPlayerWeaponDamageModifier, ALL_PLAYERS())
lw_bSetPlayerWeaponDamageModifier = FALSE
NET_PRINT(" - LES WIDGETS - BROADCAST_UPDATE_PLAYER_WEAPON_DAMAGE_MODIFIER - lw_bSetPlayerWeaponDamageModifier = ") NET_PRINT_FLOAT(lw_fPlayerWeaponDamageModifier) NET_NL()
ENDIF
//Update Ai Damage Modifier
IF lw_bSetAiDamageModifier = TRUE
BROADCAST_UPDATE_AI_DAMAGE_MODIFIER(lw_fAiDamageModifier, ALL_PLAYERS())
lw_bSetAiDamageModifier = FALSE
NET_PRINT(" - LES WIDGETS - BROADCAST_UPDATE_AI_DAMAGE_MODIFIER - lw_fAiDamageModifier = ") NET_PRINT_FLOAT(lw_fAiDamageModifier) NET_NL()
ENDIF
IF g_bProcessBots
//PROCESS_BOTS()
ENDIF
IF GlobalServerBD_FM.bSwapTeams = FALSE
IF bSwapSetUp = FALSE
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), rgFM_Default)
PRINTSTRING("Set player team: rgFM_Default")PRINTNL()
bSwapSetUp = TRUE
ENDIF
ENDIF
IF NETWORK_IS_HOST_OF_THIS_SCRIPT()
IF IS_DEBUG_KEY_JUST_PRESSED(KEY_T, KEYBOARD_MODIFIER_NONE, "FM Swap Teams")
GlobalServerBD_FM.bSwapTeams = FALSE
ENDIF
ENDIF
ELSE
IF bSwapSetUp = TRUE
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), lrgFM_Team[PARTICIPANT_ID_TO_INT()])
PRINTSTRING("Set player team: lrgFM_Team[PARTICIPANT_ID_TO_INT()]")PRINTNL()
bSwapSetUp = FALSE
ENDIF
ENDIF
IF NETWORK_IS_HOST_OF_THIS_SCRIPT()
IF IS_DEBUG_KEY_JUST_PRESSED(KEY_T, KEYBOARD_MODIFIER_NONE, "FM Swap Teams")
GlobalServerBD_FM.bSwapTeams = TRUE
ENDIF
ENDIF
ENDIF
ENDPROC
//On all machines populate the sequence index with
// tasks (this done on all machines so if the ped migrates
// to another machine while performing the sequence it continues to work properly):
BOOL bOpenTaskSequence = FALSE
PROC FILL_SEQUENCE_TASK()
OPEN_SEQUENCE_TASK(SequenceIndex)
VECTOR playerCoord = GET_PLAYER_COORDS(PLAYER_ID())
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << -43.19, -57.01, 1.0>>, PEDMOVE_SPRINT, 999999, 10.0)
TASK_PED_SLIDE_TO_COORD(NULL, << -43.19, -57.01, 1.0>>, 0.0)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, playerCoord, PEDMOVE_SPRINT, 999999, 10.0)
TASK_PED_SLIDE_TO_COORD(NULL, playerCoord, 0.0)
CLOSE_SEQUENCE_TASK(SequenceIndex)
bOpenTaskSequence = FALSE
ENDPROC
// On the machine in control of the ped you want to do the
// sequence, give the ped a task perform sequence and pass
// in the sequence index from above.
BOOL bStartTaskSequence = FALSE
PROC DEBUG_TASK_SEQUENCES()
// Start sequence if we have control of the focus ped.
PED_INDEX pedIndex = NETWORK_GET_FOCUS_PED_LOCAL_ID()
IF pedIndex <> INT_TO_NATIVE(PED_INDEX, -1)
AND pedIndex <> NULL
IF NETWORK_HAS_CONTROL_OF_ENTITY(pedIndex)
TASK_PERFORM_SEQUENCE(pedIndex, SequenceIndex)
ENDIF
ENDIF
bStartTaskSequence = FALSE
ENDPROC
//Add widgets for setting relationship groups
BOOL bSetToOwnTeam
PROC ADD_RELATIONSHIP_GROUP_WIDGETS()
START_WIDGET_GROUP("Player Teams")
ADD_WIDGET_BOOL("On Own Team", bSetToOwnTeam)
STOP_WIDGET_GROUP()
ENDPROC
//Add widgets for temporary testing purposes
BOOL bTestRappelTask
BOOL bCreateTestPed
BOOL bCreateTestVehicle
BOOL bPlayAnimOnTestPed
BOOL bTestPedFleeFromPlayer
BOOL bTestPedFleeFromPoint
BOOL bTestPedFollowNavMesh
BOOL bTestPedGoToCoord
BOOL bTestPedStandStill
BOOL bTestPedThrowProjectile
BOOL bTestPedCombatHatedPeds
BOOL bTestPedGoToCoordAiming
BOOL bTestPedPerformSequence
BOOL bTestPedEnterVehicle
BOOL bTestPedLeaveVehicle
BOOL bTestPedDriveVehicleToCoord
BOOL bTestPedDriveVehicleWander
BOOL bTestPedDriveVehicleMission
BOOL bClearTestPedTasks
BOOL bClearTestPedTasksImmediately
BOOL bDisplayScriptTaskStatus
BOOL bGivePedWeapon
BOOL bGivePedGrenade
PROC ADD_TASK_DEBUG_WIDGETS()
START_WIDGET_GROUP("Task Debug Widgets")
ADD_WIDGET_BOOL("Test Rappel task", bTestRappelTask)
ADD_WIDGET_BOOL("Create Test Ped", bCreateTestPed)
ADD_WIDGET_BOOL("Create Test Vehicle", bCreateTestVehicle)
START_WIDGET_GROUP("Basic Tasks")
ADD_WIDGET_BOOL("Play Anim On Test Ped", bPlayAnimOnTestPed)
ADD_WIDGET_BOOL("Make Test Ped Flee From Player", bTestPedFleeFromPlayer)
ADD_WIDGET_BOOL("Make Test Ped Flee From Point", bTestPedFleeFromPoint)
ADD_WIDGET_BOOL("Make Test Ped Follow Nav Mesh", bTestPedFollowNavMesh)
ADD_WIDGET_BOOL("Make Test Ped Go To Coord", bTestPedGoToCoord)
ADD_WIDGET_BOOL("Make Test Ped Stand Still", bTestPedStandStill)
ADD_WIDGET_BOOL("Make Test Ped Throw Projectile", bTestPedThrowProjectile)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Combat Tasks")
ADD_WIDGET_BOOL("Make Test Ped Combat Hated Peds", bTestPedCombatHatedPeds)
ADD_WIDGET_BOOL("Make Test Ped Go To Coord Aiming", bTestPedGoToCoordAiming)
ADD_WIDGET_BOOL("Make Test Ped Perform Sequence", bTestPedPerformSequence)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Vehicle Tasks")
ADD_WIDGET_BOOL("Make Test Ped Enter Vehicle", bTestPedEnterVehicle)
ADD_WIDGET_BOOL("Make Test Ped Leave Vehicle", bTestPedLeaveVehicle)
ADD_WIDGET_BOOL("Make Test Drive Vehicle To Coord", bTestPedDriveVehicleToCoord)
ADD_WIDGET_BOOL("Make Test Ped Drive Vehicle Wander", bTestPedDriveVehicleWander)
ADD_WIDGET_BOOL("Make Test Ped Follow Vehicle Mission", bTestPedDriveVehicleMission)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Inventory")
ADD_WIDGET_BOOL("Give Test Ped Weapon", bGivePedWeapon)
ADD_WIDGET_BOOL("Give Test Ped Grenade", bGivePedGrenade)
STOP_WIDGET_GROUP()
ADD_WIDGET_BOOL("Clear test ped tasks", bClearTestPedTasks)
ADD_WIDGET_BOOL("Clear test ped tasks immediately", bClearTestPedTasksImmediately)
ADD_WIDGET_BOOL("Display Script Task Status", bDisplayScriptTaskStatus)
STOP_WIDGET_GROUP()
ENDPROC
BOOL bTeamDoToggle
// //Process team relationships
PROC PROCESS_RELATIONSHIP_GROUPS()
IF bSetToOwnTeam=TRUE
IF bTeamDoToggle = FALSE
IF GET_PLAYER_TEAM(PLAYER_ID()) <> 1
AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
// NET_PRINT("PARTICIPANT_ID_TO_INT() ")NET_PRINT_INT(PARTICIPANT_ID_TO_INT())
SET_PLAYER_TEAM(PLAYER_ID(), 1)
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), lrgFM_Team[1])
NET_PRINT(" -----> PLAYER SET TO OWN TEAM <----- \n")
bTeamDoToggle = TRUE
ENDIF
ENDIF
ELIF bTeamDoToggle
IF GET_PLAYER_TEAM(PLAYER_ID()) <> -1
AND NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
bTeamDoToggle = FALSE
SET_PLAYER_TEAM(PLAYER_ID(), -1)
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), rgFM_Default)
NET_PRINT(" -----> PLAYER SET TO DEFAULT TEAM <----- \n")
ENDIF
ENDIF
ENDPROC
//Process temporary test code
NETWORK_INDEX TestPed
NETWORK_INDEX TestVehicle
ROPE_INDEX TestRopeID
PROC PROCESS_TASK_DEBUG()
IF bTestRappelTask
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<29.23, 50, 11>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 286)
TestRopeID = ADD_ROPE(<<30, 50.75, 10.7>>, <<0,90,0>>, 20.0, PHYSICS_ROPE_DEFAULT)
TASK_RAPPEL_DOWN_WALL(PLAYER_PED_ID(), <<29.23, 50, 12>>, <<30, 50.75, 10.7>>, 2.5, TestRopeID)
bTestRappelTask = FALSE
ENDIF
ENDIF
IF DOES_ROPE_EXIST(TestRopeID)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SCRIPTTASKSTATUS iStatus = GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_RAPPEL_DOWN_WALL)
IF iStatus != WAITING_TO_START_TASK AND iStatus != PERFORMING_TASK
DELETE_ROPE(TestRopeID)
ENDIF
ENDIF
ENDIF
IF bCreateTestPed
IF REQUEST_LOAD_MODEL(A_M_Y_METHHEAD_01)
IF CREATE_NET_PED(TestPed, PEDTYPE_CIVMALE, A_M_Y_METHHEAD_01, <<14,-12,1>>, 180, FALSE)
bCreateTestPed = FALSE
ENDIF
ENDIF
ENDIF
IF bCreateTestVehicle
IF REQUEST_LOAD_MODEL(TAILGATER)
IF CREATE_NET_VEHICLE(TestVehicle, TAILGATER, <<6,-22,1>>, 0, FALSE)
bCreateTestVehicle = FALSE
ENDIF
ENDIF
ENDIF
//
// IF bPlayAnimOnTestPed
// IF NETWORK_DOES_NETWORK_ID_EXIST(TestPed)
// REQUEST_ANIM_DICT("mp_arresting")
// WHILE NOT HAS_ANIM_DICT_LOADED("mp_arresting")
// WAIT(0)
// ENDWHILE
// IF NOT IS_ENTITY_DEAD(NET_TO_PED(TestPed))
// TASK_PLAY_ANIM(NET_TO_PED(TestPed), "mp_arresting", "guard_handsup_loop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
// bPlayAnimOnTestPed = FALSE
// ENDIF
// ENDIF
// ENDIF
IF NETWORK_DOES_NETWORK_ID_EXIST(TestPed)
IF NOT IS_ENTITY_DEAD(NET_TO_PED(TestPed))
IF NETWORK_HAS_CONTROL_OF_ENTITY(NET_TO_PED(TestPed))
WEAPON_TYPE weaponType
IF bGivePedWeapon
weaponType = WEAPONTYPE_PISTOL
ELSE
IF bGivePedGrenade
weaponType = WEAPONTYPE_GRENADE
ENDIF
ENDIF
IF bGivePedWeapon OR bGivePedGrenade
IF NOT HAS_PED_GOT_WEAPON(NET_TO_PED(TestPed), weaponType)
GIVE_WEAPON_TO_PED(NET_TO_PED(TestPed), weaponType, -1, FALSE)
ENDIF
SET_CURRENT_PED_WEAPON(NET_TO_PED(TestPed), weaponType, TRUE)
ENDIF
ENDIF
IF bTestPedFleeFromPlayer
TASK_SMART_FLEE_PED(NET_TO_PED(TestPed), PLAYER_PED_ID(), 100.0, 5000)
bTestPedFleeFromPlayer = FALSE
ENDIF
IF bTestPedFleeFromPoint
TASK_SMART_FLEE_COORD(NET_TO_PED(TestPed), <<14,-12,1>>, 100.0, 5000)
bTestPedFleeFromPoint = FALSE
ENDIF
IF bTestPedFollowNavMesh
TASK_FOLLOW_NAV_MESH_TO_COORD(NET_TO_PED(TestPed), <<14,-12,1>>, PEDMOVE_WALK)
bTestPedFollowNavMesh = FALSE
ENDIF
IF bTestPedGoToCoord
TASK_GO_STRAIGHT_TO_COORD(NET_TO_PED(TestPed), <<14,-12,1>>, PEDMOVE_WALK)
bTestPedGoToCoord = FALSE
ENDIF
IF bTestPedStandStill
TASK_STAND_STILL(NET_TO_PED(TestPed), 5000)
bTestPedStandStill = FALSE
ENDIF
IF bTestPedThrowProjectile
TASK_THROW_PROJECTILE(NET_TO_PED(TestPed), <<13,-20,1>>)
bTestPedThrowProjectile = FALSE
ENDIF
IF bTestPedCombatHatedPeds
SET_PED_RELATIONSHIP_GROUP_HASH(NET_TO_PED(TestPed), RELGROUPHASH_HATES_PLAYER)
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(NET_TO_PED(TestPed), 25.0)
bTestPedCombatHatedPeds = FALSE
ENDIF
IF bTestPedGoToCoordAiming
TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD(NET_TO_PED(TestPed), <<14,-12,1>>, <<14,-12,1>>, PEDMOVE_WALK, FALSE)
bTestPedGoToCoordAiming = FALSE
ENDIF
IF bTestPedPerformSequence
TASK_PERFORM_SEQUENCE(NET_TO_PED(TestPed), SequenceIndex)
bTestPedPerformSequence = FALSE
ENDIF
IF NETWORK_DOES_NETWORK_ID_EXIST(TestVehicle)
IF NOT IS_ENTITY_DEAD(NET_TO_VEH(TestVehicle))
IF bTestPedEnterVehicle
TASK_ENTER_VEHICLE(NET_TO_PED(TestPed), NET_TO_VEH(TestVehicle))
bTestPedEnterVehicle = FALSE
ENDIF
IF bTestPedLeaveVehicle
TASK_LEAVE_ANY_VEHICLE(NET_TO_PED(TestPed))
bTestPedLeaveVehicle = FALSE
ENDIF
IF bTestPedDriveVehicleToCoord
TASK_VEHICLE_DRIVE_TO_COORD(NET_TO_PED(TestPed),
NET_TO_VEH(TestVehicle),
<<6,-22,1>>,
12.0,
DRIVINGSTYLE_NORMAL,
GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_IN(NET_TO_PED(TestPed))),
DRIVINGMODE_AVOIDCARS,
1,
1)
bTestPedDriveVehicleToCoord = FALSE
ENDIF
IF bTestPedDriveVehicleWander
TASK_VEHICLE_DRIVE_WANDER(NET_TO_PED(TestPed),
NET_TO_VEH(TestVehicle),
12.0,
DRIVINGMODE_AVOIDCARS)
bTestPedDriveVehicleWander = FALSE
ENDIF
IF bTestPedDriveVehicleMission
TASK_VEHICLE_MISSION_COORS_TARGET(NET_TO_PED(TestPed),
NET_TO_VEH(TestVehicle),
<<6,-22,1>>,
MISSION_GOTO,
10.0,
DRIVINGMODE_AVOIDCARS,
-1,
-1)
bTestPedDriveVehicleMission = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF bClearTestPedTasks
IF NETWORK_DOES_NETWORK_ID_EXIST(TestPed)
IF NOT IS_ENTITY_DEAD(NET_TO_PED(TestPed))
CLEAR_PED_TASKS(NET_TO_PED(TestPed))
SET_PED_RELATIONSHIP_GROUP_HASH(NET_TO_PED(TestPed), RELGROUPHASH_PLAYER)
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), rgFM_Default)
bClearTestPedTasks = FALSE
ENDIF
ENDIF
ENDIF
IF bClearTestPedTasksImmediately
IF NETWORK_DOES_NETWORK_ID_EXIST(TestPed)
IF NOT IS_ENTITY_DEAD(NET_TO_PED(TestPed))
CLEAR_PED_TASKS_IMMEDIATELY(NET_TO_PED(TestPed))
SET_PED_RELATIONSHIP_GROUP_HASH(NET_TO_PED(TestPed), RELGROUPHASH_PLAYER)
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), rgFM_Default)
bClearTestPedTasksImmediately = FALSE
ENDIF
ENDIF
ENDIF
IF bDisplayScriptTaskStatus
IF NETWORK_DOES_NETWORK_ID_EXIST(TestPed)
IF NOT IS_ENTITY_DEAD(NET_TO_PED(TestPed))
SCRIPTTASKSTATUS iStatus = GET_SCRIPT_TASK_STATUS(NET_TO_PED(TestPed), SCRIPT_TASK_PLAY_ANIM)
IF iStatus = WAITING_TO_START_TASK
NET_PRINT("TASK WAITING TO START") NET_NL()
ELSE
IF iStatus = PERFORMING_TASK
NET_PRINT("TASK RUNNING") NET_NL()
ELSE
NET_PRINT("TASK NOT RUNNING") NET_NL()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
// PROC CREATE_TEST_SCRIPT_WIDGETS()
//
// INT iPlayer
// TEXT_LABEL_63 tl63
//
// IF NOT DOES_WIDGET_GROUP_EXIST(missionTab)
//
// missionTab = START_WIDGET_GROUP(tl31MissionName)
// ADD_WIDGET_BOOL( "bHasPlayerSwapped", bHasPlayerSwapped)
// ADD_WIDGET_BOOL( "bSetUpUsjs", bSetUpUsjs)
//
// START_WIDGET_GROUP( "Les Widgets")
// ADD_WIDGET_FLOAT_SLIDER("Player Weapon Damage Modifier", lw_fPlayerWeaponDamageModifier, 0.0, 100.0, 0.1)
// ADD_WIDGET_BOOL( "Set Player Weapon Damage Modifier", lw_bSetPlayerWeaponDamageModifier)
// STOP_WIDGET_GROUP()
//
//
// // Gameplay debug, sever only.
// START_WIDGET_GROUP("Server Only Gameplay")
// ADD_WIDGET_BOOL("All: Swap Teams", GlobalServerBD_FM.bSwapTeams)
// ADD_WIDGET_BOOL("All: End Match", bHostEndGameNow)
// ADD_WIDGET_BOOL("All: End Session", bHostAllLeave)
// ADD_WIDGET_BOOL("bHostDoNotEndGame", bHostDoNotEndGame)
// STOP_WIDGET_GROUP()
//
// // Data about the server
// START_WIDGET_GROUP("Server BD")
// ADD_WIDGET_INT_SLIDER("S. Game state", GlobalServerBD.iServerGameState,-1, HIGHEST_INT,1)
// STOP_WIDGET_GROUP()
//
// // Data about the clients. * = You.
// START_WIDGET_GROUP("Client BD")
// REPEAT NUM_NETWORK_PLAYERS iPlayer
// tl63 = "Player "
// tl63 += iPlayer
// IF iPlayer = PARTICIPANT_ID_TO_INT()
// tl63 += "*"
// ENDIF
// START_WIDGET_GROUP(tl63)
// ADD_WIDGET_INT_SLIDER("Game state", GlobalplayerBD[iPlayer].iGameState,-1, HIGHEST_INT,1)
//
// START_WIDGET_GROUP("Weapon swapping")
// ADD_WIDGET_INT_READ_ONLY("State", GlobalplayerBD[iPlayer].weaponSwappingData.iState)
// ADD_WIDGET_INT_READ_ONLY("Part interacting with", GlobalplayerBD[iPlayer].weaponSwappingData.iPlayerInteractingWith)
// ADD_WIDGET_INT_READ_ONLY("Ammo", GlobalplayerBD[iPlayer].weaponSwappingData.iAmmo)
// STOP_WIDGET_GROUP()
// STOP_WIDGET_GROUP()
// ENDREPEAT
//
// STOP_WIDGET_GROUP()
//
// START_WIDGET_GROUP("Debug Task Sequence")
// ADD_WIDGET_BOOL("Open", bOpenTaskSequence)
// ADD_WIDGET_BOOL("Start", bStartTaskSequence)
// STOP_WIDGET_GROUP()
//
// ADD_RELATIONSHIP_GROUP_WIDGETS()
//
// CREATE_BOT_WIDGET(TRUE)
//
// ADD_TASK_DEBUG_WIDGETS()
//
// Create_Main_Generic_Client_Widgets()
// Create_Main_Generic_Server_Widgets()
//
// STOP_WIDGET_GROUP()
//
// SET_CURRENT_WIDGET_GROUP(missionTab)
// ADD_SPAWNING_WIDGETS()
// CLEAR_CURRENT_WIDGET_GROUP(missionTab)
// ENDIF
// ENDPROC
#ENDIF
// ----------------------------------- STAGE FUNCTIONS
PROC SET_CLIENT_GAME_STATE(INT iStage)
SWITCH iStage
CASE MAIN_GAME_STATE_INI
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_CLIENT_GAME_STATE >>> MAIN_GAME_STATE_INI ", tl31MissionName) NET_NL()
#ENDIF
BREAK
CASE MAIN_GAME_STATE_WAIT
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_CLIENT_GAME_STATE >>> MAIN_GAME_STATE_WAIT ", tl31MissionName) NET_NL()
#ENDIF
BREAK
CASE MAIN_GAME_STATE_INITIAL_CAMERA_WORK
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_CLIENT_GAME_STATE >>> MAIN_GAME_STATE_INITIAL_CAMERA_WORK ", tl31MissionName) NET_NL()
#ENDIF
BREAK
CASE MAIN_GAME_STATE_FIRST_SPAWN
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_CLIENT_GAME_STATE >>> MAIN_GAME_STATE_FIRST_SPAWN ", tl31MissionName) NET_NL()
#ENDIF
BREAK
CASE MAIN_GAME_STATE_RUNNING
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_CLIENT_GAME_STATE >>> MAIN_GAME_STATE_RUNNING ", tl31MissionName) NET_NL()
#ENDIF
BREAK
CASE MAIN_GAME_STATE_END
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_CLIENT_GAME_STATE >>> MAIN_GAME_STATE_END ", tl31MissionName) NET_NL()
#ENDIF
BREAK
CASE MAIN_GAME_STATE_ALL_LEAVE
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_CLIENT_GAME_STATE >>> MAIN_GAME_STATE_ALL_LEAVE ", tl31MissionName) NET_NL()
#ENDIF
BREAK
CASE MAIN_GAME_STATE_SWAP_TEAM
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_CLIENT_GAME_STATE >>> MAIN_GAME_STATE_SWAP_TEAM ", tl31MissionName) NET_NL()
#ENDIF
BREAK
CASE MAIN_GAME_STATE_CHOOSE_ALTERNATIVE_TEAM
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_CLIENT_GAME_STATE >>> MAIN_GAME_STATE_CHOOSE_ALTERNATIVE_TEAM ", tl31MissionName) NET_NL()
#ENDIF
BREAK
CASE MAIN_GAME_STATE_RUN_LOBBY
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_CLIENT_GAME_STATE >>> MAIN_GAME_STATE_RUN_LOBBY ", tl31MissionName) NET_NL()
#ENDIF
BREAK
CASE MAIN_GAME_STATE_HOLD_FOR_TRANSITION
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_CLIENT_GAME_STATE >>> MAIN_GAME_STATE_HOLD_FOR_TRANSITION ", tl31MissionName) NET_NL()
#ENDIF
BREAK
CASE MAIN_GAME_STATE_RUN_TRANSITION
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_CLIENT_GAME_STATE >>> MAIN_GAME_STATE_RUN_TRANSITION ", tl31MissionName) NET_NL()
#ENDIF
BREAK
DEFAULT
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("SET_CLIENT_GAME_STATE Deathmath.sc invalid option")
#ENDIF
BREAK
ENDSWITCH
GlobalplayerBD[NATIVE_TO_INT(PLAYER_ID())].iGameState = iStage
ENDPROC
PROC SET_SERVER_GAME_STATE(INT iStage)
#IF IS_DEBUG_BUILD
NET_SCRIPT_HOST_ONLY_COMMAND_ASSERT("SET_SERVER_GAME_STATE Called on client by mistake")
#ENDIF
SWITCH iStage
CASE MAIN_GAME_STATE_INI
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_SERVER_GAME_STATE >>> MAIN_GAME_STATE_INI ", tl31MissionName) NET_NL()
#ENDIF
BREAK
CASE MAIN_GAME_STATE_WAIT
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_SERVER_GAME_STATE >>> MAIN_GAME_STATE_WAIT ", tl31MissionName) NET_NL()
#ENDIF
BREAK
CASE MAIN_GAME_STATE_INITIAL_CAMERA_WORK
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_SERVER_GAME_STATE >>> MAIN_GAME_STATE_INITIAL_CAMERA_WORK ", tl31MissionName) NET_NL()
#ENDIF
BREAK
CASE MAIN_GAME_STATE_FIRST_SPAWN
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_SERVER_GAME_STATE >>> MAIN_GAME_STATE_FIRST_SPAWN ", tl31MissionName) NET_NL()
#ENDIF
BREAK
CASE MAIN_GAME_STATE_RUNNING
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_SERVER_GAME_STATE >>> MAIN_GAME_STATE_RUNNING ", tl31MissionName) NET_NL()
#ENDIF
BREAK
CASE MAIN_GAME_STATE_END
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_SERVER_GAME_STATE >>> MAIN_GAME_STATE_END ", tl31MissionName) NET_NL()
#ENDIF
BREAK
CASE MAIN_GAME_STATE_ALL_LEAVE
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_SERVER_GAME_STATE >>> MAIN_GAME_STATE_ALL_LEAVE ", tl31MissionName) NET_NL()
#ENDIF
BREAK
CASE MAIN_GAME_STATE_SWAP_TEAM
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_SERVER_GAME_STATE >>> MAIN_GAME_STATE_SWAP_TEAM ", tl31MissionName) NET_NL()
#ENDIF
BREAK
CASE MAIN_GAME_STATE_CHOOSE_ALTERNATIVE_TEAM
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_SERVER_GAME_STATE >>> MAIN_GAME_STATE_CHOOSE_ALTERNATIVE_TEAM ", tl31MissionName) NET_NL()
#ENDIF
BREAK
CASE MAIN_GAME_STATE_RUN_LOBBY
#IF IS_DEBUG_BUILD
NET_PRINT_TIME() NET_PRINT_STRINGS("SET_SERVER_GAME_STATE >>> MAIN_GAME_STATE_RUN_LOBBY ", tl31MissionName) NET_NL()
#ENDIF
BREAK
DEFAULT
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("SET_SERVER_GAME_STATE Deathmath.sc invalid option")
#ENDIF
BREAK
ENDSWITCH
GlobalServerBD.iServerGameState = iStage
ENDPROC
//PROC RESET_FREEMODE_MISSION_PLAY_REQUEST_ARRAY()
// INT i
// FOR i = 0 TO (MAX_PENDING_PLAY_REQUESTS -1)
// g_sFM_play_request_detail[i].iMissionType = -1
// g_sFM_play_request_detail[i].iCreatorID = -1
// g_sFM_play_request_detail[i].iVariation = -1
// g_sFM_play_request_detail[i].vLocation = <<0.0, 0.0, 0.0>>
// g_sFM_play_request_detail[i].piFromPlayer = INT_TO_NATIVE(PLAYER_INDEX, -1)
// g_sFM_play_request_detail[i].iBitSet = 0
// ENDFOR
// g_iNumberStoredMessageRequests = 0
//ENDPROC
FUNC BOOL PROCESS_PRE_GAME()
INT i
NET_NL()NET_PRINT("PROCESS PREGAME - FREEMODE ")
// For this game, we can have 32 players. Other scripts may only have 8,12,16,24 ect players.
//RESET_FREEMODE_MISSION_PLAY_REQUEST_ARRAY()
// This makes sure the net script is active, waits untull it is.
HANDLE_NET_SCRIPT_INITIALISATION(FALSE, ENUM_TO_INT(GAMEMODE_FM))
RESERVE_NETWORK_MISSION_PEDS(1)
RESERVE_NETWORK_MISSION_VEHICLES(1)
// register the common broadcast data
NETWORK_REGISTER_HOST_BROADCAST_VARIABLES(GlobalServerBD, SIZE_OF(GlobalServerBD))
NETWORK_REGISTER_PLAYER_BROADCAST_VARIABLES(GlobalplayerBD, SIZE_OF(GlobalplayerBD))
NETWORK_REGISTER_HOST_BROADCAST_VARIABLES(GlobalServerBD_FM, SIZE_OF(GlobalServerBD_FM))
NETWORK_REGISTER_PLAYER_BROADCAST_VARIABLES(GlobalplayerBD_FM, SIZE_OF(GlobalplayerBD_FM))
// For the Missions Shared arrays
NETWORK_REGISTER_HOST_BROADCAST_VARIABLES(GlobalServerBD_MissionsShared, SIZE_OF(GlobalServerBD_MissionsShared))
// KGM: Wait for the first network broadcast before moving on
// (after Initialisation and Broadcast Variable Registration - Hosts can do this too)
IF NOT Wait_For_First_Network_Broadcast()
RETURN FALSE
ENDIF
SET_PLAYER_DEFAULT_FRIENDLY_FIRE_OPTION() //NETWORK_SET_FRIENDLY_FIRE_OPTION(TRUE)
//Clean up every thing before the initilisation
RESET_GlobalplayerBD_FM_2()
//Register the Vote Boradcast data
NETWORK_REGISTER_PLAYER_BROADCAST_VARIABLES(GlobalplayerBD_FM_2, SIZE_OF(GlobalplayerBD_FM_2))
// This script will not be paused if another script calls PAUSE_GAME
SET_THIS_SCRIPT_CAN_BE_PAUSED(FALSE)
SET_INSTANCE_PRIORITY_MODE(INSTANCE_MODE_MULTIPLAYER)
//Clear the time
SET_TIME_OF_DAY(TIME_OFF, TRUE)
INIT_STATS()
SET_MAX_WANTED_LEVEL(6)
SET_WANTED_LEVEL_MULTIPLIER(0.0)
SET_CREATE_RANDOM_COPS(TRUE)
SET_DITCH_POLICE_MODELS(FALSE)
// switch on emergency services in freemode
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_HELICOPTER, TRUE)
ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_SWAT_AUTOMOBILE, TRUE)
ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_RIDERS, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_VEHICLE_REQUEST, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_ROAD_BLOCK, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_PULLED_OVER, TRUE)
ENABLE_DISPATCH_SERVICE(DT_POLICE_AUTOMOBILE_WAIT_CRUISING, TRUE)
ENABLE_DISPATCH_SERVICE(DT_SWAT_HELICOPTER, TRUE)
// In FM, make sure each player has their own colour, and not the common
// team colour.
USE_PLAYER_COLOUR_INSTEAD_OF_TEAM_COLOUR(TRUE)
// Setup rel groups
ADD_RELATIONSHIP_GROUP("rgFM_Default", rgFM_Default)
REPEAT NUM_NETWORK_PLAYERS i
TEXT_LABEL_63 tlRelGroup
tlRelGroup = "lrgFM_Team"
tlRelGroup += i
ADD_RELATIONSHIP_GROUP(tlRelGroup, lrgFM_Team[i])
ENDREPEAT
SET_TEAM_RELATIONSHIPS(ACQUAINTANCE_TYPE_PED_HATE, rgFM_Default)
REPEAT NUM_NETWORK_PLAYERS i
SET_TEAM_RELATIONSHIPS(ACQUAINTANCE_TYPE_PED_HATE, lrgFM_Team[i])
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, lrgFM_Team[i], rgFM_Default)
ENDREPEAT
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), rgFM_Default) //lrgFM_Team[PARTICIPANT_ID_TO_INT()]) //Put all players on default team to start with rgFM_Default#
//SET_CAN_ATTACK_FRIENDLY(PLAYER_PED_ID(), TRUE, TRUE)
PRINTLN("SET_CAN_ATTACK_FRIENDLY")
//SET_PED_CAN_BE_TARGETTED_BY_TEAM(PLAYER_PED_ID(), -1, TRUE)
ENDIF
UPDATE_ACTIVE_PLAYERS_IN_MP_LAUNCH_SCRIPT()
IF NETWORK_IS_HOST_OF_THIS_SCRIPT()
//NETWORK_SET_WEATHER("SMOG", 0, TRUE)
ENDIF
#IF IS_DEBUG_BUILD
NET_PRINT_STRING_INT("NATIVE_TO_INT(PLAYER_ID()) = ", NATIVE_TO_INT(PLAYER_ID())) NET_NL()
IF NOT CREATE_NETWORK_BOTS_RELATIONSHIP_GROUPS()
SCRIPT_ASSERT("NOT CREATE_NETWORK_BOTS_RELATIONSHIP_GROUPS")
ENDIF
#ENDIF
// Reset kill and death counters when player joins (CS)
INITIALISE_KILL_AND_DEATH_COUNTERS()
// Speirs added 07/07/11 to fix 153666
// Set frontend player blip name
BLIP_INDEX playerBlip = GET_MAIN_PLAYER_BLIP_ID()
IF DOES_BLIP_EXIST(playerBlip)
SET_BLIP_NAME_FROM_TEXT_FILE(playerBlip, "BLIP_PLAYER")
ENDIF
//Set it so people can attack me.
SET_EVERYONE_CAN_KILL_LOCAL_PLAYER(TRUE)
PRINTLN("Calling SET_EVERYONE_CAN_KILL_LOCAL_PLAYER")
SET_CLIENT_GAME_STATE(MAIN_GAME_STATE_INI)
INIT_STAT_TIMERS()
RETURN TRUE
ENDFUNC
PROC MAINTAIN_CLEAN_UP_WHEN_NOT_ON_A_MISSION()
IF g_bFreemodeCleanUpAfterMission = TRUE
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), rgFM_Default) //lrgFM_Team[PARTICIPANT_ID_TO_INT()]) //Put all players on default team to start with rgFM_Default#
//SET_CAN_ATTACK_FRIENDLY(PLAYER_PED_ID(), TRUE, TRUE)
PRINTLN("SET_CAN_ATTACK_FRIENDLY Called")
//SET_PED_CAN_BE_TARGETTED_BY_TEAM(PLAYER_PED_ID(), -1, TRUE)
PRINTLN("MAINTAIN_CLEAN_UP_WHEN_NOT_ON_A_MISSION() Called")
g_bFreemodeCleanUpAfterMission = FALSE
ENDIF
ENDIF
ENDPROC
PROC MAINTAIN_FREEMODE_DPAD_DOWN()
IF MAINTAIN_DPADDOWN_CHECK()
IF GET_DPADDOWN_ACTIVATION_STATE() != DPADDOWN_NONE
IF HAS_NET_TIMER_EXPIRED_ONE_FRAME(MPGlobalsHud.iOnMissionOverlayTimer, DPAD_DOWN_DISPLAY_TIME)
SET_DPADDOWN_ACTIVATION_STATE(DPADDOWN_NONE)
DPADDOWN_ONE_TIME_ACTIVE(FALSE)
ENDIF
ENDIF
ENDIF
ENDPROC
////PURPOSE: Does a full 32 player repeat
//PROC MAINTAIN_32_PLYR_REPEAT()
// INT iParticipant
// PLAYER_INDEX PlayerId
// INT iCount
//
// #IF IS_DEBUG_BUILD
// ADD_SCRIPT_PROFILE_PRE_LOOP_MARKER("loop")
// #ENDIF
//
// REPEAT NETWORK_GET_MAX_NUM_PARTICIPANTS() iCount
//
// #IF IS_DEBUG_BUILD
// ADD_SCRIPT_PROFILE_MARKER("START OF REPEAT", 0)
// #ENDIF
//
// // if we are simulating max number of players then set the player id here
// iParticipant = iCount
// PlayerID = INVALID_PLAYER_INDEX()
// IF NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iParticipant))
// PlayerId = NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iParticipant))
//
// MPGlobals.vWarpRequest[iCount] = <<0.0, 0.0, 0.0>> // reset these each frame
//
// IF IS_NET_PLAYER_OK(PlayerId, FALSE, FALSE)
//
// #IF IS_DEBUG_BUILD
// ADD_SCRIPT_PROFILE_MARKER("IS_NET_PLAYER_OK", 1)
// #ENDIF
//
// // INT iPlayersGlobalInt = NATIVE_TO_INT(PlayerId)
// // INT iLocalPlayersIdtoGlobalInt = NETWORK_PLAYER_ID_TO_INT()
//
// // --------------------------------------------------------------------------------//
// // Blips
// // --------------------------------------------------------------------------------//
//
// // Do blips for players.
// HANDLE_FM_PLAYER_BLIPS(iParticipant)
// #IF IS_DEBUG_BUILD
// ADD_SCRIPT_PROFILE_MARKER("HANDLE_PLAYER_BLIPS", 7)
// #ENDIF
//
// // -----------------------------------------------------------------------------------------------//
// // These procs and funcs were previously repeats that we had to move in here.
// // They set a temp flag that in turn sets a global flag for a specific command to check against.
// // -----------------------------------------------------------------------------------------------//
// IF PLAYER_ID() <> PlayerId
//
// // Check if I can offer this player my weapon
// CHECK_PLAYER_WEAPON_OFFERING(iParticipant, PlayerId)
// #IF IS_DEBUG_BUILD
// ADD_SCRIPT_PROFILE_MARKER("weapon swap", 17)
// #ENDIF
// ENDIF
//
// //DISPLAY_WEAPON_SWAP_HUD(iParticipant)
// ENDIF
// ENDIF
//
// ENDREPEAT
//
// #IF IS_DEBUG_BUILD
// ADD_SCRIPT_PROFILE_POST_LOOP_MARKER()
// #ENDIF
//
//ENDPROC
PROC SETUP_FM_USJS()
DISABLE_STUNT_JUMP_SET(ciSINGLE_PLAYER_SJS_GROUP)
PRINTLN("MPUSJ - DISABLE_STUNT_JUMP_SET(ciSINGLE_PLAYER_SJS_GROUP)")
ENABLE_STUNT_JUMP_SET(ciFREEMODE_PLAYER_SJS_GROUP)
PRINTLN("MPUSJ - ENABLE_STUNT_JUMP_SET(ciFREEMODE_PLAYER_SJS_GROUP)")
ENDPROC
PROC ACTIVATE_SHOPS_IN_FM()
SET_SHOP_IS_AVAILABLE(CLOTHES_SHOP_L_01_SC, TRUE)
SET_SHOP_IS_AVAILABLE(CLOTHES_SHOP_M_01_SM, TRUE)
SET_SHOP_IS_AVAILABLE(CLOTHES_SHOP_H_01_BH, TRUE)
SET_SHOP_IS_AVAILABLE(HAIRDO_SHOP_01_BH, TRUE)
SET_SHOP_IS_AVAILABLE(HAIRDO_SHOP_02_SC, TRUE)
SET_SHOP_IS_AVAILABLE(TATTOO_PARLOUR_01_HW, TRUE)
SET_SHOP_IS_AVAILABLE(CARMOD_SHOP_01_AP, TRUE)
SET_SHOP_IS_AVAILABLE(GUN_SHOP_01_DT, TRUE)
SET_SHOP_LOCATES_ARE_BLOCKED(CLOTHES_SHOP_L_01_SC, FALSE)
SET_SHOP_LOCATES_ARE_BLOCKED(CLOTHES_SHOP_M_01_SM, FALSE)
SET_SHOP_LOCATES_ARE_BLOCKED(CLOTHES_SHOP_H_01_BH, FALSE)
SET_SHOP_LOCATES_ARE_BLOCKED(HAIRDO_SHOP_01_BH, FALSE)
SET_SHOP_LOCATES_ARE_BLOCKED(HAIRDO_SHOP_02_SC, FALSE)
SET_SHOP_LOCATES_ARE_BLOCKED(TATTOO_PARLOUR_01_HW, FALSE)
SET_SHOP_LOCATES_ARE_BLOCKED(CARMOD_SHOP_01_AP, FALSE)
SET_SHOP_LOCATES_ARE_BLOCKED(GUN_SHOP_01_DT, FALSE)
ENDPROC
PROC SCRIPT_CLEANUP()
// Cleanup Widgets
#IF IS_DEBUG_BUILD
// Keith 14/12/11: Terminate The Generic Client and Server Routines
Destroy_Main_Generic_Client_Widgets()
Destroy_Main_Generic_Server_Widgets()
g_MainMissionScriptID = INT_TO_NATIVE(THREADID, -1)
g_bMainMissionScriptActive = FALSE
CLEANUP_BOTS()
NET_PRINT("...KGM MP: Cleaning Up MPTESTBED") NET_NL()
#ENDIF
Cleanup_Main_Generic_Client()
// Clean up police scanner radio. Allow ambient reports again.
SET_AUDIO_FLAG("OnlyAllowScriptTriggerPoliceScanner", FALSE)
CLEANUP_FM_BLIPS()
CLEAR_HELP()
CLEAR_PRINTS()
// TERMINATE_THIS_MULTIPLAYER_THREAD()
Cleanup_Main_Generic_Client() // call this just before the terminate (as it wipes the globals)
TERMINATE_THIS_MULTIPLAYER_THREAD_NO_ARGS()
ENDPROC
FUNC INT GET_NUM_FREEMODE_PLAYERS()
INT iParticipant
INT iPlayerCount
REPEAT NETWORK_GET_MAX_NUM_PARTICIPANTS() iParticipant
IF NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iParticipant))
iPlayerCount++
ENDIF
ENDREPEAT
RETURN iPlayerCount
ENDFUNC
// Repeat through all clients
PROC MAINTAIN_FREEMODE_PLAYER_LOOP()
INT iParticipant
PLAYER_INDEX PlayerId
INT iCount
BOOL bIsDpaddownActive = (GET_DPADDOWN_ACTIVATION_STATE() != DPADDOWN_NONE)
REPEAT NETWORK_GET_MAX_NUM_PARTICIPANTS() iCount
iParticipant = iCount
// Gamertags above heads probably temp solution (Speirs 357426 17/02/2012)
IF NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iParticipant))
PlayerId = NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iParticipant))
IF IS_NET_PLAYER_OK(PlayerId)
IF PlayerId != PLAYER_ID()
//IF GET_PLAYER_TEAM(PlayerId) >= 0
IF GET_PLAYER_TEAM(PlayerId) != GET_PLAYER_TEAM(PLAYER_ID())
NETWORK_SET_ANTAGONISTIC_TO_PLAYER(TRUE, PlayerId)
ENDIF
//ENDIF
ENDIF
IF IS_NET_PLAYER_OK(PLAYER_ID())
RUN_OVERALL_FREEMODE_LOGIC_CHECKS(PlayerId, iParticipant, bIsDpaddownActive )
PROCESS_PLAYER_NAME_DISPLAY_FM_DM_RC(PlayerId, iParticipant)
ELSE
HIDE_ALL_ABOVE_HEAD_DISPLAY_FOR_PLAYER_NOW(PlayerId, iParticipant)
ENDIF
ENDIF
ELSE
CLEANUP_ABOVE_HEAD_DISPLAY(iParticipant,PlayerId )
ENDIF
ENDREPEAT
NETWORK_SET_ANTAGONISTIC_TO_PLAYER(TRUE, INVALID_PLAYER_INDEX())
ENDPROC
/// PURPOSE:
/// Routine to work through when trying to initially spawn the player
/// RETURNS:
/// True is spawn has happened
FUNC BOOL SPAWN_PLAYER_AT_TESTBED()
VECTOR vSpawnPosition = <<0.0, 0.0, 0.0>>
FLOAT fSpawnHeading = 0.0
NET_PRINT("SPAWN_PLAYER_AT_TESTBED() called...") NET_NL()
IF GET_SERVER_SCRIPT_GAME_STATE() > MAIN_GAME_STATE_INI
// Get a spawn position, then try to spawn the player
REQUEST_MODEL(MP_M_FREEMODE_01)
IF HAS_MODEL_LOADED(MP_M_FREEMODE_01)
IF HAS_GOT_SPAWN_LOCATION(vSpawnPosition, fSpawnHeading, SPAWN_LOCATION_NET_TEST_BED, FALSE)
// make sure there are no blips left from pevious lives
CLEANUP_ALL_PLAYER_BLIPS()
SET_NET_PLAYER_MODEL(MP_M_FREEMODE_01)
REQUEST_MODEL(MP_M_FREEMODE_01)
NET_SPAWN_PLAYER(vSpawnPosition , fSpawnHeading, SPAWN_REASON_MANUAL, SPAWN_LOCATION_AT_SPECIFIC_COORDS, FALSE, TRUE)
NET_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
IF NOT (IS_SCREEN_FADED_IN() OR IS_SCREEN_FADING_IN())
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
RETURN(TRUE)
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
#IF IS_DEBUG_BUILD
USING "player_ped_public.sch"
FUNC BOOL HAS_PLAYER_PED_MODEL_SWAPPED()
MODEL_NAMES mnTemp
WHILE NOT IS_NET_PLAYER_OK(PLAYER_ID(), FALSE, FALSE)
PRINTLN("HAS_PLAYER_PED_MODEL_SWAPPED- IS_NET_PLAYER_OK")
WAIT(0)
ENDWHILE
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
mnTemp = GET_ENTITY_MODEL(PLAYER_PED_ID())
ENDIF
IF mnTemp = GET_PLAYER_PED_MODEL(CHAR_TREVOR)
RETURN FALSE
ENDIF
IF mnTemp = GET_PLAYER_PED_MODEL(CHAR_MICHAEL)
RETURN FALSE
ENDIF
IF mnTemp = GET_PLAYER_PED_MODEL(CHAR_FRANKLIN)
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL CORRECT_PLAYER_PED()//VECTOR &vSpawnCoords, FLOAT &fSpawnHeading)
IF RandomModel= DUMMY_MODEL_FOR_SCRIPT
IF (GET_RANDOM_INT_IN_RANGE(0,2) = 0)
RandomModel = GET_RANDOM_PED_MODEL(TRUE)
ELSE
RandomModel = GET_RANDOM_PED_MODEL(FALSE)
ENDIF
ENDIF
PRINTSTRING("CORRECT_PLAYER_PED called")
IF LOAD_AND_SET_PLAYER_MODEL(RandomModel)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
//SET_CAN_ATTACK_FRIENDLY(PLAYER_PED_ID(), TRUE, TRUE)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, 32)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_ASSAULTRIFLE, 128)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
#ENDIF
#ENDIF
// ----------------------------------- MAIN LOOP ----------------------------------------------------------------------
SCRIPT
#IF IS_DEBUG_BUILD
#IF IS_DEBUG_BUILD
NET_PRINT("\n\n >>>> MPTestBed: Script Launched..... \n\n ")
#ENDIF
PRINTLN("LOAD_ALL_UGC_CONTENT_FOR_GTA_V_ONLINE - REQUEST_SCRIPT(\"UGC_Global_Registration\")")
REQUEST_SCRIPT("UGC_Global_Registration")
REQUEST_SCRIPT("UGC_Global_Registration_2")
WHILE NOT HAS_SCRIPT_LOADED("UGC_Global_Registration")
AND NOT HAS_SCRIPT_LOADED("UGC_Global_Registration_2")
WAIT(0)
REQUEST_SCRIPT("UGC_Global_Registration")
REQUEST_SCRIPT("UGC_Global_Registration_2")
ENDWHILE
START_NEW_SCRIPT("UGC_Global_Registration", MICRO_STACK_SIZE)
START_NEW_SCRIPT("UGC_Global_Registration_2", MICRO_STACK_SIZE)
PRINTLN("Give UGC_Global_Registration.sc one frame to run before requesting and launching mpTestBed.")
WAIT(0)
CLEAR_ALL_MP_GLOBALS() // should be called first.
SET_CURRENT_GAMEMODE(GAMEMODE_MPTESTBED)
// VECTOR vSpawnCoords
// FLOAT fSpawnHeading
NETWORK_SET_THIS_SCRIPT_IS_NETWORK_SCRIPT(NUM_NETWORK_PLAYERS, FALSE)
SHUTDOWN_LOADING_SCREEN()
Initialise_Main_Generic_Server()
// Carry out all the initial game starting duties.
IF NOT PROCESS_PRE_GAME()
NET_PRINT("\n\n >>>> MPTestbed: Failed to receive initial broadcast data. Cleaning up..... \n\n ")
SCRIPT_CLEANUP()
ENDIF
//KM:
Initialise_Main_Generic_Client()
// initialising stat timers
INIT_STAT_TIMERS()
//Turn off/On StuntJumps
SETUP_FM_USJS()
ACTIVATE_SHOPS_IN_FM()
// Turn off ambient cop dispatch (turned back on in script cleanup)
SET_AUDIO_FLAG("OnlyAllowScriptTriggerPoliceScanner", TRUE)
#IF IS_DEBUG_BUILD
g_MainMissionScriptID = GET_ID_OF_THIS_THREAD()
SET_CURRENT_GAMEMODE(GAMEMODE_FM)
NET_PRINT("\n\n >>>> Testbed: Started..... \n\n ")
#ENDIF
// Setup widgets
#IF IS_DEBUG_BUILD
g_bMainMissionScriptActive = TRUE
// CREATE_TEST_SCRIPT_WIDGETS()
//IF NOT HAS_PLAYER_PED_MODEL_SWAPPED()
// IF NETWORK_IS_IN_CODE_DEVELOPMENT_MODE()
// bHasPlayerSwapped = FALSE
PRINTSTRING(" HAS_PLAYER_PED_MODEL_SWAPPED bHasPlayerSwapped = FALSE")
// ELSE
// PRINTSTRING(" HAS_PLAYER_PED_MODEL_SWAPPED bHasPlayerSwapped = TRUE")
// bHasPlayerSwapped = TRUE
// ENDIF
#ENDIF
HIDE_HUD_AND_RADAR_THIS_FRAME()
// Main loop.
WHILE TRUE
// One wait to rule them all. This can be the ONLY wait from here on in.....
WAIT(0)
// Speirs added 08/06/12 (428425)
IF NOT IS_LOCAL_PLAYER_ON_ANY_FM_MISSION()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
//SET_CAN_ATTACK_FRIENDLY(PLAYER_PED_ID(), TRUE)
ENDIF
ENDIF
// If we have a match end event, bail.
IF SHOULD_THIS_MULTIPLAYER_THREAD_TERMINATE()
SCRIPT_CLEANUP()
ENDIF
g_iMPTimer = GET_NETWORK_TIME()
Maintain_Main_Generic_Client_Start_Of_Frame_Every_Frame(sHeistIslandTravel, sFMREScriptEventdata)
//Updates list of active player (has to be done after events as that updates list when someone joins or leaves)
SET_PLAYER_COUNTS()
// Deal with the debug.
#IF IS_DEBUG_BUILD
PROCESS_RELATIONSHIP_GROUPS()
PROCESS_TASK_DEBUG()
UPDATE_WIDGETS()
IF bOpenTaskSequence
FILL_SEQUENCE_TASK()
bOpenTaskSequence = FALSE
ENDIF
IF bStartTaskSequence
DEBUG_TASK_SEQUENCES()
bStartTaskSequence = FALSE
ENDIF
#ENDIF
// ----------------------------------- CLIENT
SWITCH GET_CLIENT_SCRIPT_GAME_STATE(PLAYER_ID())
// Wait until the server gives the all go before moving on.
CASE MAIN_GAME_STATE_INI
NET_NL()NET_PRINT("MAIN_GAME_STATE_INI")
IF GET_SERVER_SCRIPT_GAME_STATE() > MAIN_GAME_STATE_INI
/* BC: 08/05/2012 - Changed as I do all of this in the transition.
#IF IS_DEBUG_BUILD
IF g_UseNewTransitionSystem = FALSE
#ENDIF
IF LOAD_AND_SET_PLAYER_MODEL(RandomModel)
IF HAS_GOT_SPAWN_LOCATION(vSpawnCoords, fSpawnHeading, SPAWN_LOCATION_AUTOMATIC, FALSE)
//REQUEST_MODEL(GET_ENTITY_MODEL(PLAYER_PED_ID()))
//IF HAS_MODEL_LOADED(GET_ENTITY_MODEL(PLAYER_PED_ID()))
// NET_SPAWN_PLAYER(vSpawnCoords, fSpawnHeading)
ENABLE_STUNT_JUMP_SET(ciFREEMODE_PLAYER_SJS_GROUP)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_CAN_ATTACK_FRIENDLY(PLAYER_PED_ID(), TRUE, TRUE)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, 32)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_ASSAULTRIFLE, 128)
ENDIF
SET_CLIENT_GAME_STATE(MAIN_GAME_STATE_INITIAL_CAMERA_WORK)
//g_TransitionData.iTransitionStatsState = TRANSITION_STATS_STATE_SHUTDOWN
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
ENDIF
#ENDIF
*/
IF SPAWN_PLAYER_AT_TESTBED()
SET_GAME_STATE_ON_DEATH(AFTERLIFE_JUST_REJOIN)
SET_CLIENT_GAME_STATE(MAIN_GAME_STATE_RUN_TRANSITION)
ENDIF
ENDIF
BREAK
CASE MAIN_GAME_STATE_RUN_TRANSITION
NET_NL()NET_PRINT("MAIN_GAME_STATE_RUN_TRANSITION")
TRIGGER_TRANSITION_MENU_ACTIVE(FALSE) //Needs to be here so when DM_Deathmatch stops running, this can loop round and not instantly bring up the hud again.
SET_CLIENT_GAME_STATE(MAIN_GAME_STATE_HOLD_FOR_TRANSITION)
BREAK
CASE MAIN_GAME_STATE_HOLD_FOR_TRANSITION
NET_NL()NET_PRINT("MAIN_GAME_STATE_HOLD_FOR_TRANSITION")
// #IF IS_DEBUG_BUILD
// IF NOT bHasPlayerSwapped
// SET_CLIENT_GAME_STATE(MAIN_GAME_STATE_RUNNING)
// ENDIF
// IF NETWORK_IS_IN_CODE_DEVELOPMENT_MODE()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
SET_PED_DEFAULT_COMPONENT_VARIATION(PLAYER_PED_ID())
ENDIF
SET_CLIENT_GAME_STATE(MAIN_GAME_STATE_RUNNING)
// ENDIF
// #ENDIF
BREAK
CASE MAIN_GAME_STATE_INITIAL_CAMERA_WORK
//HIDE_HUD_AND_RADAR_THIS_FRAME()
IF bSetUpPlayer = FALSE
//IF IS_GANG_INTERIOR_LOADED(GET_PLAYER_TEAM(PLAYER_ID()))
// IF SPAWN_PLAYER_AT_GANG_HOUSE()
bSetUpPlayer = TRUE
// In freemode, it's everyone against everyone
SET_PLAYER_TEAM(PLAYER_ID(), -1)
PRINTSTRING(" Testbed - bSetUpPlayer - DONE")
// ENDIF
// ENDIF
ELSE
//IF NET_WARP_TO_COORD(vSpawnCoords, fSpawnHeading, FALSE, FALSE)
IF SET_SKYSWOOP_DOWN()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
SET_PED_DEFAULT_COMPONENT_VARIATION(PLAYER_PED_ID())
ENDIF
SET_CLIENT_GAME_STATE(MAIN_GAME_STATE_RUNNING)
PRINTSTRING(" TESTBED - MAIN_GAME_STATE_RUNNING - TESTBED INTRO CUTSCENE ALREADY DONE")
ENDIF
ENDIF
BREAK
// Main gameplay state.
CASE MAIN_GAME_STATE_RUNNING
/*IF NOT HAS_FREEMODE_INTRO_BEEN_DONE()
IF RUN_FREEMODE_INTRO_CUTSCENE()
PRINTSTRING(" FREEMODE - MAIN_GAME_STATE_RUNNING - RUN_FREEMODE_INTRO_CUTSCENE - DONE - B")
ENDIF
ENDIF*/
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
ENDIF
//If we are in game develoipment the force the player ped
// #IF IS_DEBUG_BUILD
// IF NOT bHasPlayerSwapped
// IF CORRECT_PLAYER_PED()
// bHasPlayerSwapped = TRUE
// ENDIF
// ENDIF
// //Run the debug health bars
// RUN_ALL_OVERHEAD_HEALTHBARS()
// #ENDIF
//DEAL_WITH_TRIGGER_TICKER()
#IF IS_DEBUG_BUILD
Maintain_Main_Generic_Client_TESTBED()
#ENDIF
UPDATE_PLAYER_RESPAWN_STATE()
MAINTAIN_FREEMODE_PLAYER_LOOP()
MAINTAIN_CLEAN_UP_WHEN_NOT_ON_A_MISSION()
MAINTAIN_FREEMODE_DPAD_DOWN()
RUN_RADAR_MAP()
// Process swapping weapons with other players
/*MAINTAIN_PLAYER_WEAPON_SWAPPING(iIsNetPlayerOK)
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("MAINTAIN_PLAYER_WEAPON_SWAPPING")
#ENDIF
//TEST FOR LAUNCHING A MISSION FROM DEBUG MENU NOT FINAL
HANDLE_LAUNCHING_MISSIONS()
#ENDIF*/
// Look for the server say the game has ended.
IF GET_SERVER_SCRIPT_GAME_STATE() = MAIN_GAME_STATE_END
SET_CLIENT_GAME_STATE(MAIN_GAME_STATE_END)
ENDIF
BREAK
CASE MAIN_GAME_STATE_END
IF NETWORK_IS_IN_SESSION()
AND NETWORK_CAN_SESSION_END()
NETWORK_SESSION_END()
ENDIF
BREAK
DEFAULT
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("Testbed - invalid game state!!")
#ENDIF
BREAK
ENDSWITCH
// ----------------------------------- SERVER
IF NETWORK_IS_HOST_OF_THIS_SCRIPT()
SWITCH GET_SERVER_SCRIPT_GAME_STATE()
// For now just move straight into playing.
CASE MAIN_GAME_STATE_INI
SET_SERVER_GAME_STATE(MAIN_GAME_STATE_RUNNING)
BREAK
// Look for game end conditions.
CASE MAIN_GAME_STATE_RUNNING
//SET_INITIAL_DOOR_STATES()
Maintain_Main_Generic_Server()
#IF IS_DEBUG_BUILD
IF bHostEndGameNow
GlobalServerBD.iServerGameState = MAIN_GAME_STATE_END
ENDIF
#ENDIF
BREAK
CASE MAIN_GAME_STATE_END
// We'd want to upload scores here, show results, do whatever.
BREAK
DEFAULT
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("Testbed.sc - SERVER invalid game state!!")
#ENDIF
BREAK
ENDSWITCH
ENDIF
#IF IS_DEBUG_BUILD
KEYPRESS_DEBUG()
UPDATE_WIDGETS()
UPDATE_DEBUG()
#ENDIF
#IF IS_DEBUG_BUILD
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_TALK)
IF bSetUpUsjs
//Turn off/On StuntJumps
SETUP_FM_USJS()
bSetUpUsjs = FALSE
ENDIF
#ENDIF
ENDWHILE
#ENDIF
// End of Mission
ENDSCRIPT