Node Posted May 18, 2013 Share Posted May 18, 2013 (edited) 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 Edited May 18, 2013 by The_Sorrow Link to comment Share on other sites More sharing options...
K^2 Posted May 18, 2013 Share Posted May 18, 2013 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 More sharing options...
Node Posted May 19, 2013 Author Share Posted May 19, 2013 (edited) 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 May 19, 2013 by The_Sorrow Link to comment Share on other sites More sharing options...
K^2 Posted May 19, 2013 Share Posted May 19, 2013 You wouldn't be using WriteByte with it. 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 More sharing options...
Node Posted May 19, 2013 Author Share Posted May 19, 2013 You wouldn't be using WriteByte with it. 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 More sharing options...
K^2 Posted May 22, 2013 Share Posted May 22, 2013 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now