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

375 lines
11 KiB
Python
Executable File

#IF IS_FINAL_BUILD
SCRIPT
ENDSCRIPT
#ENDIF
#IF IS_DEBUG_BUILD
//
// Author: Fraser Morgan Date: 11/05/2012
//
// SCRIPT NAME: PROP DROP
// DESCRIPTION: Create any prop and either drop it from set height,
// or fire it into another custom prop.
// For testing Prop collision audio.
//
// HEADERS
USING "rage_builtins.sch"
USING "globals.sch"
USING "brains.sch"
USING "script_player.sch"
USING "script_ped.sch"
USING "commands_script.sch"
USING "commands_pad.sch"
USING "commands_camera.sch"
USING "commands_ped.sch"
USING "commands_graphics.sch"
USING "commands_camera.sch"
USING "commands_streaming.sch"
USING "commands_interiors.sch"
USING "commands_object.sch"
USING "commands_physics.sch"
USING "commands_misc.sch"
USING "flow_public_core_override.sch"
USING "weapon_enums.sch"
OBJECT_INDEX PROP_A
OBJECT_INDEX PROP_B
MODEL_NAMES prop_model_A
MODEL_NAMES prop_model_B
// VECTOR vOffset
//VECTOR vPlayerPos
VECTOR vPropALocation, vADistance, vTransAPos
VECTOR vPropBLocation, vBDistance, vTransBPos
VECTOR vFront, vSide, vUp, vPos
VECTOR force_vec_ba, force_vec_ab
VECTOR vPropACurrent, vPropBCurrent
VECTOR vRotationA, vRotationB
FLOAT fPropAHeight = 0
FLOAT fPropBHeight = 0
FLOAT fADistance = 1
FLOAT fBDistance = 1
FLOAT force_multiplier = 0
FLOAT fADelta = 1
FLOAT fBDelta = 1
FLOAT fX, fY, fZ
INT iSeconds = 1000
BOOL bPropACreated = FALSE
BOOL bPropBCreated = FALSE
BOOL bThrowPropsTogether = FALSE
BOOL bCleanedLastProp = FALSE
BOOL bClearProps = FALSE
BOOL bRandomRot = FALSE
BOOL bAutoReset = FALSE
BOOL bFireAatB = FALSE
BOOL bFireBatA = FALSE
BOOL bBothProps = TRUE
BOOL bAmbience
WIDGET_GROUP_ID createPropDropWidgets
TEXT_WIDGET_ID twid_PropASelection
TEXT_WIDGET_ID twid_PropBSelection
PROC CLEANUP_SCRIPT()
IF DOES_WIDGET_GROUP_EXIST(createPropDropWidgets)
DELETE_WIDGET_GROUP(createPropDropWidgets)
ENDIF
IF DOES_ENTITY_EXIST(PROP_A)
DELETE_OBJECT(PROP_A)
ENDIF
IF DOES_ENTITY_EXIST(PROP_B)
DELETE_OBJECT(PROP_B)
ENDIF
TERMINATE_THIS_THREAD()
ENDPROC
PROC CREATE_PROP_A()
prop_model_A = INT_TO_ENUM(MODEL_NAMES, GET_HASH_KEY(GET_CONTENTS_OF_TEXT_WIDGET(twid_PropASelection)))
IF NOT bCleanedLastProp
IF DOES_ENTITY_EXIST(PROP_A)
DELETE_OBJECT(PROP_A)
ENDIF
bCleanedLastProp = TRUE
ENDIF
IF NOT DOES_ENTITY_EXIST(PROP_A)
PROP_A = CREATE_OBJECT(prop_model_A, vPropALocation)
IF bRandomRot
fX = GET_RANDOM_FLOAT_IN_RANGE(0.0, 180.0)
fY = GET_RANDOM_FLOAT_IN_RANGE(0.0, 180.0)
fZ = GET_RANDOM_FLOAT_IN_RANGE(0.0, 180.0)
vRotationA = << fX, fY, fZ >>
SET_ENTITY_ROTATION(PROP_A, vRotationA, EULER_XYZ)
ENDIF
bCleanedLastProp = FALSE
ENDIF
ENDPROC
PROC CREATE_PROP_B()
prop_model_B = INT_TO_ENUM(MODEL_NAMES, GET_HASH_KEY(GET_CONTENTS_OF_TEXT_WIDGET(twid_PropBSelection)))
IF NOT bCleanedLastProp
IF DOES_ENTITY_EXIST(PROP_B)
DELETE_OBJECT(PROP_B)
ENDIF
bCleanedLastProp = TRUE
ENDIF
IF NOT DOES_ENTITY_EXIST(PROP_B)
PROP_B = CREATE_OBJECT(prop_model_B, vPropBLocation)
IF bRandomRot
fX = GET_RANDOM_FLOAT_IN_RANGE(0.0, 180.0)
fY = GET_RANDOM_FLOAT_IN_RANGE(0.0, 180.0)
fZ = GET_RANDOM_FLOAT_IN_RANGE(0.0, 180.0)
vRotationB = << fX, fY, fZ >>
SET_ENTITY_ROTATION(PROP_B, vRotationB, EULER_XYZ)
ENDIF
bCleanedLastProp = FALSE
ENDIF
ENDPROC
PROC CREATE_PROP_DROP_WIDGETS()
// #IF IS_DEBUG_BUILD
createPropDropWidgets = START_WIDGET_GROUP("Prop Drop")
ADD_WIDGET_BOOL("Mute Ambience", bAmbience)
START_WIDGET_GROUP("Prop Creation")
ADD_WIDGET_STRING("Prop A Creation")
twid_PropASelection = ADD_TEXT_WIDGET("Prop A")
SET_CONTENTS_OF_TEXT_WIDGET(twid_PropASelection, "Enter prop model name...")
ADD_WIDGET_FLOAT_SLIDER("Prop A Height:", fPropAHeight, -1, 70, 1)
ADD_WIDGET_FLOAT_SLIDER("Prop A Left Dist:", fADelta, 0, 10, 1)
ADD_WIDGET_FLOAT_SLIDER("Prop A Forward Dist:", fADistance, 0, 20, 1)
ADD_WIDGET_BOOL("Create Prop A", bPropACreated)
ADD_WIDGET_STRING("")
ADD_WIDGET_STRING("Prop B Creation")
twid_PropBSelection = ADD_TEXT_WIDGET("Prop B:")
SET_CONTENTS_OF_TEXT_WIDGET(twid_PropBSelection, "Enter prop model name...")
ADD_WIDGET_FLOAT_SLIDER("Prop B Height:", fPropBHeight, -1, 70, 1)
ADD_WIDGET_FLOAT_SLIDER("Prop B Right Dist:", fBDelta, 0, 10, 1)
ADD_WIDGET_FLOAT_SLIDER("Prop B Forward Dist:", fBDistance, 0, 20, 1)
ADD_WIDGET_BOOL("Create Prop B", bPropBCreated)
ADD_WIDGET_STRING("")
ADD_WIDGET_STRING("Automatic Creation Options")
ADD_WIDGET_BOOL("Apply Random Rotation When Spawning", bRandomRot)
ADD_WIDGET_BOOL("Auto-Reset Props After Firing", bAutoReset)
ADD_WIDGET_INT_SLIDER("Time to Auto-Reset Props (ms)", iSeconds, 100, 10000, 500)
ADD_WIDGET_STRING("")
ADD_WIDGET_BOOL("Clear All Props", bClearProps)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Firing Options")
ADD_WIDGET_FLOAT_SLIDER("Amount of Force:", force_multiplier, 0, 20, 1)
ADD_WIDGET_STRING("")
ADD_WIDGET_STRING("Firing Method")
ADD_WIDGET_BOOL("Fire both props together", bBothProps)
ADD_WIDGET_BOOL("Fire A at B", bFireAatB)
ADD_WIDGET_BOOL("Fire B at A", bFireBatA)
ADD_WIDGET_STRING("Triangle/Y on Pad 1 will also fire props")
ADD_WIDGET_BOOL("Fire The Props", bThrowPropsTogether)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
// #ENDIF
ENDPROC
PROC FORCE_APPLIED()
// If Only one prop exists, apply the force to fire it at the ground.
IF DOES_ENTITY_EXIST(PROP_A)
AND DOES_ENTITY_EXIST(PROP_B)
IF bBothProps = TRUE
bFireAatB = FALSE
bFireBatA = FALSE
vPropACurrent = GET_ENTITY_COORDS(PROP_A)
vPropBCurrent = GET_ENTITY_COORDS(PROP_B)
force_vec_ba = vPropBCurrent - vPropACurrent
force_vec_ab = vPropACurrent - vPropBCurrent
normalise_vector(force_vec_ba)
normalise_vector(force_vec_ab)
force_vec_ba.x *= force_multiplier
force_vec_ba.y *= force_multiplier
force_vec_ba.z *= force_multiplier
force_vec_ab.x *= force_multiplier
force_vec_ab.y *= force_multiplier
force_vec_ab.z *= force_multiplier
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(PROP_B, APPLY_TYPE_IMPULSE, force_vec_ab, 0, FALSE, TRUE)
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(PROP_A, APPLY_TYPE_IMPULSE, force_vec_ba, 0, FALSE, TRUE)
ENDIF
IF bFireAatB = TRUE
bBothProps = FALSE
bFireBatA = FALSE
IF DOES_ENTITY_EXIST(PROP_A)
AND DOES_ENTITY_EXIST(PROP_B)
vPropACurrent = GET_ENTITY_COORDS(PROP_A)
vPropBCurrent = GET_ENTITY_COORDS(PROP_B)
force_vec_ab = vPropBCurrent - vPropACurrent
normalise_vector(force_vec_ab)
force_vec_ab.x *= force_multiplier
force_vec_ab.y *= force_multiplier
force_vec_ab.z *= force_multiplier
FREEZE_ENTITY_POSITION(PROP_B, TRUE)
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(PROP_A, APPLY_TYPE_IMPULSE, force_vec_ab, 0, FALSE, TRUE)
ELSE
bFireAatB = FALSE
ENDIF
ENDIF
IF bFireBatA = TRUE
bFireAatB = FALSE
bBothProps = FALSE
IF DOES_ENTITY_EXIST(PROP_B)
AND DOES_ENTITY_EXIST(PROP_A)
vPropACurrent = GET_ENTITY_COORDS(PROP_A)
vPropBCurrent = GET_ENTITY_COORDS(PROP_B)
force_vec_ba = vPropACurrent - vPropBCurrent
normalise_vector(force_vec_ba)
force_vec_ba.x *= force_multiplier
force_vec_ba.y *= force_multiplier
force_vec_ba.z *= force_multiplier
FREEZE_ENTITY_POSITION(PROP_A, TRUE)
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(PROP_B, APPLY_TYPE_IMPULSE, force_vec_ba, 0, FALSE, TRUE)
ELSE
bFireBatA = FALSE
ENDIF
ENDIF
ELSE
IF DOES_ENTITY_EXIST(PROP_A)
AND NOT DOES_ENTITY_EXIST(PROP_B)
vPropACurrent = GET_ENTITY_COORDS(PROP_A)
vADistance = GET_ENTITY_COORDS(PROP_A) - <<0, 0, (GET_ENTITY_HEIGHT_ABOVE_GROUND(PROP_A))>>
force_vec_ab = vADistance - vPropACurrent
normalise_vector(force_vec_ab)
force_vec_ab.x *= force_multiplier
force_vec_ab.y *= force_multiplier
force_vec_ab.z *= force_multiplier
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(PROP_A, APPLY_TYPE_IMPULSE, force_vec_ab, 0, FALSE, TRUE)
ENDIF
IF DOES_ENTITY_EXIST(PROP_B)
AND NOT DOES_ENTITY_EXIST(PROP_A)
vPropBCurrent = GET_ENTITY_COORDS(PROP_B)
vBDistance = GET_ENTITY_COORDS(PROP_B) - <<0, 0, (GET_ENTITY_HEIGHT_ABOVE_GROUND(PROP_B))>>
force_vec_ba = vBDistance - vPropBCurrent
normalise_vector(force_vec_ba)
force_vec_ba.x *= force_multiplier
force_vec_ba.y *= force_multiplier
force_vec_ba.z *= force_multiplier
APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(PROP_B, APPLY_TYPE_IMPULSE, force_vec_ba, 0, FALSE, TRUE)
ENDIf
ENDIF
ENDPROC
SCRIPT
CREATE_PROP_DROP_WIDGETS()
REGISTER_SCRIPT_WITH_AUDIO()
WHILE TRUE
WAIT(0)
INVALIDATE_IDLE_CAM()
IF bAmbience = TRUE
IF NOT IS_AUDIO_SCENE_ACTIVE("MUTES_AMBIENCE_SCENE")
START_AUDIO_SCENE("MUTES_AMBIENCE_SCENE")
ENDIF
ELSE STOP_AUDIO_SCENE("MUTES_AMBIENCE_SCENE")
ENDIF
// Calcultating prop spawn distances.
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
GET_ENTITY_MATRIX(PLAYER_PED_ID(), vFront, vSide, vUp, vPos)
// vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID(), TRUE)
vTransAPos = vPos - fADelta * vSide
vTransBPos = vPos + fBDelta * vSide
vADistance = vTransAPos + vFront * fADistance
vBDistance = vTransBPos + vFront * fBDistance
vPropALocation = vADistance + vUp * fPropAHeight
vPropBLocation = vBDistance + vUp * fPropBHeight
ENDIF
IF bPropACreated = TRUE
CREATE_PROP_A()
bPropACreated = FALSE
ENDIF
IF bPropBCreated = TRUE
CREATE_PROP_B()
bPropBCreated = FALSE
ENDIF
IF bClearProps = TRUE
IF DOES_ENTITY_EXIST(PROP_A)
DELETE_OBJECT(PROP_A)
ENDIF
IF DOES_ENTITY_EXIST(PROP_B)
DELETE_OBJECT(PROP_B)
ENDIF
bClearProps = FALSE
ENDIF
IF bAutoReset = TRUE
IF bThrowPropsTogether = TRUE
FORCE_APPLIED()
WAIT(iSeconds)
IF DOES_ENTITY_EXIST(PROP_A)
bPropACreated = TRUE
ENDIF
IF DOES_ENTITY_EXIST(PROP_B)
bPropBCreated = TRUE
ENDIF
bThrowPropsTogether = FALSE
ENDIF
ENDIF
IF bThrowPropsTogether = TRUE
FORCE_APPLIED()
bThrowPropsTogether = FALSE
ENDIF
IF IS_BUTTON_PRESSED(PAD1, TRIANGLE)
bThrowPropsTogether = TRUE
ENDIF
SET_CLOCK_TIME(12, 00, 00)
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
CLEANUP_SCRIPT()
ENDIF
ENDWHILE
ENDSCRIPT
#ENDIF // IS_DEBUG_BUILD