428 lines
10 KiB
Python
Executable File
428 lines
10 KiB
Python
Executable File
#IF IS_FINAL_BUILD
|
|
SCRIPT
|
|
ENDSCRIPT
|
|
#ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
USING "rage_builtins.sch"
|
|
USING "globals.sch"
|
|
USING "commands_path.sch"
|
|
USING "commands_script.sch"
|
|
USING "commands_streaming.sch"
|
|
USING "commands_physics.sch"
|
|
USING "commands_decorator.sch"
|
|
USING "model_enums.sch"
|
|
|
|
CONST_INT NUM_PEDS 10
|
|
PED_INDEX pindex[NUM_PEDS]
|
|
|
|
BOOL bSpawn = FALSE
|
|
bool bDelete = FALSE
|
|
BOOL bExecute = TRUE
|
|
BOOL bTask = FALSE
|
|
|
|
FLOAT fMoveBlendRatio1 = 1.0
|
|
FLOAT fMoveBlendRatio2 = 1.0
|
|
FLOAT fRadius = 10.0
|
|
FLOAT fSpacing = 1.5
|
|
FLOAT fDistance = 20.0
|
|
int iSelectedAvoidanceTest =0
|
|
int iGroup1PedCount = 0
|
|
|
|
BOOL bIgnoreGroup1Peds = FALSE
|
|
|
|
|
|
ENUM eAvoidanceTest
|
|
|
|
eCircle,
|
|
e1v1HeadOn,
|
|
e2v2HeadOn,
|
|
e3v3HeadOn,
|
|
e1v1Perpendicular,
|
|
e1v1Parallel,
|
|
e2v2Parallel,
|
|
e3v3Parallel,
|
|
e1UseMobilePhone,
|
|
e1CombatPlayer
|
|
|
|
ENDENUM
|
|
|
|
|
|
PROC DELETE_AVOIDANCE_PEDS()
|
|
|
|
INT i
|
|
FOR i = 0 TO NUM_PEDS-1
|
|
IF DOES_ENTITY_EXIST(pindex[i])
|
|
DELETE_PED(pindex[i])
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
|
|
PROC CREATE_AVOIDANCE_PEDS_PARALLEL(INT iFrontPeds, int iBackPeds)
|
|
|
|
float heading
|
|
VECTOR pedForward
|
|
VECTOR pedRight
|
|
VECTOR vCenter
|
|
IF DOES_ENTITY_EXIST(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
IF NOT IS_PED_INJURED(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
|
|
pedForward = GET_ENTITY_FORWARD_VECTOR(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
pedRight = <<pedForward.y, -pedForward.x, 0.0>>
|
|
VECTOR pedPosition = GET_ENTITY_COORDS(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
|
|
heading = GET_ENTITY_HEADING(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
heading = (heading + 180 ) % 360
|
|
|
|
vCenter = pedPosition + ( pedForward * fRadius )
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
INT i
|
|
FOR i = 0 TO iFrontPeds -1
|
|
|
|
FLOAT fHeading = (heading + 90) % 360
|
|
VECTOR vOffset = <<0, fRadius, 0>>
|
|
VECTOR vForwardOffset = pedForward
|
|
vForwardOffset *= 1 + (i * fSpacing )
|
|
|
|
|
|
vOffset = ROTATE_VECTOR_ABOUT_Z(vOffset, fHeading)
|
|
pindex[i] = CREATE_PED(PEDTYPE_MISSION, S_M_Y_DOCKWORK_01, vCenter + vOffset + vForwardOffset, ( fHeading + 180 ) % 360 )
|
|
SET_PED_CONFIG_FLAG(pindex[i], PCF_Avoidance_Member_of_Group1, TRUE)
|
|
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO iBackPeds -1
|
|
|
|
FLOAT fHeading = (heading +90) % 360
|
|
VECTOR vOffset = <<0, fRadius, 0>>
|
|
VECTOR vForwardOffset = pedForward
|
|
VECTOR vSideOffset = pedRight
|
|
|
|
vForwardOffset *= 1 + (i * fSpacing )
|
|
|
|
vOffset = ROTATE_VECTOR_ABOUT_Z(vOffset, fHeading)
|
|
pindex[iBackPeds + i] = CREATE_PED(PEDTYPE_MISSION, S_M_Y_DOCKWORK_01, vCenter + vOffset + vForwardOffset + vSideOffset, ( fHeading + 180 ) % 360 )
|
|
SET_PED_CONFIG_FLAG(pindex[iBackPeds + i], PCF_Avoidance_Ignore_Group1, bIgnoreGroup1Peds)
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
|
|
PROC CREATE_AVOIDANCE_PEDS_HEAD_ON(INT iLeftPeds, int iRightPeds)
|
|
|
|
float heading
|
|
VECTOR pedForward
|
|
VECTOR vCenter
|
|
IF DOES_ENTITY_EXIST(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
IF NOT IS_PED_INJURED(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
|
|
pedForward = GET_ENTITY_FORWARD_VECTOR(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
VECTOR pedPosition = GET_ENTITY_COORDS(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
|
|
heading = GET_ENTITY_HEADING(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
heading = (heading + 180 ) % 360
|
|
|
|
vCenter = pedPosition + ( pedForward * fRadius )
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
INT i
|
|
FOR i = 0 TO iLeftPeds -1
|
|
|
|
FLOAT fHeading = (heading + 90) % 360
|
|
VECTOR vOffset = <<0, fRadius, 0>>
|
|
VECTOR vForwardOffset = pedForward
|
|
vForwardOffset *= 1 + (i * fSpacing )
|
|
|
|
|
|
vOffset = ROTATE_VECTOR_ABOUT_Z(vOffset, fHeading)
|
|
pindex[i] = CREATE_PED(PEDTYPE_MISSION, S_M_Y_DOCKWORK_01, vCenter + vOffset + vForwardOffset, ( fHeading + 180 ) % 360 )
|
|
|
|
SET_PED_CONFIG_FLAG(pindex[i], PCF_Avoidance_Member_of_Group1, TRUE)
|
|
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO iRightPeds -1
|
|
|
|
FLOAT fHeading = (heading -90) % 360
|
|
VECTOR vOffset = <<0, fRadius, 0>>
|
|
VECTOR vForwardOffset = pedForward
|
|
vForwardOffset *= 1 + (i * fSpacing )
|
|
|
|
vOffset = ROTATE_VECTOR_ABOUT_Z(vOffset, fHeading)
|
|
pindex[iLeftPeds + i] = CREATE_PED(PEDTYPE_MISSION, S_M_Y_DOCKWORK_01, vCenter + vOffset + vForwardOffset, ( fHeading + 180 ) % 360 )
|
|
SET_PED_CONFIG_FLAG(pindex[iLeftPeds + i], PCF_Avoidance_Ignore_Group1, bIgnoreGroup1Peds)
|
|
ENDFOR
|
|
|
|
|
|
ENDPROC
|
|
|
|
PROC CREATE_AVOIDANCE_PEDS_CIRCLE()
|
|
|
|
VECTOR vCenter
|
|
IF DOES_ENTITY_EXIST(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
IF NOT IS_PED_INJURED(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
|
|
VECTOR pedForward = GET_ENTITY_FORWARD_VECTOR(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
VECTOR pedPosition = GET_ENTITY_COORDS(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
|
|
FLOAT heading = GET_ENTITY_HEADING(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
heading = (heading + 180 ) % 360
|
|
|
|
pedForward *= fRadius
|
|
vCenter = pedPosition + pedForward
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
INT i
|
|
FOR i = 0 TO NUM_PEDS-1
|
|
|
|
FLOAT fHeading = ( 360.0 / NUM_PEDS ) * i
|
|
VECTOR vOffset = <<0, fRadius, 0>>
|
|
|
|
vOffset = ROTATE_VECTOR_ABOUT_Z(vOffset, fHeading)
|
|
|
|
|
|
pindex[i] = CREATE_PED(PEDTYPE_MISSION, S_M_Y_DOCKWORK_01, vCenter + vOffset, ( fHeading + 180 ) % 360 )
|
|
|
|
|
|
|
|
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC CREATE_AVOIDANCE_PEDS()
|
|
|
|
REQUEST_MODEL(S_M_Y_DOCKWORK_01)
|
|
WHILE not HAS_MODEL_LOADED(S_M_Y_DOCKWORK_01)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SWITCH INT_TO_ENUM(eAvoidanceTest, iSelectedAvoidanceTest)
|
|
CASE eCircle
|
|
CREATE_AVOIDANCE_PEDS_CIRCLE()
|
|
BREAK
|
|
|
|
CASE e1v1HeadOn
|
|
iGroup1PedCount = 1
|
|
CREATE_AVOIDANCE_PEDS_HEAD_ON(1, 1)
|
|
BREAK
|
|
|
|
CASE e2v2HeadOn
|
|
iGroup1PedCount = 2
|
|
CREATE_AVOIDANCE_PEDS_HEAD_ON(2, 2)
|
|
BREAK
|
|
|
|
CASE e3v3HeadOn
|
|
iGroup1PedCount = 3
|
|
CREATE_AVOIDANCE_PEDS_HEAD_ON(3, 3)
|
|
BREAK
|
|
|
|
CASE e2v2Parallel
|
|
BREAK
|
|
CASE e3v3Parallel
|
|
BREAK
|
|
|
|
CASE e1v1Parallel
|
|
CASE e1UseMobilePhone
|
|
CASE e1CombatPlayer
|
|
iGroup1PedCount = 1
|
|
CREATE_AVOIDANCE_PEDS_PARALLEL(1, 1)
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
|
|
ENDPROC
|
|
|
|
|
|
PROC TASK_PEDS_MOVE_FORWARD()
|
|
INT i
|
|
FOR i = 0 TO NUM_PEDS-1
|
|
IF DOES_ENTITY_EXIST(pindex[i])
|
|
IF NOT IS_PED_INJURED(pindex[i])
|
|
VECTOR pedForward = GET_ENTITY_FORWARD_VECTOR(pindex[i])
|
|
VECTOR pedPosition = GET_ENTITY_COORDS(pindex[i])
|
|
pedForward *= fDistance
|
|
VECTOR vTarget = pedPosition + pedForward
|
|
|
|
IF i < iGroup1PedCount
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(pindex[i], vTarget, fMoveBlendRatio1)
|
|
ELSE
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(pindex[i], vTarget, fMoveBlendRatio2)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC TASK_PEDS_USE_PHONE()
|
|
INT i
|
|
FOR i = 0 TO NUM_PEDS-1
|
|
IF DOES_ENTITY_EXIST(pindex[i])
|
|
IF NOT IS_PED_INJURED(pindex[i])
|
|
|
|
TASK_USE_MOBILE_PHONE(pindex[i], FALSE)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
ENDPROC
|
|
|
|
PROC TASK_PEDS_COMBAT_PLAYER()
|
|
IF DOES_ENTITY_EXIST(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
IF NOT IS_PED_INJURED(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
INT i
|
|
FOR i = 0 TO NUM_PEDS-1
|
|
IF DOES_ENTITY_EXIST(pindex[i])
|
|
IF NOT IS_PED_INJURED(pindex[i])
|
|
|
|
GIVE_WEAPON_TO_PED(pindex[i], WEAPONTYPE_ASSAULTRIFLE, INFINITE_AMMO, FALSE, true)
|
|
SET_CURRENT_PED_WEAPON(pindex[i], WEAPONTYPE_ASSAULTRIFLE, true)
|
|
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(pindex[i], RELGROUPHASH_HATES_PLAYER)
|
|
//TASK_COMBAT_PED(pindex[i], GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC TASK_AVOIDANCE_PEDS()
|
|
|
|
SWITCH INT_TO_ENUM(eAvoidanceTest, iSelectedAvoidanceTest)
|
|
CASE eCircle
|
|
TASK_PEDS_MOVE_FORWARD()
|
|
BREAK
|
|
CASE e1v1HeadOn
|
|
TASK_PEDS_MOVE_FORWARD()
|
|
BREAK
|
|
CASE e2v2HeadOn
|
|
TASK_PEDS_MOVE_FORWARD()
|
|
BREAK
|
|
CASE e3v3HeadOn
|
|
TASK_PEDS_MOVE_FORWARD()
|
|
BREAK
|
|
CASE e1v1Perpendicular
|
|
TASK_PEDS_MOVE_FORWARD()
|
|
BREAK
|
|
|
|
CASE e1v1Parallel
|
|
TASK_PEDS_MOVE_FORWARD()
|
|
BREAK
|
|
|
|
CASE e1UseMobilePhone
|
|
TASK_PEDS_USE_PHONE()
|
|
BREAK
|
|
|
|
CASE e1CombatPlayer
|
|
TASK_PEDS_COMBAT_PLAYER()
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
|
|
PROC CREATE_WIDGETS()
|
|
START_WIDGET_GROUP ("gtest_avoidance")
|
|
|
|
START_NEW_WIDGET_COMBO()
|
|
ADD_TO_WIDGET_COMBO ("eCircle")
|
|
ADD_TO_WIDGET_COMBO ("e1v1HeadOn")
|
|
ADD_TO_WIDGET_COMBO ("e2v2HeadOn")
|
|
ADD_TO_WIDGET_COMBO ("e3v3HeadOn")
|
|
ADD_TO_WIDGET_COMBO ("e1v1Perpendicular")
|
|
ADD_TO_WIDGET_COMBO ("e1v1Parallel")
|
|
ADD_TO_WIDGET_COMBO ("e2v2Parallel")
|
|
ADD_TO_WIDGET_COMBO ("e3v3Parallel")
|
|
|
|
ADD_TO_WIDGET_COMBO ("e1UseMobilePhone")
|
|
ADD_TO_WIDGET_COMBO ("e1CombatPlayer")
|
|
|
|
STOP_WIDGET_COMBO("AvoidanceTest", iSelectedAvoidanceTest)
|
|
|
|
|
|
ADD_WIDGET_BOOL ("Spawn", bSpawn)
|
|
ADD_WIDGET_BOOL ("Delete", bDelete)
|
|
ADD_WIDGET_BOOL ("Task", bTask)
|
|
|
|
ADD_WIDGET_FLOAT_SLIDER("MoveBlendRatio1", fMoveBlendRatio1, 0.1, 10.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("MoveBlendRatio2", fMoveBlendRatio2, 0.1, 10.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Spacing", fSpacing, 0.1, 10.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Radius", fRadius, 1.0, 20.0, 1.0)
|
|
ADD_WIDGET_FLOAT_SLIDER("Distance", fDistance, 1.0, 200.0, 1.0)
|
|
|
|
ADD_WIDGET_BOOL ("IgnoreGroup1Peds", bIgnoreGroup1Peds)
|
|
|
|
|
|
STOP_WIDGET_GROUP()
|
|
ENDPROC
|
|
|
|
PROC PROCESS_WIDGETS()
|
|
|
|
IF bSpawn
|
|
bSpawn = FALSE
|
|
DELETE_AVOIDANCE_PEDS()
|
|
CREATE_AVOIDANCE_PEDS()
|
|
ENDIF
|
|
|
|
IF bDelete
|
|
bDelete = FALSE
|
|
DELETE_AVOIDANCE_PEDS()
|
|
ENDIF
|
|
|
|
IF bTask
|
|
bTask = FALSE
|
|
TASK_AVOIDANCE_PEDS()
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC PROCESS_DECORATORS()
|
|
bExecute = FALSE
|
|
IF DOES_ENTITY_EXIST(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
IF NOT IS_PED_INJURED(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
|
|
IF DECOR_EXIST_ON(GET_PLAYER_PED(GET_PLAYER_INDEX()), "rsne_testscript_active")
|
|
bExecute = DECOR_GET_BOOL(GET_PLAYER_PED(GET_PLAYER_INDEX()),"rsne_testscript_active")
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
SCRIPT
|
|
|
|
NETWORK_SET_SCRIPT_IS_SAFE_FOR_NETWORK_GAME()
|
|
CREATE_WIDGETS()
|
|
|
|
WHILE bExecute
|
|
PROCESS_DECORATORS()
|
|
PROCESS_WIDGETS()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
DELETE_AVOIDANCE_PEDS()
|
|
|
|
ENDSCRIPT
|
|
|
|
#ENDIF // IS_DEBUG_BUILD |