Ir para conteúdo

Featured Replies

Postado

Boa noite! Estou com um certo problema de reconhecimento de variável global.

Defini uma varíavel no arquivo 000-constant.lua e estou alterando o valor dessa variável de 0 para 1, por meio de um talkaction.

 

Essa alteração é feita normalmente e consegui verificar que ele faz isso. Porém, eu criei um item que, ao ser utilizado, verifica se essa variável é 1 para dar continuidade no seu funcionamento. Percebi que ele não tá reconhecendo a variável que eu defini em 000-constant.lua. Não estou entendendo o motivo, já que o talkaction reconheceu. Alguém sabe?

  • Respostas 5
  • Visualizações 536
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • eu amo quando o pessoal pensa um pouco sobre o próprio problema. Tudo que você comentou aqui está corretíssimo!!! O que ocorre é o seguinte: os ambientes (talkactions, spells, monster, npc, actions,

Postado
  • Autor

Eu só estou fazendo uns testes apenas pra ver como eu implementaria um sistema maior. Ainda não é nada demais. Eu apenas defini uma variável em 000-constant.lua, por exemplo:

 

VARIAVEL_01 = 0

 

Em seguida, criei uma talkaction que, por exemplo, faz isso:

 

function onSay(cid, words, param, channel)
    VARIAVEL_01 = 1
    return true
end

 

E, por último, criei uma action para um item dessa maneira:

 

function onUse(cid, item, fromPosition, itemEx, toPosition)
    if(VARIAVEL_01 == 0) then
        return doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "A variável está inativa.")
    end
    local pos = {x = 213, y = 607, z = 7}
    doTeleportThing(cid, pos, true)
    return true
end

 

Mas está sempre caindo no if. Pelo que percebi, a talkaction não tá mudando de fato o valor da variável, provavelmente criando outra com mesmo nome no escopo da função. Como eu poderia alterar o valor real?

Editado por Snox (veja o histórico de edições)

Postado

eu amo quando o pessoal pensa um pouco sobre o próprio problema. Tudo que você comentou aqui está corretíssimo!!!
O que ocorre é o seguinte: os ambientes (talkactions, spells, monster, npc, actions, movements, creaturescripts.. etc.) tem escopos separados e uma lib nada mais é do que um arquivo que o tfs simplesmente cria cópias locais pra cada ambiente. Quando você altera na talkaction o que vc está fazendo é simplesmente alterar a variavel LOCAL do ambiente talkaction, o que não influi em nada na variavel local de mesmo nome do ambiente de actions. Você alterou uma cópia mas a original e as outras cópias estão intactas.

Pra você alterar o valor real você tem uma série de soluções, porém a mais esperta de todas é entender que existem posições da memória próprias pra isso: as chamadas global storage.

Semelhante ao storage de um player, as globais storage ficam definidas pra todos os ambientes. Tudo que você precisa fazer é usar as funções setGlobalStorageValue(posição da memoria, valor)
e getGlobalStorageValue(posição da memória);

o que você pode fazer é o seguinte: define a sua variavel da lib como VARIAVEL_01 = 17543 e usa setGlobalStorageValue(VARIAVEL_01, 1).
na actions você coloca: getGlobalStorageValue(VARIAVEL_01) == 0. Dessa forma você garante que ambos vão sempre estar lendo e escrevendo na posição certa da memória já que o valor é controlado pela lib e ao mesmo tempo você tem variáveis salvas e compartilhadas entre todos os ambientes.

PS: não sei se o nome da função é exatamente setGlobalStorageValue e getGlobalStorageValue, mas é algo parecido com isso.

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Postado
  • Autor

Rapaz, você realmente é bom! kkkkk

 

Agora as coisas fazem mais sentido. Testei aqui da maneira que você falou e deu certo mesmo. E sim, os nomes das funções são esses mesmos.

 

Agora entendo um pouco mais, muito obrigado meeesmo pela ajuda!

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.7k

Informação Importante

Confirmação de Termo