Skip to content

Instantly share code, notes, and snippets.

@JuniorDjjr
Created November 29, 2020 04:16
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/e641a5c3b14fecebc2265662dc1ef8b9 to your computer and use it in GitHub Desktop.
Save JuniorDjjr/e641a5c3b14fecebc2265662dc1ef8b9 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 playerId i j scplayer iModel hObject pObject pMatrix pColPoint pQuat bValidToSpray iTimeToFinish iSpraying hProcessObject iAlpha bNotSprayingLastFrame pAPI pSetObjectAlpha iLayer iSelected iFlags iTotalModels
LVAR_FLOAT x y z x2 y2 z2 f g fTotalArea
CONST_INT MIN_ALPHA 60
CONST_FLOAT HUD_ICON_SIZE 20.0
CONST_FLOAT HUD_POS_X 310.0
CONST_FLOAT HUD_POS_X_PLAYER_2 400.0
CONST_FLOAT HUD_POS_Y 20.0
CONST_FLOAT HUD_POS_Y_ICON_SPACE 10.0
CONST_FLOAT HUD_POS_Y_TEXT_SPACE 25.0
CONST_INT FLAG_SAVE 0
CONST_INT FLAG_DONE 1
CONST_INT FLAG_ENABLED_LAST_FRAME 2
CONST_INT SPRITE_ICON_STYLE 1
CONST_INT SPRITE_ICON_LAYER 2
CONST_INT SPRITE_ICON_DELETE 3
WAIT 600
IF playerId = 0
STREAM_CUSTOM_SCRIPT "Graffiti Anywhere (Junior_Djjr).cs" 1
GET_PLAYER_CHAR playerId scplayer
ENDIF
pSetObjectAlpha = 0
IF GET_LOADED_LIBRARY "ObjectColorsAPI.SA.asi" (pAPI)
IF NOT GET_DYNAMIC_LIBRARY_PROCEDURE "SetObjectAlpha" pAPI (pSetObjectAlpha)
pSetObjectAlpha = 0
ENDIF
ENDIF
IF pSetObjectAlpha = 0
PRINT_STRING_NOW "~r~Error: Graffiti Anywhere requires 'ObjectColorsAPI.SA.asi' installed." 5000
TERMINATE_THIS_CUSTOM_SCRIPT
ENDIF
iLayer = 1
iSelected = 1
IF GOSUB ReadSelected
ELSE
PRINT_STRING_NOW "~r~Error: Need at least one graffiti model ID in 'Graffiti Anywhere.ini' 'Models'" 5000
TERMINATE_THIS_CUSTOM_SCRIPT
ENDIF
IF READ_INT_FROM_INI_FILE "CLEO/Graffiti Anywhere.ini" "Settings" "Save" (i)
AND i = TRUE
SET_LOCAL_VAR_BIT_CONST iFlags FLAG_SAVE
ENDIF
LOAD_TEXTURE_DICTIONARY GRFANYW
LOAD_SPRITE 1 ICON_STYLE
LOAD_SPRITE 2 ICON_LAYER
LOAD_SPRITE 3 ICON_DELETE
/////////////////////////////////////////////
WHILE TRUE
IF TEST_CHEAT CLEARALLGRAF
CREATE_LIST DATATYPE_INT timera
j = 1
GET_LABEL_POINTER Buffer32 (i)
WHILE j < 1000
STRING_FORMAT i "ID%i" j
IF NOT READ_INT_FROM_INI_FILE "CLEO/Graffiti Anywhere.ini" "Models" $i (iModel)
BREAK
ENDIF
LIST_ADD timera iModel
++j
ENDWHILE
i = 0
GET_LIST_SIZE timera timerb
WHILE GET_ANY_OBJECT_NO_SAVE_RECURSIVE i (i hObject)
j = 0
WHILE j < timerb
GET_LIST_VALUE_BY_INDEX timera j (iModel)
IF DOES_OBJECT_HAVE_THIS_MODEL hObject iModel
DELETE_OBJECT hObject
BREAK
ENDIF
++j
ENDWHILE
ENDWHILE
DELETE_LIST timera
PRINT_HELP GRFANY3
ENDIF
/*IF TEST_CHEAT GR
REQUEST_MODEL SPRAYCAN
LOAD_ALL_MODELS_NOW
GIVE_WEAPON_TO_CHAR scplayer WEAPONTYPE_SPRAYCAN 9999
ENDIF*/
IF IS_LOCAL_VAR_BIT_SET_CONST iFlags FLAG_ENABLED_LAST_FRAME
GOSUB DrawInterface
ELSE
WAIT 0
ENDIF
CLEAR_LOCAL_VAR_BIT_CONST iFlags FLAG_ENABLED_LAST_FRAME
IF playerId = 1
IF IS_2PLAYER_GAME_GOING_ON
GET_PLAYER_CHAR playerId scplayer
ELSE
CONTINUE
ENDIF
ENDIF
IF IS_CURRENT_CHAR_WEAPON scplayer WEAPONTYPE_SPRAYCAN
IF IS_AIM_BUTTON_PRESSED playerId
AND NOT IS_CHAR_DEAD scplayer
AND NOT IS_CHAR_IN_ANY_CAR scplayer
AND NOT IS_CHAR_DOING_ANY_IMPORTANT_TASK scplayer INCLUDE_ANIMS_BOTH
AND NOT IS_ON_SCRIPTED_CUTSCENE
SET_LOCAL_VAR_BIT_CONST iFlags FLAG_ENABLED_LAST_FRAME
GOSUB PosGraffiti
ENDIF
ENDIF
ENDWHILE
/////////////////////////////////////////////
PosGraffiti:
// Paint disabled, wait change graffiti
IF iSelected = 0
WHILE IS_CURRENT_CHAR_WEAPON scplayer WEAPONTYPE_SPRAYCAN
AND IS_AIM_BUTTON_PRESSED playerId
IF IS_BUTTON_JUST_PRESSED playerId LEFTSHOULDER2
iSelected = 1
BREAK
ENDIF
IF IS_BUTTON_JUST_PRESSED playerId RIGHTSHOULDER2
iSelected = iTotalModels
BREAK
ENDIF
GOSUB DrawInterface
IF playerId = 1
IF NOT IS_2PLAYER_GAME_GOING_ON
BREAK
ENDIF
ENDIF
ENDWHILE
RETURN
ENDIF
IF GOSUB ReadSelected
ELSE
RETURN
ENDIF
REQUEST_PRIORITY_MODEL iModel
LOAD_ALL_PRIORITY_MODELS_NOW
CREATE_OBJECT_NO_SAVE iModel 0.0 0.0 -100.0 FALSE FALSE (hObject)
GET_OBJECT_POINTER hObject (pObject)
READ_STRUCT_OFFSET pObject 0x14 4 (pMatrix)
iAlpha = MIN_ALPHA
bValidToSpray = FALSE
iSpraying = FALSE
bNotSprayingLastFrame = FALSE
timera = 0
CLEAR_LOCAL_VAR_BIT_CONST iFlags FLAG_DONE
//extern "C" void __declspec(dllexport) SetObjectColor(CObject *object, int red, int green, int blue)
//CALL_FUNCTION pSetObjectAlpha 2 2 (iAlpha pObject)()
WHILE IS_CURRENT_CHAR_WEAPON scplayer WEAPONTYPE_SPRAYCAN
AND IS_AIM_BUTTON_PRESSED playerId
AND DOES_OBJECT_EXIST hObject
AND NOT IS_CHAR_DEAD scplayer
AND NOT IS_CHAR_IN_ANY_CAR scplayer
AND NOT IS_CHAR_DOING_ANY_IMPORTANT_TASK scplayer INCLUDE_ANIMS_BOTH
AND NOT IS_ON_SCRIPTED_CUTSCENE
GET_CURRENT_CAMERA_MODE (i)
IF i = CAMERAMODE_AIMING
OR i = CAMERAMODE_AIMWEAPON
// the following ones aren't really required, but trying to be safe
OR i = CAMERAMODE_FOLLOWPED
OR i = CAMERAMODE_1STPERSON
OR i = CAMERAMODE_CAM_ON_A_STRING
OR i >= CAMERAMODE_AIMWEAPON_ATTACHED // maybe this includes other camera modes added by mods
GET_OFFSET_FROM_CAMERA_IN_WORLD_COORDS 0.0 0.0 0.0 (x y z)
GET_OFFSET_FROM_CAMERA_IN_WORLD_COORDS 0.0 5.0 0.0 (x2 y2 z2)
ELSE
GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS scplayer 0.0 0.0 0.0 (x y z)
GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS scplayer 0.0 5.0 0.0 (x2 y2 z2)
ENDIF
IF IS_BUTTON_JUST_PRESSED playerId LEFTSHOULDER2
++iSelected
IF iSelected > iTotalModels
iSelected = 0
ENDIF
BREAK
ENDIF
IF IS_BUTTON_JUST_PRESSED playerId RIGHTSHOULDER2
--iSelected
BREAK
ENDIF
IF NOT LOCATE_CHAR_DISTANCE_TO_OBJECT scplayer hObject 7.0
bValidToSpray = FALSE
ENDIF
// Fix spraycan "reloading" on 1 frame (not really realoading)
IF bValidToSpray = TRUE
GET_CHAR_WEAPON_STATE scplayer iSpraying
ELSE
iSpraying = FALSE
ENDIF
IF iSpraying = FALSE
IF bNotSprayingLastFrame = TRUE
timera = 0
ELSE
iSpraying = TRUE
ENDIF
bNotSprayingLastFrame = TRUE
ELSE
bNotSprayingLastFrame = FALSE
ENDIF
IF IS_LOCAL_VAR_BIT_SET_CONST iFlags FLAG_DONE
IF iSpraying = FALSE
BREAK
ENDIF
GOSUB DrawInterface
IF playerId = 1
IF NOT IS_2PLAYER_GAME_GOING_ON
BREAK
ENDIF
ENDIF
CONTINUE
ELSE
SET_OBJECT_VISIBLE hObject OFF
ENDIF
IF IS_BUTTON_JUST_PRESSED playerId DPADRIGHT
++iLayer
IF iLayer > 10
iLayer = 10
ENDIF
ENDIF
IF IS_BUTTON_JUST_PRESSED playerId DPADLEFT
--iLayer
IF iLayer < 1
iLayer = 1
ENDIF
ENDIF
bValidToSpray = FALSE
iAlpha = MIN_ALPHA
GET_PED_POINTER scplayer i
GET_LABEL_POINTER ColPointBuffer (pColPoint)
IF GET_COLLISION_BETWEEN_POINTS (x y z) (x2 y2 z2) TRUE FALSE FALSE FALSE FALSE TRUE TRUE TRUE i pColPoint (x y z i)
IF IS_BUTTON_PRESSED playerId DPADDOWN
AND playerId = 0
i = 0
WHILE GET_ANY_OBJECT_NO_SAVE_RECURSIVE i (i j)
GET_OBJECT_MODEL j timera
IF timera = iModel
AND NOT hObject = j
AND LOCATE_OBJECT_DISTANCE_TO_OBJECT hObject j 1.0
DELETE_OBJECT j
ENDIF
ENDWHILE
timera = 0
ELSE
SET_OBJECT_VISIBLE hObject ON
bValidToSpray = TRUE
// Final validation
IF iSpraying = 1
IF NOT IS_WANTED_LEVEL_GREATER playerId 0
IF GET_CLOSEST_COP_NEAR_CHAR scplayer 50.0 TRUE TRUE TRUE TRUE i
ALTER_WANTED_LEVEL_NO_DROP playerId 1
ENDIF
ENDIF
GET_MODEL_DIMENSIONS iModel (x y z x2 y2 z2)
fTotalArea = 0.0
f = x - x2
ABS_LVAR_FLOAT f
fTotalArea += f
f = y - y2
ABS_LVAR_FLOAT f
fTotalArea += f
f = z - z2
ABS_LVAR_FLOAT f
fTotalArea += f
f = fTotalArea * 400.0
iTimeToFinish =# f
iTimeToFinish += 500
IF timera > iTimeToFinish
iAlpha = 255
// Set object to save
IF IS_LOCAL_VAR_BIT_SET_CONST iFlags FLAG_SAVE
WRITE_STRUCT_OFFSET pObject 0x13C 1 2 // eObjectType::OBJECT_MISSION
ENDIF
SET_LOCAL_VAR_BIT_CONST iFlags FLAG_DONE
ELSE
// convert to percent progress; mult for close 255.0
f =# timera
g =# iTimeToFinish
f /= g
f *= 120.0
iAlpha =# f
iAlpha += MIN_ALPHA
CLAMP_INT iAlpha MIN_ALPHA 255 (iAlpha)
//PRINT_FORMATTED_NOW "%i / %i ALPHA %f" 1000 timera iTimeToFinish f
ENDIF
ELSE
SET_OBJECT_COORDINATES hObject x y z
GET_COLPOINT_NORMAL_VECTOR pColPoint (x2 y2 z2)
GET_LABEL_POINTER QuaternionBuffer (pQuat)
// for better CONVERT_DIRECTION_TO_QUAT calculation
x2 *= 10.0
y2 *= 10.0
z2 *= 10.0
CONVERT_DIRECTION_TO_QUAT pQuat x2 y2 z2
ROTATE_QUAT_ON_AXIS pQuat 1.0 0.0 0.0 -90.0 1
SET_MATRIX_ROTATION_FROM_QUAT pMatrix pQuat
f =# iLayer
f *= -0.01 // each layer step
GET_OFFSET_FROM_OBJECT_IN_WORLD_COORDS hObject 0.0 f 0.0 x y z
SET_OBJECT_COORDINATES hObject x y z
ENDIF
ENDIF
ENDIF
IF DOES_OBJECT_EXIST hObject
CALL_FUNCTION pSetObjectAlpha 2 2 (iAlpha pObject)()
ENDIF
GOSUB DrawInterface
IF playerId = 1
IF NOT IS_2PLAYER_GAME_GOING_ON
BREAK
ENDIF
ENDIF
ENDWHILE
IF NOT IS_LOCAL_VAR_BIT_SET_CONST iFlags FLAG_DONE
AND hObject > 0
DELETE_OBJECT hObject
hObject = 0
ENDIF
RETURN
DrawInterface:
GET_FIXED_XY_ASPECT_RATIO HUD_ICON_SIZE HUD_ICON_SIZE (x y)
y2 = HUD_POS_Y
IF playerId = 0
x2 = HUD_POS_X
ELSE
x2 = HUD_POS_X_PLAYER_2
ENDIF
DRAW_SPRITE SPRITE_ICON_STYLE x2 y2 x y 255 255 255 255
y2 += HUD_POS_Y_ICON_SPACE
GOSUB HudTextFormat
DISPLAY_TEXT_WITH_NUMBER x2 y2 GRFANY0 iSelected
y2 += HUD_POS_Y_TEXT_SPACE
DRAW_SPRITE SPRITE_ICON_LAYER x2 y2 x y 255 255 255 255
y2 += HUD_POS_Y_ICON_SPACE
GOSUB HudTextFormat
DISPLAY_TEXT_WITH_NUMBER x2 y2 GRFANY1 iLayer
y2 += HUD_POS_Y_TEXT_SPACE
IF NOT iSelected = 0
IF IS_BUTTON_PRESSED playerId DPADDOWN
DRAW_SPRITE SPRITE_ICON_DELETE x2 y2 x y 255 50 0 255
y2 += HUD_POS_Y_ICON_SPACE
GOSUB HudTextFormat
SET_TEXT_COLOUR 255 50 0 255
ELSE
DRAW_SPRITE SPRITE_ICON_DELETE x2 y2 x y 255 255 255 255
y2 += HUD_POS_Y_ICON_SPACE
GOSUB HudTextFormat
ENDIF
DISPLAY_TEXT x2 y2 GRFANY2
y2 += HUD_POS_Y_TEXT_SPACE
ENDIF
USE_TEXT_COMMANDS 0
WAIT 0
RETURN
HudTextFormat:
SET_TEXT_FONT FONT_MENU
SET_TEXT_PROPORTIONAL TRUE
SET_TEXT_SCALE 0.3 0.93
SET_TEXT_EDGE 1 0 0 0 255
SET_TEXT_COLOUR 255 255 255 255
SET_TEXT_CENTRE TRUE
SET_TEXT_CENTRE_SIZE 640.0
RETURN
CountModels:
iTotalModels = 0
j = 1
GET_LABEL_POINTER Buffer32 (i)
WHILE j < 1000
STRING_FORMAT i "ID%i" j
IF NOT READ_INT_FROM_INI_FILE "CLEO/Graffiti Anywhere.ini" "Models" $i (iModel)
BREAK
ENDIF
++iTotalModels
++j
ENDWHILE
IF iTotalModels > 0
RETURN_TRUE
RETURN
ENDIF
RETURN_FALSE
RETURN
ReadSelected:
GOSUB CountModels
j = iModel //backup
GET_LABEL_POINTER Buffer32 (i)
STRING_FORMAT i "ID%i" iSelected
READ_INT_FROM_INI_FILE "CLEO/Graffiti Anywhere.ini" "Models" $i (iModel)
IF NOT IS_MODEL_IN_CDIMAGE iModel
PRINT_FORMATTED_NOW "~r~Error: Can't read graffiti model ID %i" 3000 iModel
IF j = 0
RETURN_FALSE
RETURN
ELSE
iModel = j
ENDIF
ENDIF
RETURN_TRUE
RETURN
}
SCRIPT_END
ColPointBuffer:
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
ENDDUMP
QuaternionBuffer:
DUMP
00 00 00 00 //x
00 00 00 00 //y
00 00 00 00 //z
00 00 00 00 //w
ENDDUMP
Buffer32:
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
ENDDUMP
@luanalatte
Copy link

Is this code updated with the night lighting fix? I am trying to fix an issue with my controller input (using Ginput's IV-style mapping, you might want to take a look at that conflict yourself).

Asking here since I don't have a facebook account to comment on mixmods. I love your work!

@JuniorDjjr
Copy link
Author

Prelight is inside .dff.

@luanalatte
Copy link

Oh, thanks! I will try to workaround the issue later then

@JuniorDjjr
Copy link
Author

GET_DAY_NIGHT_BALANCE from CLEO+ returns the balance value used for prelight transition.

@luanalatte
Copy link

oh nono, I don't need to change that. If prelight works on the .dff and this code is indeed up to date with the last .cs then I will only need to change the joystick mappings to work with the IV-style ginput preset!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment