Last active
January 5, 2024 17:54
-
-
Save JuniorDjjr/51ed68cf1dd3364642666c5dce72872d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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