Jump to content

[SA] CLEO How to store string literals in memory?


Recommended Posts

Hi, how can I store string literals (GXT keys  e.g 'GUN1') in a memory allocated array?

 

For example lets say I have this array:

0AC8: 0@ = allocate_memory_size 16 //2 strings. Is string size 8 bytes?

 

I tried something like this

write_memory 0@ size 8 value 'GUN1' virtual_protect 0

0A8D: 1@ = read_memory 0@ size 8 virtual_protect 0

but it doesn't work.

 

 

Edited by GrGTaGamer
Link to comment
https://gtaforums.com/topic/975494-sa-cleo-how-to-store-string-literals-in-memory/
Share on other sites

The command to read and write memory only supports 1, 2, 4 bytes

 

I think you should allocate memory and pass the string directly to the variable.  There is no need to write characters into memory.  Or use character variables s and v

Keep in mind that each short string (7 bytes plus a null terminator) will use two variables, so @0[1] will be stored in local vars 2@ and 3@. There really isn't enough room for string arrays in a custom script. Can you adapt your script to a custom mission so you have access to the full local var set?

 

I often use out of range "extended variable space" for testing with string arrays. The area of SCM memory beyond the global var space and before the main loop in the main script isn't needed any more by the time a cleo script can actually run. If your main script isn't too heavily modified you should be able to safely use global variables $12000 thru $14999 for temporary use.

 

However, the proper strategy, after the bugs have been ironed out with dirty tricks, would be you reserve two local vars to hold the gxt key and use jump tables/switch case or if-then-else constructs to assign a hard coded gxt string as needed. There are examples of this strategy buried in a standard main - forget which missions now. 

 

CrimeSplash, included with the Crimes and Chaos Toolkit I put together for testing the wanted level system might provide a useful example. The script was built using the strategy described above. First I got it working with the easy extended global var string arrays, but didn't think that would be a safe script to share, so I converted the arrays to jump tables.

 

 

If I have a string in memory loaded with sscanf (0x8220AD) how can I use it in opcodes that take string literals (e.g 08DB)?

 

EDIT: Basically I have a pointer var to a string (4 bytes) and I need to save it in a string variable (characters).

 

nvm I did it using 0A8D

Edited by GrGTaGamer

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • 0 User Currently Viewing
    0 members, 0 Anonymous, 0 Guests

×
×
  • Create New...

Important Information

By using GTAForums.com, you agree to our Terms of Use and Privacy Policy.