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:
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).