Página 1 de 1

[CLEO+] EnhancedPickupPlus

Enviado: 01 Abr 2021, 17:28
por HzanRsxa2959
This script is the successor of [CLEO] EnhancedPickup, which was created at a time when CLEO+ didn't have as many features as it does now. One of the many newly-added features is the command SET_SCRIPT_EVENT_SAVE_CONFIRMATION, which is used in this script.

Anyway, let's begin:

Description:
This is a template script that is written with the hope that other users will create their pickups using its code, as it sorts out many issues with the game's pickup system as well as adding useful new features, while still emulating the vanilla game pickups in a faithful and compatible way.

Features:
  • Prevents hitting the game's pickups limit: Pickup will only be created if looking at its position (optional) and near it based on pickups' draw distance.
  • Nothing is saved in the game: Everything is saved using CLEO's save system, meaning that the user's save files are left unaffected while the pickup's properties such as regeneration (respawn) time, ammo, model ID, revenue etc. are still saved.
  • Creating a pickup is as easy as writing a single opcode.
  • Many customizable constants are present in the code, and the code itself is good-structured, well-commented and easy-to-read: The user can easily add their own code in the script to manage the pickup as desired.
  • Support for AutoID.

Requirements:
Latest versions may not be required, but are highly recommended.

Code:
SpoilerAbrir
Note: The regular version won't work with AutoID; use the AutoID version below. They only difference the regular and AutoID version is that the AutoID version uses the AUID name instead of a model ID, and the model ID of the pickup isn't saved.

Regular version: Spawns an M4 in front of the Santa Maria Beach Safehouse.

Código: Selecionar tudo

{$CLEO .cs}
{$USE CLEO+}

// create your pickup >>>
const
    _EnhancedPickupPlus_hPickup = 0@ // required, pickup handle must be stored in a variable with this name
    _EnhancedPickupPlus_bOffScreen = false // if you want pickup to exist even when not looking at it, for e.g., revenue
end

0213: _EnhancedPickupPlus_hPickup = create_pickup 356 type 2 at 329.2386 -1783.8059 4.8963
// <<< create your pickup

const
    _EnhancedPickupPlus_iModelID = 1@
    _EnhancedPickupPlus_iType = 2@
    _EnhancedPickupPlus_fPosX = 3@
    _EnhancedPickupPlus_fPosY = 4@
    _EnhancedPickupPlus_fPosZ = 5@

    _EnhancedPickupPlus_fRevenue = 6@
    _EnhancedPickupPlus_iAmmo = 7@
    _EnhancedPickupPlus_iRegenerationTime = 8@
    _EnhancedPickupPlus_iRevenueRate = 9@
    _EnhancedPickupPlus_iFlags = 10@

    _EnhancedPickupPlus_vTemporary1 = 20@
    _EnhancedPickupPlus_vTemporary2 = 21@
end

gosub @_EnhancedPickupPlus_Data

0A95: save_this_custom_script

while true
    0AC6: _EnhancedPickupPlus_vTemporary1 = label @_EnhancedPickupPlus_Launch pointer
    0A8D: _EnhancedPickupPlus_vTemporary2 = read_memory _EnhancedPickupPlus_vTemporary1 size 1 virtual_protect 0
    if _EnhancedPickupPlus_vTemporary2 == 0
    then
        0A8C: write_memory _EnhancedPickupPlus_vTemporary1 size 1 value 1 virtual_protect 0

        0ED1: set_script_event_save_confirmation true label @_EnhancedPickupPlus_Save var_slot _EnhancedPickupPlus_vTemporary1
    end

    if gosub @_EnhancedPickupPlus_Seen
    then
        if gosub @_EnhancedPickupPlus_Exists
        then
/* // comment this to manage the pickup
        if 0214: pickup _EnhancedPickupPlus_hPickup picked_up
        then
            // what to do if pickup is collected
            0A93: terminate_this_custom_script
        end
//*///
        else
            gosub @_EnhancedPickupPlus_Create
        end
    else
        gosub @_EnhancedPickupPlus_Destroy
    end

    wait 0
end

:_EnhancedPickupPlus_Launch
hex
    00
end

:_EnhancedPickupPlus_Data
    0E38: get_pickup_pointer _EnhancedPickupPlus_hPickup store_to _EnhancedPickupPlus_vTemporary1
    0E34: get_pickup_model _EnhancedPickupPlus_hPickup _EnhancedPickupPlus_iModelID
    0E39: get_pickup_type _EnhancedPickupPlus_hPickup store_to _EnhancedPickupPlus_iType
    065B: store_pickup _EnhancedPickupPlus_hPickup position_to _EnhancedPickupPlus_fPosX _EnhancedPickupPlus_fPosY _EnhancedPickupPlus_fPosZ

    0A8D: _EnhancedPickupPlus_fRevenue = read_memory _EnhancedPickupPlus_vTemporary1 size 4 virtual_protect 0
    0D4E: _EnhancedPickupPlus_iAmmo = struct _EnhancedPickupPlus_vTemporary1 offset 0x8 size 4
    0D4E: _EnhancedPickupPlus_iRegenerationTime = struct _EnhancedPickupPlus_vTemporary1 offset 0xC size 4
    0D4E: _EnhancedPickupPlus_iRevenueRate = struct _EnhancedPickupPlus_vTemporary1 offset 0x16 size 2
    0D4E: _EnhancedPickupPlus_iFlags = struct _EnhancedPickupPlus_vTemporary1 offset 0x1D size 1
return

:_EnhancedPickupPlus_Exists
    _EnhancedPickupPlus_hPickup <> -1
return

:_EnhancedPickupPlus_Destroy
    if gosub @_EnhancedPickupPlus_Exists
    then
        gosub @_EnhancedPickupPlus_Data

        0215: destroy_pickup _EnhancedPickupPlus_hPickup
        _EnhancedPickupPlus_hPickup = -1
    end
return

:_EnhancedPickupPlus_Seen
    _EnhancedPickupPlus_vTemporary1 = false

    0A8D: _EnhancedPickupPlus_vTemporary2 = read_memory 0x454CC9 size 4 virtual_protect 0
    0A8D: _EnhancedPickupPlus_vTemporary2 = read_memory _EnhancedPickupPlus_vTemporary2 size 4 virtual_protect 0
    if 0EBE: locate_camera_distance_to_coordinates _EnhancedPickupPlus_fPosX _EnhancedPickupPlus_fPosY _EnhancedPickupPlus_fPosZ radius _EnhancedPickupPlus_vTemporary2
    then
        _EnhancedPickupPlus_vTemporary2 = _EnhancedPickupPlus_bOffScreen
        if _EnhancedPickupPlus_vTemporary2 == true
        then
            _EnhancedPickupPlus_vTemporary1 = true
        else
            if 00C2: sphere_onscreen _EnhancedPickupPlus_fPosX _EnhancedPickupPlus_fPosY _EnhancedPickupPlus_fPosZ radius 2.0
            then
                _EnhancedPickupPlus_vTemporary1 = true
            end
        end
    end

    _EnhancedPickupPlus_vTemporary1 == true
return

:_EnhancedPickupPlus_Save
    gosub @_EnhancedPickupPlus_Destroy
0ED0: return_script_event

:_EnhancedPickupPlus_Set
    0E38: get_pickup_pointer _EnhancedPickupPlus_hPickup store_to _EnhancedPickupPlus_vTemporary1

    if or
        _EnhancedPickupPlus_iType == 17
        _EnhancedPickupPlus_iType == 18
    then
        0E28: write_struct _EnhancedPickupPlus_vTemporary1 offset 0x18 size 2 value _EnhancedPickupPlus_iModelID
    end

    0D4E: _EnhancedPickupPlus_vTemporary2 = struct _EnhancedPickupPlus_vTemporary1 offset 0x4 size 4
    if _EnhancedPickupPlus_vTemporary2 > 0
    then
        0AEC: _EnhancedPickupPlus_vTemporary2 = object_struct _EnhancedPickupPlus_vTemporary2 handle
        if 03CA: object _EnhancedPickupPlus_vTemporary2 exists
        then
            0108: destroy_object _EnhancedPickupPlus_vTemporary2
        end
    end

    0A8C: write_memory _EnhancedPickupPlus_vTemporary1 size 4 value _EnhancedPickupPlus_fRevenue virtual_protect 0
    0E28: write_struct _EnhancedPickupPlus_vTemporary1 offset 0x8 size 4 value _EnhancedPickupPlus_iAmmo
    0E28: write_struct _EnhancedPickupPlus_vTemporary1 offset 0xC size 4 value _EnhancedPickupPlus_iRegenerationTime
    0E28: write_struct _EnhancedPickupPlus_vTemporary1 offset 0x16 size 2 value _EnhancedPickupPlus_iRevenueRate
    0E28: write_struct _EnhancedPickupPlus_vTemporary1 offset 0x1D size 1 value _EnhancedPickupPlus_iFlags
return

:_EnhancedPickupPlus_Create
    if gosub @_EnhancedPickupPlus_Seen
    then
        if _EnhancedPickupPlus_iType == 17
        then
            0517: _EnhancedPickupPlus_hPickup = create_unavailable_asset_pickup 'PROP_4' at _EnhancedPickupPlus_fPosX _EnhancedPickupPlus_fPosY _EnhancedPickupPlus_fPosZ
        else
            if _EnhancedPickupPlus_iType == 18
            then
                0518: _EnhancedPickupPlus_hPickup = create_available_asset_pickup 'PROP_3' at _EnhancedPickupPlus_fPosX _EnhancedPickupPlus_fPosY _EnhancedPickupPlus_fPosZ price 0
            else
                0213: _EnhancedPickupPlus_hPickup = create_pickup _EnhancedPickupPlus_iModelID type _EnhancedPickupPlus_iType at _EnhancedPickupPlus_fPosX _EnhancedPickupPlus_fPosY _EnhancedPickupPlus_fPosZ
            end
        end

        gosub @_EnhancedPickupPlus_Set
    end
return

AutoID version: Spawns the weapon from this tutorial in front of the Santa Maria Beach Safehouse.

Código: Selecionar tudo

{$CLEO .cs}
{$USE CLEO+}
{$USE INI}

// create your pickup >>>
const
    _EnhancedPickupPlus_hPickup = 0@ // required, pickup handle must be stored in a variable with this name
    _EnhancedPickupPlus_bOffScreen = false // if you want pickup to exist even when not looking at it, for e.g., revenue
    _EnhancedPickupPlus_sAUIDName = "wp&1883dblbrlstg" // required, AUID name must be stored in a constant with this name
end

// model ID does not matter, it will be replaced with the one corresponding to the AUID name in the constant above
0213: _EnhancedPickupPlus_hPickup = create_pickup 0 type 2 at 324.2386 -1783.8059 4.8963
// <<< create your pickup

const
    _EnhancedPickupPlus_iModelID = 1@
    _EnhancedPickupPlus_iType = 2@
    _EnhancedPickupPlus_fPosX = 3@
    _EnhancedPickupPlus_fPosY = 4@
    _EnhancedPickupPlus_fPosZ = 5@

    _EnhancedPickupPlus_fRevenue = 6@
    _EnhancedPickupPlus_iAmmo = 7@
    _EnhancedPickupPlus_iRegenerationTime = 8@
    _EnhancedPickupPlus_iRevenueRate = 9@
    _EnhancedPickupPlus_iFlags = 10@

    _EnhancedPickupPlus_vTemporary1 = 20@
    _EnhancedPickupPlus_vTemporary2 = 21@

    _EnhancedPickupPlus_vTemporary3 = 22@v // used only once when game loads
end

gosub @_EnhancedPickupPlus_Destroy

0A95: save_this_custom_script

while true
    0AC6: _EnhancedPickupPlus_vTemporary1 = label @_EnhancedPickupPlus_Launch pointer
    0A8D: _EnhancedPickupPlus_vTemporary2 = read_memory _EnhancedPickupPlus_vTemporary1 size 1 virtual_protect 0
    if _EnhancedPickupPlus_vTemporary2 == 0
    then
        0A8C: write_memory _EnhancedPickupPlus_vTemporary1 size 1 value 1 virtual_protect 0

        _EnhancedPickupPlus_iModelID = 1239

        0ADE: _EnhancedPickupPlus_vTemporary3 = text_label_string 'AUTOID'
        if _EnhancedPickupPlus_vTemporary3 <> ""
        then
            if 0AF0: _EnhancedPickupPlus_vTemporary1 = read_int_from_ini_file "AutoID\\AutoID.ini" section "AutoID" key _EnhancedPickupPlus_sAUIDName
            then
                0085: _EnhancedPickupPlus_iModelID = _EnhancedPickupPlus_vTemporary1
            end
        end

        0ED1: set_script_event_save_confirmation true label @_EnhancedPickupPlus_Save var_slot _EnhancedPickupPlus_vTemporary1
    end

    if gosub @_EnhancedPickupPlus_Seen
    then
        if gosub @_EnhancedPickupPlus_Exists
        then
/* // comment this to manage the pickup
        if 0214: pickup _EnhancedPickupPlus_hPickup picked_up
        then
            // what to do if pickup is collected
            0A93: terminate_this_custom_script
        end
//*///
        else
            gosub @_EnhancedPickupPlus_Create
        end
    else
        gosub @_EnhancedPickupPlus_Destroy
    end

    wait 0
end

:_EnhancedPickupPlus_Launch
hex
    00
end

:_EnhancedPickupPlus_Data
    0E38: get_pickup_pointer _EnhancedPickupPlus_hPickup store_to _EnhancedPickupPlus_vTemporary1
    0E39: get_pickup_type _EnhancedPickupPlus_hPickup store_to _EnhancedPickupPlus_iType
    065B: store_pickup _EnhancedPickupPlus_hPickup position_to _EnhancedPickupPlus_fPosX _EnhancedPickupPlus_fPosY _EnhancedPickupPlus_fPosZ

    0A8D: _EnhancedPickupPlus_fRevenue = read_memory _EnhancedPickupPlus_vTemporary1 size 4 virtual_protect 0
    0D4E: _EnhancedPickupPlus_iAmmo = struct _EnhancedPickupPlus_vTemporary1 offset 0x8 size 4
    0D4E: _EnhancedPickupPlus_iRegenerationTime = struct _EnhancedPickupPlus_vTemporary1 offset 0xC size 4
    0D4E: _EnhancedPickupPlus_iRevenueRate = struct _EnhancedPickupPlus_vTemporary1 offset 0x16 size 2
    0D4E: _EnhancedPickupPlus_iFlags = struct _EnhancedPickupPlus_vTemporary1 offset 0x1D size 1
return

:_EnhancedPickupPlus_Exists
    _EnhancedPickupPlus_hPickup <> -1
return

:_EnhancedPickupPlus_Destroy
    if gosub @_EnhancedPickupPlus_Exists
    then
        gosub @_EnhancedPickupPlus_Data

        0215: destroy_pickup _EnhancedPickupPlus_hPickup
        _EnhancedPickupPlus_hPickup = -1
    end
return

:_EnhancedPickupPlus_Seen
    _EnhancedPickupPlus_vTemporary1 = false

    0A8D: _EnhancedPickupPlus_vTemporary2 = read_memory 0x454CC9 size 4 virtual_protect 0
    0A8D: _EnhancedPickupPlus_vTemporary2 = read_memory _EnhancedPickupPlus_vTemporary2 size 4 virtual_protect 0
    if 0EBE: locate_camera_distance_to_coordinates _EnhancedPickupPlus_fPosX _EnhancedPickupPlus_fPosY _EnhancedPickupPlus_fPosZ radius _EnhancedPickupPlus_vTemporary2
    then
        _EnhancedPickupPlus_vTemporary2 = _EnhancedPickupPlus_bOffScreen
        if _EnhancedPickupPlus_vTemporary2 == true
        then
            _EnhancedPickupPlus_vTemporary1 = true
        else
            if 00C2: sphere_onscreen _EnhancedPickupPlus_fPosX _EnhancedPickupPlus_fPosY _EnhancedPickupPlus_fPosZ radius 2.0
            then
                _EnhancedPickupPlus_vTemporary1 = true
            end
        end
    end

    _EnhancedPickupPlus_vTemporary1 == true
return

:_EnhancedPickupPlus_Save
    gosub @_EnhancedPickupPlus_Destroy
0ED0: return_script_event

:_EnhancedPickupPlus_Set
    0E38: get_pickup_pointer _EnhancedPickupPlus_hPickup store_to _EnhancedPickupPlus_vTemporary1

    if or
        _EnhancedPickupPlus_iType == 17
        _EnhancedPickupPlus_iType == 18
    then
        0E28: write_struct _EnhancedPickupPlus_vTemporary1 offset 0x18 size 2 value _EnhancedPickupPlus_iModelID
    end

    0D4E: _EnhancedPickupPlus_vTemporary2 = struct _EnhancedPickupPlus_vTemporary1 offset 0x4 size 4
    if _EnhancedPickupPlus_vTemporary2 > 0
    then
        0AEC: _EnhancedPickupPlus_vTemporary2 = object_struct _EnhancedPickupPlus_vTemporary2 handle
        if 03CA: object _EnhancedPickupPlus_vTemporary2 exists
        then
            0108: destroy_object _EnhancedPickupPlus_vTemporary2
        end
    end

    0A8C: write_memory _EnhancedPickupPlus_vTemporary1 size 4 value _EnhancedPickupPlus_fRevenue virtual_protect 0
    0E28: write_struct _EnhancedPickupPlus_vTemporary1 offset 0x8 size 4 value _EnhancedPickupPlus_iAmmo
    0E28: write_struct _EnhancedPickupPlus_vTemporary1 offset 0xC size 4 value _EnhancedPickupPlus_iRegenerationTime
    0E28: write_struct _EnhancedPickupPlus_vTemporary1 offset 0x16 size 2 value _EnhancedPickupPlus_iRevenueRate
    0E28: write_struct _EnhancedPickupPlus_vTemporary1 offset 0x1D size 1 value _EnhancedPickupPlus_iFlags
return

:_EnhancedPickupPlus_Create
    if gosub @_EnhancedPickupPlus_Seen
    then
        if _EnhancedPickupPlus_iType == 17
        then
            0517: _EnhancedPickupPlus_hPickup = create_unavailable_asset_pickup 'PROP_4' at _EnhancedPickupPlus_fPosX _EnhancedPickupPlus_fPosY _EnhancedPickupPlus_fPosZ
        else
            if _EnhancedPickupPlus_iType == 18
            then
                0518: _EnhancedPickupPlus_hPickup = create_available_asset_pickup 'PROP_3' at _EnhancedPickupPlus_fPosX _EnhancedPickupPlus_fPosY _EnhancedPickupPlus_fPosZ price 0
            else
                0213: _EnhancedPickupPlus_hPickup = create_pickup _EnhancedPickupPlus_iModelID type _EnhancedPickupPlus_iType at _EnhancedPickupPlus_fPosX _EnhancedPickupPlus_fPosY _EnhancedPickupPlus_fPosZ
            end
        end

        gosub @_EnhancedPickupPlus_Set
    end
return

Usage:
  • Copy the code into Sanny Builder.
  • In between the comments "create your pickup", edit the constants and create your pickup using any opcode (0213, 032B, 0518, 0517, 04A6 etc.), and edit the constants as needed.
  • If you want to manage the pickup, e.g., what happens when it is collected, then scroll below and comment the "comment this to manage the pickup" comment block and write your code below "what to do if pickup is collected". By default, it will end the script- useful for one-time pickups (type 3).

Re: [CLEO+] EnhancedPickupPlus

Enviado: 08 Abr 2021, 14:02
por HzanRsxa2959
Update:
  • Fixed the AutoID version not checking if AutoID is installed or not. I can't believe I forgot to do it before. Well, if your mod requires AutoID anyway, then there is no need to rush an update.