Skip to content

Instantly share code, notes, and snippets.

@JuniorDjjr
Last active January 5, 2024 17:38
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save JuniorDjjr/9cb8bf9d4d8d57af0afc82cd6aa381e9 to your computer and use it in GitHub Desktop.
Save JuniorDjjr/9cb8bf9d4d8d57af0afc82cd6aa381e9 to your computer and use it in GitHub Desktop.
// by Junior_Djjr - MixMods.com.br
// v0.6
// You need: https://forum.mixmods.com.br/f141-gta3script-cleo/t5206-como-criar-scripts-com-cleo
SCRIPT_START
{
LVAR_INT scplayer hFile i j k hObject pColPoint pObject iEditMode iEditModeBackup lObjectsList iModelId pBuffer bSelectDisabled bUpdateDisabled bForceUpdate bLoadOnEnable bAlreadyTeleported
LVAR_FLOAT x y z x2 y2 z2 fPointX fPointY fPointZ fCurSens fMouseMoveSensMult fMouseRotateSensMult fMouseSensDivButton fSelectedCoronaSize
CONST_INT EDIT_SURFACE 0
CONST_INT EDIT_MOVE_XY 1
CONST_INT EDIT_MOVE_Z 2
CONST_INT EDIT_ROTATE_XY 3
CONST_INT EDIT_ROTATE_Z 4
CONST_INT STRUCT_ORIGIN_COORD_X 0
CONST_INT STRUCT_ORIGIN_COORD_Y 1
CONST_INT STRUCT_ORIGIN_COORD_Z 2
CONST_INT STRUCT_OFFSET_COORD_X 3
CONST_INT STRUCT_OFFSET_COORD_Y 4
CONST_INT STRUCT_OFFSET_COORD_Z 5
CONST_INT STRUCT_ROTATION_X 6
CONST_INT STRUCT_ROTATION_Y 7
CONST_INT STRUCT_ROTATION_Z 8
CONST_INT STRUCT_QUAT_X 9
CONST_INT STRUCT_QUAT_Y 10
CONST_INT STRUCT_QUAT_Z 11
CONST_INT STRUCT_QUAT_W 12
WAIT 0
WAIT 0
GET_PLAYER_CHAR 0 scplayer
GET_LABEL_POINTER Buffer (pBuffer)
WHILE TRUE
WAIT 0
IF TEST_CHEAT IGME
PRINT_STRING_NOW "~y~In-Game Map Editor activated." 2000
MAKE_NOP 0x536145 5 // disable wind, to fix rotation for trees etc
READ_FLOAT_FROM_INI_FILE "CLEO\In-Game Map Editor.ini" "Settings" "MouseMoveSensMult" fMouseMoveSensMult
READ_FLOAT_FROM_INI_FILE "CLEO\In-Game Map Editor.ini" "Settings" "MouseRotateSensMult" fMouseRotateSensMult
READ_FLOAT_FROM_INI_FILE "CLEO\In-Game Map Editor.ini" "Settings" "MouseSensDivButton" fMouseSensDivButton
READ_FLOAT_FROM_INI_FILE "CLEO\In-Game Map Editor.ini" "Settings" "SelectedCoronaSize" fSelectedCoronaSize
READ_INT_FROM_INI_FILE "CLEO\In-Game Map Editor.ini" "Project" "LoadOnEnable" bLoadOnEnable
i = FALSE
READ_INT_FROM_INI_FILE "CLEO\In-Game Map Editor.ini" "Project" "TeleportOnEnableOnce" i
IF bAlreadyTeleported = FALSE
OR i = FALSE // TeleportOnEnableOnce
IF READ_STRING_FROM_INI_FILE "CLEO\In-Game Map Editor.ini" "Project" "TeleportOnEnable" pBuffer
SCAN_STRING $pBuffer "%f %f %f" i (x y z)
IF i = 3
SET_CHAR_COORDINATES scplayer x y z
bAlreadyTeleported = TRUE
WAIT 200
ENDIF
ENDIF
ENDIF
CREATE_LIST DATATYPE_INT (lObjectsList)
GIVE_WEAPON_TO_CHAR scplayer WEAPONTYPE_PISTOL 999
SET_CAR_DENSITY_MULTIPLIER 0.0
SET_PED_DENSITY_MULTIPLIER 0.0
IF bLoadOnEnable = TRUE
CLEO_CALL Load 0 (lObjectsList 17)()
ENDIF
iEditMode = EDIT_SURFACE
iEditModeBackup = iEditMode
WHILE NOT TEST_CHEAT IGME
WAIT 0
IF TEST_CHEAT LOAD
CLEO_CALL Load 0 (lObjectsList 17)()
ENDIF
IF TEST_CHEAT SAVE
CLEO_CALL Save 0 (lObjectsList)()
ENDIF
// Reset each frame
SET_CAMERA_CONTROL ON
SET_PLAYER_CYCLE_WEAPON_BUTTON 0 ON
SET_PLAYER_DUCK_BUTTON 0 ON
// Force
SET_PLAYER_FIRE_BUTTON 0 OFF
bForceUpdate = FALSE
IF IS_KEY_PRESSED VK_LCONTROL
OR IS_KEY_PRESSED VK_RCONTROL
SET_PLAYER_DUCK_BUTTON 0 OFF
IF IS_KEY_PRESSED VK_KEY_V
IF IS_KEY_JUST_PRESSED VK_LCONTROL
OR IS_KEY_JUST_PRESSED VK_RCONTROL
OR IS_KEY_JUST_PRESSED VK_KEY_V
READ_CLIPBOARD_DATA_TO pBuffer 32
SCAN_STRING $pBuffer "%i" i (j)
IF i = 1
IF CLEO_CALL ModelExist 0 (j)()
iModelId = j
//GOSUB DeleteCurrentObject
PRINT_FORMATTED_NOW "Paste ID:~y~ %i" 2000 iModelId
IF IS_CHAR_USING_GUN scplayer
bForceUpdate = TRUE
ENDIF
GOTO ForceCreateNewObject
ENDIF
PRINT_FORMATTED_NOW "~r~Model ID '%i' doesn't exist." 2000 j
ENDIF
ENDIF
ENDIF
IF IS_KEY_PRESSED VK_KEY_C
IF IS_KEY_JUST_PRESSED VK_LCONTROL
OR IS_KEY_JUST_PRESSED VK_RCONTROL
OR IS_KEY_JUST_PRESSED VK_KEY_C
/*IF DOES_OBJECT_EXIST hObject
GET_OBJECT_MODEL hObject j
STRING_FORMAT pBuffer "%i" j
WRITE_CLIPBOARD_DATA_FROM pBuffer 16
PRINT_FORMATTED_NOW "Copied ID:~y~ %s" 2000 $pBuffer
ELSE*/
GET_CHAR_COORDINATES scplayer x y z
GET_VAR_POINTER fPointX (i)
GET_VAR_POINTER x2 (j) //Camera
//514970 double __thiscall CCamera::Find3rdPersonCamTargetVector(CCamera *this, float range, float srcx, float srcy, float srcz, CVector *pCamera, CVector *pPoint)
CALL_METHOD 0x514970 0xB6F028 6 0 (i j z y x 200.0)()
GET_LABEL_POINTER ColPoint (pColPoint)
IF GET_COLLISION_BETWEEN_POINTS x2 y2 z2 fPointX fPointY fPointZ TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE -1 pColPoint x y z i
IF NOT i = -1
READ_STRUCT_OFFSET i 0x22 2 (j)
STRING_FORMAT pBuffer "%i" j
WRITE_CLIPBOARD_DATA_FROM pBuffer 16
PRINT_FORMATTED_NOW "Copied ID:~y~ %s" 2000 $pBuffer
ENDIF
ENDIF
//ENDIF
ENDIF
ENDIF
ENDIF
IF bSelectDisabled = TRUE
IF NOT IS_BUTTON_JUST_PRESSED PAD1 TRIANGLE
AND NOT IS_KEY_JUST_PRESSED VK_KEY_Y
AND NOT IS_KEY_JUST_PRESSED VK_DELETE
bSelectDisabled = FALSE
ENDIF
ENDIF
IF bUpdateDisabled = TRUE
IF NOT IS_ANY_FIRE_BUTTON_PRESSED PAD1
bUpdateDisabled = FALSE
ENDIF
ENDIF
IF IS_BUTTON_JUST_PRESSED PAD1 TRIANGLE
OR IS_KEY_JUST_PRESSED VK_KEY_Y
GOSUB CancelSaveCurrentObject
PRINT_STRING_NOW "~y~Object OK." 1000
bSelectDisabled = TRUE
ENDIF
IF IS_KEY_JUST_PRESSED VK_DELETE
IF DOES_OBJECT_EXIST hObject
GOSUB DeleteCurrentObject
PRINT_STRING_NOW "~r~Object Deleted." 1000
ENDIF
bSelectDisabled = TRUE
ENDIF
// Edit mode enabled
IF IS_CHAR_USING_GUN scplayer
SET_PLAYER_CYCLE_WEAPON_BUTTON 0 OFF
iEditMode = iEditModeBackup
IF IS_MOUSE_WHEEL_UP
++iEditMode
CLAMP_INT iEditMode EDIT_SURFACE EDIT_ROTATE_Z (iEditMode)
ENDIF
IF IS_MOUSE_WHEEL_DOWN
--iEditMode
CLAMP_INT iEditMode EDIT_SURFACE EDIT_ROTATE_Z (iEditMode)
ENDIF
iEditModeBackup = iEditMode // store for reset after hotkey
// Hotkeys
IF IS_KEY_PRESSED VK_KEY_Z
iEditMode = EDIT_MOVE_Z
ENDIF
IF IS_KEY_PRESSED VK_KEY_X
iEditMode = EDIT_ROTATE_Z
ENDIF
GOSUB ShowInterface
IF DOES_OBJECT_EXIST hObject
IF IS_KEY_JUST_PRESSED 4
GET_OBJECT_MODEL hObject (iModelId)
ForceCreateNewObject:
i = hObject
IF CLEO_CALL NewObject 0 (iModelId lObjectsList)(hObject)
IF IS_KEY_JUST_PRESSED 4 // created by duplication
CLEO_CALL CloneObject 0 (hObject i)()
ENDIF
bForceUpdate = TRUE
GOTO UpdateOnSurface
ELSE
CONTINUE
ENDIF
ENDIF
IF IS_ANY_FIRE_BUTTON_PRESSED PAD1
AND bUpdateDisabled = FALSE
IF NOT IS_KEY_PRESSED VK_LCONTROL
AND NOT IS_KEY_PRESSED VK_RCONTROL
IF iEditMode = EDIT_SURFACE
UpdateOnSurface:
GET_CHAR_COORDINATES scplayer x y z
GET_VAR_POINTER fPointX (i)
GET_VAR_POINTER x2 (j) //Camera
//514970 double __thiscall CCamera::Find3rdPersonCamTargetVector(CCamera *this, float range, float srcx, float srcy, float srcz, CVector *pCamera, CVector *pPoint)
CALL_METHOD 0x514970 0xB6F028 6 0 (i j z y x 200.0)()
GET_LABEL_POINTER ColPoint (pColPoint)
GET_OBJECT_POINTER hObject (pObject)
IF GET_COLLISION_BETWEEN_POINTS x2 y2 z2 fPointX fPointY fPointZ TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE pObject pColPoint x y z i
CLEO_CALL SetObjectOriginCoord 0 (hObject x y z)
ENDIF
ENDIF
IF iEditMode = EDIT_MOVE_XY
OR iEditMode = EDIT_MOVE_Z
OR iEditMode = EDIT_ROTATE_XY
OR iEditMode = EDIT_ROTATE_Z
SET_CAMERA_CONTROL OFF
GET_PC_MOUSE_MOVEMENT x2 y2
GET_MOUSE_SENSIBILITY (fCurSens)
IF NOT IS_MOUSE_USING_VERTICAL_INVERSION
y2 *= -1.0
ENDIF
IF fCurSens > 0.0
IF iEditMode = EDIT_MOVE_XY
OR iEditMode = EDIT_MOVE_Z
fCurSens *= fMouseMoveSensMult
ELSE // Rotate
fCurSens *= fMouseRotateSensMult
ENDIF
IF IS_KEY_PRESSED VK_LSHIFT
OR IS_KEY_PRESSED VK_RSHIFT
fCurSens /= fMouseSensDivButton
ENDIF
ENDIF
ENDIF
IF NOT fCurSens = 0.0
OR bForceUpdate = TRUE
IF iEditMode = EDIT_MOVE_XY
OR iEditMode = EDIT_MOVE_Z
CLEO_CALL GetObjectOffsetCoord 0 (hObject x y z)
x2 *= fCurSens
y2 *= fCurSens
IF iEditMode = EDIT_MOVE_XY
x +=@ x2
y +=@ y2
ELSE //EDIT_MOVE_Z
z +=@ y2
ENDIF
CLEO_CALL SetObjectOffsetCoord 0 (hObject x y z)
ENDIF
IF iEditMode = EDIT_ROTATE_XY
OR iEditMode = EDIT_ROTATE_Z
CLEO_CALL GetObjectRotation 0 (hObject x y z)
x2 *= fCurSens
y2 *= fCurSens
IF iEditMode = EDIT_ROTATE_XY
x +=@ x2
y +=@ y2
WHILE x >= 360.0
x -= 360.0
ENDWHILE
WHILE y >= 360.0
y -= 360.0
ENDWHILE
WHILE x < 0.0
x += 360.0
ENDWHILE
WHILE y < 0.0
y += 360.0
ENDWHILE
ELSE //EDIT_ROTATE_Z
z +=@ x2
z +=@ y2
WHILE z < 0.0
z += 360.0
ENDWHILE
WHILE z >= 360.0
z -= 360.0
ENDWHILE
ENDIF
CLEO_CALL SetObjectRotation 0 (hObject x y z)
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_KEY_PRESSED VK_KEY_R
IF iEditMode = EDIT_ROTATE_XY
OR iEditMode = EDIT_ROTATE_Z
CLEO_CALL GetObjectRotation 0 (hObject x y z)
IF x > 45.0
AND x < 135.0
x = 90.0
ENDIF
IF x > 135.0
AND x < 225.0
x = 180.0
ENDIF
IF x > 225.0
AND x < 315.0
x = 270.0
ENDIF
IF x > 315.0
OR x < 45.0
x = 0.0
ENDIF
IF y > 45.0
AND y < 135.0
y = 90.0
ENDIF
IF y > 135.0
AND y < 225.0
y = 180.0
ENDIF
IF y > 225.0
AND y < 315.0
y = 270.0
ENDIF
IF y > 315.0
OR y < 45.0
y = 0.0
ENDIF
IF z > 45.0
AND z < 135.0
z = 90.0
ENDIF
IF z > 135.0
AND z < 225.0
z = 180.0
ENDIF
IF z > 225.0
AND z < 315.0
z = 270.0
ENDIF
IF z > 315.0
OR z < 45.0
z = 0.0
ENDIF
CLEO_CALL SetObjectRotation 0 (hObject x y z)
ENDIF
IF iEditMode = EDIT_MOVE_XY
OR iEditMode = EDIT_MOVE_Z
OR iEditMode = EDIT_SURFACE
CLEO_CALL SetObjectOffsetCoord 0 (hObject 0.0 0.0 0.0)()
ENDIF
IF iEditMode = EDIT_MOVE_XY
CLEO_CALL GetObjectOffsetCoord 0 (hObject)(x y z)
CLEO_CALL SetObjectOffsetCoord 0 (hObject 0.0 0.0 z)()
ENDIF
IF iEditMode = EDIT_MOVE_Z
CLEO_CALL GetObjectOffsetCoord 0 (hObject)(x y z)
CLEO_CALL SetObjectOffsetCoord 0 (hObject x y 0.0)()
ENDIF
ENDIF
IF fSelectedCoronaSize > 0.0
CLEO_CALL GetObjectOriginCoord 0 (hObject x y z)
IF bUpdateDisabled = FALSE
IF iEditMode = EDIT_SURFACE
DRAW_WEAPONSHOP_CORONA x y z fSelectedCoronaSize CORONATYPE_SHINYSTAR FLARETYPE_NONE 255 0 255
ENDIF
IF iEditMode = EDIT_MOVE_XY
DRAW_WEAPONSHOP_CORONA x y z fSelectedCoronaSize CORONATYPE_SHINYSTAR FLARETYPE_NONE 0 50 255
ENDIF
IF iEditMode = EDIT_MOVE_Z
DRAW_WEAPONSHOP_CORONA x y z fSelectedCoronaSize CORONATYPE_SHINYSTAR FLARETYPE_NONE 0 150 255
ENDIF
IF iEditMode = EDIT_ROTATE_XY
DRAW_WEAPONSHOP_CORONA x y z fSelectedCoronaSize CORONATYPE_SHINYSTAR FLARETYPE_NONE 0 255 0
ENDIF
IF iEditMode = EDIT_ROTATE_Z
DRAW_WEAPONSHOP_CORONA x y z fSelectedCoronaSize CORONATYPE_SHINYSTAR FLARETYPE_NONE 130 255 0
ENDIF
ELSE
DRAW_WEAPONSHOP_CORONA x y z fSelectedCoronaSize CORONATYPE_SHINYSTAR FLARETYPE_NONE 255 255 255
ENDIF
ENDIF
ELSE
IF bSelectDisabled = FALSE
AND IS_ANY_FIRE_BUTTON_PRESSED PAD1
GET_CHAR_COORDINATES scplayer x y z
GET_VAR_POINTER fPointX (i)
GET_VAR_POINTER x2 (j) //Camera
//514970 double __thiscall CCamera::Find3rdPersonCamTargetVector(CCamera *this, float range, float srcx, float srcy, float srcz, CVector *pCamera, CVector *pPoint)
CALL_METHOD 0x514970 0xB6F028 6 0 (i j z y x 200.0)()
GET_LABEL_POINTER ColPoint (pColPoint)
IF GET_COLLISION_BETWEEN_POINTS x2 y2 z2 fPointX fPointY fPointZ TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE -1 pColPoint x y z i
IF NOT i = -1
GET_ENTITY_TYPE i (j)
IF j = ENTITY_TYPE_OBJECT
GET_OBJECT_REF i (j)
IF GET_EXTENDED_OBJECT_VAR j AUTO 1 (i)
hObject = j
GET_OBJECT_MODEL hObject (j)
bUpdateDisabled = TRUE
PRINT_FORMATTED_NOW "~y~Selected Object %i ID %i" 2000 hObject j
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDWHILE
IF READ_INT_FROM_INI_FILE "CLEO\In-Game Map Editor.ini" "Project" "SaveOnDisable" i
AND i = TRUE
CLEO_CALL Save 0 (lObjectsList)()
ENDIF
SET_CAMERA_CONTROL ON
SET_PLAYER_CYCLE_WEAPON_BUTTON 0 ON
SET_PLAYER_FIRE_BUTTON 0 ON
SET_PLAYER_DUCK_BUTTON 0 ON
SET_CAR_DENSITY_MULTIPLIER 1.0
SET_PED_DENSITY_MULTIPLIER 1.0
bForceUpdate = FALSE
GET_LIST_SIZE lObjectsList (j)
i = 0
WHILE i < j
GET_LIST_VALUE_BY_INDEX lObjectsList i (hObject)
DELETE_OBJECT hObject
++i
ENDWHILE
RESET_LIST lObjectsList
hObject = -1
// reset wind for trees
WRITE_MEMORY 0x536145 1 0xE8 TRUE
WRITE_MEMORY 0x536146 4 0xFFFFED46 TRUE
PRINT_STRING_NOW "~r~In-Game Map Editor Disabled." 2000
ENDIF
ENDWHILE
CancelSaveCurrentObject:
hObject = -1
RETURN
DeleteCurrentObject:
LIST_REMOVE_VALUE lObjectsList hObject
DELETE_OBJECT hObject
hObject = -1
RETURN
ShowInterface:
DRAW_STRING_EXT "Type 'LOAD' to load .ipl file set in .ini. 'SAVE' to save it. 'IGME' to exit." DRAW_EVENT_BEFORE_HUD 300.0 435.0 0.25 0.5 TRUE FONT_MENU TRUE ALIGN_CENTER 640.0 FALSE (255 255 0 255) 1 0 (0 0 0 255) FALSE (0 0 0 0)
IF DOES_OBJECT_EXIST hObject
DRAW_STRING_EXT "Edit Mode" DRAW_EVENT_BEFORE_HUD 400.0 300.0 0.5 1.0 TRUE FONT_MENU TRUE ALIGN_LEFT 640.0 FALSE (255 255 0 255) 1 0 (0 0 0 255) FALSE (0 0 0 0)
IF bUpdateDisabled = TRUE
DRAW_STRING_EXT "RELEASE BUTTON TO EDIT" DRAW_EVENT_BEFORE_HUD 400.0 320.0 0.4 0.8 TRUE FONT_MENU TRUE ALIGN_LEFT 640.0 FALSE (255 255 255 180) 1 0 (0 0 0 255) FALSE (0 0 0 0)
ELSE
SWITCH iEditMode
CASE EDIT_SURFACE
DRAW_STRING "SURFACE" DRAW_EVENT_BEFORE_HUD 400.0 320.0 0.4 0.8 TRUE FONT_MENU
BREAK
CASE EDIT_MOVE_XY
DRAW_STRING "MOVE XY" DRAW_EVENT_BEFORE_HUD 400.0 320.0 0.4 0.8 TRUE FONT_MENU
BREAK
CASE EDIT_MOVE_Z
DRAW_STRING "MOVE Z" DRAW_EVENT_BEFORE_HUD 400.0 320.0 0.4 0.8 TRUE FONT_MENU
BREAK
CASE EDIT_ROTATE_XY
DRAW_STRING "ROTATE XY" DRAW_EVENT_BEFORE_HUD 400.0 320.0 0.4 0.8 TRUE FONT_MENU
BREAK
CASE EDIT_ROTATE_Z
DRAW_STRING "ROTATE Z" DRAW_EVENT_BEFORE_HUD 400.0 320.0 0.4 0.8 TRUE FONT_MENU
BREAK
ENDSWITCH
ENDIF
DRAW_STRING "(mouse wheel)" DRAW_EVENT_BEFORE_HUD 400.0 332.0 0.25 0.5 TRUE FONT_SUBTITLES
IF iEditMode = EDIT_SURFACE
OR iEditMode = EDIT_MOVE_XY
OR iEditMode = EDIT_MOVE_Z
DRAW_STRING "'R' to reset offset" DRAW_EVENT_BEFORE_HUD 400.0 340.0 0.3 0.6 TRUE FONT_SUBTITLES
ENDIF
IF iEditMode = EDIT_ROTATE_XY
OR iEditMode = EDIT_ROTATE_Z
DRAW_STRING "'R' to snap angle" DRAW_EVENT_BEFORE_HUD 400.0 340.0 0.3 0.6 TRUE FONT_SUBTITLES
ENDIF
DRAW_STRING "Middle mouse button to duplicate" DRAW_EVENT_BEFORE_HUD 400.0 350.0 0.3 0.6 TRUE FONT_SUBTITLES
DRAW_STRING "SHIFT for slow" DRAW_EVENT_BEFORE_HUD 400.0 360.0 0.3 0.6 TRUE FONT_SUBTITLES
DRAW_STRING "'Y/Action' to confirm. 'Delete' to delete." DRAW_EVENT_BEFORE_HUD 400.0 380.0 0.3 0.6 TRUE FONT_SUBTITLES
ELSE
DRAW_STRING_EXT "Select Mode" DRAW_EVENT_BEFORE_HUD 400.0 300.0 0.5 1.0 TRUE FONT_MENU TRUE ALIGN_LEFT 640.0 FALSE (0 60 255 255) 1 0 (0 0 0 255) FALSE (0 0 0 0)
DRAW_STRING "CTRL+C to copy aimed" DRAW_EVENT_BEFORE_HUD 400.0 320.0 0.5 1.0 TRUE FONT_SUBTITLES
DRAW_STRING "CTRL+V to paste new" DRAW_EVENT_BEFORE_HUD 400.0 340.0 0.5 1.0 TRUE FONT_SUBTITLES
DRAW_STRING "G to type (not yet)" DRAW_EVENT_BEFORE_HUD 400.0 360.0 0.5 1.0 TRUE FONT_SUBTITLES
DRAW_STRING "Or press Fire to select (need col)" DRAW_EVENT_BEFORE_HUD 400.0 380.0 0.5 1.0 TRUE FONT_SUBTITLES
ENDIF
RETURN
}
SCRIPT_END
{
LVAR_INT iModelId //In
LVAR_INT iModelIdLimit
ModelExist:
IF iModelId > 0
READ_MEMORY 0x40885A 4 TRUE (iModelIdLimit)
IF iModelId < iModelIdLimit
IF IS_MODEL_AVAILABLE iModelId
RETURN_TRUE
CLEO_RETURN 0 ()
ENDIF
ENDIF
ENDIF
RETURN_FALSE
CLEO_RETURN 0 ()
}
{
LVAR_INT lObjectsList flags //In
LVAR_INT i j k pFilePath pBuffer hFile iModelId iArea iLOD hObject pObject pMatrix
LVAR_FLOAT x y z fRotX fRotY fRotZ fRotW
LVAR_INT pModelName
Load:
GET_LABEL_POINTER BufferFilePath (pFilePath)
GET_LABEL_POINTER Buffer (pBuffer)
GET_LABEL_POINTER ColPoint (pModelName)
READ_STRING_FROM_INI_FILE "CLEO\In-Game Map Editor.ini" "Project" "Path" pFilePath
IF OPEN_FILE $pFilePath 0x2b72 (hFile) //r+
ELSE
PRINT_STRING_NOW "~r~Can't open .ipl file." 5000
WAIT 2000
CLEO_RETURN 0 ()
ENDIF
GET_LIST_SIZE lObjectsList (j)
i = 0
WHILE i < j
GET_LIST_VALUE_BY_INDEX lObjectsList i (hObject)
DELETE_OBJECT hObject
++i
ENDWHILE
RESET_LIST lObjectsList
WHILE READ_STRING_FROM_FILE hFile pBuffer 128
IF NOT IS_STRING_COMMENT $pBuffer
IF IS_STRING_EQUAL $pBuffer "inst" 4 FALSE ""
WHILE READ_STRING_FROM_FILE hFile pBuffer 128
IF NOT IS_STRING_COMMENT $pBuffer
IF IS_STRING_EQUAL $pBuffer "end" 3 FALSE ""
BREAK
ENDIF
//2912, hash_d43844be, 0, 324.520081, -1793.644897, 3.759481, 0.000000, 0.000000, 0.000000, 1.000000, -1
SCAN_STRING $pBuffer "%i, %s %i, %f, %f, %f, %f, %f, %f, %f, %i" i iModelId pModelName iArea x y z fRotX fRotY fRotZ fRotW iLOD
//PRINT_FORMATTED_NOW "%i %i %f %f %f %f %f %f %f %i" 4000 iModelId iArea x y z fRotX fRotY fRotZ fRotW iLOD
//WAIT 2000
IF CLEO_CALL ModelExist 0 (iModelId)
CLEO_CALL NewObject 0 (iModelId lObjectsList)(hObject)
CLEO_CALL SetObjectOriginCoord 0 (hObject x y z)()
fRotW *= -1.0
SET_OBJECT_QUATERNION hObject fRotX fRotY fRotZ fRotW
GET_OBJECT_POINTER hObject (pObject)
READ_STRUCT_OFFSET pObject 0x14 4 (pMatrix)
//READ_STRUCT_OFFSET pObject 0x0 4 (pMatrix)
/*GET_MATRIX_X_ANGLE pMatrix (fRotX)
GET_MATRIX_Y_ANGLE pMatrix (fRotY)
GET_MATRIX_Z_ANGLE pMatrix (fRotZ)*/
GET_VAR_POINTER fRotX i
GET_VAR_POINTER fRotY j
GET_VAR_POINTER fRotZ k
//void __thiscall CMatrix::ConvertToEulerAngles(CMatrix *this, float *pX, float *pY, float *pZ, unsigned int flags)
CALL_METHOD 0x59A840 pMatrix 4 0 (flags k j i)()
fRotX *= -57.295779513
fRotY *= -57.295779513
fRotZ *= -57.295779513
WHILE fRotX > 360.0
fRotX -= 360.0
ENDWHILE
WHILE fRotX < 0.0
fRotX += 360.0
ENDWHILE
WHILE fRotY > 360.0
fRotY -= 360.0
ENDWHILE
WHILE fRotY < 0.0
fRotY += 360.0
ENDWHILE
WHILE fRotZ > 360.0
fRotZ -= 360.0
ENDWHILE
WHILE fRotZ < 0.0
fRotZ += 360.0
ENDWHILE
CLEO_CALL SetObjectRotation 0 (hObject fRotY fRotX fRotZ)()
SET_OBJECT_AREA_VISIBLE hObject iArea
ELSE
PRINT_FORMATTED_NOW "~r~Model ID '%i' doesn't exist." 2000 iModelId
WAIT 250
ENDIF
ENDIF
ENDWHILE
ENDIF
ENDIF
ENDWHILE
PRINT_FORMATTED_NOW "~y~Loaded '%s'" 2000 $pFilePath
CLOSE_FILE hFile
CLEO_RETURN 0 ()
}
{
LVAR_INT lObjectsList //In
LVAR_INT scplayer i iCount iListSize hObject pEditorStruct pFilePath pBuffer hFile pObject pAllocMemory hFileBackup
LVAR_FLOAT x y z w playerCoordBackupX playerCoordBackupY playerCoordBackupZ fRotX fRotY fRotZ
Save:
GET_PLAYER_CHAR 0 scplayer
GET_LABEL_POINTER BufferFilePath (pFilePath)
GET_LABEL_POINTER Buffer (pBuffer)
IF NOT READ_STRING_FROM_INI_FILE "CLEO\In-Game Map Editor.ini" "Project" "SavePath" pFilePath
IF NOT READ_STRING_FROM_INI_FILE "CLEO\In-Game Map Editor.ini" "Project" "Path" pFilePath
PRINT_STRING_NOW "~r~Error: Path not set." 3000
CLEO_RETURN 0
ENDIF
ENDIF
/*IF DOES_FILE_EXIST $pFilePath
IF OPEN_FILE $pFilePath 0x2b72 (hFile) //r+
GET_FILE_SIZE hFile i
ALLOCATE_MEMORY i pAllocMemory
STRING_FORMAT pBuffer "%s.backup" $pFilePath
IF OPEN_FILE $pBuffer 0x2b77 (hFileBackup) //w+
READ_FROM_FILE hFile i pAllocMemory
WRITE_TO_FILE hFileBackup i pAllocMemory
CLOSE_FILE hFileBackup
ENDIF
CLOSE_FILE hFile
ENDIF
ENDIF*/
IF OPEN_FILE $pFilePath 0x2b77 (hFile) //w+
ELSE
PRINT_STRING_NOW "~r~Can't create .ipl file." 5000
WAIT 2000
CLEO_RETURN 0 ()
ENDIF
GET_CHAR_COORDINATES scplayer playerCoordBackupX playerCoordBackupY playerCoordBackupZ
// Save instances
WRITE_STRING_TO_FILE hFile "inst"
CLEO_CALL WriteNewLineToFile 0 (hFile)()
GET_LIST_SIZE lObjectsList (iListSize)
WHILE iCount < iListSize
GET_LIST_VALUE_BY_INDEX lObjectsList iCount (hObject)
IF DOES_OBJECT_EXIST hObject
//PRINT_FORMATTED_NOW "Saving object %i" 2000 hObject
//WAIT 1000
// write model ID
GET_OBJECT_MODEL hObject (i)
STRING_FORMAT pBuffer "%i, " i
WRITE_STRING_TO_FILE hFile $pBuffer
// write model name - we don't have the model name, so we use the hash
GET_MODEL_INFO i (i)
READ_STRUCT_OFFSET i 0x4 4 (i)
STRING_FORMAT pBuffer "hash_%x, " i
WRITE_STRING_TO_FILE hFile $pBuffer
// write flags
GET_OBJECT_POINTER hObject (pObject)
READ_STRUCT_OFFSET pObject 0x2F 1 (i)
IF CLEO_CALL IsObjectUsingXYRotation 0 (hObject)
SET_LOCAL_VAR_BIT_CONST i 9 // force use rotation
ENDIF
GET_OBJECT_COORDINATES hObject x y z
IF z < 1.0
SET_LOCAL_VAR_BIT_CONST i 10 //Underwater
ENDIF
STRING_FORMAT pBuffer "%i, " i
WRITE_STRING_TO_FILE hFile $pBuffer
// write coord
GET_OBJECT_COORDINATES hObject x y z
STRING_FORMAT pBuffer "%f, %f, %f, " x y z
WRITE_STRING_TO_FILE hFile $pBuffer
// I don't know why but we need to adjust rotation to save on ipl
CLEO_CALL GetObjectRotation 0 (hObject fRotX fRotY fRotZ)()
fRotY *= -1.0
WHILE fRotY > 360.0
fRotY -= 360.0
ENDWHILE
WHILE fRotY < 0.0
fRotY += 360.0
ENDWHILE
fRotZ *= -1.0
WHILE fRotZ > 360.0
fRotZ -= 360.0
ENDWHILE
WHILE fRotZ < 0.0
fRotZ += 360.0
ENDWHILE
CLEO_CALL SetObjectRotation 0 (hObject fRotX fRotY fRotZ)()
// write quat rotation
CLEO_CALL GetObjectQuaternion 0 (hObject)(x y z w)
y *= -1.0
z *= -1.0
w *= -1.0
//GET_OBJECT_QUATERNION hObject x y z w // this crashes if RwObject doesn't exist (object is far away etc)
STRING_FORMAT pBuffer "%f, %f, %f, %f, " x y z w
WRITE_STRING_TO_FILE hFile $pBuffer
fRotY *= -1.0
WHILE fRotY > 360.0
fRotY -= 360.0
ENDWHILE
WHILE fRotY < 0.0
fRotY += 360.0
ENDWHILE
fRotZ *= -1.0
WHILE fRotZ > 360.0
fRotZ -= 360.0
ENDWHILE
WHILE fRotZ < 0.0
fRotZ += 360.0
ENDWHILE
CLEO_CALL SetObjectRotation 0 (hObject fRotX fRotY fRotZ)()
// write LOD index
STRING_FORMAT pBuffer "%i" -1
WRITE_STRING_TO_FILE hFile $pBuffer
CLEO_CALL WriteNewLineToFile 0 (hFile)()
//PRINT_FORMATTED_NOW "Finished saving object %i" 2000 hObject
//WAIT 1000
ENDIF
++iCount
ENDWHILE
WRITE_STRING_TO_FILE hFile "end"
CLEO_CALL WriteNewLineToFile 0 (hFile)()
// End of save instances
PRINT_FORMATTED_NOW "~y~Saved '%s'" 2000 $pFilePath
SET_CHAR_COORDINATES_NO_OFFSET scplayer playerCoordBackupX playerCoordBackupY playerCoordBackupZ
CLOSE_FILE hFile
CLEO_RETURN 0 ()
}
{
LVAR_INT hFile //In
LVAR_INT pBuffer
WriteNewLineToFile:
GET_LABEL_POINTER Buffer (pBuffer)
WRITE_STRUCT_OFFSET pBuffer 0 1 0x0A
WRITE_STRUCT_OFFSET pBuffer 1 1 0x00
WRITE_STRING_TO_FILE hFile $pBuffer
CLEO_RETURN 0 ()
}
{
LVAR_INT iModelId lObjectsList //In
LVAR_INT scplayer hObject pEditorStruct
LVAR_FLOAT x y z
NewObject:
IF iModelId > 0
GET_PLAYER_CHAR 0 scplayer
GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS scplayer 0.0 5.0 0.0 (x y z)
REQUEST_MODEL iModelId
LOAD_ALL_MODELS_NOW
CREATE_OBJECT iModelId x y z hObject
MARK_MODEL_AS_NO_LONGER_NEEDED iModelId
INIT_EXTENDED_OBJECT_VARS hObject AUTO 1
ALLOCATE_MEMORY 52 (pEditorStruct) //13*4
SET_EXTENDED_OBJECT_VAR hObject AUTO 1 pEditorStruct
CLEO_CALL SetObjectOriginCoord 0 (hObject x y z)
CLEO_CALL SetObjectOffsetCoord 0 (hObject 0.0 0.0 0.0)
CLEO_CALL SetObjectRotation 0 (hObject 0.0 0.0 0.0)
LIST_ADD lObjectsList hObject
RETURN_TRUE
CLEO_RETURN 0 (hObject)
ENDIF
RETURN_FALSE
CLEO_RETURN 0 (-1)
}
{
LVAR_INT hObject //In
LVAR_INT pEditorStruct
LVAR_FLOAT x y z
GetObjectOriginCoord:
GET_EXTENDED_OBJECT_VAR hObject AUTO 1 (pEditorStruct)
READ_STRUCT_PARAM pEditorStruct STRUCT_ORIGIN_COORD_X (x)
READ_STRUCT_PARAM pEditorStruct STRUCT_ORIGIN_COORD_Y (y)
READ_STRUCT_PARAM pEditorStruct STRUCT_ORIGIN_COORD_Z (z)
CLEO_RETURN 0 (x y z)
}
{
LVAR_INT hObject //In
LVAR_INT pEditorStruct
LVAR_FLOAT fOffsetX fOffsetY fOffsetZ
GetObjectOffsetCoord:
GET_EXTENDED_OBJECT_VAR hObject AUTO 1 (pEditorStruct)
READ_STRUCT_PARAM pEditorStruct STRUCT_OFFSET_COORD_X (fOffsetX)
READ_STRUCT_PARAM pEditorStruct STRUCT_OFFSET_COORD_Y (fOffsetY)
READ_STRUCT_PARAM pEditorStruct STRUCT_OFFSET_COORD_Z (fOffsetZ)
CLEO_RETURN 0 (fOffsetX fOffsetY fOffsetZ)
}
{
LVAR_INT hObject //In
LVAR_INT pEditorStruct
LVAR_FLOAT fRotX fRotY fRotZ
GetObjectRotation:
GET_EXTENDED_OBJECT_VAR hObject AUTO 1 (pEditorStruct)
READ_STRUCT_PARAM pEditorStruct STRUCT_ROTATION_X (fRotX)
READ_STRUCT_PARAM pEditorStruct STRUCT_ROTATION_Y (fRotY)
READ_STRUCT_PARAM pEditorStruct STRUCT_ROTATION_Z (fRotZ)
CLEO_RETURN 0 (fRotX fRotY fRotZ)
}
{
LVAR_INT hObject //In
LVAR_INT pEditorStruct
LVAR_FLOAT fRotX fRotY fRotZ
IsObjectUsingXYRotation:
CLEO_CALL GetObjectRotation 0 (hObject)(fRotX fRotY fRotZ)
ABS_LVAR_FLOAT fRotX
ABS_LVAR_FLOAT fRotY
IF fRotX > 0.001
OR fRotY > 0.001
RETURN_TRUE
CLEO_RETURN 0
ENDIF
RETURN_FALSE
CLEO_RETURN 0
}
{
LVAR_INT hObject //In
LVAR_FLOAT x y z //In
LVAR_INT pEditorStruct
SetObjectOriginCoord:
GET_EXTENDED_OBJECT_VAR hObject AUTO 1 (pEditorStruct)
WRITE_STRUCT_PARAM pEditorStruct STRUCT_ORIGIN_COORD_X (x)
WRITE_STRUCT_PARAM pEditorStruct STRUCT_ORIGIN_COORD_Y (y)
WRITE_STRUCT_PARAM pEditorStruct STRUCT_ORIGIN_COORD_Z (z)
CLEO_CALL UpdateObject 0 (hObject)()
CLEO_RETURN 0 ()
}
{
LVAR_INT hObject //In
LVAR_FLOAT fOffsetX fOffsetY fOffsetZ //In
LVAR_INT pEditorStruct
SetObjectOffsetCoord:
GET_EXTENDED_OBJECT_VAR hObject AUTO 1 (pEditorStruct)
WRITE_STRUCT_PARAM pEditorStruct STRUCT_OFFSET_COORD_X (fOffsetX)
WRITE_STRUCT_PARAM pEditorStruct STRUCT_OFFSET_COORD_Y (fOffsetY)
WRITE_STRUCT_PARAM pEditorStruct STRUCT_OFFSET_COORD_Z (fOffsetZ)
CLEO_CALL UpdateObject 0 (hObject)()
CLEO_RETURN 0 ()
}
{
LVAR_INT hObject //In
LVAR_FLOAT fRotX fRotY fRotZ //In
LVAR_INT pEditorStruct
SetObjectRotation:
GET_EXTENDED_OBJECT_VAR hObject AUTO 1 (pEditorStruct)
WRITE_STRUCT_PARAM pEditorStruct STRUCT_ROTATION_X (fRotX)
WRITE_STRUCT_PARAM pEditorStruct STRUCT_ROTATION_Y (fRotY)
WRITE_STRUCT_PARAM pEditorStruct STRUCT_ROTATION_Z (fRotZ)
CLEO_CALL UpdateObject 0 (hObject)()
CLEO_RETURN 0 ()
}
{
LVAR_INT hObject //In
LVAR_INT pEditorStruct
LVAR_FLOAT x y z fOffsetX fOffsetY fOffsetZ
GetObjectFinalCoord:
CLEO_CALL GetObjectOriginCoord 0 (hObject x y z)
CLEO_CALL GetObjectOffsetCoord 0 (hObject fOffsetX fOffsetY fOffsetZ)
x += fOffsetX
y += fOffsetY
z += fOffsetZ
CLEO_RETURN 0 (x y z)
}
{
LVAR_INT hObject //In
LVAR_INT pEditorStruct
LVAR_FLOAT x y z w
GetObjectQuaternion:
GET_EXTENDED_OBJECT_VAR hObject AUTO 1 (pEditorStruct)
READ_STRUCT_PARAM pEditorStruct STRUCT_QUAT_X (x)
READ_STRUCT_PARAM pEditorStruct STRUCT_QUAT_Y (y)
READ_STRUCT_PARAM pEditorStruct STRUCT_QUAT_Z (z)
READ_STRUCT_PARAM pEditorStruct STRUCT_QUAT_W (w)
CLEO_RETURN 0 (x y z w)
}
{
LVAR_INT hObject //In
LVAR_INT pEditorStruct pObject pMatrix pQuat
LVAR_FLOAT x y z w
StoreObjectQuaternion:
GET_OBJECT_POINTER hObject pObject
READ_STRUCT_OFFSET pObject 0x14 4 (pMatrix)
IF pMatrix > 0
//READ_STRUCT_OFFSET pMatrix 0 4 (pMatrix)
//GET_OBJECT_QUATERNION hObject x y z w
GET_VAR_POINTER x (pQuat)
//SET_QUAT_FROM_MATRIX pQuat pMatrix
CALL_METHOD 0x59C3E0 pQuat 1 0 (pMatrix)()
GET_EXTENDED_OBJECT_VAR hObject AUTO 1 (pEditorStruct)
WRITE_STRUCT_PARAM pEditorStruct STRUCT_QUAT_X (x)
WRITE_STRUCT_PARAM pEditorStruct STRUCT_QUAT_Y (y)
WRITE_STRUCT_PARAM pEditorStruct STRUCT_QUAT_Z (z)
WRITE_STRUCT_PARAM pEditorStruct STRUCT_QUAT_W (w)
ELSE
PRINT_STRING "~r~cant store quat" 1000
WAIT 1000
ENDIF
CLEO_RETURN 0 ()
}
{
LVAR_INT hObject //In
LVAR_INT i
LVAR_FLOAT x y z fRotX fRotY fRotZ
UpdateObject:
GET_AREA_VISIBLE i
SET_OBJECT_AREA_VISIBLE hObject i
CLEO_CALL GetObjectFinalCoord 0 (hObject x y z)
SET_OBJECT_COORDINATES hObject x y z
CLEO_CALL GetObjectRotation 0 (hObject x y z)
SET_OBJECT_QUATERNION hObject 0.0 0.0 0.0 1.0
SET_OBJECT_ROTATION hObject x y z
CLEO_CALL StoreObjectQuaternion 0 (hObject)()
CLEO_RETURN 0 ()
}
{
LVAR_INT hObjectDest hObjectSource //In
LVAR_INT i
LVAR_FLOAT x y z
CloneObject:
CLEO_CALL GetObjectOriginCoord 0 (hObjectSource x y z)
CLEO_CALL SetObjectOriginCoord 0 (hObjectDest x y z)
CLEO_CALL GetObjectOffsetCoord 0 (hObjectSource x y z)
CLEO_CALL SetObjectOffsetCoord 0 (hObjectDest x y z)
CLEO_CALL GetObjectRotation 0 (hObjectSource x y z)
CLEO_CALL SetObjectRotation 0 (hObjectDest x y z)
CLEO_RETURN 0 ()
}
BufferFilePath:
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 //64
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 //128
ENDDUMP
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 //64
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 //128
ENDDUMP
ColPoint:
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 //64
ENDDUMP
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment