Quantcast

Jump to content

» «
Photo

Writing to GTA Save file

5 replies to this topic
Node
  • Node

    War. War never changes.

  • Members
  • Joined: 31 May 2010
  • United-Kingdom

#1

Posted 18 May 2013 - 09:06 PM Edited by The_Sorrow, 18 May 2013 - 09:24 PM.

Okay so I've got this code:

CODE
fs.Position = 0x00; //Offset for Current money
fs.WriteByte(Convert.ToByte(1000)); //Write the money ($1000) into the offset
fs.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

K^2
  • K^2

    Vidi Vici Veni

  • Moderator
  • Joined: 14 Apr 2004
  • United-States
  • Best Poster [Programming] 2015
    Most Knowledgeable [Web Development/Programming] 2013
    Most Knowledgeable [GTA Series] 2011
    Best Debater 2010

#2

Posted 18 May 2013 - 11:59 PM

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.

Node
  • Node

    War. War never changes.

  • Members
  • Joined: 31 May 2010
  • United-Kingdom

#3

Posted 19 May 2013 - 12:01 AM Edited by The_Sorrow, 19 May 2013 - 12:08 AM.

QUOTE (K^2 @ Sunday, May 19 2013, 00:59)
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:

CODE
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.

K^2
  • K^2

    Vidi Vici Veni

  • Moderator
  • Joined: 14 Apr 2004
  • United-States
  • Best Poster [Programming] 2015
    Most Knowledgeable [Web Development/Programming] 2013
    Most Knowledgeable [GTA Series] 2011
    Best Debater 2010

#4

Posted 19 May 2013 - 04:35 AM

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.

Node
  • Node

    War. War never changes.

  • Members
  • Joined: 31 May 2010
  • United-Kingdom

#5

Posted 19 May 2013 - 11:12 AM

QUOTE (K^2 @ Sunday, May 19 2013, 05:35)
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.

K^2
  • K^2

    Vidi Vici Veni

  • Moderator
  • Joined: 14 Apr 2004
  • United-States
  • Best Poster [Programming] 2015
    Most Knowledgeable [Web Development/Programming] 2013
    Most Knowledgeable [GTA Series] 2011
    Best Debater 2010

#6

Posted 22 May 2013 - 07:17 PM

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:

CODE
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.




1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users