Raised This Month: $32 Target: $400
 8% 

Solved Auto Hud Organization + Percent Getting 'Devide' Run Time Error


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
AnimalMonster
Senior Member
Join Date: May 2020
Old 06-13-2021 , 19:48   Auto Hud Organization + Percent Getting 'Devide' Run Time Error
Reply With Quote #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.
AnimalMonster is offline
Old 06-14-2021, 00:49
Celena Luna
This message has been deleted by Celena Luna. Reason: ah nvm, it is sovled
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 05:03.


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