Skip to content

Instantly share code, notes, and snippets.

@JuniorDjjr
Last active January 5, 2024 17:41
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save JuniorDjjr/731b8641ba4e9688d87402464b2765d2 to your computer and use it in GitHub Desktop.
Save JuniorDjjr/731b8641ba4e9688d87402464b2765d2 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 i j scplayer hVeh hChar iPlayerId bRulesFlags
LVAR_FLOAT f car_x car_y car_z x y z fDistance fTimeOnSidewalk[2] fSpeed fDecreaseEase[2] fFinalDecreaseValue fCarHighSpeedLimit fCarInSidewalkTimeLimit
CONST_INT FLAG_CAR_HIGH_SPEED 0
CONST_INT FLAG_CAR_IN_SIDEWALK 1
CONST_INT FLAG_DRIVE_EMERGENCY_VEHICLES 2
CONST_INT FLAG_DRIVE_EMERGENCY_VEHICLES_CONSIDER_OUTFIT 3
WAIT 1000
IF READ_INT_FROM_INI_FILE "CLEO\Rules.ini" "CarHighSpeed" "Enabled" (i)
AND i = TRUE
IF READ_FLOAT_FROM_INI_FILE "CLEO\Rules.ini" "CarHighSpeed" "SpeedLimit" (fCarHighSpeedLimit)
SET_LOCAL_VAR_BIT_CONST bRulesFlags FLAG_CAR_HIGH_SPEED
ENDIF
ENDIF
IF READ_INT_FROM_INI_FILE "CLEO\Rules.ini" "CarInSidewalk" "Enabled" (i)
AND i = TRUE
IF READ_FLOAT_FROM_INI_FILE "CLEO\Rules.ini" "CarInSidewalk" "TimeLimit" (fCarInSidewalkTimeLimit)
SET_LOCAL_VAR_BIT_CONST bRulesFlags FLAG_CAR_IN_SIDEWALK
ENDIF
ENDIF
IF READ_INT_FROM_INI_FILE "CLEO\Rules.ini" "DriveEmergencyCar" "Enabled" (i)
AND i = TRUE
SET_LOCAL_VAR_BIT_CONST bRulesFlags FLAG_DRIVE_EMERGENCY_VEHICLES
IF READ_INT_FROM_INI_FILE "CLEO\Rules.ini" "DriveEmergencyCar" "IgnoreIfCopOutfit" (i)
AND i = TRUE
SET_LOCAL_VAR_BIT_CONST bRulesFlags FLAG_DRIVE_EMERGENCY_VEHICLES_CONSIDER_OUTFIT
ENDIF
ENDIF
/////////////////////////////////////////////////
WHILE TRUE
WAIT 0
// -- Simple 2 players adaptation
iPlayerId = 0
GOSUB CheckAndStart
IF IS_2PLAYER_GAME_GOING_ON
iPlayerId = 1
GOSUB CheckAndStart
ENDIF
ENDWHILE
CheckAndStart:
GET_PLAYER_CHAR iPlayerId scplayer
IF NOT IS_WANTED_LEVEL_GREATER iPlayerId 1
IF IS_CHAR_SITTING_IN_ANY_CAR scplayer
STORE_CAR_CHAR_IS_IN_NO_SAVE scplayer (hVeh)
GET_DRIVER_OF_CAR hVeh (hChar)
IF hChar = scplayer
AND IS_PLAYER_CONTROL_ON iPlayerId
AND NOT IS_ON_SCRIPTED_CUTSCENE
AND NOT IS_ON_MISSION
GET_VEHICLE_SUBCLASS hVeh i
IF NOT i = VEHICLE_SUBCLASS_TRAIN
AND NOT i = VEHICLE_SUBCLASS_BMX
GET_CAR_SPEED hVeh (fSpeed)
GET_CAR_COORDINATES hVeh car_x car_y car_z
IF NOT i = VEHICLE_SUBCLASS_PLANE
AND NOT i = VEHICLE_SUBCLASS_HELI
GOSUB CarHighSpeed
GOSUB CarInSidewalk
IF fSpeed < 20.0
GOSUB DriveEmergencyVehicles
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
fTimeOnSidewalk[iPlayerId] = 0.0
fDecreaseEase[iPlayerId] = 0.0
ENDIF
RETURN
/////////////////////////////////////////////////
CarHighSpeed:
IF IS_LOCAL_VAR_BIT_SET_CONST bRulesFlags FLAG_CAR_HIGH_SPEED
//PRINT_FORMATTED_NOW "sp %.3f" 100 fSpeed
IF fSpeed > fCarHighSpeedLimit
GOSUB IsSeenByCop
ENDIF
ENDIF
RETURN
CarInSidewalk:
IF IS_LOCAL_VAR_BIT_SET_CONST bRulesFlags FLAG_CAR_IN_SIDEWALK
GET_CLOSEST_CHAR_NODE car_x car_y car_z (x y z)
GET_DISTANCE_BETWEEN_COORDS_3D car_x car_y car_z x y z (fDistance)
IF fDistance > 3.0
fDecreaseEase[iPlayerId] +=@ 0.01
IF fDecreaseEase[iPlayerId] > 1.0
fDecreaseEase[iPlayerId] = 1.0
ENDIF
f = fSpeed / 10.0
IF f > 1.0
f = 1.0
ENDIF
fFinalDecreaseValue = fDecreaseEase[iPlayerId] * f
IF fFinalDecreaseValue > 0.0
fTimeOnSidewalk[iPlayerId] -=@ fFinalDecreaseValue
ENDIF
IF fTimeOnSidewalk[iPlayerId] < 0.0
fTimeOnSidewalk[iPlayerId] = 0.0
ENDIF
//PRINT_FORMATTED_NOW "~r~%.1f - %.1f" 100 fTimeOnSidewalk[iPlayerId] fFinalDecreaseValue
ELSE
fDecreaseEase[iPlayerId] -=@ 0.1
IF fDecreaseEase[iPlayerId] < 0.0
fDecreaseEase[iPlayerId] = 0.0
ENDIF
f = fSpeed / 20.0
IF f > 1.0
f = 1.0
ENDIF
fTimeOnSidewalk[iPlayerId] +=@ f
IF fTimeOnSidewalk[iPlayerId] > fCarInSidewalkTimeLimit
fDistance = 100.0
GOSUB IsSeenByCop
f = fCarInSidewalkTimeLimit * 2.0 // to avoid too high values
IF fTimeOnSidewalk[iPlayerId] > f
fTimeOnSidewalk[iPlayerId] = f
ENDIF
ENDIF
//PRINT_FORMATTED_NOW "~y~%.1f + %.1f" 100 fTimeOnSidewalk[iPlayerId] f
ENDIF
ENDIF
RETURN
DriveEmergencyVehicles:
IF IS_LOCAL_VAR_BIT_SET_CONST bRulesFlags FLAG_DRIVE_EMERGENCY_VEHICLES
IF IS_EMERGENCY_SERVICES_VEHICLE hVeh
GET_CAR_MODEL hVeh i
IF NOT i = 432 //rhino
AND NOT i = 601 //swatvan
IF IS_LOCAL_VAR_BIT_SET_CONST bRulesFlags FLAG_DRIVE_EMERGENCY_VEHICLES_CONSIDER_OUTFIT
GET_CHAR_MODEL scplayer i
IF IS_PLAYER_WEARING iPlayerId 17 POLICETR
RETURN
ENDIF
IF i >= 274
AND i <= 288
RETURN
ENDIF
ENDIF
fDistance = 20.0
GOSUB IsSeenByCop
ENDIF
ENDIF
ENDIF
RETURN
IsSeenByCop:
IF GET_CLOSEST_COP_NEAR_CHAR scplayer fDistance TRUE TRUE TRUE TRUE (hChar)
GET_SCRIPT_TASK_STATUS hChar 0x5C0 (i)
IF i = 7
TASK_LOOK_AT_VEHICLE hChar hVeh (3000)
ENDIF
ALTER_WANTED_LEVEL_NO_DROP iPlayerId 1
RETURN_TRUE
RETURN
ENDIF
RETURN_FALSE
RETURN
}
SCRIPT_END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment