kagikn Posted August 11, 2017 Share Posted August 11, 2017 (edited) There are workarounds to add long single-byte characters to the stack in GTA, but as for long multibyte strings, there aren't any workarounds.I thought I needed to find how to draw long multibyte strings when I was making Insane Stunt Bonus V (I'll upload to GTA5-Mods.com when I release it) and trying to draw long Japanese texts.Anyway, this is how to get sliced multibyte strings whose byte lengths are properly limited to 99 or less. // in C#public static string[] ToSlicedStrings(string input, int maxByteLengthPerString = 99){ if (maxByteLengthPerString < 0) { throw new ArgumentOutOfRangeException("maxLengthPerString"); } if (string.IsNullOrEmpty(input) || maxByteLengthPerString == 0) { return new string[0]; } var utf8ByteCount = Encoding.UTF8.GetByteCount(input); if (utf8ByteCount <= maxByteLengthPerString ) { return new string[] { input }; } var initListCapacity = utf8ByteCount / maxByteLengthPerString; if (utf8ByteCount % maxByteLengthPerString > 0) { initListCapacity += 1; } var stringList = new List<string>(initListCapacity); var startIndex = 0; for (int i = 0; i < input.Length; i++) { var length = i - startIndex; if (Encoding.UTF8.GetByteCount(input.Substring(startIndex, length)) > maxByteLengthPerString) { stringList.Add(input.Substring(startIndex, length - 1)); i -= 1; startIndex = (startIndex + length - 1); } } stringList.Add(input.Substring(startIndex, input.Length - startIndex)); return stringList.ToArray();}// I'll change the method name if I find a better name or somebody tells me.// Probably I could do with StringBuilder but I need to test it before I post it here. When you use some natives like ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME or _BEGIN_TEXT_COMMAND_WIDTH, you can use these strings by calling _SET_TEXT_COMPONENT_FORMAT with CELL_EMAIL_BCON and then calling those natives repeatedly with individual strings. Yeah, I will post a workaround for C++, but I need to make one first. EDIT: Fixed not slicing at a correct position. Edited August 25, 2017 by kagikn ikt 1 Link to comment Share on other sites More sharing options...
uNiverselEgacy Posted August 24, 2017 Share Posted August 24, 2017 This looks quite inefficient. Just write a custom UTF8 decoder. It only takes several lines of code. Link to comment Share on other sites More sharing options...
kagikn Posted August 25, 2017 Author Share Posted August 25, 2017 (edited) Could you show me an example? I can't come up with anything better in performance. I tried a similar method using StringBuilder, but it was worse in performance. This methods costs about 1600 ticks for 100-200 byte string, and this doesn't cost much FPS (at least calling Enum.GetValues with Control enum costs way more time) If you slice strings by using Math.Min when you slice ASCII characters, you can save many (timer) ticks, though. Edited August 25, 2017 by kagikn 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