Log in to reply
 

[Tips] How to draw long multibyte strings



  • 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 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));
    			startIndex = i - 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 can optimize performance of this method.
    

    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.


Log in to reply
 

Looks like your connection to GTA5-Mods.com Forums was lost, please wait while we try to reconnect.