Skip to content

Instantly share code, notes, and snippets.

@JuniorDjjr
Last active January 5, 2024 17:24
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/e46312e95b5c5ed0ab52f8ae452b51ee to your computer and use it in GitHub Desktop.
Save JuniorDjjr/e46312e95b5c5ed0ab52f8ae452b51ee to your computer and use it in GitHub Desktop.
// by Junior_Djjr - MixMods.com.br
// You need: https://forum.mixmods.com.br/f141-gta3script-cleo/t5206-como-criar-scripts-com-cleoplus
SCRIPT_START
{
LVAR_INT pTempString // In
LVAR_INT pFileString iAreaID bSpawnOnMission i lPedList iPed pKeyString pPedSpawn iTotalPeds hChar bLazySpawn bLoadAnim iTestMode lCreatedPedsList bInPanic
LVAR_FLOAT f x y z spawnX spawnY spawnZ radius
LVAR_TEXT_LABEL16 tAnimIfp tAnim
CONST_INT PED_SPAWN_COORD_X 0
CONST_INT PED_SPAWN_COORD_Y 1
CONST_INT PED_SPAWN_COORD_Z 2
CONST_INT PED_SPAWN_ANGLE 3
CONST_INT PED_SPAWN_MODEL 4
CONST_INT PED_SPAWN_FIX_GROUND 5
CONST_INT PED_SPAWN_FREEZE 6
CONST_INT PED_SPAWN_COLLISION 7
CONST_INT PED_SPAWN_CHANCE 8
CONST_INT PED_SPAWN_ANIM_IFP_OFFSET 36 // size 16
CONST_INT PED_SPAWN_ANIM_OFFSET 52 // size 16
CONST_INT SIZE_OF_PED_SPAWN_STRUCT 68 // 16 + 16 + (4*9)
GET_LABEL_POINTER Buffer pFileString
IF pTempString = 0 // First thread (root)
WAIT 0 // ignore first load frame, that then reloads
WAIT 0
IF FIND_FIRST_FILE "CLEO\Ped Spawn Creator\*.ini" (i pFileString)
WHILE TRUE
STREAM_CUSTOM_SCRIPT "Ped Spawn Creator (Junior_Djjr).cs" pFileString
WAIT 0 // to make .cs use the allocate memory var, so we can change it again
IF NOT FIND_NEXT_FILE i (pFileString)
BREAK
ENDIF
ENDWHILE
ENDIF
TERMINATE_THIS_CUSTOM_SCRIPT
ENDIF
// Each thread starts with pTempString as .ini file name
STRING_FORMAT pFileString "CLEO\Ped Spawn Creator\%s" $pTempString
GET_LABEL_POINTER Buffer2 pTempString
IF READ_STRING_FROM_INI_FILE $pFileString "Settings" "Coord" (pTempString)
IF NOT SCAN_STRING $pTempString "%f %f %f" i spawnX spawnY spawnZ
PRINT_FORMATTED_NOW "~r~Error: Unable to read 'Coord' from %s" 10000 $pFileString
TERMINATE_THIS_CUSTOM_SCRIPT
ENDIF
ELSE
PRINT_FORMATTED_NOW "~r~Error: Unable to find 'Coord' from %s" 10000 $pFileString
TERMINATE_THIS_CUSTOM_SCRIPT
ENDIF
IF NOT READ_INT_FROM_INI_FILE $pFileString "Settings" "AreaID" (iAreaID)
PRINT_FORMATTED_NOW "~r~Error: Unable to read 'AreaID' from %s" 10000 $pFileString
TERMINATE_THIS_CUSTOM_SCRIPT
ELSE
IF iAreaID = 0
PRINT_FORMATTED_NOW "~r~%s is using AreaID 0, which isn't adapted yet. Please use this mod for interiors only." 10000 $pFileString
TERMINATE_THIS_CUSTOM_SCRIPT
ENDIF
ENDIF
IF NOT READ_INT_FROM_INI_FILE $pFileString "Settings" "SpawnOnMission" (bSpawnOnMission)
PRINT_FORMATTED_NOW "~r~Error: Unable to read 'SpawnOnMission' from %s" 10000 $pFileString
TERMINATE_THIS_CUSTOM_SCRIPT
ENDIF
IF NOT READ_FLOAT_FROM_INI_FILE $pFileString "Settings" "Radius" (radius)
PRINT_FORMATTED_NOW "~r~Error: Unable to read 'Radius' from %s" 10000 $pFileString
TERMINATE_THIS_CUSTOM_SCRIPT
ENDIF
GET_LABEL_POINTER Buffer3 pKeyString
CREATE_LIST DATATYPE_INT (lPedList)
CREATE_LIST DATATYPE_INT (lCreatedPedsList)
iPed = 1
WHILE TRUE
STRING_FORMAT pKeyString "Ped%i" iPed
IF READ_STRING_FROM_INI_FILE $pFileString $pKeyString "Coord" (pTempString)
IF SCAN_STRING $pTempString "%f %f %f" i x y z
ALLOCATE_MEMORY SIZE_OF_PED_SPAWN_STRUCT (pPedSpawn)
LIST_ADD lPedList pPedSpawn
WRITE_STRUCT_PARAM pPedSpawn PED_SPAWN_COORD_X x
WRITE_STRUCT_PARAM pPedSpawn PED_SPAWN_COORD_Y y
WRITE_STRUCT_PARAM pPedSpawn PED_SPAWN_COORD_Z z
IF NOT READ_FLOAT_FROM_INI_FILE $pFileString $pKeyString "Angle" (f)
f = 0.0
ENDIF
WRITE_STRUCT_PARAM pPedSpawn PED_SPAWN_ANGLE f
IF NOT READ_INT_FROM_INI_FILE $pFileString $pKeyString "Model" (i)
i = -1
ENDIF
WRITE_STRUCT_PARAM pPedSpawn PED_SPAWN_MODEL i
IF NOT READ_INT_FROM_INI_FILE $pFileString $pKeyString "FixGround" (i)
i = TRUE
ENDIF
WRITE_STRUCT_PARAM pPedSpawn PED_SPAWN_FIX_GROUND i
IF NOT READ_INT_FROM_INI_FILE $pFileString $pKeyString "Freeze" (i)
i = FALSE
ENDIF
WRITE_STRUCT_PARAM pPedSpawn PED_SPAWN_FREEZE i
IF NOT READ_INT_FROM_INI_FILE $pFileString $pKeyString "Collision" (i)
i = TRUE
ENDIF
WRITE_STRUCT_PARAM pPedSpawn PED_SPAWN_COLLISION i
IF NOT READ_INT_FROM_INI_FILE $pFileString $pKeyString "Chance" (i)
i = 100
ENDIF
WRITE_STRUCT_PARAM pPedSpawn PED_SPAWN_CHANCE i
IF NOT READ_STRING_FROM_INI_FILE $pFileString $pKeyString "AnimIFP" (pTempString)
STRING_FORMAT pTempString ""
ENDIF
i = pPedSpawn + PED_SPAWN_ANIM_IFP_OFFSET
STRING_FORMAT i "%s" $pTempString
IF NOT READ_STRING_FROM_INI_FILE $pFileString $pKeyString "Anim" (pTempString)
STRING_FORMAT pTempString ""
ENDIF
i = pPedSpawn + PED_SPAWN_ANIM_OFFSET
STRING_FORMAT i "%s" $pTempString
ELSE
PRINT_FORMATTED_NOW "~r~Error: Unable to read 'Coord' from %s ped %i" 10000 $pFileString iPed
BREAK
ENDIF
ELSE
BREAK
ENDIF
++iPed
ENDWHILE
IF READ_INT_FROM_INI_FILE $pFileString "Settings" "TestMode" (iTestMode)
AND iTestMode > 0
WAIT 500
SET_AREA_VISIBLE iAreaID
GET_PLAYER_CHAR 0 (hChar)
SET_CHAR_AREA_VISIBLE hChar iAreaID
SET_CHAR_COORDINATES hChar spawnX spawnY spawnZ
WAIT 1500
ENDIF
WHILE TRUE
GOSUB Process
GET_AREA_VISIBLE (i)
IF i = iAreaID
IF NOT IS_ON_MISSION
OR bSpawnOnMission = TRUE
IF LOCATE_CAMERA_DISTANCE_TO_COORDINATES spawnX spawnY spawnZ radius
//PRINT_STRING_NOW "ok" 100
GOSUB CreatePeds
radius += 10.0
WHILE LOCATE_CAMERA_DISTANCE_TO_COORDINATES spawnX spawnY spawnZ radius
GET_AREA_VISIBLE (i)
IF NOT i = iAreaID
BREAK
ENDIF
i = 0 //player ID
GOSUB CheckPanic
IF IS_2PLAYER_GAME_GOING_ON
GET_PLAYER_CHAR 1 (hChar)
GOSUB CheckPanic
ENDIF
GOSUB Process
ENDWHILE
radius -= 10.0
GOSUB ReleasePeds
ENDIF
ENDIF
ENDIF
ENDWHILE
TERMINATE_THIS_CUSTOM_SCRIPT
Process:
WAIT 0
IF iTestMode > 0
IF TEST_CHEAT AREAID
GET_AREA_VISIBLE (timerb)
PRINT_FORMATTED_NOW "Current Area ID: %i" 4000 timerb
ENDIF
ENDIF
RETURN
CheckPanic:
IF bInPanic = FALSE
GET_PLAYER_CHAR i (hChar)
IF IS_CHAR_SHOOTING hChar
GOSUB SetPanic
RETURN
ENDIF
IF GET_CHAR_PLAYER_IS_TARGETING i timera
AND DOES_CHAR_EXIST timera
GET_CURRENT_CHAR_WEAPON hChar (timera)
IF IS_WEAPON_FIRE_TYPE timera WEAPONFIRE_INSTANT_HIT
OR IS_WEAPON_FIRE_TYPE timera WEAPONFIRE_PROJECTILE
OR IS_WEAPON_FIRE_TYPE timera WEAPONFIRE_AREA_EFFECT
GOSUB SetPanic
RETURN
ENDIF
ENDIF
IF IS_CHAR_FIGHTING hChar
timerb = 0
WHILE GET_ANY_CHAR_NO_SAVE_RECURSIVE timerb (timerb timera)
IF NOT hChar = timera
IF LOCATE_CHAR_DISTANCE_TO_CHAR hChar timera 1.0
hChar = timera
GOSUB ClearTaskThisChar
RETURN
ENDIF
ENDIF
ENDWHILE
ENDIF
ENDIF
RETURN
SetPanic:
iPed = 0
GET_LIST_SIZE lCreatedPedsList (iTotalPeds)
WHILE iPed < iTotalPeds
GET_LIST_VALUE_BY_INDEX lCreatedPedsList iPed (hChar)
IF DOES_CHAR_EXIST hChar
GOSUB ClearTaskThisChar
ENDIF
++iPed
ENDWHILE
bInPanic = TRUE
RETURN
ClearTaskThisChar:
IF GET_EXTENDED_CHAR_VAR hChar AUTO 1 (timera)
IF timera = 1
FREEZE_CHAR_POSITION hChar OFF
SET_CHAR_COLLISION hChar TRUE
CLEAR_CHAR_TASKS hChar
MARK_CHAR_AS_NO_LONGER_NEEDED hChar // releases everything
MARK_CHAR_AS_NEEDED hChar // but make sure that don't delete it
SET_EXTENDED_CHAR_VAR hChar AUTO 1 0
ENDIF
ENDIF
RETURN
CreatePeds:
bInPanic = FALSE
iPed = 0
GET_LIST_SIZE lPedList (iTotalPeds)
WHILE iPed < iTotalPeds
GET_LIST_VALUE_BY_INDEX lPedList iPed (pPedSpawn)
READ_STRUCT_PARAM pPedSpawn PED_SPAWN_CHANCE (i)
IF RANDOM_PERCENT i
OR iTestMode = 2
READ_STRUCT_PARAM pPedSpawn PED_SPAWN_COORD_X (x)
READ_STRUCT_PARAM pPedSpawn PED_SPAWN_COORD_Y (y)
READ_STRUCT_PARAM pPedSpawn PED_SPAWN_COORD_Z (z)
GET_FADE_ALPHA f
IF f > 0.8
bLazySpawn = FALSE
ELSE
bLazySpawn = TRUE
ENDIF
pTempString = pPedSpawn + PED_SPAWN_ANIM_IFP_OFFSET
GET_STRING_LENGTH $pTempString (i)
IF i > 1
STRING_FORMAT tAnimIfp "%s" pTempString
IF NOT IS_STRING_EQUAL $pTempString "ped" 3 FALSE ""
REQUEST_ANIMATION $tAnimIfp
bLoadAnim = TRUE
ENDIF
ENDIF
READ_STRUCT_PARAM pPedSpawn PED_SPAWN_MODEL (i)
IF i >= 0
REQUEST_MODEL i
IF bLazySpawn = TRUE
WHILE NOT HAS_MODEL_LOADED i
WAIT 0
ENDWHILE
IF bLoadAnim = TRUE
//PRINT_FORMATTED_NOW "loading ifp '%s'" 10000 $tAnimIfp
WHILE NOT HAS_ANIMATION_LOADED $tAnimIfp
WAIT 0
ENDWHILE
ENDIF
ELSE
LOAD_ALL_MODELS_NOW
ENDIF
GET_MODEL_PED_TYPE i (timera timerb)
CREATE_CHAR timera i x y z (hChar)
MARK_MODEL_AS_NO_LONGER_NEEDED i
ELSE
IF bLoadAnim = TRUE
IF bLazySpawn = TRUE
WHILE NOT HAS_ANIMATION_LOADED $tAnimIfp
WAIT 0
ENDWHILE
ELSE
LOAD_ALL_MODELS_NOW
ENDIF
ENDIF
CREATE_RANDOM_CHAR x y z (hChar)
ENDIF
SET_CHAR_AREA_VISIBLE hChar iAreaID
READ_STRUCT_PARAM pPedSpawn PED_SPAWN_ANGLE (f)
SET_CHAR_HEADING hChar f
READ_STRUCT_PARAM pPedSpawn PED_SPAWN_FIX_GROUND (i)
FIX_CHAR_GROUND_BRIGHTNESS_AND_FADE_IN hChar i TRUE bLazySpawn
READ_STRUCT_PARAM pPedSpawn PED_SPAWN_FREEZE (i)
FREEZE_CHAR_POSITION hChar i
READ_STRUCT_PARAM pPedSpawn PED_SPAWN_COLLISION (i)
SET_CHAR_COLLISION hChar i
pTempString = pPedSpawn + PED_SPAWN_ANIM_OFFSET
GET_STRING_LENGTH $pTempString (i)
IF i > 1
STRING_FORMAT tAnim "%s" pTempString
//PRINT_FORMATTED_NOW "'%s' '%s'" 10000 $tAnim $tAnimIfp
READ_STRUCT_PARAM pPedSpawn PED_SPAWN_FREEZE (i)
IF i = TRUE
TASK_PLAY_ANIM_NON_INTERRUPTABLE hChar $tAnim $tAnimIfp 20.0 TRUE FALSE FALSE FALSE -1
ELSE
TASK_PLAY_ANIM hChar $tAnim $tAnimIfp 20.0 TRUE FALSE FALSE FALSE -1
ENDIF
ENDIF
// Extended vars will be very useful for upcoming in-game editor
INIT_EXTENDED_CHAR_VARS hChar AUTO 2
SET_EXTENDED_CHAR_VAR hChar AUTO 1 1 // is doing tasks
pTempString = pPedSpawn + PED_SPAWN_ANIM_IFP_OFFSET
SET_EXTENDED_CHAR_VAR hChar AUTO 2 pTempString
LIST_ADD lCreatedPedsList hChar
ENDIF
++iPed
ENDWHILE
RETURN
ReleasePeds:
iPed = 0
GET_LIST_SIZE lCreatedPedsList (iTotalPeds)
WHILE iPed < iTotalPeds
GET_LIST_VALUE_BY_INDEX lCreatedPedsList iPed (hChar)
IF DOES_CHAR_EXIST hChar
IF GET_EXTENDED_CHAR_VAR hChar AUTO 2 (pTempString)
STRING_FORMAT tAnimIfp "%s" pTempString
REMOVE_ANIMATION $tAnimIfp
ENDIF
DELETE_CHAR hChar
ENDIF
++iPed
ENDWHILE
RESET_LIST lCreatedPedsList
RETURN
}
SCRIPT_END
Buffer:
DUMP
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ENDDUMP
Buffer2:
DUMP
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ENDDUMP
Buffer3:
DUMP
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ENDDUMP
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment