Skip to content

Instantly share code, notes, and snippets.

@JuniorDjjr
Last active January 5, 2024 17:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save JuniorDjjr/51ed68cf1dd3364642666c5dce72872d to your computer and use it in GitHub Desktop.
Save JuniorDjjr/51ed68cf1dd3364642666c5dce72872d to your computer and use it in GitHub Desktop.
// You need: https://forum.mixmods.com.br/f141-gta3script-cleo/t5206-como-criar-scripts-com-cleoplus
SCRIPT_START
{
LVAR_INT bDisable scplayer hVeh pVeh p iSubClass pFrame iModel vPos hEffect bWindowPresent iDamage hPassenger
LVAR_FLOAT fSpeed fMinIntensity fDivStartInertia fInertiaEaseOut x y z x2 y2 z2 f dir_x dir_y dir_z fThrowDamageHealth fGlassDamageBonus fIntensity fImpactDamageHealth fMaxMass
/////////////////////////////////////////////
SCRIPT_NAME CCINERT // to make it better acessible for external use
IF NOT READ_FLOAT_FROM_INI_FILE "CLEO/Car Crash Inertia.ini" "Settings" "MinIntensity" (fMinIntensity)
OR NOT READ_FLOAT_FROM_INI_FILE "CLEO/Car Crash Inertia.ini" "Settings" "DivStartInertia" (fDivStartInertia)
OR NOT READ_FLOAT_FROM_INI_FILE "CLEO/Car Crash Inertia.ini" "Settings" "InertiaEaseOut" (fInertiaEaseOut)
OR NOT READ_FLOAT_FROM_INI_FILE "CLEO/Car Crash Inertia.ini" "Settings" "ImpactDamageHealth" (fImpactDamageHealth)
OR NOT READ_FLOAT_FROM_INI_FILE "CLEO/Car Crash Inertia.ini" "Settings" "ThrowDamageHealth" (fThrowDamageHealth)
OR NOT READ_FLOAT_FROM_INI_FILE "CLEO/Car Crash Inertia.ini" "Settings" "GlassDamageBonus" (fGlassDamageBonus)
OR NOT READ_FLOAT_FROM_INI_FILE "CLEO/Car Crash Inertia.ini" "Settings" "MaxMass" (fMaxMass)
PRINT_STRING_NOW "~r~Fail to load 'Car Crash Inertia.ini'" 6000
TERMINATE_THIS_CUSTOM_SCRIPT
ENDIF
GET_PLAYER_CHAR 0 scplayer
/////////////////////////////////////////////
WHILE TRUE
WAIT 0
IF IS_CHAR_SITTING_IN_ANY_CAR scplayer
AND NOT IS_ON_MISSION
AND NOT IS_ON_CUTSCENE
AND NOT IS_ON_SCRIPTED_CUTSCENE
AND NOT bDisable = TRUE // Why? Some seatbelt mod can use SET_THREAD_VAR script 0 TRUE on this script to disable it.
STORE_CAR_CHAR_IS_IN_NO_SAVE scplayer (hVeh)
GET_CAR_COLLISION_INTENSITY hVeh fIntensity
IF fIntensity > 0.0
GET_CAR_MODEL hVeh (iModel)
IF NOT iModel = RHINO
GET_NUMBER_OF_PASSENGERS hVeh (p)
IF p > 0
GET_CHAR_IN_CAR_PASSENGER_SEAT hVeh 0 (hPassenger)
IF NOT hPassenger > 0
hPassenger = -1
ENDIF
ELSE
hPassenger = -1
ENDIF
GET_VEHICLE_SUBCLASS hVeh (iSubclass)
f = fIntensity / 100.0
f *= fImpactDamageHealth
IF NOT iSubClass = VEHICLE_SUBCLASS_AUTOMOBILE
f /= 2.0
IF iSubClass = VEHICLE_SUBCLASS_HELI
OR iSubClass = VEHICLE_SUBCLASS_PLANE
f /= 2.0
ENDIF
ENDIF
iDamage =# f
IF iDamage > 0
DAMAGE_CHAR scplayer iDamage FALSE
IF hPassenger > 0
DAMAGE_CHAR hPassenger iDamage FALSE
ENDIF
ENDIF
IF fIntensity > fMinIntensity
IF iSubClass = VEHICLE_SUBCLASS_AUTOMOBILE
OR iSubClass = VEHICLE_SUBCLASS_MTRUCK
GET_CAR_MASS hVeh (f)
IF f <= fMaxMass
IF CLEO_CALL IsCarCollisionFrontDirection 0 (hVeh)()
IF DOES_CAR_HAVE_PART_NODE hVeh CAR_NODE_WINDSCREEN
IF CLEO_CALL IsPanelPresent 0 (hVeh 4)()
GET_VEHICLE_POINTER hVeh (pVeh)
CALL_FUNCTION 0x71C2B0 1 1 (pVeh) // Glass effect
POP_CAR_PANEL hVeh 4 OFF
bWindowPresent = TRUE
ELSE
bWindowPresent = FALSE
ENDIF
ENDIF
f = fIntensity / 100.0
f *= fThrowDamageHealth
IF bWindowPresent = TRUE
f *= fGlassDamageBonus
ENDIF
iDamage =# f
IF iDamage > 0
DAMAGE_CHAR scplayer iDamage FALSE
IF hPassenger > 0
DAMAGE_CHAR hPassenger iDamage FALSE
ENDIF
ENDIF
GET_MODEL_DIMENSIONS iModel (f f f, f f z)
GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS scplayer (0.0 1.0 1.0) (x y z)
WARP_CHAR_FROM_CAR_TO_COORD scplayer (9999.9 9999.9 9999.9)
SET_CHAR_COORDINATES_SIMPLE scplayer x y z
IF hPassenger > 0
GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS hPassenger (0.0 1.0 1.0) (x y z)
WARP_CHAR_FROM_CAR_TO_COORD hPassenger (9999.9 9999.9 9999.9)
SET_CHAR_COORDINATES_SIMPLE hPassenger x y z
ENDIF
// Simple inertia
TASK_PLAY_ANIM_NON_INTERRUPTABLE scplayer FALL_FRONT PED 4.0 FALSE FALSE FALSE FALSE 1000
TASK_FALL_AND_GET_UP scplayer 2 1000
TASK_SAY scplayer 344
IF hPassenger > 0
TASK_PLAY_ANIM_NON_INTERRUPTABLE hPassenger FALL_FRONT PED 4.0 FALSE FALSE FALSE FALSE 1000
TASK_FALL_AND_GET_UP hPassenger 2 1000
TASK_SAY hPassenger 344
ENDIF
IF NOT dir_x = 0.0
AND NOT dir_y = 0.0
AND NOT dir_z = 0.0
dir_x /= fDivStartInertia
dir_y /= fDivStartInertia
dir_z /= fDivStartInertia
f = fInertiaEaseOut
WHILE TRUE
SET_CHAR_VELOCITY scplayer (dir_x dir_y dir_z)
IF hPassenger > 0
SET_CHAR_VELOCITY hPassenger (dir_x dir_y dir_z)
ENDIF
f +=@ f
dir_x -=@ f
dir_y -=@ f
dir_z -=@ f
IF dir_x < 0.05
OR dir_x < 0.05
OR dir_x < 0.05
BREAK
ENDIF
GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS scplayer 0.0 0.6 0.6 (x y z)
GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS scplayer 0.0 0.5 1.5 (x2 y2 z2)
IF IS_AREA_OCCUPIED x y z x2 y2 z2 1 0 0 0 0
BREAK
ENDIF
WAIT 0
ENDWHILE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
// Store last speed (before big impact)
GET_CAR_SPEED_VECTOR hVeh (dir_x dir_y dir_z)
ENDIF
ELSE
dir_x = 0.0
dir_y = 0.0
dir_z = 0.0
ENDIF
ENDWHILE
}
SCRIPT_END
/////////////////////////////////////////////////
{
LVAR_INT hVeh iPanel // In
LVAR_INT pDamageManager iPanelStatus
CONST_INT DamageManager 0x5A0
CONST_INT GetPanelStatus 0x6C2180
IsPanelPresent:
GET_VEHICLE_POINTER hVeh (pDamageManager)
pDamageManager += DamageManager
CALL_METHOD_RETURN GetPanelStatus pDamageManager 1 0 (4)(iPanelStatus)
IF NOT iPanelStatus = 3
RETURN_TRUE
ELSE
RETURN_FALSE
ENDIF
CLEO_RETURN 0 ()
}
{
LVAR_INT car // In
LVAR_INT i
LVAR_FLOAT x y z f back front side car_x car_y car_z
IsCarCollisionFrontDirection:
GET_CAR_COLLISION_COORDINATES car x y z
// TODO: Maybe convert to euler angles, but need to preserve a condition like this 'side' one
GET_CAR_MODEL car (i)
GET_MODEL_DIMENSIONS i (side back f, f front f)
IF back > front
front = back
ENDIF
GET_OFFSET_FROM_CAR_IN_WORLD_COORDS car 0.0 front 0.0 (car_x car_y car_z)
GET_DISTANCE_BETWEEN_COORDS_2D (x y, car_x car_y) (f)
ABS_LVAR_FLOAT side
side *= 1.3
IS_THING_GREATER_THAN_THING side f
CLEO_RETURN 0 ()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment