Ir para conteúdo
  • Cadastre-se

(Resolvido)problema com tabelas


Ir para solução Resolvido por xWhiteWolf,

Posts Recomendados

bom dia!

 

estou tendo dificuldades para criar uma tabela que esteja durante toda a execução do ot

por exemplo

 

crio uma tabela players_id = {}

e conforme cada player puxa uma alavanca, o script faz um table.insert(players_id,cid)

e essa tabela cheia de creatureIDs deve estar disponivel a qualquer script de qualquer tipo (actions, cevents, movements etc)

a tabela deve ser reseta apenas quando o servidor é fechado, a nao ser que algum script faça isso, declarando que ela é {} novamente

 

não tenho certeza exata quanto ao meu problema, mas imagino que esteja em saber o local que devo declará-la

 

por exemplo, criei um .lua de configuração (assim como o config.lua, chamarei de marcelo.lua)

no inicio do marcelo.lua declarei players_id = {}

mas noto que sempre que inserto um valor, ele nao é fixado na tabela, pois atraves de outro script verifico que a tabela sempre contém 0 elementos, nao importa quantos players eu coloco

 

imagino que por ser declarada fora de uma função, ela sempre será nula fora do escopo de uma função que a modifique

porém não sei como devo proceder, então

 

 

sei que minha explicação foi confusa, se algum ponto falhei, tentarei tornar mais claro

 

desde já agradeço!!

Link para o post
Compartilhar em outros sites

Dá pra simplificar.
Veja se entende o exemplo, básico:


cids.lua (data/lib):

players_id = {}




alavanca.lua (data/actions/scripts):

function onUse(cid)
    if #players_id > 0 then -- se a tabela tiver ao menos um elemento..
        for i = 1, #players_id do -- do primeiro elemento da tabela, ao último..
            if cid ~= players_id[i] then return false end -- se cid não estiver incluso na tabela, retorne false..
        end

        doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) -- se o escopo acima for false, teleporte o cid para o templo de sua town..
    else
        table.insert(players_id, cid) -- se a tabela não possuir pelo menos um elemento, então o cid é inserido na mesma..
    end
    
    return true
end

E sim, a tabela é setada à zero elementos quando é feito o shutdown.
PS: explicação sem muitos detalhes aprofundados, nos comentários, só pra você entender.

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

The corrupt fear us.

The honest support us.

The heroic join us.

Link para o post
Compartilhar em outros sites

certo, até essa parte tudo bem.

 

entretanto,

3 players puxam a alavanca, por exemplo

se em uma talkaction, eu quiser que todas as cids sejam enviadas em textos

eu não consigo. nenhum valor aparece. esse é meu problema

Link para o post
Compartilhar em outros sites
3 players puxam a alavanca, por exemplo se em uma talkaction, eu quiser que todas as cids sejam enviadas em textos eu não consigo. nenhum valor aparece. esse é meu problema

 

Ficou um pouco confuso, mas vou fazer como entendi você.

Tente o seguinte.

Adicione o player guid (player ID) à tabela e faça dos valores uma string (pegando os nomes dos players pelos guids), pra ser enviada como uma lista de nomes na talkaction.

Ex:

table.insert(players_id, getPlayerGUID(cid))

 

function onSay(cid)
    if #players_id > 0 then
        list = ''
        for i = 1, #players_id do
            name = players_id[i]
            list = list.. getPlayerNameByGUID(name) ..''
            if i ~= #players_id then
                list = list ..', '
            else
                list = list ..'.'
            end
        end
        
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Name of the players in the table: '.. list)
    else
        doPlayerSendCancel(cid, 'There are no elements in the table.')
    end
    
    return true
end
Editado por Suicide (veja o histórico de edições)

The corrupt fear us.

The honest support us.

The heroic join us.

Link para o post
Compartilhar em outros sites

oque é suicide falou tá correto mas oque ele não sabia é que as tabelas não são "passáveis" entre os scripts. Eu enfrentei esse problema ao tentar fazer esse script aqui: http://www.tibiaking.com/forum/topic/41021-voodoo/

Note que ele ficaria muito mais limpo se eu pudesse montar uma tabela e ir adicionando quem é o voodoo de quem nessa tabela porém como a tabela é feita em spells e eu teria que usar em creaturescripts isso não é possível, ela aparece como se estivesse vazia porque seria como se fosse criada uma outra instância da tabela para creaturescripts (mesmo em mods). Eu tentei de tudo e felizmente eu descobri que algumas versões de TFS suportam string (texto) no storage, daí foi só salvar o nome do voodoo no storage do player e pegar pelo creaturescript. Deve ter uma solução alternativa pro seu problema (sempre tem) mas se vc for teimoso igual o Mock era, ele fez uma função que salva uma tabela num documento de texto e outra pra ler essa tabela. Aviso que isso vai ficar pesado no seu server mas é uma "solução". As funções de salvar table e dar load estão na New Lib. São as funções 30 e 31 mas vc vai precisar da função 29 pra rodar. http://www.tibiaking.com/forum/topic/46015-new-library-v-12.

Isso dai faz mais sentido qnd vc estuda classes e objetos mas oque vc tem que ter em mente é que algumas coisas são interpretadas diferentemente de acordo com o script que vai ler (isso vale até pras libs). Não dá pra vc criar uma tabela na lib, editar ela num script e achar que vai usar a versão editada em outro script.

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)

Link para o post
Compartilhar em outros sites

Eu encontrei uma solução:

 

existe uma maneira de transformar as tabelas em um formato que as proprias storages possam guardar

entretanto, ainda nao testei. Começarei a mexer neste instante.

 

--[[ Colocar strings em storages penso ser algo simples

transformar a string em número deve resolver ]]--


meu problema pode ser resolvido usando a database, entretanto meu conhecimento não me permite fazê-lo.

Editado por Marcelo Druida (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

é mais facil adicionar um storage no player qnd clica na alavanca e aí fazer a checagem enntre todos os players online pra montar a tabela dentro de cada script. Caso o player tenha o valor do storage = 1 então adiciona o cid dele na tabela. Rápido, fácil e não vai lagar seu servidor. Sttring em storage pesa demais, dá pra pasar uma tabela pra string e adicionar num storage mas isso vai pesar mais ainda.

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)

Link para o post
Compartilhar em outros sites

http://otland.net/threads/lua-array-serialization-deserialization-into-from-single-storage-value.189180/

olhe isso e me diga o que pensa

 

na verdade, nao sei bem se esta será minha solução, mas foi o que entendi no meu pequeno conhecimento

Link para o post
Compartilhar em outros sites

isso é um versão em OO da função do mock '-' dá na mesma praticamente. É mais facil vc falar oque quer fazer que daí eu te explico como fazer ao invés da gente discutir soluções que podem não ser adequadas pro seu server..

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)

Link para o post
Compartilhar em outros sites

pensei ser um metodo que transforma a tabela em algo que seja possivel guardar em storages, ela simplesmente guarda as informações em um arquivo texto?

 

enfim.

 

imagine um evento.

cada player interessado em participar, fala !entrar

a talkaction adiciona o valor "cid" a uma tabela que deve ser visivel a QUALQUER script de qualquer parte.

essa tabela deve conter os cid de todos os participantes, portanto

eu devo ser capaz de manipular esta tabela da maneira que bem desejar, usando table.insert, table.remove ou qualquer outra coisa, assim como #tabela

essa tabela só deve ter os valores resetados se eu definir algum script que a faça, ou quando o servidor for desligado.

 

acho que isso é tudo.

testarei ambas as funções (mock e tarjei) agora.


eu digo tabela, mas qualquer meio de registrar o que eu preciso é valido, assim como disse databases é minha proxima opção

Editado por Marcelo Druida (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • Solução

qnd falar !entrar seta um storage no player e coloca um onLogin pra se o storage for diferente de 0 setar pra 0 no caso deles falarem !entrar e sairem do server. Feito isso vc cria um método (função) getEventPlayers que vai retornar a tabela de todos os players online cujo storage seja 1.

local function getEventPlayers()
local players = {}
for _, pid in pairs(getPlayersOnline()) do
 if getPlayerStorageValue(pid, storagequalquer) == 1 then 
table.insert(players, pid)
end
end
return players
end

simples e fácil, daí vc pode colocar isso numa lib (vai ter que tirar o local) e só chamar essa função sempre que quiser a lista de players.

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

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)

Link para o post
Compartilhar em outros sites

realmente, imagino ser a forma mais simples ^^

obrigado!

 

por exemplo, se eu precisar guardar uma string, simplesmente converter toNumber("ola") daria certo?


http://otland.net/threads/lib-serializing-and-deserializing-many-values-into-from-single-storage-value.177284/

 

esse topico contém uma função parecida, mas guarda de outra maneira, além de aceitar outros tipos de valores.

entretanto, minha demanda atual foi atendida, fica como conhecimento :D

Link para o post
Compartilhar em outros sites

não.. tonumber() retorna apenas valores numéricos. Se vc usa numa string vai retornar nil. tonumber("Vote 5371 para deputado federal") vai retornar 5371 pois é o único número.

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)

Link para o post
Compartilhar em outros sites

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

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo