Jump to content
    1. Welcome to GTAForums!

    1. GTANet.com

    1. GTA Online

      1. Los Santos Drug Wars
      2. Updates
      3. Find Lobbies & Players
      4. Guides & Strategies
      5. Vehicles
      6. Content Creator
      7. Help & Support
    2. Red Dead Online

      1. Blood Money
      2. Frontier Pursuits
      3. Find Lobbies & Outlaws
      4. Help & Support
    3. Crews

    1. Grand Theft Auto Series

      1. Bugs*
      2. St. Andrews Cathedral
    2. GTA VI

    3. GTA V

      1. Guides & Strategies
      2. Help & Support
    4. GTA IV

      1. The Lost and Damned
      2. The Ballad of Gay Tony
      3. Guides & Strategies
      4. Help & Support
    5. GTA San Andreas

      1. Classic GTA SA
      2. Guides & Strategies
      3. Help & Support
    6. GTA Vice City

      1. Classic GTA VC
      2. Guides & Strategies
      3. Help & Support
    7. GTA III

      1. Classic GTA III
      2. Guides & Strategies
      3. Help & Support
    8. Portable Games

      1. GTA Chinatown Wars
      2. GTA Vice City Stories
      3. GTA Liberty City Stories
    9. Top-Down Games

      1. GTA Advance
      2. GTA 2
      3. GTA
    1. Red Dead Redemption 2

      1. PC
      2. Help & Support
    2. Red Dead Redemption

    1. GTA Mods

      1. GTA V
      2. GTA IV
      3. GTA III, VC & SA
      4. Tutorials
    2. Red Dead Mods

      1. Documentation
    3. Mod Showroom

      1. Scripts & Plugins
      2. Maps
      3. Total Conversions
      4. Vehicles
      5. Textures
      6. Characters
      7. Tools
      8. Other
      9. Workshop
    4. Featured Mods

      1. Design Your Own Mission
      2. OpenIV
      3. GTA: Underground
      4. GTA: Liberty City
      5. GTA: State of Liberty
    1. Rockstar Games

    2. Rockstar Collectors

    1. Off-Topic

      1. General Chat
      2. Gaming
      3. Technology
      4. Movies & TV
      5. Music
      6. Sports
      7. Vehicles
    2. Expression

      1. Graphics / Visual Arts
      2. GFX Requests & Tutorials
      3. Writers' Discussion
      4. Debates & Discussion
    1. Announcements

    2. Support

    3. Suggestions

Happy Holidays from the GTANet team!

[CLEO SDK] Opcode / variable number of parameters / returns value


gokuta
 Share

Recommended Posts

Let's visualize such an opcode:

7FFE: [email protected] is_the_sum_of 2 5  // [email protected] stores a value of 7 after executing this opcode
7FFE=3,%3d% is_the_sum_of %1d% %2d%

Not let's extend this to accept variable number of arguments:

7FFF: [email protected] is_the_sum_of 2 5 4 5 6 2 7 8
7FFF=-1,%1d% is_the_sum_of %2d% %3d%

The argument for storing the sum has to be the first one in this case. But is there a way to skip the first argument, sum up all the rest arguments and only then set the first argument to some value?

Similarly to this opcode:

0AD3: [email protected] = format "%d + %d = %d" 2 2 4
0AD3=-1,%1d% = format %2s%
Edited by gokuta
Link to comment
Share on other sites

#include "CLEO.h"

 

// 7FFF: [email protected] = 1 + 2 + 3

// 7FFF=-1,%1d% = %2d% + %3d% + %4d%

OpcodeResult WINAPI Sum(CScriptThread* thread)

{

// save current script position

BYTE *firstParam = thread->ip;

CLEO_SkipOpcodeParams(thread, 1); // skip %1d%

int result = CLEO_GetIntOpcodeParam(thread); // it must have at least one addendum, right?

// now read all additional parameters

while(CLEO_GetOperandType(thread))

result += CLEO_GetIntOpcodeParam(thread);

// save current script position

BYTE *lastParam = thread->ip + 1; // we add '1' so we skip terminating '0'

// 'jump' to the first parameter

thread->ip = firstParam;

CLEO_SetIntOpcodeParam(thread, result);

// 'jump' after the last parameter

thread->ip = lastParam;

return OR_CONTINUE;

}

 

BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved)

{

if(reason == DLL_PROCESS_ATTACH)

CLEO_RegisterOpcode(0x7FFF, Sum);

return TRUE;

}

{$CLEO}

0000:

while true

wait 0

7FFF: [email protected] = 52 + 3416 + 322347 + -124124 + 7 + -95233

0AD1: show_formatted_text_highpriority "(106465) : %d" time 100 [email protected]

end

Link to comment
Share on other sites

What about this variable?

BYTE *baseIp;  //pointer to begin of script in memory

Maybe it also stores the first thread->ip? If no, what is it?

Edited by gokuta
Link to comment
Share on other sites

That's a constant base address for script bytes.

For CLEO scripts it points to the beginning of .cs file loaded into memory.

Link to comment
Share on other sites

That's a constant base address for script bytes.

For CLEO scripts it points to the beginning of .cs file loaded into memory.

 

Someone should consider writing a tutorial on CScriptThread structure. That's so many variables and I've got no clue what I can possibly achieve with all that :D

Link to comment
Share on other sites

Moreover, there's no CScriptThread in real GTA game source code.

There's a class CRunningScript instead.

CScriptThread is the name invented by the CLEO creators, because the real name was not known until GTA games for Android were released.

 

A simple C++ statement to make both names valid may look like this:

 

typedef CScriptThread CRunningScript;
Link to comment
Share on other sites

because the real name was not known until GTA games for Android were released

false, it was known ever since GTA3 was released on PS2

SsZgxdL.png

Inactive in GTA/R* title modification indefinitely pursuant to a court order obtained by TTWO. Good job acting against modding!

Link to comment
Share on other sites

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
 Share

  • 1 User Currently Viewing
    0 members, 0 Anonymous, 1 Guest

×
×
  • Create New...

Important Information

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