Jump to content

Caracteres especiais obtidos de arquivo XML se tornam inválidos?


Recommended Posts

  • Other Languages Moderators

Olá senhores.

Estou fazendo um script cujo menu GUI é construído a partir de informações de um arquivo.xml

No arquivo.xml, estão os textos que devem aparecer nos botões e texto do painel. O problema é que em alguns botões, preciso colocar quebra de linha. (\n) [contra-barra + N)

Se eu criar um botão dentro do script.lua e colocar um texto com quebra de linha, funciona normal. Porém se eu obter esse mesmo texto com quebra de linha do arquivo.xml, ele carrega \n no lugar da quebra de linha, como se o \n deixasse de funcionar.

buttons[i][k] = guiCreateButton (250, 50*(k-1)-30, 150, 40, xmlACLValues[i][2], false, PainelTAG)

O valor xmlACLValues[2] é igual a "recruta\n(membro)" e foi obtido do arquivo.xml. O botão é criado corretamente, porém a quebra de linha não funciona e o botão fica assim:

k1F6IoqOTuOzHRSL1zFHxA.png

Se eu setar o texto de dentro do script.lua, dai a quebra de linha funciona normal usando a mesma string "recruta\n(membro)".

xmlACLValues[i][2] = "recruta\n(membro)"
buttons[i][k] = guiCreateButton (250, 50*(k-1)-30, 150, 40, xmlACLValues[i][2], false, PainelTAG)

lS3JiFNASSupZNnLcpKQqQ.png

Alguém sabe por que ocorre isso e como resolver? Já tentei usar tostring, string.gsub (parece tolice substituir um \n por outro \n mas eu tava na esperança de ele criar um \n novo que funcione.)

Obs: Eu sei que é possível evitar isso entupindo de espaços até a segunda parte ir pra baixo, mas eu não queria fazer gambiarras.

Arquivo.xml:

Spoiler

<groups>
	<text>Selecione um grupo na lista da Esquerda, depois selecione um jogador na lista da Direita e então gerencie a TAG dele usando os botões. Os botões verdes irão atribuir a TAG específica, enquanto que os botões vermelhos irão remover a TAG específica.</text>
	<group>
		<info name="BOPE - Batalhão de Operações Policiais Especiais" type="COP" /> <!-- type accepted values: COP, GANG, NEUTRAL, ARMY-->
		<acl name="BOPE" title="recruta\n(membro)" /> <!-- \n = Enter. For some reason, the resource don't recognize this as Enter. -->
		<acl name="SDD-BOPE" title="soldado" />
		<acl name="CABO-BOPE" title="cabo" /> <!--The ACLs must be in the privilege order. Less privilege first, more privilege last. Maximum 18 ACLs. -->
		<acl name="3SGT-BOPE" title="3º sargento" />
		<acl name="2SGT-BOPE" title="2º sargento" />
		<acl name="SGT-BOPE" title="1º sargento" />
		<acl name="SUBTEN-BOPE" title="sub-tenente" />
      	<!-- mais botões -->
	</group>
	<!-- mais grupos -->
</groups>

Escrevi os comentários em inglês de propósito.

 

Edited by Lord Henry
Link to comment
  • Moderators

Você usa (membro) somente quando está como recruta? Se for isso mesmo, é só fazer assim que deve funcionar:

local patente = xmlACLValues[i][2] == "recruta" and "recruta\n(membro)" or xmlACLValues[i][2]
buttons[i][k] = guiCreateButton (250, 50*(k-1)-30, 150, 40, patente, false, PainelTAG)

E claro, remove (membro) do arquivo XML.

Link to comment
  • Other Languages Moderators
5 minutes ago, DNL291 said:

Você usa (membro) somente quando está como recruta? Se for isso mesmo, é só fazer assim que deve funcionar:


local patente = xmlACLValues[i][2] == "recruta" and "recruta\n(membro)" or xmlACLValues[i][2]
buttons[i][k] = guiCreateButton (250, 50*(k-1)-30, 150, 40, patente, false, PainelTAG)

E claro, remove (membro) do arquivo XML.

É porque a TAG padrão (no caso do BOPE) é a ACL Group "BOPE". Os membros precisam ter sempre ela para usar as viaturas, acessar base, etc. Quando alguém entra na corporação, começa como recruta. A ACL é de membro mas oq aparece no chat é Recruta. Quando o membro é promovido para outra patente, ele continua nessa ACL Group.

Mas esse não é o problema. Só preciso que a quebra de linha funcione a partir do XML. Pois existem outros botões de patentes que precisam dela também.

Link to comment
  • Other Languages Moderators

Descobri um jeito de corrigir, mas parece gambiarra.

Eu substituí todos os \n do XML por underline ( ). E então no script, eu substituo o underline pelo \n.
Já que o \n foi criado no próprio script, dai ele funciona.

xmlACLValues[i][2] = xmlNodeGetAttribute(xmlNodes[i][k], "title")
xmlACLValues[i][2] = string.gsub (xmlACLValues[i][2], "_", "\n")

 

Link to comment
  • Moderators

Não sei o motivo de não dar a quebra de linha, estranho, teria que funcionar da forma que está, pode ser algum bug do MTA, problema com codificação, sei lá :/

Tem outra forma de qubrar a linha com [[ ]] quer seria assim:

[[recruta

(membro)]]

Dai você poderia usar as funções de strings pra separar. Nunca testei isso, mas talvez funcione.

Edit: Curioso isso, talvez seja um bug mesmo e a solução seja refazer o \n por código.

Edited by DNL291
Link to comment
  • Other Languages Moderators
9 minutes ago, DNL291 said:

Edit: Curioso isso, talvez seja um bug mesmo e a solução seja refazer o \n por código.

Foi oq eu optei em fazer. Refiz o \n no código quando ele detecta o underline no XML.

Link to comment

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
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...