AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   Solved Auto Hud Organization + Percent Getting 'Devide' Run Time Error (https://forums.alliedmods.net/showthread.php?t=333009)

AnimalMonster 06-13-2021 19:48

Auto Hud Organization + Percent Getting 'Devide' Run Time Error
 
so, as in title, i've tried some things about auto hud organization. This thing is based on searching 2 words, that can be setted through lang, and their center.
my first problem about this is that when text2[1] gets added, starting with / and finishing with ], gets deleted

Code:

public ShowInfo(TASKID)
{
        for(new i=1; i<=g_maxplayers; i++)
        {
                if(!is_user_alive(i) || is_user_bot(i))
                        continue
       
                set_hudmessage(0, 255, 0, -1.0, 0.9, 0, 0.0, UPDATE_HUD_TIME+0.1, 0.0, 0.0)
                new text[524], text2[4][524], len[4]
                format(text, charsmax(text), "%L ^n", i, "HUD_MESSAGE_DOWN")

                len[0] = format(text2[0], charsmax(text2), "[%i]", g_PlayerLevel[i])
                /*if(get_pcvar_num(pcvar_hud_type)){
                        new Float:lasuta = (((g_PlayerExp[i]/g_PlayerExpCurrent[i])-1.0)*100)*(-1)
                        len[1] = format(text2[1], charsmax(text2), "[%.2f]", lasuta)
                }
                else*/ len[1] = format(text2[1], charsmax(text2), "[%i/%i]", g_PlayerExp[i], g_PlayerExpCurrent[i])
               
                len[2] = format(text2[2], charsmax(text2), "%L", i, "LEVEL")
                len[3] = format(text2[3], charsmax(text2), "%L", i, "EXP")
               
                new pos[2]
                pos[0] = strfind(text, text2[2])-1
                pos[1] = strfind(text, text2[3])-1
               
                new dPos
                if(pos[0] > pos[1])
                        dPos = pos[0]-pos[1]
                else dPos = pos[1]-pos[0]
               
                if(len[0] != len[2])
                {
                        if(len[0] > len[2])
                                pos[0] += len[0]-len[2]
                        else pos[0] += len[2]-len[0]
                }
               
                if(len[1] != len[3])
                {
                        if(len[1] > len[3])
                                pos[1] += len[1]-len[3]
                        else pos[1] += len[3]-len[1]
                }
               
                for(new x = 0; x < pos[0]; x++)
                        add(text, charsmax(text), " ")
               
                add(text, charsmax(text), text2[0])
               
                for(new x = 0; x < pos[1]-dPos; x++)
                        add(text, charsmax(text), " ")
                       
                add(text, charsmax(text), text2[1])

                ShowSyncHudMsg(i, g_HudSyncObj, text)
        }
}

and where you see the commented code (between /* */) i tried to get the percent of exp 'till next level of the player but i was getting the run time error 11 (i think) also named 'Devide', i really don't know why but i hope someone can help me xd.

Edit:
After a while i've got a better result but not perfect since the second string with values wasn't as expected but the first string is :bee:

Code:

public ShowInfo(TASKID)
{
        for(new i=1; i<=g_maxplayers; i++)
        {
                if(!is_user_alive(i) || is_user_bot(i))
                        continue
       
                set_hudmessage(0, 255, 0, -1.0, 0.9, 0, 0.0, UPDATE_HUD_TIME+0.1, 0.0, 0.0)
                new text[524], text2[2][524], szLevel[20], szExp[200], len[4]
                format(text, charsmax(text), "%L^n", i, "HUD_MESSAGE_DOWN")

                format(szLevel, charsmax(szLevel), "[%i]", g_PlayerLevel[i])
                /*if(get_pcvar_num(pcvar_hud_type)){
                        new Float:lasuta = (((g_PlayerExp[i]/g_PlayerExpCurrent[i])-1.0)*100)*(-1)
                        len[1] = format(text2[1], charsmax(text2), "[%.2f]", lasuta)
                }
                else*/ format(szExp, charsmax(szExp), "[%i/%i]", g_PlayerExp[i], g_PlayerExpCurrent[i])
               
                LookupLangKey(text2[0], charsmax(text2), "LEVEL", i)
                LookupLangKey(text2[1], charsmax(text2), "EXP", i)
               
                len[0] = strlen(szLevel)
                len[1] = strlen(szExp)
                len[2] = strlen(text2[0])
                len[3] = strlen(text2[1])
               
                new pos[2]
               
                pos[0] = strfind(text, text2[0])
                pos[1] = strfind(text, text2[1])
               
                client_print(i, print_chat, "pos = { %i, %i } len = { %i, %i, %i, %i }", pos[0], pos[1], len[0], len[1], len[2], len[3])
               
                if(len[0] != len[2])
                {
                        if(len[0] > len[2])
                                pos[0] += len[0]-len[2]
                        else pos[0] += len[2]-len[0]
                }
               
                if(len[1] != len[3])
                {
                        if(len[1] > len[3])
                                pos[1] += len[1]-len[3]
                        else pos[1] += len[3]-len[1]
                }
               
                client_print(i, print_chat, "pos = { %i, %i } len = { %i, %i, %i, %i }", pos[0], pos[1], len[0], len[1], len[2], len[3])
               
                new dPos
                if(pos[0] > pos[1])
                        dPos = pos[0]-pos[1]
                else dPos = pos[1]-pos[0]
               
                pos[1] -= dPos
               
                client_print(i, print_chat, "pos = { %i, %i } len = { %i, %i, %i, %i } dPos = %i", pos[0], pos[1], len[0], len[1], len[2], len[3], dPos)
               
                for(new x = 0; x < pos[0]; x++)
                        add(text, charsmax(text), " ")
               
                add(text, charsmax(text), szLevel)
               
                for(new x = 0; x < pos[1]; x++)
                        add(text, charsmax(text), " ")
                       
                add(text, charsmax(text), szExp)

                ShowSyncHudMsg(i, g_HudSyncObj, text)
        }
}

And in my test i see that lang strings always come out with lenght 1, why is that?
Code:

pos = { 4, 16 } len = { 3, 9, 1, 1 }
pos = { 6, 24 } len = { 3, 9, 1, 1 }
pos = { 6, 6 } len = { 3, 9, 1, 1 } dPos = 18

Edit 2:
After so many tests i've got it right and i see also why it wasn't put as expected + i still don't know why with 'text2' the lenght of the string didn't go through but ,now that i made separately 2 other strings, it gets them right and i could use them to finish it as wanted.

Final Code:
Code:

public ShowInfo(TASKID)
{
        for(new i=1; i<=g_maxplayers; i++)
        {
                if(!is_user_alive(i) || is_user_bot(i))
                        continue
       
                set_hudmessage(0, 255, 0, -1.0, 0.9, 0, 0.0, UPDATE_HUD_TIME+0.1, 0.0, 0.0)
                new text[524], text2[2][524], LLevel[10], EExp[10], szLevel[20], szExp[200], len[4]
                format(text, charsmax(text), "%L^n", i, "HUD_MESSAGE_DOWN")

                format(szLevel, charsmax(szLevel), "[%i]", g_PlayerLevel[i])
                /*if(get_pcvar_num(pcvar_hud_type)){
                        new Float:lasuta = (((g_PlayerExp[i]/g_PlayerExpCurrent[i])-1.0)*100)*(-1)
                        len[1] = format(text2[1], charsmax(text2), "[%.2f]", lasuta)
                }
                else*/ format(szExp, charsmax(szExp), "[%i/%i]", g_PlayerExp[i], g_PlayerExpCurrent[i])
               
                LookupLangKey(LLevel, charsmax(LLevel), "LEVEL", i)
                LookupLangKey(EExp, charsmax(EExp), "EXP", i)
               
                len[0] = strlen(szLevel)
                len[1] = strlen(szExp)
                len[2] = strlen(LLevel)
                len[3] = strlen(EExp)
               
                new pos[2]
               
                pos[0] = strfind(text, LLevel)+(len[2]/2)
                pos[1] = strfind(text, EExp)+(len[3]/2)
               
                client_print(i, print_chat, "pos = { %i, %i } len = { %i, %i, %i, %i }", pos[0], pos[1], len[0], len[1], len[2], len[3])
               
                if(len[0] != len[2])
                {
                        if(len[0] > len[2])
                                pos[0] += len[0]-len[2]
                        else pos[0] += len[2]-len[0]
                }
               
                if(len[1] != len[3])
                {
                        if(len[1] > len[3])
                                pos[1] += len[1]-len[3]
                        else pos[1] += len[3]-len[1]
                }
               
                client_print(i, print_chat, "pos = { %i, %i } len = { %i, %i, %i, %i }", pos[0], pos[1], len[0], len[1], len[2], len[3])
               
                new dPos
                if(pos[0] > pos[1])
                        dPos = pos[0]-pos[1]
                else dPos = pos[1]-pos[0]
               
                pos[1] -= dPos
               
                client_print(i, print_chat, "pos = { %i, %i } len = { %i, %i, %i, %i } dPos = %i", pos[0], pos[1], len[0], len[1], len[2], len[3], dPos)
               
                for(new x = 0; x < pos[0]; x++)
                        add(text, charsmax(text), " ")
               
                add(text, charsmax(text), szLevel)
               
                for(new x = 0; x < pos[1]; x++)
                        add(text, charsmax(text), " ")
                       
                add(text, charsmax(text), szExp)

                ShowSyncHudMsg(i, g_HudSyncObj, text)
        }
}

Edit 3:
After another hour i could make it even more accurate and minimalisti, this really is final. I hope this can help someone else that tries the same thing and i was getting the devide run time error bcs i forgot to check if user is bot, since there were bots in my tests and they couldn't get xp the values were both 0 and you can't devide 0 by 0.
Code:

public ShowInfo(TASKID)
{
        for(new i=1; i<=g_maxplayers; i++)
        {
                if(!is_user_alive(i) || is_user_bot(i))
                        continue

                set_hudmessage(0, 255, 0, -1.0, 0.9, 0, 0.0, UPDATE_HUD_TIME+0.1, 0.0, 0.0)
                new text[524], LLevel[10], EExp[10], szLevel[20], szExp[200], len[4]
                format(text, charsmax(text), "%L^n", i, "HUD_MESSAGE_DOWN")

                format(szLevel, charsmax(szLevel), "[%i/%i]", g_PlayerLevel[i], g_LevelsNum)
                if(get_pcvar_num(pcvar_hud_type)){
                        new Float:lasuta = (((g_PlayerExp[i]/g_PlayerExpCurrent[i])-1.0)*100)*(-1)
                        format(szExp, charsmax(szExp), "[%.2f]", lasuta)
                }
                else format(szExp, charsmax(szExp), "[%i/%i]", g_PlayerExp[i], g_PlayerExpCurrent[i])
               
                LookupLangKey(LLevel, charsmax(LLevel), "LEVEL", i)
                LookupLangKey(EExp, charsmax(EExp), "EXP", i)
               
                len[0] = strlen(szLevel)
                len[1] = strlen(szExp)
                len[2] = strlen(LLevel)
                len[3] = strlen(EExp)
               
                new pos[2]
               
                pos[0] = strfind(text, LLevel)-1
                pos[1] = strfind(text, EExp)-1
               
                new pPos = pos[1]-(pos[0]+len[0])

                client_print(i, print_chat, "pos = { %i, %i } len = { %i, %i, %i, %i }", pos[0], pos[1], len[0], len[1], len[2], len[3])
               
                for(new x = 0; x < pos[0]; x++)
                        add(text, charsmax(text), " ")
               
                add(text, charsmax(text), szLevel)
               
                for(new x = 0; x < pPos; x++)
                        add(text, charsmax(text), " ")
                       
                add(text, charsmax(text), szExp)

                ShowSyncHudMsg(i, g_HudSyncObj, text)
        }
}



All times are GMT -4. The time now is 02:29.

Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.