Jump to content

Olá Tibiano! Notamos que você está com um adblocker ligado... 

Nós promovemos servidores dentro da comunidade, para que eles tenham visibilidade.

Por favor, nos ajude a continuar promovendo esses servidores. Adicione nosso domínio na whitelist de seu adblocker, ok? :)

Search the Community

Showing results for tags 'scripting'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • xTibia - Notícias e Suporte
    • Regras
    • Noticias
    • Soluções
    • Projetos Patrocinados
    • Tutoriais para Iniciantes
    • Imprensa
  • OTServ
    • Notícias e Debates
    • OTServlist
    • Recursos
    • Suporte
    • Pedidos
    • Downloads
  • OFF-Topic

Categories

There are no results to display.


Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Sou

Found 26 results

  1. Olá, eu vim trazer um script que eu produzi para absolutamente nada além de treino, eu estou postando pois talvez seja útil para alguém em algum momento do espaçotempo. E também vou ceder todos os créditos ao @Woox, afinal eu não ia conseguir sem ele, então meu muito obrigado. local configuration = { positionParedinso1 = {x=1067, y=1071, z=7, stackpos=1}, -- Posição do objeto que ira sumir time = 1*15*1000, -- tempo para o objeto voltar para o seu lugar devido monstrosTime = 1*10*1000, -- tempo até os monstros despertarem guardioes = { [1] = {name = "Hellfire Fighter", pos = {x = 1065, y = 1071, z = 7}}, -- Todas posições onde os monstros seram criados [2] = {name = "Massive Fire Elemental", pos = {x = 1061, y = 1069, z = 7}}, -- Bem como seus nomes e quantidade [3] = {name = "Fury", pos = {x = 1069, y = 1074, z = 7}}, [4] = {name = "Demon", pos = {x = 1069, y = 1071, z = 7}}, [5] = {name = "Diabolic Imp", pos = {x = 1066, y = 1074, z = 7}}, [6] = {name = "Fire Devil", pos = {x = 1064, y = 1075, z = 7}}, [7] = {name = "Fire Elemental", pos = {x = 1062, y = 1069, z = 7}}, [8] = {name = "Massive Fire Elemental", pos = {x = 1067, y = 1068, z = 7}} } } function onUse(cid, item, fromPosition, itemEx, toPosition) if item.itemid == 1945 then -- alavanca doTransformItem(item.uid, 1946) positionParedinso = getThingFromPos(configuration.positionParedinso1) if positionParedinso.itemid ~= 0 then doRemoveItem(positionParedinso.uid, 1) doCreatureSay(cid, "Um som terrível de engrenagens antigas se movendo pode ser ouvido imediatamente após você puxar a alavanca. \z Estrondos, chamas e vozes demoniacas estão vindo na sua direção, são ouvidos cada vez mais altos, corra por sua vida, \z você acaba fezer um mal antigo despertar.", TALKTYPE_ORANGE_1) -- Mensagem que será exibida após você puxar a alavanca addEvent(function() for k, v in pairs(configuration.guardioes) do doCreateMonster(v.name, v.pos) end end, configuration.monstrosTime) addEvent(doCreateItem, configuration.time, 12794, configuration.positionParedinso1) -- "12794" é o ID da parede que você quer criar após puxar a alavanca end else doTransformItem(item.uid, 1945) end end
  2. Bem Vindo! jovem:tibiano Apresentação: Estou querendo formar uma equipe para criação de um jogo, baseado em Tibia mas desenvolvido com uma linguagem própria. O enredo se passara durante a primeira grande gerra ninja, em um mundo de Shinobi e lordes. O jogo seguira como base fiel a tíbia em seu gráfico e fácil jogabilidade. Proposta: O jogo ira ter uma linguagem Java, por sua fácil compreensão maleabilidade para criação. O designe de Client ira ter uma inovação, junto com seus botoes e seu cursor . Em relação a site, ele ira ser feito de acordo com andamento do projeto. O jogo também sera lançado para playstore de acordo com a situação do servidor original. Requisitos para se juntar a equipe: Trabalho em equipe com um horário fixo pré estabelecido. Para quem for efetuar o trabalho de programar é necessário Java. Dedicação e respeito com os colegas. Benefícios De Participar Deste Projeto: * Com o lançamento oficial ou beta, quais quer lucro adquirido os integrantes da equipe irão receber uma % dos lucros mensais do jogo. * O nome dos participantes irão estar a vista nas sub linhas, assim divulgando seus nomes para futuros projetos. * Para segurança de todos os participantes do projeto, haverá um consenso legal dos termos e benefícios recebidos . Requerimentos para preenchimento de vaga: Nome: Idade: Função ou atribuição desejada: Experiencias anteriores: Contato Whatsapp > Contato Email > Para sua segurança de Numero de whatsapp ou email, podem ser enviados os seguintes dados para o meu contato de email > [email protected] Facebook https://www.facebook.com/nikolas.valois ou meu Whatsapp > 11943932200 . Obrigado por sua atenção. nk..
  3. Palavras e caracteres reservados Link da aula anterior, caso não tenha lido. Palavras reservadas que será usado nessa aula: if, else, elseif, then, end, and, or, not Estrutura de controle (if) O if serve para criar uma condição; ele está precedido de outra palavra que finaliza a condição, que se chama “then”, e também de outra palavra para fechar o if, que se chama “end”. Caso a condição seja verdadeira, o bloco criado por if será executado, caso não seja verdadeira, ele passa para a próxima instrução. Exemplo: if (condição) then -- caso a condição seja verdadeira, executa as instruções abaixo. print(“condição verdadeira”) return true end -- finaliza o if. E se precisarmos de mais condições? Podemos usar dentro do if a palavra “and” que diz ao sistema que há mais condições para ser analisadas. if (condição) and (condição) then -- abertura do bloco. print(“as duas condições são verdadeiras”) -- evento dentro do bloco criado por then. end -- finaliza o if. Podemos também usar a palavra “or” que diz ao sistema que caso uma condição não seja verdadeira, ele tem que verificar se a próxima condição é verdadeira. if (condição) or (condição) then -- abertura do bloco. print(“uma, ou as duas condições é, são verdadeira\’s”) – evento dentro do bloco criado por then. end -- finaliza o if. O “elseif” faz a mesma coisa do “if”, ele cria uma nova condição e um novo bloco, e nela, podemos inserir instruções distintas para cada ocasião. valordaconta = 100 if valordaconta > 100 then print(“não temos essa quantia”) elseif valordaconta <= 100 and valordaconta > 0 then print(“pague a conta”) elseif valordaconta <= 0 then print(“conta não tem valor, portanto não precisa paga-la”) end -- fecha o if. Não é necessário fechar os elseif’s, pois eles fazem parte do if. Existe outra palavra reservada que ajuda muito quando determinamos diversas condições, mas não são validas; O “else” é a ultima possibilidade de se criar um bloco de instruções caso nenhuma condição anterior seja valida. cor = “azul” if cor == “vermelha” then print(“sinal de pare”) elseif cor == “amarela” then print(“sinal de atenção”) elseif cor == “verde” then print(“sinal de liberado”) else -- executa o bloco, desde que as demais condições acima não sejam validas. print(“cor desconhecida”) end A palavra reservado “not” serve para inverte o valor da condição; caso a condição seja verdadeira, ao usar a palavra not, ela se torna falsa e assim vice-versa. if not 1+1 ~= 2 then -- 1+1 não é diferente de 2, portanto é uma condição falsa. print(“mesmo 1+1 não sendo diferente de 2, esse bloco foi executado porquê a palavra \“not\” inverteu o valor da condição de \“false\” para \”true\”.”) end Agora no código que vocês criaram nas aulas anteriores, acrescentem estruturas de controles com condições a eles. Inté a próxima aula.
  4. Palavras e caracteres reservados Essa é a primeira aula do modulo palavras e caracteres reservados. Link da aula anterior, caso tu não tenha lido. Para que todo programa funcione, ele tem que ter algumas palavras e caracteres reservados para saber o que o código quer que faça. Eu vou me ater na linguagem de programação lua que é a mais usada em otserver e é o proposito de nosso estudo. Vou deixar escrito aqui algumas palavras e caracteres, e darei uma breve explicação sobre cada uma: < <= > >= == ~= true false nil ‘’ “” [[ ]] nil não tem valor algum, ele simplesmente é declarado como nulo, ou seja, algo que não existe. true é um boolean para a condição verdadeira. Se algo é verdade, ele é representado por “true”. false é um boolean para a condição falsa. Se algo é falso, ele é representado por “false”. Como se cria uma condição? De diversos modos. Um deles é comparando algo com outro algo. Alguns exemplos de operadores lógicos que podem ser usados. Caracteres lógicos < menor que: 10 < 100 | 10 é menor que 100, logo é uma condição true. <= menor ou igual: 10 <= 10 | 10 é igual a 10, logo é uma condição true. > maior que: 10 > 100 | 10 não é maior que 100, logo é uma condição false. >= maior ou igual: 10 >= 100 | 10 não é maior e nem igual a 100, logo é uma condição false. ~= diferente: 10 ~= 100 | 10 é diferente de 100, logo é uma condição true. == igualdade: 10 == 100 | 10 não é igual a 100, logo é uma condição false. Caracteres matemáticos + sinal de adição 1+1 = 2 - sinal de subtração 1-1 = 0 * sinal de multiplicação 2*2 = 4 / sinal de divisão 2/2 = 1 ^ sinal de potenciação 2^3 = 8 % isso não é sinal de porcentagem e sim um modulo. A função de tal módulo é tentar chegar ao valor 0 (zero) do numero declarado, seja ele positivo ou negativo. Ele retorna o valor restante ou 0 (zero). Strings Vamos tratar sobre os métodos mais comuns de criação de cadeia de caracteres conhecido como strings. Uma string é uma cadeia de caracteres delimitada por aspas simples (‘ ‘) ou aspas duplas (“ ”) das quais operam em apenas uma linha; já o sistema de cadeia de caracteres usando colchetes duplos ([[ ]]) pode aceitar formatação sem uso de caracteres de escape além de não validar as ações dos mesmo usando colchetes. Alguns caracteres de escape: caractere função caractere função \n Quebra de linha. \r Demarca o ponto de retorno da string. \t Tabulação horizontal. \\ O próprio caractere \ \v Tabulação vertical. \’ Quote simples. \” Quote duplo. “esse é um texto em uma string com aspas duplas” ‘esse é um texto em uma string com aspas simples’ [[ esse é um texto em uma string com colchetes duplos ]] A diferença entre as aspas simples e duplas para os colchetes é que os colchetes aceitam formatação, já nas aspas só poderá se fazer do uso de formatação com a utilização de caracteres de escape: “quebra de texto\n agora uma tabulação\t \’um texto em quote\’.” Exemplos: Uma string de caractere usando aspas simples, sem caracteres de escape: ‘isso é uma string de caracteres sem formatação’ Agora o mesmo exemplo só que com o uso de caracteres de escape: ‘isso é\numa \’string\’ de caracteres\n\t com formatação’ Se fosse impressa essa string, ela ficaria dessa forma: isso é uma ‘string’ de caracteres com formatação O mesmo se vale para a cadeia de caracteres com aspas duplas: “isso é\ruma \”string\” de caracteres\n\tcom formatação.” Caso fosse impressa, ficaria dessa forma: isso é uma “string” de caracteres com formatação. Agora no caso do uso da cadeia de caractere com colchetes duplos, esses caracteres de escape ficam inválidos e serão impressos como sendo meros caracteres de string. O uso do colchete duplo serve para que se possa criar uma formatação sem o uso dos caracteres de escape. Abre-se a cadeia usando os colchetes duplos [[ e finalizando com colchetes duplos invertidos ]]; também é valido o uso do caractere de atribuição para que também os colchetes duplos sejam ignorados. Alguns exemplos de uso: [[ Isso é uma\n string \tNa qual os caracteres \r de escape são ignorados \rFormatada ]] Se fosse impresso essa string, ela ficaria assim: Isso é uma\n string \tNa qual os caracteres \r de escape são ignorados \rFormatada Agora o mesmo exemplo ignorando os colchetes duplos: [=[ Isso é uma string. [[ isso é uma string com colchetes duplos dentro de uma string com colchetes duplos ]] Fim da string ]=] Caso fosse impresso tal string, ficaria assim: Isso é uma string. [[ isso é uma string com colchetes duplos dentro de uma string com colchetes duplos ]] Fim da string O processo de uso do caractere de atribuição para ignorar os colchetes, também é valido para ignorar eles mesmo usando uma maior sequencia de caracteres de atribuição. Exemplo: [==[ String de colchetes duplos com duplos caracteres de atribuição. [=[ String de colchetes duplos com um caractere de atribuição. ]=] Fim da string primaria. ]==] Se fosse impresso tal, seria: String de colchetes duplos com duplos caracteres de atribuição. [=[ String de colchetes duplos com um caractere de atribuição. ]=] Fim da string primaria. Podemos também concatenar (unir) strings para que se tornem uma só string usando o caractere de ponto final duas vezes seguidas. "oi "..'mundo '..[[ da... Lua!!! ]] Se fosse impresso, ficaria assim: oi mundo da... Lua!!! Criem condições e insiram textos ao código criado por vocês nas aulas passadas. Inté a próxima aula.
  5. Logica de Programação Eu sei que vocês estão cansados de saber disso, mas se faz muito necessário que tenham isso em mente. Para se criar um programa de computador, tem que imaginar como será o programa, qual o objetivo do mesmo, O que é necessário para que ele funcione, Quais são os passos que terei que dar para fazê-lo... São perguntas que tem que ser feitas e postas para podermos traçar um caminho que nos leve ao objetivo do programa. Vamos entender um pouco sobre cada passo necessário para a criação de um programa. LOGICA DE PROGRAMAÇÃO: Logica de programação é a técnica de encadear pensamentos para atingir determinado objetivo. Em outras palavras, tu tens que pensar em como a coisa vai ter que funcionar; O que é preciso para que ele funcione; qual é o proposito dele. Exemplo: Um carro caiu em um barranco; qual seria a melhor maneira de prestar socorro aos ocupantes do veiculo? Retirar o veiculo? Com cordas? Não! com cabo de aço; puxando ou içando-o? Enviando uma equipe para lá? São perguntas necessárias para se desenvolver a melhor maneira de resolver o problema; é nesse sentido que tem que pensar em logica de programação. SEQUÊNCIA LOGICA: Sequência logica são os passos executados até atingir um objetivo ou solução de um problema. Os eventos seguem uma logica na qual um fator depende do outro. Não posso fazer um ovo mexido sem antes quebrar o ovo; primeiro quebra o ovo, põe na frigideira ao fogo com óleo, depois mexe; Pronto, saiu um ovo mexido. INSTRUÇÕES. Instruções é um conjunto de regras ou normas definidas para a realização ou emprego de algo. Em informática, é o que indica a um computador uma ação elementar a executar. Dando um exemplo hipotético para descrever o que seja instruções: Ir à padaria; saia pela rua x vá em frente, vire a direita na venda do seu zé, ande por 200 metros e a sua esquerda estará a padaria. Todos estes conceitos podem ser descritos como um algoritmo, que devem ser seguidas para se cumprir uma determinada tarefa. ALGORITMO: Um algoritmo é formalmente uma sequencia finita de passos que levam a execução de uma tarefa. Podemos pensar em algoritmo como uma receita, uma sequencia de instruções que dão cabo de uma meta especifica. Estas tarefas não podem ser redundantes nem subjetivas na sua definição, devem ser claras e precisas. PROGRAMA: Programa é uma sequência, uma lista na qual fica marcado todos os eventos do que se deve fazer. Em outras palavras... Se tu queres fazer algo, tu deve seguir uma lista de afazeres para que esse algo seja feito. Vamos criar uma lista de um evento hipotético: >> Vá à lanchonete. >> Peça um Xburger. >> Pague. >> Volte para casa. As instruções são claras: ir a uma lanchonete comprar um lanche especifico e voltar pra casa. Mas por trás existe uma serie de algoritmos, instruções, sequência e lógica de programação que são necessários para executar esse programa. Descrevo aqui passo a passo como eu faço quando estou a desenvolver um código de programa: Passo 1: Idealizar o código. Por em minha mente o funcionamento dele por completo. Passo2: Dividir o código idealizado em partes; partes essa que se divide em requisitos e eventos. Passo 3: Traçar a melhor metodologia para confecção do script. Vamos a um exemplo hipotético de criação de código. Vamos criar um script para uma quest hipotética. Primeiro vamos idealizar como seria essa quest: O jogador terá que entrar em uma sala e enfrentar um monstro sozinho. Opa, aparti daí nós já temos um requisito que seria impedir de outros entrarem na sala. Esse requisito já vai para o passo dois no bloco de requisitos. Pode haver outros requisitos à medida que vamos idealizando como seria tal quest. Agora vamos imaginar os eventos que ocorrerão nessa quest: Se já tiver alguém na sala, então impede dele entrar na sala e envia uma mensagem. Não pode sair da sala. Tem tempo para terminar a sala. E etc... Então chegamos a esse resultado: Requisitos [ir sozinho a sala; ter level 100 ou mais; ser um druid, ...] Eventos [impedir múltiplos jogadores na sala, impedir dele sair da sala, retira-lo da sala após 10 minutos, ...] Agora tu escreves o código usando uma linguagem de programação, como lua que é o foco do nosso estudo, e cria o código para tal quest ou outra coisa que seja teu foco. Tarefa: Escrevam os eventos de um programa hipotético na qual o objetivo seja construir algo. Inté a próxima aula e bons estudos.
  6. Estruturas de controle Palavras reservadas que será usado nessa aula: for, do, while, repeat, until, not, end, in Iremos tratar nesta aula sobre loops. Tomem muito cuidados ao usar loops, pois eles são a maior causa de travamento de sistemas. Será ensinado sobre as estruturas de controle: for, while e repeat. Iniciaremos pelo loop for: O loop for é composto por uma expressão de controle na qual a primeira expressão é uma variável interna e a segunda são suas atribuições que podem ser feitas para percorrer uma sequencia numérica ou uma iteração de tabela, por exemplo. Estrutura do for: for varName = primeiroValor,ultimoValor[,atribuição] do -- bloco end varName: seria o nome da variável, ou variáveis, que vai à receber a atribuição dos valores secundários. primeiroValor: seria o número que irá começar a percorrer a sequência; essa sequência tanto pode ser positiva quanto negativa. ultimoValor: seria o último valor a percorrer na sequência numérica. [,atribuição]: esse é um valor que pode ser omitido, mas quando não for, serve como atribuição de valor ao percorrer a sequência numérica; quando o loop está percorrendo a sequência numérica, esse valor é atribuído ao valor anterior da sequência; essa atribuição faz com que o loop “pule” alguns valores da sequência numérica. Por padrão, esse valor é 1 (positivo), caso esteja percorrendo valores negativos, terá que declarar como atribuição um valor negativo também. Exemplo de loop for usado para percorrer uma sequência numérica: for x = -1,-10,-2 do print(x) end >> -1 >> -3 >> -5 >> -7 >> -9 Veja que ele “pulou” os números: -2,-4,-6 e -8; Por quê? Porquê ao atribuir o valor ao valor anterior, ele deixa de seguir a sequência comum e passa a seguir segundo a atribuição. Lembrando que o valor da atribuição pode ser omitido e que ele vale +1 (um positivo). for x = 1,4 do print(x) end >> 1 >> 2 >> 3 >> 4 Outra expressão muito usada no for é o uso de funções, principalmente funções iteradoras. Como toda função pode retornar mais de um valor, na expressão da variável interna, podem-se declarar mais palavras que irão pegar os múltiplos valores retornados pela função, ou omiti-las como já foi demonstrado na aula sobre variáveis. Enquanto a expressão for verdadeira, ele continuará executando o bloco até que a expressão se torne falsa ou ele seja terminado pelo uso da palavra break ou por um return. Exemplo de um for com uma função iteradora: O loop while: Estrutura do loop while: while expressão do --bloco end Tu poderás usar qualquer tipo de expressão válida em lua. A maior diferença entre esse loop e o for é a falta da variável interna que consta no loop for. Enquanto a expressão for verdadeira, ele continuará executando o bloco até que a expressão se torne falsa ou ele seja terminado pelo uso da palavra break ou por um return. Exemplo de uso de um loop while: local ttm = 0 while (ttm < 60) do ttm = ttm + 1 end Uma pratica em programação é não por expressão no loop while, mas por algo que seja verdadeiro no lugar, forçando assim que tu tenhas que parar o loop dentro do bloco. local x = 0 while true do -- loop infinito if x > 9 then break end -- controle para parar o loop x = x + 1 end O loop repeat: O loop repeat segue o conceito oposto dos demais. Ao invés dele continuar executando enquanto a expressão for verdadeira, ele só continua executando enquanto a expressão for falsa e parando quando ela for verdadeira; ou caso seja finalizada pelo uso da palavra break ou return. A estrutura do loop repeat: repeat --bloco until expressão O loop repeat cria o bloco e sua expressão de controle fica após a palavra until que serve como “end” dos demais loops. Exemplo de uso do loop repeat: local x = 0 repeat print(x) x = x + 1 until not (x < 10) No código criado por vocês nas aulas anteriores, adicionem loops dos três tipos. Inté a próxima aula.
  7. Hail xtibianos! Gostaria de saber se vocês se interessam em ter aulas de scripting lua. Já temos cerca de oito aulas prontas para o primeiro módulo,. As aulas são compostas de teoria e prática, métodos e tarefas para fixar o conhecimento aos alunos. Serão disponibilizados aulas em três módulos: conceito e aplicações básicas, técnicas e conceitos intermediarios, spoo lua; disponibilizado em uma gama de aulas que serão postas todos os sábados até o final do módulo vigente. Ao final, pretendemos dar uma "pip" de scripting lua para todos os alunos que completarem o(s) módulo(s). Dependendo da quantidade de interessados, poderemos iniciar as aulas em princípios do mês subsequente. Deixem nos comentários seu aval ou sua queixa. Esperamos que tenham bastante participantes. Obrigado.
  8. Boa tarde! Venho hoje pedir ajuda com um bug que me deparei com a base PLight (TFS 0.4), basicamente o problema é: Quando crio pokémons pelo comando /m ou /s ou até mesmo em suas pokeballs pelo /cb eles funcionam 100%. Porém quando eu fixo spawns no mapa pelo remeres, os spawns ficam bugados, com nomes aleatorios, e status/sexo bugados. Alguém poderia me dar um suporte nessa área por gentileza? Agradeço fortemente desde já!
  9. As Livrarias de Lua A livraria OS (operation system – sistema operacional). os.execute(cmd) Executa um comando através de uma string de comando cmd. os.exit( ) Termina um programa e retorna code (default = success). os.remove(fn) Apaga o arquivo fn; em caso de erro, retorna nil e uma descrição do erro. os.rename(of,nf) Renomeia o arquivo of para nf; em caso de erro retorna nil e uma descrição do erro. os.tmpname() Retorna o nome do arquivo criado por io.tmpfile(). os.clock() Retorna a quantidade de tempo em segundos usado da CPU pelo programa. os.time([tt]) Retorna um numero em segundos que depende do sistema usado e esse numero pode receber uma tabela contendo uma data especifica: year,month,day,hour,minu,sec. os.date([fmt[,t]]) Retorna uma string contendo a data atual formatada; ou pode ser formatada a data atual ou uma data inserida (t) usando uma formatação (fmt) com elementos validos. os.difftime(t2,t1) Retorna a diferença entre os dois valores de um tempo gerado por os.time(). Nem todas as funções serão possíveis ou necessárias mostrar exemplos. Exemplos os.execute(cmd): os.execute(“luac.exe”) obs: Não darei mais exemplos sobre a função execute devido a minha ignorância sobre comandos cmd. os.tmpname(): dir = os.tmpname() io.write(dir,"Valores inseridos") io.write(dir,"novo valor") io.write(dir,"linha final") print(dir) >> \sdu8.Valores inseridos\sdu8.novo valor\sdu8.linha final\sdu8. os.time([tt]): print(os.time({year=2017,month=4,day=29,hour=18,min=30,sec=0})) >> 1493501400 << valor especificado print(os.time()) >> 1493509967 << valor atual os.date([fmt[,t]]): Caracteres usados na formatação (fmt) da função os.date. %a – Abreviação do nome do dia vigente da semana em inglês. %A – Nome completo do dia vigente da semana em inglês. %b – Abreviação do nome do mês vigente. %B – Nome do mês vigente. %c – Representação formatada da data e horário vigente. %d – Dia do mês vigente. %H – Hora em formato de 24h (00-23) %I – Hora em formato 12h (01-12) %j – Dia do ano (001-366) %m – Mês do ano decimal (01-12) %M – Minuto (00-59) %p – Formato local do indicador de horas (am/pm) %S – Segundos (00-59) %U – Número da semana do ano, sendo que o domingo é o primeiro dia da semana (00-53) %w – Número do dia da semana (0-6; domingo é 0) %W – Número da semana do ano, sendo que segunda-feira seja o primeiro dia da semana (00-53) %x – Representação da data no formato local %X – Representação do tempo no formato local %y – Formato abreviado do ano no século vigente (00-99) %Y – Formato completo do ano milenar (ex: 2017) Se usar o formato: “*t” será retornado uma tabela contendo: sec(0-59) min(0-59) hour(0-23) day(1-31) month(1-12) year(aparti de 1900) wday(domingo é dia 1, segunda é 2 e etc) yday(dia do ano) Exemplos: print(os.date("%a")) >> sun print(os.date(“%A”)) >> Sunday print(os.date(“%b”)) >> apr print(os.date(“%B”)) >> april print(os.date(“%c”)) >> 04/30/17 19:32:09 print(os.date(“%d”)) >> 30 print(os.date(“%H”)) >> 19 print(os.date(“%I”)) >> 7 print(os.date(“%j”)) >> 120 print(os.date(“%m”)) >> 4 print(os.date(“%M”)) >> 32 print(os.date(“%p”)) >> pm print(os.date(“%S”)) >> 09 print(os.date(“%U”)) >> 18 print(os.date(“%w”)) >> 0 print(os.date(“%W”)) >> 17 print(os.date(“%x”)) >> 04/30/17 print(os.date(“%X”)) >> 19:32:09 print(os.date(“%y”)) >> 17 print(os.date(“%Y”)) >> 2017 -- Com uso do tempo (t) print(os.date(“%d/%m/%y %H:%M:%S”,os.time())) >> 30/04/17 19:32:09 print(os.date(“%d/%m/%y %H:%M:%S”, 1493591529)) >> 30/04/17 19:32:09 t = os.date(“*t”) print((t.hour)..’:’..(t.minu)..’:’..(t.sec)) >> 19:32:09 print((t.day)..”/”..(t.month)..”/”..(t.year)) >> 30/04/17 print((t.wday)..”/”..(t.yday)) >> 120
  10. As Livrarias de Lua A livraria básica de matemática disponibilizada por lua: math.abs(x) Retorna o valor absoluto de x math.mod(x,y) É um modulo que subtrai o valor de y em x até que não seja mais possível sua subtração [y <= x]. math.floor(x) Arredonda para o valor inteiro menor e mais próximo. math.ceil(x) Arredonda para o valor inteiro maior e mais próximo. math.min(args) Retorna o menor valor declarado nos argumentos. math.max(args) Retorna o maior valor declarado nos argumentos. math.random(x,y) Retorna qualquer um dos valores entre x e y. Obs: Existem mais funções na biblioteca de matemática disponibilizada por lua, mas não iremos tratar sobre elas por serem funções exponenciais e muito especifica a área da trigonometria. A livraria de tabelas. table.insert(t, [i,] v) Insere o valor v na posição (index) i, caso seja declarada [o valor padrão é o ultimo valor da tabela], dentro da tabela t. table.remove(t [,i]) Remove o elemento na tabela t da posição i, caso seja declarada; se não for, ele irá remover o ultimo valor da tabela. table.maxn(t) Retorna o maior valor de index existente na tabela, ou zero, caso não tenha nenhum index numérico. table.sort(t [,cf]) Ordena os index dos elementos da tabela usando uma função de comparação - função essa que pode ser omitida: function cf(e1, e2) [default: ' < '] table.concat(t [,s [,i [,j]]]) Retorna uma string criada pela concatenação dos elementos da tabela desde a posição t[i] até t[j] [default: i =1 , j = #t] separados pela string s; retorna uma string vazia se não existir elementos para serem concatenados ou se i > j. Exemplos da livraria matemática math.abs( print(math.abs(5/8)) >> 0.625 math.mod(x,y): print(math.mod(20,8)) >> 4 – valor restante >> 20-8 = 12 >> 12-8 = 4 << quatro não pode ser mais subtraído por 8. print(math.mod(8,3) >> 2 – 8-3 = 5 >> 5-3 = 2 print(math.mod(9,4)) >> 1 – 9-4 = 5 >> 5-4 = 1 print(math.mod(10,2)) >> 0 – 10-2 = 8 >> 8-2 = 6 >> 6-2 = 4 >> 4-2 = 2 >> 2-2 = 0 math.floor( print(math.floor(1.99)) >> 1 print(math.floor(1.1)) >> 1 print(math.floor(2.00001)) >> 2 math.ceil( print(math.ceil(1.99)) >> 2 print(math.ceil(1.49)) >> 2 print(math.ceil(1.00001) >> 2 print(math.ceil(0.99999)) >> 1 math.min(args): print(math.min(100,50,2,1,0,5)) >> 0 print(math.min(9,8,7,6,5,4)) >> 4 math.max(args): print(math.max(100,50,2,1,0,5)) >> 100 print(math.max(9,8,7,6,5,4)) >> 9 math.random(x,y): print(math.random(1,10)) >> pode ser qualquer numero entre 1 e 10. print(math.random(-10,-1)) >> aceita valores negativos, mas ele tem que iniciar do valor negativo maior para o menor (sempre em direção ao zero). Exemplos da livraria de tabelas table.insert(t, [i,] v): com uso do index. str = {} table.insert(str,1,"oi") print(str[1]) >> oi str = {} table.insert(str,1,"oi") table.insert(str,2,"ola") print(str[1]) >> oi print(str[2]) >> ola str = {} table.insert(str,1,"oi") table.insert(str,3,"ola") print(str[1]) >> oi print(str[2]) >> nil str = {} table.insert(str,1,"oi") table.insert(str,1,"ola") print(str[1]) >> ola table.insert(t, [i,] v): sem uso do index. str = {} table.insert(str,"oi") print(str[1]) >> oi str = {} table.insert(str,"oi") table.insert(str,"ola") print(str[1]) >> oi print(str[2]) >> ola table.remove(t [,i]): com uso do index. str = {[1] = 'oi'} print(str[1]) >> oi table.remove(str,1) print(str[1]) >> nil str = {[1] = 'oi', [2] = "ola"} table.remove(str,1) print(str[1]) >> ola table.remove(t [,i]): sem uso do index. str = {[1] = 'oi'} print(str[1]) >> oi table.remove(str) print(str[1]) >> nil str = {[1] = 'oi', [2] = “ola”} table.remove(str) print(str[1]) >> oi table.maxn(t): str = {[1] = 1, [100] = 100, [12] = 12, [23] = 23} print(table.maxn(str)) >> 100 table.sort(t [,cf]): str = {6,2,5,4,3,1} -- embaralhado table.sort(str) print(unpack(str)) >> 1 2 3 4 5 6 -- ordenado table.concat(t [,s [,i [,j]]]): str = {"ola", "mundo", "Aula", "de", "scripting", "lua", "!!!"} print(table.concat(str," ",3,#str)) >> Aula de scripting lua !!!
  11. indentação e comentários Link da aula anterior, caso tu não tenha lido ela. Para que o código fique bonito, organizado e de fácil entendimento; usamos de indentação e comentários que nos ajudam e ajuda aos demais programadores, a saber, de forma fácil do que se trata cada código. Um código sem indentação se torna de difícil leitura além de dar margem aos erros de escrita do código. Esse código demonstra como é difícil entendê-lo. Não se sabe bem onde inicia um bloco ou onde ele termina; não tem comentários para ajudar, a saber, do que se trata ou o que cada coisa faz. Vejamos o mesmo código com indentação e comentários. Obs: Será usada a forma de comentários usada na linguagem de programação lua. Tudo isso ajuda quando escrevemos um código; torna o código mais legível, de fácil entendimento e qualquer outro programador que queira dar continuidade ao código ou modifica-lo, saberá de uma forma fácil o que cada coisa faz. Essa é uma boa pratica em programação. Qualquer pessoa que queira ser programador, primeiro tem que saber como escrever um código e torna-lo claro e de fácil leitura. Uma pratica em programação é quando estamos criando longos códigos é não conseguimos termina-los, deixamos escrito no código o que ficou para ser terminado ou, no caso se estivermos testando o script, onde ocorreu o erro, que tipo de erro sucedeu, qual a localização da função, método onde ocorreu o erro e etc. Agora insiram no código criado por vocês na aula anterior uma boa indentação e comentários para que se tornem legíveis e de fácil entendimento.
  12. Variáveis Aula anterior, caso não tenha lido. Palavras e caracteres reservados que será usado nessa aula: = { } ( ) function return end local do Variável nada mais é do que um espaço na memoria que aloca um dado (informação) e contem um nome como identificador (ponteiro) para essa informação. Lua é uma linguagem dinamicamente tipada e, portanto tu não precisa declarar de que tipo se trata aquele determinado dado. Lua também é uma linguagem sensível a maiúsculas e minúsculas, portanto existe diferença entre a palavra oi e a palavra Oi (com o “o” maiúsculo). Como se cria uma variável? Basicamente declarando uma palavra que seja alfanumérica. Nomedavariavel Nomedavariavel2689 umNomeQualquer Agora que criamos a variável, o que podemos fazer com ela? Vamos atribuir valores a ela de todo tipo. E como se atribui valores a ela? Com o caractere de atribuição; veja: Nomedavariavel = “essa variável contem esse texto” number = 546789 tabela = {} -- uma tabela vazia bool = true -- boolean digaoi = function() return ‘oi’ end -- outro modo de declarar uma função. Como eu pego esses valores declarados em variáveis? Usando o nome que foi declarado pra ele. Lembre-se que lua diferencia letras maiúsculas de letras minúsculas. Usando como exemplo as palavras que usei para criar as variáveis acima sendo chamado pela função print: Nomedavariavel = “essa variável contem esse texto” print(Nomedavariavel) >> essa variável contem esse texto print(nomedavariavel) >> nil -- a saída é nula devido a variável não existir; lembre-se que lua diferencia maiúscula de minúscula. number = 546789 print(number) >> 546789 print(Number) >> nil -- idem. digaoi = function() return ‘oi’ end print(digaoi()) >> oi print(DigaOi()) >> nil Tu poderás declarar as variáveis uma pós outra; esse recurso não serve somente para diminuir as linhas do código e torna-lo mais legível, mas também é usado como um recurso para pegar múltiplos valores retornados por funções. Exemplo: function multiplosRetorno() return 1,”retorno”, {texto = “não se imprime tabelas”} end Para que eu tenha acesso aos dados retornados por tal função, eu teria que atribuir uma variável para cada retorno; dessa forma: numero, string, tab = multiplosRetorno() Associando a função as variáveis, eu consigo pegar todos os dados retornados por ela. print(numero) >> 1 print(string) >> retorno print(tab.texto) >> não se imprime tabelas Uma pratica comum em programação é anular um dado desnecessário que fora retornado; usando o caractere underline (linha baixa). numero, _, tab = multiplosRetorno() -- underline impossibilitando de pegar o valor retornado naquela posição pela função. Lua dispõe de uma forma própria de operador ternário, que consiste em fazer uma comparação logica na qual se for verdadeiro ele assume o valor atribuído/direcionado pela palavra and ou, caso seja falsa a condição, assume o valor atribuído/direcionado pela palavra or. condição == logica and valor caso seja verdadeiro or valor caso seja falso getPlayerLevel(cid) >= 100 and “welcome to hell!!!” or “noob” Como Lua é uma linguagem dinamicamente tipada, tu poderás mudar o tipo de dado atribuído a variável a qualquer momento. dado = true if(type(dado) == "boolean" )then dado = "string" end print(type(dado)) >> "string" dado = type(dado) == "string" and 123 or type(dado) -- Forma do operador ternário usado por lua print(type(dado)) >> "number" dado = {str = "string"} print(type(dado)) >> "table" Vamos explicar um pouco sobre a palavra reservada “local”. Ao declararmos uma variável, ela assume uma posição global, mas caso não se faça necessário ou não seja permitido que isso ocorra, faz-se do uso da palavra “local” para que aquela variável seja visível apenas naquele bloco e nada mais. do -- criando um bloco var = "variavel global" end print(var) >> variavel global Veja que a variável “var” que foi declarada dentro de um bloco ficou visível fora dele, pois se trata de uma variável global, portanto visível para todos; Se tivesse sido declarado à palavra “local” na variável, ela ficaria visível apenas para o bloco e nada mais. Agora veja esse caso: var = "variavel global" do -- criando um bloco local var = "variavel local" print(var) >> variavel local var = "variavel alterada" -- alterando o texto da variável “var” print(var) >> variavel alterada end print(var) >> variavel global Veja que eu declarei uma variável local dentro de um bloco com o mesmo nome da variável global. A variável local sofreu alterações de texto, só que a variável global não, mesmo tendo o mesmo nome. Isso se deu devido a que, quando se declara uma variável local, ela só é valida para aquele bloco, todo e qualquer alteração, só valera para ela, não afetando nada externamente. Agora adicionem em seus códigos variáveis tanto locais quanto globais e atribua a elas valores de vários tipos. Inté a próxima aula.
  13. As Livrarias de Lua Existe funções aqui que não tenho como demonstrar seu funcionamento sozinho, pois dependem de outras funções. A livraria I/O (entrada e saída de dados): io.open(fn[,m]) Abre o arquivo fn no modo m: "r" = ler [default], "w" = escrever, "a" = adicionar, "r+" = atualizar-preservar, "w+" = atualizar-apagar, "a+" = atualizar-adicionar. io.close([file]) Fecha o arquivo. io.read([file,]formatos) Retorna o valor vindo de file para cada formato passado como argumento: "*n" = ler números, "*a" = ler todo o arquivo, "*l" = ler a primeira linha [default], n = ler os dados no arquivo da primeira até a posição n. io.lines([fn]) É um iterador que lê o arquivo fn linha por linha. ela não fecha o arquivo. io.write([file,]values) Uma função de saída de dados; imprime os valores no console ou escreve em arquivos. io.seek([p][,of]) Seta a posição p (“set” = inicio [default], “cur” = marca uma posição no arquivo (of), “end” = final) relativa no arquivo corrente. io.input([file]) Marca o arquivo file como padrão para entrada de dados. io.output([file]) Marca o arquivo file como padrão para saída de dados. io.flush([file]) Salva os dados no arquivo da saída de dados. io.type(x) Retorna uma string: “file” se x for um arquivo aberto; “closed file” se x estiver fechado ou nil caso x não seja um arquivo. io.tmpfile() Cria um arquivo temporário (que será deletado depois que terminar o programa). io.popen([prog[,mode]]) Inicia um programa prog em processo separado e pode ser usado para ler (se mode for “r” [default]) ou para escrever dados (se mode for “w”) no programa. Exemplos Irei usar um arquivo com esse conteúdo para teste das funções. io.read([file,]formatos): arq = io.open(dir,"r") len = arq:read(10) -- definindo a quantidade de caracteres que será retornado. print(len) >> “<instant” lin = arq:read("*l") -- Ler somente a primeira linha do arquivo. print(lin) >> “<instant name="Flame Strike" words="exori flam" lvl="12" mana="20" prem="1" range="3" needlearn="1" event="script" value="attack/flame strike.lua">” all = arq:read(“*a”) -- Retorna todos os caracteres do arquivo. print(all) >> “<instant name="Flame Strike" words="exori flam" lvl="12" mana="20" prem="1" range="3" needlearn="1" event="script" value="attack/flame strike.lua"> <vocation id="1"/> <vocation id="2"/> <vocation id="5"/> <vocation id="6"/> <vocation id="9"/> <vocation id="10"/> </instant>” arq:close() -- fecha o arquivo Para usar o formato de “*n” o arquivo deva iniciar com números ou não irá conseguir pega-lo. -- Diremos que o arquivo contenha esses dados. -- apenas exemplo. dir = “2354 passe 3030 meio” arq = io.open(dir, “r”) num = arq:read(“*n”) arq:close() -- fecha o arquivo print(num) >> 2354 io.lines([fn]): arq = io.open(dir,"r") local pp = 1 for result in arq:lines() do print(pp,result) pp = pp+1 end arq:close() -- fecha o arquivo 1 <instant name="Flame Strike" words="exori flam" lvl="12" mana="20" prem="1" range="3" needlearn="1" event="script" value="attack/flame strike.lua"> 2 <vocation id="1"/> 3 <vocation id="2"/> 4 <vocation id="5"/> 5 <vocation id="6"/> 6 <vocation id="9"/> 7 <vocation id="10"/> 8 </instant> io.write([file,]values): arq = io.open(dir,"w") arq:write("Escrevendo em um arquivo.") -- escreve esse texto no arquivo. io.write("Escreve no console.") -- escreve esse texto no console. arq:close() io.seek([p][,of]): sem o uso da definição de posição (of) arq = io.open(dir,"r") print(arq:read("*l")) >> <instant name="Flame Strike" words="exori flam" lvl="12" mana="20" prem="1" range="3" needlearn="1" event="script" value="attack/flame strike.lua"> arq:seek("cur") -- usa como parâmetro para demarca a posição corrente a ultima obtenção de dados do arquivo. print(arq:read("*l")) >> <vocation id="1"/> arq:close() io.seek([p][,of]): usando a definição de posição (of) arq = io.open(dir,"r") arq:seek("cur",90) print(arq:read("*l")) >> learn="1" event="script" value="attack/flame strike.lua"> arq:close() io.input([file]): arq = io.open(dir,"r") io.input(arq) print(io.read("*l")) -- não requer mais o uso do parâmetro file. >> learn="1" event="script" value="attack/flame strike.lua"> io.close() -- idem. io.output([file]): faz o inverso do input. arq = io.open(dir,"w") io.output(arq) io.write("Somente escreve no arquivo e não mais no console.") -- escreve esse texto no arquivo. arq:close() io.tmpfile() e io.type(arq): temp = io.tmpfile() temp:write("escrevendo algo em um arquivo temporario") print(io.type(temp)) io.popen([prog[,mode]]): file = assert(io.popen('lua.exe','w'), “assert failed”) -- abre um programa io.output(file) io.write("print 'ola mundo'") -- insere dados no programa aberto file:close()
  14. As Livrarias de Lua A livraria base: print(args) Imprime cada um dos argumentos passados. error(msg[,n]) Fecha o programa ou a função chamada em modo protegido. assert(v[,msg]) Chama à função error caso v seja nil ou false e envia uma mensagem (msg). type(x) Retorna o tipo de dado de x. tostring(x) Converte x em uma string. tonumber(x[,b]) Converte uma string com números para números na base b. unpack(t) Retorna todos os valores da tabela em separado. ipairs(t) Retorna um iterador que pega o index e value de uma array (t) em ordem numérica. pairs(t) Retorna um iterador que pega a key e value da tabela (t) sem ordem especifica. next(t[,inx]) Se inx for nil [default] retorna o primeiro valor index, value da tabela t; se inx for o presente índice, então retorna o próximo index,value ou nil caso tenha terminado. require (pkgname) Carrega um pacote. dofile ([filename]) Carrega e executa o conteúdo de um arquivo. load (func [, chunkname]) Carrega uma string e executa uma string. loadfile (filename) Carrega o arquivo filename. loadstring (s [, name]) Carrega a string s. pcall (f [, args ]) Chama a função (f) em modo protegido. xpcall (f, h) Exemplos print(args): imprime os valores declarados. print(123,”ola”,true,function() return ‘function’end,{}) >> 123 ola true function: 0095B6B8 table: 00959158 error(msg[,nivel]): essa função serve para parar o programa ou a função em modo protegido e enviar uma mensagem de erro. O nivel da mensagem de erro aloca informações a mais. · Nível 0 – Não adiciona localização do erro. · Nível 1 [padrão] – chama para a função o nome do arquivo mais linha do erro. · Nível 2 – insere a linha onde se encontra a chamada da função que se deu o erro. abaixo está escrito a mensagem de erro que gera essa função em cada nível. Nível 0: wlua: Parametro 'algo' não é um argumento valido. stack traceback: [C]: in function 'error' wxtest.wx.wlua:5: in function 'digaAlgo' wxtest.wx.wlua:9: in main chunk [C]: ? Nível 1: wlua: wxtest.wx.wlua:5: Parametro 'algo' não é um argumento valido. stack traceback: [C]: in function 'error' wxtest.wx.wlua:5: in function 'digaAlgo' wxtest.wx.wlua:9: in main chunk [C]: ? Nível 2: wlua: wxtest.wx.wlua:9: Parametro 'algo' não é um argumento valido. stack traceback: [C]: in function 'error' wxtest.wx.wlua:5: in function 'digaAlgo' wxtest.wx.wlua:9: in main chunk [C]: ? assert(v[,msg]): type(x): print(type(true)) >> boolean print(type({})) >> table print(type(function() end)) >> function print(type(“ola”)) >> string print(type(123)) >> number tostring(x): tostring(true) >> true tostring(123) >> 123 tostring({}) >> table tostring(function()end) >> function tonumber(x[,b]): tonumber(“123”) >> 123 tonumber(“12”,8) >> 10 tonumber(“ola”) >> nil unpack(t): local str = {84,105,98,105,97} local a1,a2,a3,a4,a5 = unpack(str) print(a1,a2,a3,a4,a5) >> 84 105 98 105 97 ipairs(t): É um iterador que funciona progressivamente em ordem numérica. str = {1,2,3,4,5,6,7,8,9} for k in ipairs(str) do print(k) end >> 1 2 3 4 5 6 7 8 9 str = {[1] = 1, [2] = 2, [100] = 100, [23] = 23} for k,v in ipairs(str) do print(k,v) end >> 1 2 pairs(t): É um iterador que não segue uma ordem. str = {1,2,3,4,5,6,7,8,9} for k in pairs(str) do print(k) end >> 7 1 2 4 8 9 5 3 6 next(t[,index]) require(pkgname): package.cpath = package.cpath..";./?.dll;./?.so;../lib/?.so;../lib/vc_dll/?.dll;../lib/bcc_dll/?.dll;../lib/mingw_dll/?.dll;" require("wx") dofile ([filename]): load(func [, chunkname]): loadfile(filename): loadstring(s [, name]): print(loadstring("print \'ola\'")) >> function: -- somente carregou a string print(loadstring("print \'ola\'")()) >> ola -- executou a função carregada. pcall(f [, args ]): pcall(print,"oi", "ola") >> oi ola xpcall(f, h):
  15. As livrarias de Lua Nesse modulo iremos tratar sobre as livrarias disponibilizadas por Lua. Iremos tratar agora sobre a livraria básica de strings: string.len(s) Retorna o tamanho da string (mesmo uso do operador #) string.sub(s,i[,j]) Retorna uma string da string s contendo os valores desde a posição i até j. [caso j não seja declarado usa a posição padrão que é a ultima posição da string #s]. string.rep(s,n) Retorna uma string com n copias de s. string.upper(s) Retorna a string formata em letras maiúsculas. string.lower(s) Retorna a string formatada em letras minúsculas. Códigos de caracteres: string.byte(s [,i]) Retorna o numero relacionado ao caractere; i seria a posição do caractere requerido, caso seja omitido, vale 1. string.char(args) Retorna uma string formada pelos argumentos que são o numero relacionado aos caracteres. Marcação de funções: string.dump(f) Retorna uma representação binaria da função f. Formatação: string.format(s [,args]) Retorna uma string formatada com os argumentos declarados. Procura, substituição e iterador. string.match(s,p[,i]) Retorna a captura da pattern p na string s aparti da posição i [deafult 1]. string.find(s,p[,i[,d]]) Retorna três argumentos: inicio, fim e string (ou nil caso não use pattern); encontrado na string s pela procura da pattern p desde a posição i até d, desde que sejam declarados, senão, valem 1 e #s respectivamente. string.gmatch(s,p) É um iterador que retorna os argumentos requisitados pela pattern p na string s. string.gsub(s,p,r[,n]) Retorna uma copia de s a parti da posição n (default = 1) pega pela pattern p e substituída por r (caso r seja uma função, chama-o passando o valor pego pela pattern). Exemplos string.len(s): é um função que retorna o tamanho de uma string, sem contar caracteres de escape em strings sem formatação. str = [[olá mundo\n da LUA!]] print(str:len()) >> 19 string.sub(s,i[,j]): essa função serve para pegar os valores de uma parte de uma string; iniciando da posição i até a posição j ou final, caso não seja declarado j. str = [[scripting Lua!!!]] print(str:sub(11)) >> Lua!!! print(str:sub(11,13)) >> Lua string.rep(s,n): uma função que repete a string s, n vezes. str = [[repeat>]] print(str:rep(2)) >> repeat>repeat> string.upper(s): coloca todas as letras da string s em maiúsculas. str = “Uma StriNG de CARActere” print(str:upper()) >> UMA STRING DE CARACTERE string.lower(s): faz o inverso da string.upper, ela põe todas as letras em minúsculo: str = “Uma StriNG de CARActere” print(str:lower()) >> uma string de caractere string.byte(s[,p]): Retorna o numero associado ao caractere s. esse pode variar dependendo da plataforma utilizada. str = ‘abc’ print(str:byte()) >> 97 – primeiro caractere da string; letra a print(str:byte(2)) >> 98 – segundo caractere da string; letra b print(str:byte(#str)) >> 99 – ultimo caractere da string; letra c string.char(args): faz a ação inversa da função string.byte; retorna o caractere associado ao numero. numeros = {76,117,97,33} print(string.char(unpack(numeros)))>> Lua! string.dump(f): converte uma função lua valida em uma cadeia de caracteres com elementos binários que representa tal função. function ola() return 'ola' end func = string.dump(ola) print(type(func)) >> string Para usar essa função; tu terá que chamá-la com o uso da função loadstring(s [,args]). print(loadstring(func)()) >> ola string.format(s[,args]): formata a string s com alguns argumentos que sejam passados em args. Caracteres para formatação: %d Inteiro decimal (10) %o Inteiro octal (8) %x Inteiro hexadecimal %f Ponto flutuante (fração), no formato [-]nnnn.nnnn %e Ponto flutuante (fração), no formato [-]n.nnnn e [+|-]nnn %g Ponto flutuante de %e. [< -4 or >=] precisão, se não, sera usado o ponto flutuante de %f. %c Insere o caractere associado ao numero (depende do sistema operacional). %s Usa apenas strings, caso seja declarado numero, os zeros a esquerda serão suprimidos. %q Transforma todos os caracteres de cadeias em quotes duplos. %% O proprio caractere:' % '. Exemplo de uso: string.format("results: %d, %d", 13, 27) results: 13, 27 string.format("<%5d>", 13) < 13> string.format("<%-5d>", 13) <13 > string.format("<%05d>", 13) <00013> string.format("<%06.3d>", 13) < 013> string.format("<%f>", math.pi) <3.141593> string.format("<%e>", math.pi) <3.141593e+00> string.format("<%.4f>", math.pi) <3.1416> string.format("<%9.4f>", math.pi) < 3.1416> string.format("<%c>", 64) <@> string.format("<%.4s>", "goodbye") <good> string.format("%q", [[she said "hi"]]) "she said \"hi\"" Antes de explicar sobre as demais funções, fica-se requisitado que seja explicado sobre patterns. Patterns e seus atributos. cc * Pode pegar nenhum ou alguns caracteres da classe cc; para a maior sequencia. cc - Pode pegar nenhum ou algum caractere da classe cc; para a menor sequencia. cc + Pega um ou mais caracteres da classe cc; para a maior sequencia. cc ? Pode pegar nenhum ou um caractere da classe cc. % n Captura números ^ Ancóra um caracterer. $ Determina o fim de uma string. string.match(s,p[,i]): uma função que procura dados determinados pela pattern p na string s que pode ser iniciada da posição i e retorna uma string com os caracteres buscados, caso não seja encontrados retorna nil. print(string.match(“um |dois| três |quatro| cinco”, ‘|.*|’)) >> |dois| três |quatro| print(string.match(“um |dois| três |quatro| cinco”, ‘|.-|’)) >> |dois| print(string.match(“um |dois| três |quatro| cinco”, ‘[a-u]’)) >> u – primeira letra encontrada print(string.match(“um |dois| três |quatro| cinco”, ‘[x-z]’)) >> nil – não existe nenhuma letra nessa string entre x e z do alfabeto. print(string.match(“um |dois| três |quatro| cinco”, ‘|%d+|’)) >> nil string.find(s,p[,i[,d]]): uma função que procura dados determinados pela pattern p na string s que pode ser iniciada a parti da posição i até a posição d, e retorna a posição inicial e final desses dados e pode também retornar uma string contendo os dados encontrados; caso não seja encontrado os dados, retorna nil. local txt = "You see the justice seeker (Atk:47, Def:24 +3). It can only be wielded properly by players of level 75 or higher." print(txt:find("[def]%d....)")) >> 32, 34, 24 +3 Veja que eu usei na pattern quatro vezes o caractere de ponto final após a pattern; isso é um recurso que lua disponibiliza para pegar mais elementos além do que já foi pego pela pattern; por isso ele retornou a string “24 +3”. string.gmatch(s,p): iterador que retorna uma string da pattern p, até que não tenha mais, na string s. str = [[ <nome Marcryzius/> <nome Vladimir/> <nome Sellina/> ]] for head,name in string.gmatch(str,'<(%a+) (.-)/>') do print(head, name) end >> nome Marcryzius >> nome Vladimir >> nome Sellina string.gsub(s,p,r[,n]): uma função que percorre uma cadeia de caracteres há encontrar elementos da pattern p na string s e substitui por r (que pode ser uma função) n ocorrências; retorna uma string com a formatação. str = [[ <nome Marcryzius/> <nome Vladimir/> <nome Sellina/> ]] print(string.gsub(str,'<(%a+).-/>', "add: ",2)) >> add: --foi substituído add: -- pela segunda vez e não mais. <nome Sellina/> -- a cota de substituições fora expirado.
  16. Palavras e caracteres reservados Link da aula anterior, caso não tenha lido. Palavras e caracteres reservados que será usada nessa aula: function ( ) return end local A palavra “function” serve para criar uma função, ou seja, um bloco de instruções que irá fazer algo. Ela é composta majoritariamente pela palavra “function”, um nome para essa função (que pode ser omitido, mas assim sendo não poderá ser chamado posteriormente), depois entre parêntesis ficam os parâmetros dessa função; ela pode ter em seu bloco o uso da palavra “return” que serve para retornar valores (ou nil) para quem chamou a função e a palavra “end” que finaliza o bloco da função. A função cria um bloco e dentro desse bloco podem-se alocar diversas instruções dependendo apenas da finalidade da função. function nomeDaMinhaFuncao(parametro1,parametro2,quantosParametrosEuQuiser,quantosParametrosEuPrecisar) --corpo da função. Na qual fica todas as instruções de afazeres dessa função (finalidade da função). return -- não é obrigatório seu uso. Usa-se apenas quando se faz necessário para o programa; nesse caso ele retornou nil (nulo). end -- obrigatório para fechar o bloco da função. Um exemplo de função e uso do return: -- palavra reservada, nome da função, parâmetros dela. function somar(a,b) return a+b -- retorno de valor. end -- finaliza o bloco da função. print(somar(10,20)) >> 30 Quando a função “somar” é chamada, a palavra reservada return retorna a quem chamou a função um valor ou uma serie de valores. Um exemplo do uso da função sem o uso do return. function imprimir(txt) print(txt) end Um exemplo de uma função que retorna diversos valores: function ret(num) return true,num*num,”retornando uma string” end Nesse caso, essa função retorna três valores: o primeiro é um boolean (true); o segundo é a multiplicação do parâmetro “num” por ele mesmo; o terceiro é uma string. Obs.: Em outra aula desse modulo, será tratado como pegar os valores múltiplos retornados por uma função. Funções podem fazer do uso da recursividade, que nada mais é do que chamar a si próprio. function rec(param,n) n = not n and 1 or n if n < 2 then –uma forma de controlar a quantidade de vezes que será executada a recursividade. return rec(param*2,n+1) -- recursividade. end return param*2 -- Para a recursividade. end Quando se faz do uso da recursividade, tu tens que criar alguma forma de parar a chamada dela. Um exemplo de uma função sem nome: function(arg) end Funciona e é muito usado em programação. Serve para criar um bloco na qual terá instruções, mas que não será usado posteriormente. Quando não se sabe ao certo a quantidade de parâmetros que terá uma função, fazemos do uso dos três pontos (reticências) para isso. function naoSeiQuantosParametrosTemEssaFuncao(...) parametros = {...} -- insere tais parâmetro em uma tabela para que seja pego os argumentos passados a função. for k,v in pairs(parametros) do -- percorre a tabela com os argumentos passados a função print(k,v) -- imprime os valores passados a função end end naoSeiQuantosParametrosTemEssaFuncao(‘oi’,’lua’)) >> oi lua naoSeiQuantosParametrosTemEssaFuncao(“idade”,20,”nome”,”Vladimir”) >> idade 20 nome Vladimir Tu podes também mesclar declarações de parâmetros com os três pontos (reticências): function doisParametrosDeclarados(nome,idade,...) return “nome: ”..nome, “idade: ”..idade,unpack({...}) -- A função unpack retorna os restantes dos argumentos passados a função. end print(doisParametrosDeclarados(“Vladimir”,20, “anos”) >> nome: Vladimir idade: 20 anos print(doisParametrosDeclarados(“Vladimir”,20, “anos”, “um novo parâmetro”, “e assim sucessivamente”) >> nome: Vladimir idade: 20 anos um novo parâmetro e assim sucessivamente Explicando um pouco sobre o uso da palavra reservada “local” em funções: Toda função declarada assume um valor global, ou seja, é visível por outros scripts; quando se declara local, essa função só é visível apenas por aquele script. local function funcaolocal() end Agora em seu código criado em outras aulas, insira nele pelo menos uma função. Inté a próxima aula.
  17. OIE GENTEE !! eu queria 1 script q funcionace assim : A pessoa ao clicar em 1 item .... tal q será ganhando a alcançar certo lv ..... Ela perderá 1 item equipado e terá outro no lugar !! Ps : nao sei mt desse negocio de Tfs ... ent coloquei 1.0 ...
  18. Boa Noite Galera! Preciso muito da ajuda de vocês, quando eu coloco o meu server online, e logo com o player que usou a gema aura não aparece nenhum erro na Distro, mais quando eu deslogo e logo no server o erro aparece, erro nos seguintes arquivos login.lua e no pivi.lua gente por favor me ajudem a tirar esse erro? Irei posta o erro que aparece na distro e os arquivos, estou usando o TFS 0.4 versão 8.60 Por Favor Gente Me Ajudem, Estou desesperado, tem dias que estou tentando arrume isso e não consigo erro que aparece na Distro [05/03/2016 00:22:52] [Error - CreatureScript Interface] [05/03/2016 00:22:52] In a timer event called from: [05/03/2016 00:22:52] data/creaturescripts/scripts/login.lua:onLogin [05/03/2016 00:22:52] Description: [05/03/2016 00:22:52] (luaGetThingPosition) Thing not found [05/03/2016 00:22:52] [Error - CreatureScript Interface] [05/03/2016 00:22:52] In a timer event called from: [05/03/2016 00:22:52] data/creaturescripts/scripts/login.lua:onLogin [05/03/2016 00:22:52] Description: [05/03/2016 00:22:52] (internalGetPlayerInfo) Player not found when requesting player info #6 [05/03/2016 00:22:52] [Error - CreatureScript Interface] [05/03/2016 00:22:52] In a timer event called from: [05/03/2016 00:22:52] data/creaturescripts/scripts/login.lua:onLogin [05/03/2016 00:22:52] Description: [05/03/2016 00:22:53] (internalGetPlayerInfo) Player not found when requesting player info #6 [05/03/2016 00:22:53] [Error - CreatureScript Interface] [05/03/2016 00:22:53] In a timer event called from: [05/03/2016 00:22:53] data/creaturescripts/scripts/login.lua:onLogin [05/03/2016 00:22:53] Description: [05/03/2016 00:22:53] (luaGetCreatureStorage) Creature not found [05/03/2016 00:22:53] [Error - CreatureScript Interface] [05/03/2016 00:22:53] In a timer event called from: [05/03/2016 00:22:53] data/creaturescripts/scripts/login.lua:onLogin [05/03/2016 00:22:53] Description: [05/03/2016 00:22:53] data/lib/Pivi.lua:34: attempt to compare number with boolean [05/03/2016 00:22:53] stack traceback: [05/03/2016 00:22:53] data/lib/Pivi.lua:34: in function <data/lib/Pivi.lua:19> Arquivo data/creaturescripts/scripts/login.lua function onLogin(cid) setPlayerStorageValue(cid, 47112120, 2) local voc = getPlayerVocation(cid) if getPlayerStorageValue(cid, gems.storage[getPlayerVocation(cid)]) > 0 then sendGemEffect(cid, gems.storage[voc], gems.interval[voc]) end local loss = getConfigValue('deathLostPercent') if(loss ~= nil) then for i = PLAYERLOSS_EXPERIENCE, PLAYERLOSS_ITEMS do doPlayerSetLossPercent(cid, i, getConfigValue('deathLostPercent')) end end registerCreatureEvent(cid, "owned") registerCreatureEvent(cid, "conected") registerCreatureEvent(cid, "boss") registerCreatureEvent(cid, "thalasteleport") registerCreatureEvent(cid, "thalas_teleport") doSendMagicEffect(getCreaturePosition(cid), CONST_ME_TELEPORT) registerCreatureEvent(cid, "zombieevent") registerCreatureEvent(cid, "combat") registerCreatureEvent(cid, "forever amulet") return TRUE end Arquivo data/lib/Pivi.lua function doUseGem(cid, item) local voc = getPlayerVocation(cid) local interval = gems.interval[voc] if item.itemid ~= gems.id[voc] or getPlayerStorageValue(cid, gems.storage[voc]) > 0 then return FALSE end setPlayerStorageValue(cid, gems.storage[voc], 1) sendGemEffect(cid, gems.storage[voc], gems.interval[voc]) doRemoveItem(item.uid, 1) return TRUE end function sendGemEffect(cid, storage, interval) local pos = getThingPos(cid) local voc = getPlayerVocation(cid) local color = 1 if voc == 5 then color = gemMsg.colorDruid[math.random(1,#gemMsg.colorElderDruid)] elseif voc == 6 then color = gemMsg.colorSorcerer[math.random(1,#gemMsg.colorMasterSorcerer)] elseif voc == 7 then color = gemMsg.colorPaladin[math.random(1,#gemMsg.colorRoyalPaladin)] elseif voc == 8 then color = gemMsg.colorKnight[math.random(1,#gemMsg.colorEliteKnight)] end doSendAnimatedText(pos, gemMsg.rnd[math.random(1,#gemMsg.rnd)], color) if getPlayerStorageValue(cid, gems.storage[getPlayerVocation(cid)]) >= 1 then addEvent(sendGemEffect, interval, cid, storage, interval) end end function doRemoveGemEffect(cid) if getPlayerStorageValue(cid, gems.storage[getPlayerVocation(cid)]) < 1 then return FALSE end setPlayerStorageValue(cid, gems.storage[getPlayerVocation(cid)], 0) return TRUE end function doRemoveAllGemEffect(cid) for i = 1, table.maxn(gms.storage) do setPlayerStorageValue(cid, gems.storage[i], 0) end return TRUE end function isGemActivated(cid) if getPlayerStorageValue(cid, gems.storage[getPlayerVocation(cid)]) > 0 then return TRUE end return FALSE end
  19. Boa Tarde Galera! achei um evento no fórum, e acabei gostando dele e coloquei no meu servidor 8.60 mais e um script na pasta Globalevents esta com um erro alguém por favor poderia me ajudar? o nome do evento é Jogos Vorazes. Aqui esta o erro que aparece no distro [12/02/2016 15:24:06] [Error - GlobalEvent Interface] [12/02/2016 15:24:06] data/globalevents/scripts/hunger.lua [12/02/2016 15:24:06] Description: [12/02/2016 15:24:06] data/globalevents/scripts/hunger.lua:49: attempt to index global 'Player' (a nil value) [12/02/2016 15:24:06] [Warning - Event::loadScript] Cannot load script (data/globalevents/scripts/hunger.lua) Aqui esta o script da pasta GlobalEvent currentgameid = 201 killstreak = 60013 depotbox= {x=700,y=760,z=5} --location of a depot box, recommended to be accessible by players incase of bugs or crashes game = {{name="Hunger Games Arena 1", cheststartid=60100, minplayers=8, maxplayers=16, chests=299, startpos={ {x = 814, y = 760, z = 7}, {x = 809, y = 758, z = 7}, {x = 807, y = 753, z = 7}, {x = 809, y = 748, z = 7}, {x = 814, y = 746, z = 7}, {x = 819, y = 748, z = 7}, {x = 821, y = 753, z = 7}, {x = 819, y = 758, z = 7}, {x = 811, y = 759, z = 7}, {x = 808, y = 756, z = 7}, {x = 808, y = 750, z = 7}, {x = 811, y = 747, z = 7}, {x = 817, y = 747, z = 7}, {x = 820, y = 750, z = 7}, {x = 820, y = 756, z = 7}, {x = 817, y = 759, z = 7} } }, { name="Hunger Games Arena 2", cheststartid=61100, minplayers=2, maxplayers=4, chests=299, startpos={ {x = 1036, y = 910, z = 6}, {x = 1032, y = 906, z = 6}, {x = 1036, y = 902, z = 6}, {x = 1040, y = 906, z = 6} } }, { name="Hunger Games Arena 3", cheststartid=62100, minplayers=4, maxplayers=8, chests=299, startpos={ {x = 1047, y = 1158, z = 7}, {x = 1048, y = 1158, z = 7}, {x = 1052, y = 1158, z = 7}, {x = 1053, y = 1158, z = 7}, {x = 1047, y = 1167, z = 7}, {x = 1048, y = 1167, z = 7}, {x = 1052, y = 1167, z = 7}, {x = 1053, y = 1167, z = 7} } } } availablearenas = {1,2,3} -- script starts with all arenas as "available" gameplayers = {} prize = {{2160,1},{5097,10},{2128,1}} function Player:removeAllItems() -- function to clear the player's inventory local depotpos = Tile(Position(depotbox.x, depotbox.y, depotbox.z)):getItemByType(ITEM_TYPE_DEPOT) local depotid = getDepotId(depotpos:getUniqueId()) local depot = self:getDepotChest(depotid,true) local box = depot:addItem(1988) box:setAttribute(ITEM_ATTRIBUTE_NAME,"player gear box") for i=1,10 do local item = self:getSlotItem(i) if item then item:moveTo(box) end end end function Player:getBackItems() -- function to clear the player's inventory local depotpos = Tile(Position(depotbox.x, depotbox.y, depotbox.z)):getItemByType(ITEM_TYPE_DEPOT) local depotid = getDepotId(depotpos:getUniqueId()) local depot = self:getDepotChest(depotid,true) local box = depot:getItem(0) for i= box:getSize()-1, 0, -1 do local item = box:getItem(i) if item then item:clone():moveTo(self) end end box:remove() --unqued this function to clean the depot after duplicating it to player. end local function teleportThing(seconds) if seconds <= 0 and #queue >= 1 then local looparenas = availablearenas -- preventing possible conflicts with looping for a,b in pairs(looparenas) do if #queue >= game[looparenas[a]].minplayers then local p = 1 while p < game[looparenas[a]].maxplayers do for i, pname in pairs(queue) do local player = Player(pname) if player then player:setStorageValue(currentgameid, looparenas[a]) local pos = Position(game[looparenas[a]].startpos[p].x, game[looparenas[a]].startpos[p].y, game[looparenas[a]].startpos[p].z) player:teleportTo(pos) player:removeAllItems() player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Welcome to The Hunger Games, Your objective is to loot, kill and be the last man standing, Good luck!") if gameplayers[looparenas[a]] == nil then gameplayers[looparenas[a]] = {} end table.insert(gameplayers[looparenas[a]], player:getName()) table.remove(queue,i) end end p = p+1 end for i = game[looparenas[a]].cheststartid, game[looparenas[a]].cheststartid+game[looparenas[a]].chests do Game.setStorageValue(i, -1) end Game.broadcastMessage(MESSAGE_EVENT_ADVANCE,"Hunger Games started in " ..game[looparenas[a]].name.."!") for k,v in pairs(availablearenas) do if v == r then table.remove(availablearenas,i) end end else for _, player in pairs(queue) do Player(player):sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Sorry, There is not enough players to start "..game[availablearenas[a]].name) end end end return true end if seconds == 60 then for _, player in pairs(queue) do Player(player):sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "The Hunger Games will begin in " .. seconds/60 .. " minute, Get Ready!") end elseif seconds % 60 == 0 and seconds ~= 60 and seconds ~= 300 and seconds < 300 then for _, player in pairs(queue) do Player(player):sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "The Hunger Games will begin in " .. seconds/60 .. " minutes!") end elseif seconds == 300 then Game.broadcastMessage(MESSAGE_EVENT_ADVANCE,"The Hunger Games will begin in " .. seconds/60 .. " minutes! To join say /join hunger games") end if seconds ~= 0 then addEvent(teleportThing, 60000, seconds - 60) end return true end function onStartup() teleportThing(60) return true end
  20. othereality

    lua for

    Oi gostaria que alguem me mostrasse como eu coloco a seguinte logica dentro de um for: local loc = LOCAIS[0] if (lv > 100) then loc = LOCAIS[100] end if (lv > 200) then loc = LOCAIS[200] end if (lv > 300) then loc = LOCAIS[300] end if (lv > 400) then loc = LOCAIS[400] end if (lv > 500) then loc = LOCAIS[500] end Obrigado. edit: ops, percebi agr que postei em spriting em vez de scriptiong foi a preça desculpa, se puderem mover agradeço.
  21. É isso... Gostaria do Script do Shiny Wobbuffet,grato.
  22. Luna, a estrela mais amada pelos elfos, vista como um ponto azul e brilhante, ilumina a terra mais que a lua nas noites escuras. Na fortaleza leste da grande floresta, encontra-se a floresta azul, mais conhecida como Lui. Um lugar hábil e sagrado para elfos em treinamento; Yulai é uma jovem elfa que recém formou-se na academia de elfos jovens. Todas as noites, Yulai costumava sentar em um tronco de uma árvore-base (são as maiores da fortaleza), e permanecia por horas olhando para a estrela Luna. Certo dia, Yulai estava deitada olhando para Luna, até notar que a luz da estrela se desfazia no vazio do céu. No mesmo instante, uma luz cegante caiu sobre a floresta e transformou todos os elfos, animais e até mesmo as menores criaturas, em cristais azuis petrificados, com exceção de Yulai. Ela procurou desesperadamente por alguém que não tivesse sido petrificado pela estrela, mas sem sucesso, desistiu. Yulai não conseguia parar de pensar em alguma forma de concertar isto, afinal, porque a estrela mais venerada pelos elfos, Luna, faria isso? Ou não fora ela?" Clique aqui para participar
  23. Olá pessoal, seguindo a onda do desafio do mês eu bolei um novo desafio pra vocês no mesmo esquema do anterior (você pode verificar o desafio do mês passado clicando aqui) Eu vou mais uma vez apresentar um pseudocódigo, algumas partes dele estão mais explícitas na linguagem e outras estão mais teóricas mas isso não vai influenciar tanto. O desafio é o seguinte: vocês tem que tentar adivinhar do que se trata esse código. Isso vale tanto para explicar partes do código quanto para explicar a idéia por trás dele. A cada dia (o primeiro não conta) irei postar uma dica para ajudá-los nesse desafio, podendo ser uma dica explicando partes do código ou dicas sobre a funcionalidade dele. "Mas lobo, por que eu iria tentar descobrir do que se trata seu código estúpido?" Bem meu caro, será uma tarefa legal e esse script é uma idéia bem inovadora.. só o fato de você tentar ler irá ajudá-lo a treinar seu cérebro para a linguagem Lua. E também há uma recompensa!! aquele que acertar ou chegar mais perto verá e terá acesso ao código antes de todo mundo!!111 Espero que vocês aninem pra participar deste tanto quanto animaram para participar do outro Dicas = { } Lembrando que toda resposta próxima da correta irá ganhar 1 ponto de reputação.
  24. Não sei se estou na área correta! #Bom eu uso o rev3777 em meu server, e ele funciona normalmente porém tem um erro que acontece após cria uma conta no jogo. Muitos tem esse problema e até não vi um tópico explicando de como resolver, só apenas falando para trocar de distro. Como eu fiz alguns sistemas e o único rev que da para compilar no meu pc, preciso muito resolver esse problema pessoal do xt! Erro: Ao logar na minha conta, tento entrar no "Account Manager" e aparece "Invalid Password" respectivamente. Tentativas: 1-Já troquei de mysql.sql. 2-Já alterei o password para: 356a192b7913b04c54574d18c28d46e6395428ab pelo Sqlstudios. 3-Já coloquei: accountManager = true no config.lua. 4-Já coloquei: encryptionType = "sha1" no config.lua. Obs."plain" não funciona no server. Solucão: Entrar no Account Manager.
  25. Não sei se estou na área correta! #Bom eu uso o rev3777 em meu server, e ele funciona normalmente porém tem um erro que acontece após cria uma conta no jogo. Muitos tem esse problema e até não vi um tópico explicando de como resolver, só apenas falando para trocar de distro. Como eu fiz alguns sistemas e o único rev que da para compilar no meu pc, preciso muito resolver esse problema pessoal do xt! Erro: Ao logar na minha conta, tento entrar no "Account Manager" e aparece "Invalid Password" respectivamente. Tentativas: 1-Já troquei de mysql.sql. 2-Já alterei o password para: 356a192b7913b04c54574d18c28d46e6395428ab pelo Sqlstudios. 3-Já coloquei: accountManager = true no config.lua. 4-Já coloquei: encryptionType = "sha1" no config.lua. Obs."plain" não funciona no server. Solucão: Entrar no Account Manager.
×
×
  • Create New...