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

Writing to GTA Save file


Node
 Share

Recommended Posts

Okay so I've got this code:

 

 

fs.Position = 0x00; //Offset for Current moneyfs.WriteByte(Convert.ToByte(1000)); //Write the money ($1000) into the offsetfs.Flush();fs.Close();MessageBox.Show("Written");

 

 

This can't be the right way to do it because if the value is between 0 - 255 the game screen goes to black with a unhandled exeption after the "Vice city" splash screen before the main menu, if it's over 255 then my application throws an overflow error

 

Also, I really wanted to be able to grab an amount entered into a textbox and write that amount into the offset, does anyone know how?

 

Thanks icon14.gif

Edited by The_Sorrow
Link to comment
Share on other sites

Do you have the correct offset? You can break up the number into bytes and write it one by one. So if the number is 1,000, the high byte is going to be 1,000/256 = 3 (it's rounded down). And your low byte is going to be 1,000 % 256 = 232 (remainder of division by 256). But I think there's a call to write short or int as well. I would guess that money is stored as a 32 bit integer. So see if there is something like "WriteInt" or "WriteInteger".

 

As far as causing errors, you are probably writing it to the wrong location. It's also possible (though, unlikely) that the number is stored in unconventional endianness, with most significant byte first. In that case, writing 255 is probably equivalent to writing something on the order of -2 million, which can cause all sorts of problems. But I'd check the offset first.

Prior to filing a bug against any of my code, please consider this response to common concerns.

Link to comment
Share on other sites

 

Do you have the correct offset? You can break up the number into bytes and write it one by one. So if the number is 1,000, the high byte is going to be 1,000/256 = 3 (it's rounded down). And your low byte is going to be 1,000 % 256 = 232 (remainder of division by 256). But I think there's a call to write short or int as well. I would guess that money is stored as a 32 bit integer. So see if there is something like "WriteInt" or "WriteInteger".

 

As far as causing errors, you are probably writing it to the wrong location. It's also possible (though, unlikely) that the number is stored in unconventional endianness, with most significant byte first. In that case, writing 255 is probably equivalent to writing something on the order of -2 million, which can cause all sorts of problems. But I'd check the offset first.

I didn't think it would be this difficult to overwrite a simple offset.

 

The offset "0x00" I got off of GTAModding.com under the Saves(VC) section

 

I tried this line:

 

 

fs.WriteByte(Convert.ToInt32(3));

 

 

But it gives an error, cannot convert int to byte.

 

There are no decent tutorials on reading/writing to files that aren't text files.

Edited by The_Sorrow
Link to comment
Share on other sites

You wouldn't be using WriteByte with it. wink.gif

 

The offset 0x00 is relative to Block 18. The code you wrote sets it to literal 0x00 - the very first byte in the save file, which is the size of block 0. Naturally, once you set the very first block to zero size, the rest is going to crash.

 

You need to write code that reads in size of block, skips that many bytes ahead, and reads size of the next block. It should keep going so until it reaches the block you want. Then it should find the actual beginning of the block and write the relevant data to it.

Prior to filing a bug against any of my code, please consider this response to common concerns.

Link to comment
Share on other sites

You wouldn't be using WriteByte with it. wink.gif

 

The offset 0x00 is relative to Block 18. The code you wrote sets it to literal 0x00 - the very first byte in the save file, which is the size of block 0. Naturally, once you set the very first block to zero size, the rest is going to crash.

 

You need to write code that reads in size of block, skips that many bytes ahead, and reads size of the next block. It should keep going so until it reaches the block you want. Then it should find the actual beginning of the block and write the relevant data to it.

Sorry for being such a "n00b" at this K^2.

 

So I understand what I have to do, but I have no idea how to do it.

Link to comment
Share on other sites

Lets start with the basics. You need to parse the file, so try writing a program that goes through the blocks and prints out the starting offset and size of each block. For this, you wouldn't be writing anything, just reading. Do you know how to open file for reading instead of writing and how to read byte/int from the file? You should be able to do something along the lines of:

 

 

int value;...value=fs.ReadInt32();

 

 

This is very similar to how WriteByte works, but it reads instead of writing, takes 4 bytes at a time, interprets them as 32 bit integer, and returns the value to be stored in a variable or whatever.

Prior to filing a bug against any of my code, please consider this response to common concerns.

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.