Files
2025-09-29 00:52:08 +02:00

201 lines
6.7 KiB
Scheme
Executable File

//////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : chop_van_public.sch //
// AUTHOR : Rob Bray //
// DESCRIPTION : Common functions for Chop riding in van //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////
USING "rage_builtins.sch"
USING "commands_misc.sch"
USING "commands_pad.sch"
USING "commands_script.sch"
USING "commands_player.sch"
USING "commands_vehicle.sch"
USING "commands_object.sch"
USING "commands_graphics.sch"
USING "commands_physics.sch"
USING "commands_streaming.sch"
USING "commands_camera.sch"
USING "commands_audio.sch"
USING "script_player.sch"
ENUM CHOP_LEAN_IN_VAN_STATE_ENUM
CHOP_LEAN_IN_VAN_STATE_CENTERED = 0,
CHOP_LEAN_IN_VAN_STATE_FORWARD,
CHOP_LEAN_IN_VAN_STATE_BACK,
CHOP_LEAN_IN_VAN_STATE_LEFT,
CHOP_LEAN_IN_VAN_STATE_RIGHT,
CHOP_LEAN_IN_VAN_STATE_BARK
ENDENUM
CONST_FLOAT CHOP_ANIM_BLEND_IN 0.8
CONST_FLOAT CHOP_ANIM_BLEND_OUT -0.8
CONST_FLOAT CHOP_GROWL_ROT 206.0
// get chop in van dictionary
FUNC STRING GET_CHOP_IN_VAN_ANIM_DICT()
RETURN "MISSCHOP_VEHICLE@BACK_OF_VAN"
ENDFUNC
// handle chop lean animations
PROC HANDLE_CHOP_LEAN_IN_VAN(PED_INDEX chopPed, VEHICLE_INDEX vanVehicle, CHOP_LEAN_IN_VAN_STATE_ENUM &chopState, FLOAT &fCachedSpeed, INT &iNextAnimTime, INT &iNextBarkTime, BOOL bAllowBarkAnim = FALSE)
IF NOT IS_PED_INJURED(chopPed)
AND IS_VEHICLE_DRIVEABLE(vanVehicle)
VECTOR vVanRotationVelocity = GET_ENTITY_ROTATION_VELOCITY(vanVehicle)
VECTOR vVanVelocity = GET_ENTITY_SPEED_VECTOR(vanVehicle, TRUE)
FLOAT fVanSpeed = GET_ENTITY_SPEED(vanVehicle)
//PRINTFLOAT(fVanSpeed) PRINTNL()
//PRINTVECTOR(vVanVelocity) PRINTNL()
FLOAT fVanSpeedDiff = vVanVelocity.y - fCachedSpeed
fVanSpeedDiff /= GET_FRAME_TIME()
//PRINTFLOAT(fVanSpeedDiff) PRINTNL()
IF vVanVelocity.y < 0
vVanRotationVelocity.z *= -1
ENDIF
CHOP_LEAN_IN_VAN_STATE_ENUM newChopState
IF vVanRotationVelocity.z < -0.5
IF fVanSpeed >= 6.4
newChopState = CHOP_LEAN_IN_VAN_STATE_LEFT
ENDIF
ELIF vVanRotationVelocity.z > 0.5
IF fVanSpeed >= 6.4
newChopState = CHOP_LEAN_IN_VAN_STATE_RIGHT
ENDIF
ELIF fVanSpeedDiff > 2.0
newChopState = CHOP_LEAN_IN_VAN_STATE_BACK
ELIF fVanSpeedDiff < -8.0
newChopState = CHOP_LEAN_IN_VAN_STATE_FORWARD
ELSE
IF bAllowBarkAnim
AND fVanSpeed <= 3
AND (GET_GAME_TIMER() >= iNextBarkTime OR chopState = CHOP_LEAN_IN_VAN_STATE_BARK)
newChopState = CHOP_LEAN_IN_VAN_STATE_BARK
ELSE
newChopState = CHOP_LEAN_IN_VAN_STATE_CENTERED
ENDIF
ENDIF
/*
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD1)
newChopState = CHOP_LEAN_IN_VAN_STATE_LEFT
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD2)
newChopState = CHOP_LEAN_IN_VAN_STATE_RIGHT
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD3)
newChopState = CHOP_LEAN_IN_VAN_STATE_BACK
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD4)
newChopState = CHOP_LEAN_IN_VAN_STATE_FORWARD
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD5)
newChopState = CHOP_LEAN_IN_VAN_STATE_CENTERED
ELSE
newChopState = chopState
ENDIF
*/
IF newChopState <> chopState
AND GET_GAME_TIMER() >= iNextAnimTime
//DETACH_entity(chopPed)
STRING sAnim
SWITCH newChopState
CASE CHOP_LEAN_IN_VAN_STATE_CENTERED
sAnim = "CHOP_SIT_LOOP"
BREAK
CASE CHOP_LEAN_IN_VAN_STATE_FORWARD
sAnim = "CHOP_LEAN_FORWARDS_LOOP"
BREAK
CASE CHOP_LEAN_IN_VAN_STATE_BACK
sAnim = "CHOP_LEAN_BACK_LOOP"
BREAK
CASE CHOP_LEAN_IN_VAN_STATE_LEFT
sAnim = "CHOP_LEAN_RIGHT_LOOP"
BREAK
CASE CHOP_LEAN_IN_VAN_STATE_RIGHT
sAnim = "CHOP_LEAN_LEFT_LOOP"
BREAK
CASE CHOP_LEAN_IN_VAN_STATE_BARK
sAnim = "CHOP_BARK"
BREAK
ENDSWITCH
iNextAnimTime = GET_GAME_TIMER() + 500
IF newChopState = CHOP_LEAN_IN_VAN_STATE_BARK
iNextBarkTime = GET_GAME_TIMER() + 3000
ENDIF
TASK_PLAY_ANIM(chopPed, GET_CHOP_IN_VAN_ANIM_DICT(), sAnim, CHOP_ANIM_BLEND_IN, CHOP_ANIM_BLEND_OUT, -1, AF_LOOPING)
chopState = newChopState
ENDIF
fCachedSpeed = vVanVelocity.y
ENDIF
ENDPROC
// attach chop to van
PROC ATTACH_CHOP_TO_VAN(PED_INDEX chopPed, VEHICLE_INDEX vanVehicle, FLOAT fHeading, BOOL bFromGetIn = FALSE, BOOL bOverrideAttachPos = FALSE, FLOAT fOverrideAttachX = 0.0, FLOAT fOverrideAttachY = 0.0, FLOAT fOverrideAttachZ = 0.0, FLOAT fOverrideAttachRot = 0.0)
IF NOT IS_PED_INJURED(chopPed)
AND IS_VEHICLE_DRIVEABLE(vanVehicle)
VECTOR vAttach
FLOAT fAttachHeading
IF NOT bOverrideAttachPos
IF NOT bFromGetIn
vAttach = <<0,-0.5,0.3>>
ELSE
vAttach = <<0.129,-1.522,0.3>>
ENDIF
fAttachHeading = fHeading
ELSE
vAttach = <<fOverrideAttachX, fOverrideAttachY, fOverrideAttachZ>>
fAttachHeading = fOverrideAttachRot
ENDIF
ATTACH_ENTITY_TO_ENTITY(chopPed, vanVehicle, 0, vAttach, <<0,0,fAttachHeading>>, FALSE, FALSE, FALSE, TRUE)
ENDIF
ENDPROC
// set chop in van
PROC SET_CHOP_INTO_VAN(PED_INDEX chopPed, VEHICLE_INDEX vanVehicle, CHOP_LEAN_IN_VAN_STATE_ENUM &chopState, FLOAT &fCachedVanSpeed, BOOL bGuard = FALSE, BOOL bInstant = TRUE, BOOL bFromGetIn = FALSE, BOOL bOverrideAttachPos = FALSE, FLOAT fOverrideAttachX = 0.0, FLOAT fOverrideAttachY = 0.0, FLOAT fOverrideAttachZ = 0.0, FLOAT fOverrideAttachRot = 0.0)
IF NOT IS_PED_INJURED(chopPed)
AND IS_VEHICLE_DRIVEABLE(vanVehicle)
IF bInstant
CLEAR_PED_TASKS_IMMEDIATELY(chopPed)
ELSE
//CLEAR_PED_TASKS(chopPed)
ENDIF
STRING sAnim
FLOAT fBlendIn
FLOAT fHeading
IF bGuard
sAnim = "CHOP_GROWL"
fHeading = CHOP_GROWL_ROT
ELSE
sAnim = "CHOP_SIT_LOOP"
IF NOT bFromGetIn
fHeading = 0.0
ELSE
fHeading = 11.96
ENDIF
ENDIF
IF bInstant
fBlendIn = INSTANT_BLEND_IN
ELSE
fBlendIn = SLOW_BLEND_IN
ENDIF
chopState = CHOP_LEAN_IN_VAN_STATE_CENTERED
fCachedVanSpeed = 0
ATTACH_CHOP_TO_VAN(chopPed, vanVehicle, fHeading, bFromGetIn, bOverrideAttachPos, fOverrideAttachX, fOverrideAttachY, fOverrideAttachZ, fOverrideAttachRot)
TASK_PLAY_ANIM(chopPed, GET_CHOP_IN_VAN_ANIM_DICT(), sAnim, fBlendIn, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET)
IF bInstant
FORCE_PED_AI_AND_ANIMATION_UPDATE(chopPed)
ENDIF
ENDIF
ENDPROC