Senior Member
|
06-13-2021
, 19:48
Auto Hud Organization + Percent Getting 'Devide' Run Time Error
|
#1
|
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
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)
}
}
Last edited by AnimalMonster; 06-13-2021 at 22:57.
|
|