Postado Maio 31, 2017 7 anos 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?
Postado Maio 31, 2017 7 anos Não entendi, posta os códigos... Você está alterando o valor da lib por uma talk? [*Ninguém será digno do sucesso se não usar suas derrotas para conquistá-lo.*] DISCORD: vodkart#6090
Postado Maio 31, 2017 7 anos 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 Maio 31, 2017 7 anos por Snox (veja o histórico de edições)
Postado Junho 1, 2017 7 anos 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 (obg ao @Beeny por fazer essa linda sign <3)
Postado Junho 1, 2017 7 anos 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.