เ√ลη کคи†σร . 65 Posted January 13, 2014 Bem, não vou elaborar muito, só vou dar algumas dicas.Isto vai ser extremamente necessário para programar quests e funções mais elaboradas com meia dúzia de linhas e mais funcionais.Variáveis:Atenção! Não definam variáveis sem ser "local variavelx" sem saber o que estão a fazer!Se definirem variáveis do tipo 'variavel="valor"', definam no ficheiro locale.lua, que são as variáveis globais. Jamais definam variáveis globais dentro de quests, ou as quests irão confundir-se sempre todas e como são globais elas vão estar sempre presentes no jogo vão estar sempre carregadas até reiniciar o servidor.As variáveis locais do tipo 'local variavel="valor"' podem e devem ser definidas nas quests e nas funções.Nunca criem variáveis locais dentro de if's sem saberem o que estão a fazer! Sempre que vão criar variáveis dentro de if's e outros ciclos, criem um 'local nomedavariavel' antes do if e depois dentro do if podem usar o 'nomedavariavel=pc.mais_uma_funcao_manhosa()' sem local dentro do if para exportar a variável para fora do if. Se fizerem 'local nomedavariavel=pc.mais_uma_funcao_manhosa()' dentro do if, a variável é apagada mal o if fecha. Por isso, definem um local nomedavariavel antes vazio e definem dentro sem 'local'.Ciclos:for:Estrutura: local ilocal limite=100local intervalo=1for i=1,limite,intervalo do ...endBasicamente o ciclo for é um ciclo que repete uma quantidade de vezes estipuladas no limite, com o intervalo estipulado.Ou seja, com o for i=1,100,1 como descrito em cima, o ciclo começa no número 1, tem intervalo de um número (ex 1,2,3,4,5...) e termina quando o número chegar ao 100.O intervalo não tem de ser necessariamente 1, nem como o inicio, como o for=10,20,0.5 que começa no número 10, termina no 20 e tem intervalo de 0.5 valores (10,10.5,11,11.5...).É importante que o 'local i' esteja presente! Todas as outras variáveis podem ser apagadas.Tem abaixo um exemplo em que se pode usar este ciclo:local ifor i=2,75,1 do pc.give_exp2(pc.get_next_exp()) syschat("Subiste para nível "..i.."!")endEste exemplo irá dar nível 75 quando um jogador começa. Como começa a nível 1, tem de ser i=2 a variável. Termina em 75 (nível 75, óbvio) e tem 1 valor de intervalo.Quando chega a nível 75 ele para de dar experiência.Pode ser usado para várias funções, tais como fazer inscrições com limites, ler múltiplos valores com sequência (usando a variável i dentro do for), etc. Usem a imaginação!while:Estrutura:while condicao do ...endO ciclo while é um ciclo que decorre enquanto a condição estipulada for verdadeira. Assim que a condição torna-se falsa, o ciclo fecha.A condição pode ser qualquer função ou comparação.Melhor maneira de vocês aprenderem é com um exemplo com uma função e comparação juntas: local nome=""while string.len(nome)<1 do say_title(title) say("Nome do jogador:") say() nome=input() player=mysql_query("SELECT COUNT(*) AS count FROM player.player WHERE name='"..nome.."'") if player.count[1]!=1 then nome="" endendBasicamente, tem sempre definir a variável antes do ciclo. Neste caso usei a variável nome, e a condição do meu while é enquanto a variável nome tiver menos de 1 caracter. Para o while correr, tenho de definir a variável nome vazia, para tornar a condição falsa.Esta função vai pedir que insiras o nome dum jogador que exista no jogo. Coloquei um if dentro do while para limpar a função se o jogador não existir na base de dados, senão o while iria fechar e não iria fazer o pretendido.Com isto conseguem chegar a mais ciclos que podem usar nas quests.Pesquisem programação Lua, o Google é vosso amigo! Não tem mal nenhum pesquisar, vocês aprendem assim, tal como eu aprendi.Podem fazer milhões de coisas em Lua, e de maneira mais fácil do que estão habituados. Não vos vou estar a dar tudo, mas como sempre dou-vos as bases para vocês progredirem!Qualquer coisa usem este tópico para esclarecer dúvidas.Abraço. 6 Maria Helena, quenii, Parafita16 and 3 others reacted to this Share this post Link to post Share on other sites
'PACI 2,317 Posted January 13, 2014 Não precisas de declarar uma variável com os loops for, ao fazeres for var já estás a declarar uma variável.Não sei se me fiz entender. local i -- Isto é useless, é a isso que me refiro.for i=2,75,1 do pc.give_exp2(pc.get_next_exp()) syschat("Subiste para nível "..i.."!")end local t = {19,1,29,2,39,3,49,4}for i = 1, #t, 2 do pc.give_item2(t[i], t[i+1])endlocal t = {19,29,39,49}for i = 1, #t do pc.give_item2(t[i], 1)end Share this post Link to post Share on other sites
เ√ลη کคи†σร . 65 Posted January 13, 2014 (edited) Não precisas de declarar uma variável com os loops for, ao fazeres for var já estás a declarar uma variável.Não sei se me fiz entender. local i -- Isto é useless, é a isso que me refiro.for i=2,75,1 do pc.give_exp2(pc.get_next_exp()) syschat("Subiste para nível "..i.."!")end local t = {19,1,29,2,39,3,49,4}for i = 1, #t, 2 do pc.give_item2(t[i], t[i+1])endlocal t = {19,29,39,49}for i = 1, #t do pc.give_item2(t[i], 1)end Precisas sim, eu também pensava isso. Até o i começar a confundir todo quando usado por 300 pessoas ao mesmo tempo.Tens de definir a varíavel i como local para a variável ficar definida somente para ti.EDIT: Tens uma má metodologia de programação. Deverias de usar assim:local ifor i=19,49,10 dopc.give_item2(i, 1)end Edited January 13, 2014 by เ√ลη کคи†σร . (see edit history) Share this post Link to post Share on other sites
'PACI 2,317 Posted January 13, 2014 Não precisas, eu pelo menos nunca usei. E se reparares até nas quests da ymir não têm a variável usada no loop for como local. :PEDIT:#t = table.getn Share this post Link to post Share on other sites
เ√ลη کคи†σร . 65 Posted January 13, 2014 (edited) Não precisas, eu pelo menos nunca usei. E se reparares até nas quests da ymir não têm a variável usada no loop for como local. :PEu aconselho-te a usares, eu próprio fiz o teste. Quando o resultado do 'i' for apresentado num jogador a sorte noutro jogador do mesmo core, tu vais perceber o que digo :)Eu não estou a dizer que estás errado, atenção! Assim também funciona xD Mas gera conflito, e esse conflito evita-se com o 'local i'PS: Nunca vi quests da ymir com isso, até nunca vi quest quase nenhuma da ymir, apaguei-as todas mal ganhei juízo. Edited January 13, 2014 by เ√ลη کคи†σร . (see edit history) Share this post Link to post Share on other sites
GunnerMBT 62 Posted January 13, 2014 Precisas sim, eu também pensava isso. Até o i começar a confundir todo quando usado por 300 pessoas ao mesmo tempo. Tens de definir a varíavel i como local para a variável ficar definida somente para ti. EDIT: Tens uma má metodologia de programação. Deverias de usar assim: local i for i=19,49,10 do pc.give_item2(i, 1) end A ironia... Má metodologia de programação é criar variáveis não inicializadas. "Até o i começar a confundir todo quando usado por 300 pessoas ao mesmo tempo." WTF? O "i" não se vai começar a confundir todo porque o valor vai ser guardado num CPU register e não onde lhe apetecer ao CPU... Podes criar a variável antes do loop, mas não há necessidade. 2 'PACI and quenii reacted to this Share this post Link to post Share on other sites
เ√ลη کคи†σร . 65 Posted January 13, 2014 A ironia... Má metodologia de programação é criar variáveis não inicializadas. "Até o i começar a confundir todo quando usado por 300 pessoas ao mesmo tempo." WTF? O "i" não se vai começar a confundir todo porque o valor vai ser guardado num CPU register e não onde lhe apetecer ao CPU... Podes criar a variável antes do loop, mas não há necessidade. Desculpa, eu inicializei uma variável local, enquanto vocês iniciam uma variável global que enquanto no jogador X o i é =1, e no jogador y vai no i=77, o X pode seguir logo para i=77 porque deteta o i do outro porque é uma variável global. Em qualquer programação tens sempre de inicializar a variável. Mais em C, mas em Lua também é importante. Não sejas rude, não penses que sabes mais do que alguém com experiencia desse erro. EDIT: Que dissesses isso à minha eng. professora de programação C, que ela dava-te dois berros e punha-te expulso 4 horas O.o Share this post Link to post Share on other sites
GunnerMBT 62 Posted January 13, 2014 Bem, antes de mais peço desculpa se pareci rude, não era a minha intenção. Segundo, neste exemplo que tu deste: local ilocal limite=100local intervalo=1for i=1,limite,intervalo do...end"local i" é redundante... E esse caso que tu referes só aconteceria se houvesse uma variável global com o mesmo nome da usada no loop (diz-me qual é a lógica de usar uma variável desse género no namespace global...). Terceiro, ISTO -> "local i" é uma variável não inicializada, apesar de não afectar em runtime porque o compilador trata disso por ti :)Em último lugar:... não penses que sabes mais do que alguém com experiencia desse erro.Nunca em caso algum eu disse saber mais do que alguém, nem sei de onde vem essa agressividade toda, se não és capaz de aceitar uma crítica não descarregues em mim que eu não sou pai de ninguém. Share this post Link to post Share on other sites
เ√ลη کคи†σร . 65 Posted January 13, 2014 Bem, antes de mais peço desculpa se pareci rude, não era a minha intenção. Segundo, neste exemplo que tu deste:"local i" é redundante... E esse caso que tu referes só aconteceria se houvesse uma variável global com o mesmo nome da usada no loop (diz-me qual é a lógica de usar uma variável desse género no namespace global...). Terceiro, ISTO -> "local i" é uma variável não inicializada, apesar de não afectar em runtime porque o compilador trata disso por ti :)Em último lugar:Nunca em caso algum eu disse saber mais do que alguém, nem sei de onde vem essa agressividade toda, se não és capaz de aceitar uma crítica não descarregues em mim que eu não sou pai de ninguém.Só te disse isso porque tu foste arrogante, queres dar críticas faz como o PACIFICADOR, usa a educação. Na verdade devias de inicializar sempre variáveis. Ao não inicializares, o for irá criar o i=1 como i sendo global, porque o local não foi definido. O compilador compila o que mandas, se mandas o for criar um i=1 não local, vai tornar-se global a seguir à primeira utilização.De qualquer maneira tenho teste de programação amanhã, pergunto à minha prof e ela esclarece-me. Se eu tiver errado peço desculpa de joelhos! Até lá, comprova que estou errado até conseguires que eu fique sem resposta. Share this post Link to post Share on other sites
'PACI 2,317 Posted January 13, 2014 Já usei bastantes loops for, mais propriamente para quests de inicio.Já as testei com várias personagens ao mesmo tempo, inclusive.E nunca gerou conflito nenhum.Como diz o Gunner, podes, ou não, fazê-lo, embora eu não o faça. :b Share this post Link to post Share on other sites
เ√ลη کคи†σร . 65 Posted January 13, 2014 Já usei bastantes loops for, mais propriamente para quests de inicio.Já as testei com várias personagens ao mesmo tempo, inclusive.E nunca gerou conflito nenhum.Como diz o Gunner, podes, ou não, fazê-lo, embora eu não o faça. :bEu prefiro fazer, embora esteja correto das duas maneiras. Eu zelo pela segurança, e sendo eu a explicar em cima eu não vou mudar a minha metodologia :)Podes usar ou não o 'local i' , mas tens sempre aquela segurança extra. Share this post Link to post Share on other sites
GunnerMBT 62 Posted January 13, 2014 Bem, não sei até que ponto fui arrogante, mas parece-me que estás a confundir alguns conceitos e definições, certamente que a tua professora te dirá o mesmo.Ora bem, inicializar != declarar, inicializar uma variável é por exemplo, local varTest = 0, declarar é: local varTest, portanto "local i" não é uma inicialização! Inicializar significa atribuir-lhes um valor, isto não tem importância em .quest ou .lua porque para o compilador é indiferente, desde que não acedas a esse espaço de memória não inicializado.Segundo, e usando de novo o teu exemplo: local limite=100local intervalo=1for i=1,limite,intervalo do ...endO facto de não dizeres explicitamente ao compilador que vais usar uma variável local com o nome "i", não implica que o for a vá criar no espaço global, isto não acontece até porque não faz sentido... Se tentares aceder a essa variável enquanto o loop está a ser executado sem a criar no scope actual, vais ter uma excepção levantada (algo como: tentativa de aceder a memória corrompida), isto se sequer passares pelo lexer, que não vai reconhecer o identifier (no scope actual!).Peço desculpa de novo se pareci arrogante, não era de todo a intenção, foi só uma forma descontraída de falar. Share this post Link to post Share on other sites
เ√ลη کคи†σร . 65 Posted January 13, 2014 Like if everyone knows lua. v1 = 20 -> globallocal v2 = 1 -- local ao blocowhile condition dolocal v3 =v2*2 --> local to the while bodyprint(v1) --> mostra 20, 40 , 60i = i + 1 --> incrementa iendBasicamente isto nada tem a ver com outros jogadores, um jogador tem a variável guardada em 4 bytes de memória e outro noutros 4 (Suponho que seja um Int32) Acho que esta ideia da tua parte é completamente ridícula. Se me fosses dizer que tu usas um lugar em memória onde declaras as coisas e acedes pelo offset seria uma coisa mas isto não pode gerar conflito de forma alguma, em runtime o pc sabe como lidar com as variáveis diferentes.Ninguem quer saber de bits nem que variável seja. As pessoas querem eficiência, funcionalidade e segurança. Não querem saber se tem x bits e se seja um int32 ou um tinyint Share this post Link to post Share on other sites
เ√ลη کคи†σร . 65 Posted January 13, 2014 Bem, não sei até que ponto fui arrogante, mas parece-me que estás a confundir alguns conceitos e definições, certamente que a tua professora te dirá o mesmo.Ora bem, inicializar != declarar, inicializar uma variável é por exemplo, local varTest = 0, declarar é: local varTest, portanto "local i" não é uma inicialização! Inicializar significa atribuir-lhes um valor, isto não tem importância em .quest ou .lua porque para o compilador é indiferente, desde que não acedas a esse espaço de memória não inicializado.Segundo, e usando de novo o teu exemplo: local limite=100local intervalo=1for i=1,limite,intervalo do ...endO facto de não dizeres explicitamente ao compilador que vais usar uma variável local com o nome "i", não implica que o for a vá criar no espaço global, isto não acontece até porque não faz sentido... Se tentares aceder a essa variável enquanto o loop está a ser executado sem a criar no scope actual, vais ter uma excepção levantada (algo como: tentativa de aceder a memória corrompida), isto se sequer passares pelo lexer, que não vai reconhecer o identifier (no scope actual!).Peço desculpa de novo se pareci arrogante, não era de todo a intenção, foi só uma forma descontraída de falar.Estás desculpado, também fui um bocado porque há sempre alguém no meio com a mania e pensei que irias ser mais um. Eu simplesmente declarei o i como local para o compilador ter a certeza que é uma variável local, devido a comigo não definir como local se nao definir antes de inicializar.Errei sim , troquei as palavras. Aí estavas certo. Espero que percebas o meu motivo de declarar antes. Share this post Link to post Share on other sites
ƤāƱŁѲ ƒēƦƦēƗƦā 1,220 Posted January 13, 2014 Spamm / Off topic apagado. Cumprimentos. Btw, em todas as quest que fiz com ciclos for (por exemplo) nunca declarei a variavel "i" ou o nome que tenha e nunca tive algum tipo de problema, logo concluo que não seja obrigado a declarar a variavel antes, mas cada um usa a sua maneira, desde que seja funcional claro. Share this post Link to post Share on other sites