Quantcast
Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
    1. Welcome to GTAForums!   (85,869 visits to this link)

    2. News

    1. GTA Online

      1. Find Lobbies & Players
      2. Guides & Strategies
      3. Vehicles
      4. Content Creator
      5. Help & Support
    2. Crews

      1. Events
      2. Recruitment
    1. Grand Theft Auto Series

    2. GTA Next

    3. GTA V

      1. PC
      2. Guides & Strategies
      3. Help & Support
    4. GTA IV

      1. Episodes from Liberty City
      2. Multiplayer
      3. Guides & Strategies
      4. Help & Support
      5. GTA Mods
    5. GTA Chinatown Wars

    6. GTA Vice City Stories

    7. GTA Liberty City Stories

    8. GTA San Andreas

      1. Guides & Strategies
      2. Help & Support
      3. GTA Mods
    9. GTA Vice City

      1. Guides & Strategies
      2. Help & Support
      3. GTA Mods
    10. GTA III

      1. Guides & Strategies
      2. Help & Support
      3. GTA Mods
    11. Top Down Games

      1. GTA Advance
      2. GTA 2
      3. GTA
    12. Wiki

      1. Merchandising
    1. GTA Modding

      1. GTA V
      2. GTA IV
      3. GTA III, VC & SA
      4. Tutorials
    2. Mod Showroom

      1. Scripts & Plugins
      2. Maps
      3. Total Conversions
      4. Vehicles
      5. Textures
      6. Characters
      7. Tools
      8. Other
      9. Workshop
    3. Featured Mods

      1. DYOM
      2. OpenIV
      3. GTA: Underground
      4. GTA: Liberty City
      5. GTA: State of Liberty
    1. Red Dead Redemption 2

    2. Red Dead Redemption

    3. Rockstar Games

    1. Off-Topic

      1. General Chat
      2. Gaming
      3. Technology
      4. Programming
      5. Movies & TV
      6. Music
      7. Sports
      8. Vehicles
    2. Expression

      1. Graphics / Visual Arts
      2. GFX Requests & Tutorials
      3. Writers' Discussion
      4. Debates & Discussion
    1. Forum Support

    2. Site Suggestions

Sign in to follow this  
kagikn

How to draw long multibyte strings

Recommended Posts

kagikn

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

Share this post


Link to post
Share on other sites
uNiverselEgacy

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

Share this post


Link to post
Share on other sites
kagikn

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

Share this post


Link to post
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
Sign in to follow this  

×

Important Information

By using GTAForums.com, you agree to our Terms of Use and Privacy Policy.