Jump to content
    1. Welcome to GTAForums!

    1. GTANet.com

    1. GTA Online

      1. The Criminal Enterprises
      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

*DO NOT* SHARE MEDIA OR LINKS TO LEAKED COPYRIGHTED MATERIAL. Discussion is allowed.

How to draw long multibyte strings


kagikn
 Share

Recommended Posts

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 by kagikn
Link to comment
Share on other sites

  • 2 weeks later...
uNiverselEgacy

This looks quite inefficient. Just write a custom UTF8 decoder. It only takes several lines of code.

Link to comment
Share on other sites

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 by kagikn
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.