Líderes
-
MaXwEllDeN
HéroiPontos1185Total de itens -
xWhiteWolf
HéroiPontos3605Total de itens -
-
JuininhoOFC
MembroPontos6Total de itens
Conteúdo Popular
Exibindo conteúdo com a maior reputação em 06/03/17 em todas áreas
-
[C++] Attack Speed
[C++] Attack Speed
koyotestark reagiu a Emersonssss por uma resposta no tópico
1 pontoSalve Galera, olhando em minhas libs achei um script muito bom !! Em alguns servidores derivados o Skill Fist Fighting influencia no Attack Speed do Player, Então .... Segue a Formula na source que faz essa magica : Em Player.cpp Procure : uint32_t Player::getAttackSpeed() const Mude Atualize para esse função : uint32_t Player::getAttackSpeed() const { int32_t SpeedAttack; SpeedAttack = vocation->getAttackSpeed() - (getSkill(SKILL_FIST, SKILL_LEVEL) * 10); if (SpeedAttack < 500) { return 500; } else { return (uint32_t) SpeedAttack; } } Explicando : Ele irá verifica o Attack Speed padrão no Vocations.xml e irá verifica o Skill Fist do Player e retornará a velocidade, caso a velocidade retorne menor que 500 ele sempre limitará a 500ms para que não haja erros. Simples e Facil ! Creditos ? Emerson Henrique1 ponto -
DEV C++ Compilando TFS no Windows
DEV C++ Compilando TFS no Windows
Gabriel485 reagiu a Natanael Beckman por uma resposta no tópico
1 pontoDEV C++, aprenda a compila uma source TFS! Downloads(Baixe de acordo as configurações do seu windows): DEV C++ CONFIGURADO PARA 32BITS DEV C++ CONFIGURADO PARA 64BITS REV 3884 TFS 0.4 Certo, feitos os downloads, extrai DEV C++ no Disco C e REV 3884 em Documentos. ====================================== Abra o DEV C++: ====================================== ====================================== Abra a Source: ====================================== ====================================== Localize a pasta da Source e abra o arquivo TheForgottenServer.dev, Documentos> trunk.r3884> dev-cpp> TheForgottenServer.dev: ====================================== ============================================================= ====================================== Aguarde carregar todos os arquivos: ====================================== ====================================== Vamos adicionar o parâmetro -D__CONSOLE__ no teclado digita ALT + P, clique em parameters e adicione o parâmetro... Feito? clique em OK: ====================================== ====================================== Vamos compilar Source, no teclado digite CTRL+F9 e aguarde finalizar o processo: ====================================== ====================================== Se der tudo certo em Log vai estar como mostra a imagem abaixo: ====================================== ====================================== Verifique na pasta Documentos> trunk.r3884> dev-cpp você vai encontrar o arquivo TheForgottenServer.exe e pronto meu parabéns você compilou! ====================================== =========================================== Só isso galera tutorial rápido resumido e útil! Créditos Natanael Beckman! =========================================== Caso você adquira uma source com apenas os arquivos .cpp e .h e não sabe como compilar o projeto, abaixo vamos explicar: Na pasta onde está localizado os arquivos .cpp e .h crie uma pasta chamada dev-cpp, e dentro dela adicione uma imagem icone. Abra o DEV-C++, clique em File> New> Project: Logo em seguida selecione Empty Project, em name terá o nome Project1 altere utilize o nome quer quiser, após isso clique em OK e em seguida selecione a pasta dev-cpp que criamos: Agora selecione a opção Win32GUI caso use source OTX ou TFS selecione Win32Console ao lado << Browse selecione a imagem do icone que está na pasta Dev-Cpp. No mesmo menu na aba Parameters em C++ compiler adicione os seguintes parâmetros: -D__ENABLE_SERVER_DIAGNOSTIC__ -D__ROOT_PERMISSION__ -D__GROUND_CACHE__ -D__USE_SQLITE__ -D__USE_MYSQL__ -D__CONSOLE__ -D__WAR_SYSTEM__ E em Linker adicione as seguintes libs: -lboost_filesystem -lboost_thread -lboost_system -lboost_regex -lsqlite3 -lwsock32 -llua5.1 -lws2_32 -leay32 -lmysql -lxml2 -lgmp -lz -s No mesmo Menu na aba Build Option escreva na segunda coluna horizontal escreva Obj e dê OK. Na lateral terá o nome do seu projeto o meu no caso é The Forgotten Server, clique com o botão direito do mouse em cima do nome e clique na opção Add Project: Selecione na pasta da sua source todos os arquivos .cpp e .h após isso salva o projeto e já pode compilar CTRL+F9: OpenSSL 0.9.8 1º baixe http://devpaks.org/details.php?devpak=73 2° abra Dev-Cpp > Tools > Packager Manager > Install > Seleciona o arquivo baixado e instala, fecha abre e testa! Clica aqui \/1 ponto -
Object Builder e Item Editor 10x(11 até 1149)
Object Builder e Item Editor 10x(11 até 1149)
Gogetasaya reagiu a Bruxo Ots por uma resposta no tópico
1 pontoAtualizei com algumas versões a mais. da 11 até a 11.20 e 11.49. Object Builder. SCAN Download O item editor funciona normal porem tem que remover <!-- --> isso da frente da versão que deseja e adicionar na ultima, se nao da conflito. Não sei o porque ainda. Scan Download1 ponto -
[v32] GlobalFull 11/12 - New Asuras, Falcons, Warzones 4,5,6 . (Updates Frequentes)
[v32] GlobalFull 11/12 - New Asuras, Falcons, Warzones 4,5,6 . (Updates Frequentes)
anderson de souza reagiu a Qwizer por uma resposta no tópico
1 pontoGlobal 11/12x [v32] - New Falcons - New Asuras - Warzone 4,5,6 - Exercise Training - Raids 100% - Monstros 100% - Trainer Offline 100% - Trainer Online 100% - Taming system funcionando 100%; - Database completa - War System 100% - Global MAP Full - Store 100% - Imbuement - Prey System - Entre outros sistemas. Projeto no: GITHUB Scan Vírus Total IMAGES Créditos:1 ponto -
[Aula 2] Lógica da Programaçao
[Aula 2] Lógica da Programaçao
denisbts96 reagiu a MaXwEllDeN por uma resposta no tópico
1 ponto<< Aula 1 - Introdução Lógica da Programação Aula 2 O que é a Lógica da Programação? Bem, tudo o que é escrito em alguma linguagem de programação deve seguir uma lógica para poder funcionar. Vamos pegar um exemplo simples e curto: Um script de SD. (Sudden Death Rune) Quando o script de SD for chamado (Alguém usou a SD), ela segue passos básicos, que é basicamente a execução dela. Primeiro o script vai verificar se quem usou a SD possui nível, magic level, etc... suficiente para poder usar a SD. Se não possuir opa! Ela vai enviar uma mensagem de erro ao jogador, um efeito de fumaça e vai encerrar a execução. Caso contrário: se for um jogador com todos os requerimentos básicos para usar uma SD, então o script vai verificar se o alvo é um Player ou Monstro. Se não for vai enviar uma mensagem de erro, efeito, e vai parar de executar. Se for um monstro ou player, então o script fará um efeito da SD atingindo o alvo, toda aquela piromancia louca, e então vai tirar o devido dano do jogador. Um pouco cansativo de ler tudo isso, mas observe o exemplo abaixo: Quando uma SD for usada, então faça: Verifique se o jogador que usou a SD possui nível igual ou maior que 45, e se possui nível mágico maior ou igual a 15. Se possuir, faça: Se o alvo da SD for um Monstro ou Jogador, então faça: Calcule o dano que causará ao alvo. Remova uma carga da SD. Execute o efeito de SD. Calcule o dano que causará ao alvo e execute-o no alvo, tirando a vida dele ou mana, no caso de o alvo estiver usando o Magic Shield (Utamo Vita). Mas se o alvo da SD não for um Monstro ou Jogador, então faça: Envie uma mensagem de erro ao jogador. Envie um efeito de fumaça na posição do jogador. Aqui termina a verificação se o alvo da SD é um Monstro ou Jogador, ou nenhum dos dois. Mas se o jogador não possuir estes requerimentos, então faça: Envie uma mensagem de erro ao jogador. Envie um efeito de fumaça na posição do jogador. Aqui termina a verificação se o jogador possui ou não os requerimentos. Aqui termina a execução da SD. Agora, depois deste algoritmo, talvez tenha ficado mais claro como os programas de computador funcionam. Tudo não passa de um processo lógico, onde a linguagem de programação só serve como uma "máscara" para que o programador escreva o código seguindo esta lógica, por isso é ultra importante saber a lógica da programação antes de começar a programar. O que é um Algoritmo? O "código" que eu escrevi acima (Dentro da caixa de texto) representando o uso da SD foi um algoritmo. Os algoritmos são formas de representar a lógica seguida pelo programa. São passos que o programa segue para atingir determinado objetivo ou em outras palavras, completar uma tarefa (No caso da SD, matar ou não o alvo, ou enviar uma mensagem de erro). Um exemplo de algoritmo são as operações matemáticas, como somar, dividir, multiplicar, subtrair... Quando você soma 2 mais 2, você está executando um algoritmo para ele atingir o objetivo (O resultado!!), que é 4. Um programa ou script é basicamente a escrita dos algoritmos em uma linguagem de programação que é executada pelo computador de forma lógica. Esta aula foi curta pois eu prefiro lhes ensinar as estruturas lógicas conforme ensino as mesmas em Lua, assim trabalhando a lógica e Lua ao mesmo tempo. Primeiro ensino como funciona a estrutura na Lógica e depois ensino como aplicar em Lua. Exercícios-Tarefa: 1. Monte o algoritmo de um script de "Shovel (Pá)". 2. Monte o algoritmo de um script de "Pedra que troca sexo". 3. Monte o algoritmo de "Ir ao cinema". 4. Monte o algoritmo de "Fazer bolo". Respostas: Só abra depois de ter tentado resolver os exercícios! Exercício 1: Exercício 2: Verifique se quem clicou na pedra é um jogador, se for, então faça: Verifique se o jogador é mulher, se for, então faça: Transforme o sexo dele em homem Execute um efeito de magia azul na posição do jogador Envie uma mensagem ao jogador afirmando que o sexo dele foi trocado Mas se o jogador é homem, então faça: Transforme o sexo dele em mulher Execute um efeito de magia azul na posição do jogador Envie uma mensagem ao jogador afirmando que o sexo dele foi trocado Finalize a verificação se o jogador é mulher ou homem Finalize a verificação se quem clicou na pedra é um jogador Exercício 3: Se arrume Tome banho Dirija seu carro até o cinema Pague o ingresso Assista o filme Volte para casa Exercício 4: OBS: Nota-se que já fiquei cansado nas respostas do exercício 3 e 4... Aqui só serão aceitas dúvidas ou reporte de erros. Qualquer coisa que não se encaixe nesta descrição será apagado sem aviso. Essa aula foi escrita por uma raposa levada Skyen Hasus, todos os créditos são dele. Aula 3 - Primeiros Passos >>1 ponto -
Novo Sistema de Trainer [0.36~0.4]
Novo Sistema de Trainer [0.36~0.4]
Rodrigo94 reagiu a xWhiteWolf por uma resposta no tópico
1 pontoOlá meus caros do Tibia King, hoje vim trazer pra vocês um sistema que bolei pra um concurso em outro fórum mas acabei ficando descontente e nunca cheguei a disponibilizar. Eu gostaria de agradecer inicialmente à três acontecimentos que sem eles não seriam possíveis a criação desse sistema. - A otlist obrigar que os servidores utilizem anti idle - Os mages do meu servidor reclamarem que não dava pra treinar ml nos trainers - Ao @Storm Night, que embora tenha me irritado muito nesse tópico aqui , botou a sementinha dessa idéia na minha cabeça. Explicação É a combinação de dois sistemas que eu ja havia feito, o primeiro escolhe entre todas as salas de treiner aquela que está vazia pra te alocar e o segundo te mantém alimentado e rodando pra simular o anti idle. (Nota: ele não impede o anti idle de fato, se vc quiser fazer isso vc vai precisar editar o script de anti idle que vc utiliza pra ignorar players com determinado storage e adicionar o storage no player quando ele entrar na sala e tirar ao sair.. mas não sei até que ponto isso pode provocar ban da OTservlist por isso decidi não ensinar isso aqui.) Sem mais delongas, talk is cheap, show me the code. Idéia Basicamente dá pra reduzir toda a idéia do código nessa foto aqui: Você tem diversas salas com trainers nesse formato (pode ser em linha reta horizontal ou vertical tb, mas assim fica melhor distribuído). Você inclusive pode criar salas no meio do void de forma que a distancia de uma vc nao consiga ver a outra e vai ser uma experiencia muito amigável para o player ver que está treinando sozinho na paz. Ao entrar no tp ele te aloca na primeira sala vazia, se não houverem salas vazias ele retorna que não tem posições livres Instalação Você precisa criar as salinhas dos trainers equidistantemente, ou seja, tendo a mesma distância A em X e mesma distância B em Y. Sério, se vc errar nessa parte é porque vc não sabe oque significa equidistante. Vai pesquisar preguiçoso!! Já aviso que não vou dar suporte quanto à isso. Você vai precisar criar salas parecidas com isso daqui: Perceba que não tem como ter acesso a essa sala, não tem como ser puxado pra fora do trainer, não tem dor de cabeça nenhuma e quando o player quiser sair ele só entra no tp e volta pro templo ou pra onde vc definir. Nesse teleport da sala vc adiciona o actionid 14877 e não bota nenhuma posição nele. Naquele tile que o player irá ficar que inclusive tem id diferente vc bota actionid 14878. Agora seleciona a area dessa sala no rme e vai copiando e colando percebendo sempre se vc tá criando as salas com mesma distância em X. Se o ponto inicial de uma sala é 140 e vc quer que todas tenham 12 sqm de distancia vc cria em 152, 164, 178.. por aí vai. Quando terminar as salas que quiser e tiver montado as linhas e colunas da forma que desejou, vc vai criar um tp principal pra alocar os players nessa sala: Lembrando que ele não deve ter posição no rme, vc só bota o actionID 14876 e deixa a toPos dele 0, 0, 0. Ele não tem q te teleportar pra nenhum lugar pois a posição será decidida por script. Se você fez tudo certo até agora vc deve ter algo +- assim: O importante é manter a distancia certinha entre cada sala. Aí no caso eu fiz rX = 11 e rY = 8 (é a terceira ou quarta vez q eu to falando isso, se vcs errarem pqp eu vou ficar muito irritado); Vc não bota os trainers, e ali embaixo do spawn vc tem que botar um outro obstáculo pra impedir que o player ande pra baixo e dê a sala como livre. Feito isso só adicionar os scripts abaixo: movements.xml <movevent type="StepIn" actionid="14876" event="script" value="trainertp.lua"/> <movevent type="StepIn" actionid="14877" event="script" value="trainertp2.lua"/> <movevent type="StepIn" actionid="14878" event="script" value="foodtrainer.lua"/> movements/scripts/trainertp.lua: movements/scripts/trainertp2.lua: movements/scripts/foodtrainer.lua: FIM, qualquer dúvida ou comentário ou sugestão coloquem abaixo. Se gostou REP+, se não gostou REP+ pq deu trabalho e vai ser útil pra alguém, mesmo que de estudo. Abraços do Lobo. E ao cara do outro fórum que ficou falando que ia dar erro e quis ficar me corrigindo e mandando scripts sem noção pra "mostrar" que sabia de lua:1 ponto -
New Library v. 1.2
New Library v. 1.2
Underewar reagiu a xWhiteWolf por uma resposta no tópico
1 pontoFala galera, hoje vim trazer pra vocês uma nova biblioteca de funções que eu venho desenvolvendo, pretendo ir atualizando esse tópico constantemente sempre adicionando funções novas e explicando a utilização delas. Algumas funções que eu coloquei aqui estão presentes na OTAL também, porém algumas eu fiz pequenas correções de forma que essa lib poderia facilmente substituir a OTAL sem grandes problemas (pelo menos se você utilizava apenas as funções básicas da otal) Todas as funções que não tem -- nome do autor do lado dela foram feitas por mim, xWhiteWolf ou Night Wolf (NW). O restante delas são créditos dos devidos autores, apenas coloquei pois considero funções vitais no server de cada um. Crie um arquivo em data/lib chamado 075 - White Wolf Functions.lua e coloque o seguinte código dentro: Agora eu vou explicar oque cada função faz porque de nada adianta lançar uma lib e não explicar oque ela faz não é mesmo? hahaha Obs inicial: quando uma função tiver em seus parametros um [] significa que oque está dentro do colchetes não é um parâmetro obrigatório. Como usar: doShowTimeByPos(cid, getCreaturePosition(cid), 20, 20) Irá fazer uma contagem regressiva na posição que o player se encontra começando de 20 e mandando a mensagem na mesma cor da fala dos monstros. Essa função é bem útil em actions/spells para fazer contagem de tempo em runas como a magic wall e ver quanto tempo falta pra magic wall sumir) Obs: Espero que ajude bastante pessoas a entender sobre funções, eu utilizei cid como o principal uid das funções nos exemplos mas você pode muito bem utilizar outros uids, fica a critério seu. Qualquer dúvida comentem abaixo que eu vou tentar ajudar da melhor maneira. Ahhh, isso daí foi testado em 8.54 mas deve funcionar em quase todas as versões que tenham as funções básicas do TFS. EDIT: Pessoal, agora é sério, essa lib tem fácil umas 600 linhas, das quais umas 500 eu devo ter codado sozinho (na mão, linha por linha). Eu tive todo o trabalho de testar cada uma delas e oque eu peço é o mínimo de gratidão e respeito. Se eu te ajudei clique em Gostei, se você tiver alguma dúvida eu to me colocando a disposição de responder qualquer coisa relacionada ao tópico, mesmo que você não saiba nem oque é uma lib apenas venha aqui e escreva sua dúvida. EDIT 2: Duas novas funções adicionas, espero que gostem! EDIT 3: Três novas funções adicionadas juntamente com suas respectivas explicações.1 ponto -
[Aula 8] while & repeat
[Aula 8] while & repeat
abmauromacedo reagiu a MaXwEllDeN por uma resposta no tópico
1 ponto<< Aula 7 - Estruturas de Controle Essa aula foi escrita por um urso gordo Mock, todos os créditos pertencem à ele. While & repeat Aula 8 Primeiramente desculpe a demora por essa aula, ficou meio aquela de; ah faz você, não faz você, anem faz você; Mais em fim estamos de volta com uma coisa indispensável em scripting que são os loops. Antes de tudo devo avisa que loops são perigosos, você pode travar seu servidor inteiro usando errado um loop. Os loops são usados para inicialmente quando temos varias funções juntas iguais, por exemplo, fazendo um jogador falar oi 10 vezes. Sem os loops você faria assim: doPlayerSay(cid,'oi',1) doPlayerSay(cid,'oi',1) doPlayerSay(cid,'oi',1) doPlayerSay(cid,'oi',1) doPlayerSay(cid,'oi',1) doPlayerSay(cid,'oi',1) doPlayerSay(cid,'oi',1) doPlayerSay(cid,'oi',1) Com loops você resume isso a 4 linhas, e ainda pode fazer milhares de coisas com eles! While Sintaxe: Traduzindo: Então repare, enquanto algo for verdadeiro fazer... Ele vai executar o que estiver dentro do loop infinitas vezes até que o ((sentença)) seja falso ou você mande ele parar. Veja um exemplo: while getPlayerLevel(cid) < 10 do --- Enquanto o level for menor que 10 doPlayerAddExp(cid,1000) adcionar 1k de exp por vez end Viram? enquanto o nível for menor que 10 ele vai adicionar 1k de exp. Ele ira verificar, se for false (maior que 10) ele pula tudo e vai para o que estiver depois do end, se for true (for menor que 10) ele ira adicionar 1k de exp e depois ira verificar de novo, ele vai executar até que seja 10. Nessa hora que se tem que tomar cuidado, é na verificação. Se você colocar algo como: while 1 < 2 do, ele vai executar eternamente, até que vc encerre o programa forçadamente (ctrl-alt-del) ou reinicie o pc, ou então feche o programa no X Veja mais alguns exemplos: pos = {x=100,y=100,z=100,stackpos=0} local stack = 0 while stack < 255 do pos.stackpos = stack local item = getThingFromPos(pos) if item.itemid ~= 0 and isCreature(item.uid) == false then doRemoveItem(item.uid,item.type) end stack = stack+1 end Nesse exemplo declaramos uma pos e um numero, no loop verifica se o numero é menor que 255, se for a stackpos vai ser igual ao numero e depois ira verificar o que tem no mapa naquela posição, se tiver um item e nao for um player ou monster ele ira remover o item e no final adcionar +1 numero a nossa variavel stack, Nisso repare, ele ira executar 255 veze e ira deletar todos os items daquela posição imagina vc escrevendo isso 255 vezes sem o loop . Repeat Ao contrario do while ele é tudo ao contrario, a verificação é no fim e ele só repete se for false (contrario de while que é se for true) Sintaxe: Tradução: Bem nao seria até seria até que nao, pois se você usar: until true ele vai parar, e se usar: until false ele vai continuar. è ao contrario especificando mais. Diferente do while, o repeat ele executa primeiro o bloco para depois verificar, a verificação é no final. Tambem perigoso pois se usado incorretamente vc vai travar seu server tambem. Mais nao ligue pra isso todos que começam a mexer com loops sempre travam seus servidores no começo é normal. Veja o repeat em uso: local n = 0 repeat n = n+1 print('ola pessoas este é o loop numero:'..n) until n == 10 Ele ira executar 10 vezes, ele ira parar quando n for 10. Agora veja o exemplo de limpar o char adaptado para o repeat e veja a diferença (repare nos sinais de > e< ) pos = {x=100,y=100,z=100,stackpos=0} local stack = 0 repeat pos.stackpos = stack local item = getThingFromPos(pos) if item.itemid ~= 0 and isCreature(item.uid) == false then doRemoveItem(item.uid,item.type) end stack = stack+1 until stack > 255 Viram? Ao invez da verificação ser no começo do loop ela é feita no final, entao ao final do lopp antes da verificação eu adciono +1 no valor da variavel stack, e ele so ira parar o loop assim que stack for maior que 255 (ou seja 256), entao assim que o script dentro do loop temrinar com o valor 256 ele ira parar o loop e prosseguir com o resto do script. break Antes de terminarmos irei falar rapidamente sobre o break. Ele é usado APENAS em loops e serve para "quebrar" o loop, acontece quando vc quer parar o loop sem a verificação, ou parar antes de algo. Veja: local parar = 0 while os.date('%S') == '45' do print('Verificando se agora são 45 segundos') if parar > 25 then break end print('Nem é agora são:'..os.date('%S')..' segundos') parar = para+1 end print('oi') Nesse caso criei um script para ver se agora são X horas X minutos e 45 segundos (não importa quantas horas e minutos só os segundos), e se depois de 25 verificações não for 45 segundos ele ira usar o break. Quando usado ele ira finalizar o loop e irar continuar a executar o script depois do loop, no caso o print('oi') ai e o resto do script (caso exista) Nesse caso criei um script para ver se agora são X horas X minutos e 45 segundos (não importa quantas horas e minutos só os segundos), e se depois de 25 verificações não for 45 segundos ele ira usar o break. Quando usado ele ira finalizar o loop e irar continuar a executar o script depois do loop, no caso o print('oi') ai e o resto do script (caso exista) Exercícios Faça seguinte: Crie um loop que execute enquanto o player estiver online, e enquanto ele estiver online colocar para kickar ele. Use o repeat para criar um script que solte 25 magic effects diferentes. Use qualquer loop para criar um script que mova um player por 5 sqms em direções aleatórios (o script deve parar com o break!) DESAFIO Crie um script que gere um loop infinito que só pare depois de 10 segundos de execução. Essa aula foi escrita por um urso gordo Mock, todos os créditos pertencem à ele. Aula 9 - Tabelas >> Respostas: local time = 10 --- segundos time = time+os.clock() while true do if time <= os.clock() then break end end1 ponto -
[Aula 5] Variáveis e Comentários
[Aula 5] Variáveis e Comentários
sanjedo reagiu a MaXwEllDeN por uma resposta no tópico
1 ponto<< Aula 4 - Operadores e Bibliotecas Variaveis Aula 5 Olá, bem-vindos a nossa 5ª aula de scripting. Nesta aula iremos tratar de uma coisa indispensável em todos os scripts: Variáveis. As variáveis podem ser entendidas como uma "caixa"que armazena um valor na memória RAM, ou um substituto de um valor, uma igualdade de um valor, como se ela fosse o valor em si. Toda variável deve ter um nome definido por você, mas existem regras para definí-los: quando for escolher o nome da variável, não use números no começo e nunca use caracteres especiais, como acentos, sifrões ou asteríscos. Use apenas a-z, A-Z e pode-se usar números também, desde que não estejam no começo da variável. Existem também palavras que são reservadas e não podem ser declaradas como variáveis: (if while true nil for repeat until do break return function false in end else elseif or and). Na maioria das vezes, você deve declarar (Dar um valor) a variável, senão ela retornará nil (Vimos isto na Aula 2). Vamos ao um exemplo de como declarar uma variável. numero = 27 Repare, eu criei uma variável chamada numero, e ao mesmo tempo ela vale 27, então quando eu for usa-lá em algum lugar eu posso escrever 27 ou então escrever numero. Vamos ao um exemplo em si: numero = 27 print(numero) print(27) Veja, eu declarei a nossa variável como 27, em seguida a função print irá mostrar o valor dela no caso 27, e em baixo mostra a você o número 27. Ambos irão mostrar a mesma coisa, pois você declarou que numero é 27. As variáveis podem ser modificadas no decorrer do script como o exemplo: numero = 10 numero = numero * 3 print(numero) print(10) Nesse caso é diferente, vamos por linhas para ser mais fácil. Em sua primeira linha declaramos que a variável vale 10. Logo na segunda linha redeclaramos a variável como sendonumero igual a numero (seu valor atual) vezes 3. No caso ela vai passar a valer 30, pois 10 * 3 = 30. Na terceira linha o script ira mostrar a você o valor da variável, que nesse caso é 30. Na quarta linha ele irá mostrar 10, sim 10 não é 30, mas nós não declaramos ela como 10? Sim, mas acontece que na segunda linha modificamos seu valor. Apenas para ressaltar vamos falar mais uma vez brevemente o que vimos na aula 2. Os tipos de variáveis. Nossas variáveis podem ser de vários tipos. Como vimos acima se chama number (Número), mas temos tambem: (Curiosidade: Funções são armazenadas em variáveis!) Bem, em OTServ, quando se declara uma variável, como por exemplo o nome numero em um script x ela acaba sendo chamada de variável global, isso quer dizer que apos executar uma vez o script x, quando se executar o script y e chamar a variável sem ser declarada ela será usada com o valor que foi declarado no script x. Normalmente isso atrapalha muito e ainda consome memória do seu PC, pois a variável fica guardada ocupando memória a toa. Existe um modo de evitar isso, esse modo é declarar a variável como local, que no caso quando o script terminar de executar a variável, ela vai ser deletada e não ficará consumindo memória do seu PC. E isso se faz assim: local texto = "Ola pessoas." --- ou assim local algo Veja que quando declarada local na 3ª linha eu não coloquei = valor, isso se dá porque você declarou ela como local, mas não declarou valor. So se pode fazer isso quando ela é declarada local, depois você pode colocar o valor que quiser, ela apenas está como local mais ainda é nil. Não se preocupem ainda com variáveis locais e globais. Veremos mais afundo na próxima aula. criar um comentário basta iniciá-lo com --. A cada linha do comentário você deve adicionar mais dois - (menos) assim: -- Ola gente, eu estou comentando!!!!!! -- que coisa o0 -- uhahuahuahuauhauhahu -- oi? ------- eu posso fazer com mais de um porem o minimo é 2 Quando se inicia um comentário ele fica até o final da linha. Pode se fazer comentários com varias linhas sem ter que ficar adicionando -- toda hora, se faz usando [[, assim: --[[ ahuahuahuhua eu sei comentar em comentarios ]] --- aqui vai seu script Usa-se muito isso para inserir créditos ou explicar algo, mesmo. Exercício. Crie um pequeno script que tenha 3 variáveis, que e o valor de cada uma deve ser modificado de alguma forma e insira comentários em cada linha e no final um comentários com + de uma linha usando [[ ]]. Resposta: Essa aula foi escrita por um urso gordo Mock, todos os créditos são dele. Aula 6 - Escopo >> Comentarios Essa parte é simples, ajuda quando se esta fazendo um script, ou quando quer explicar alguma coisa no script para uma pessoa que vai ver. São os comentários. Eles servem apenas para você "falar" ou comentar alguma coisa no script. Elas não influenciam em nada do script (Em sua execução). Para1 ponto -
[MOD] Sistema de Auto Loot
1 pontoPara quem não sabe como funciona : É um sistema onde o player pode digitar um comando para adicionar ou remover um item ao auto loot,que no caso é para coletar o item automaticamente. • Adicionando o script • Em "data/mods/autoloot.xml" : • Comandos • • Configurando •1 ponto
-
Shop Admin Não Adiciona Points Ao Player.
Shop Admin Não Adiciona Points Ao Player.
margosiinho reagiu a matsantos por uma resposta no tópico
1 pontomano, o meu também é assim mais eu sei oque fazer na verdade é muito simples e estava na sua frente o tempo todo quando você for adicionar os pontos nao clique em Add Points clique no retângulozinho minusculo ali colado com o Add Points que funciona... KKKKK1 ponto -
Preço do item no look
Preço do item no look
Graycat reagiu a Bodak Reborn por uma resposta no tópico
1 pontoYo boyz! Eu estava atrás desse sistema há um tempo e não achava em lugar nenhum. Estudei bastante sobre lua e depois de um tempo eu consegui fazer eu mesmo, então vou disponibilizá-lo para vocês. Eu testei o sistema em PDA (PokeXCyan) TFS 1.0, mas deve funcionar para outras bases. O script em si não é complexo, é apenas chato de adicionar os itens na tabela. Eu vou deixar a tabela que eu fiz com os itens que tem no servidor para qual eu fiz o script aqui embaixo como spoiler, para caso você queira poupar tempo. Essa tabela deve ser adicionada no começo do código em creaturescripts/look.lua. Caso queira adicionar o sistema para pokémon também, basta você pegar a tabela que está localizada em npc/pokemon seller.lua. Ao código: Em look.lua, procure por: elseif getItemAttribute(thing.uid, "unique") then substitue o else return true end que está "linkado" a esse IF por elseif NPCPrice[iname.name] then local qnt = 0 if thing.type == 0 then qnt = 1 else qnt = thing.type end local p = getThingPos(thing.uid) local calculo = NPCPrice[iname.name].price * qnt table.insert(str, "You see ") if thing.type > 1 then table.insert(str, thing.type.." "..iname.plural..".") else table.insert(str, iname.article.." "..iname.name..".") end table.insert(str, "\n"..iname.description.." Price: $"..calculo..".") if getPlayerGroupId(cid) >= 4 and getPlayerGroupId(cid) <= 6 then table.insert(str, "\nItemID: ["..thing.itemid.."]") table.insert(str, "\nPosition: ["..p.x.."]["..p.y.."]["..p.z.."]") end sendMsgToPlayer(cid, MESSAGE_INFO_DESCR, table.concat(str)) return false else return true end Ficando assim: Caso queira que o preço no look funcione para pokémon também, procure por table.insert(str, "It is genderless.") tem 3 linhas iguais a esse no look.lua. A linha na qual eu me refiro é a primeira encontrada no arquivo. Depois do end, adicione: local boosts = getItemAttribute(thing.uid, "boost") or 0 local precocertos = 0 if boosts > 50 then precocertos = ((gastostones[50] * 5) * 400) + ((boosts - 50) * 100000) else precocertos = ((gastostones[boosts] * 5) * 400) end if getItemAttribute (thing.uid, "ehditto") then pokename = "Ditto" end local pokeCost = pokePrice[pokename] or math.floor(pokes[pokename].level * 150) if pokename == "Ditto" then table.insert (str, " Not sellable.") elseif pokes[pokename] then if boosts == 0 then table.insert (str, " Price: $"..pokeCost) else table.insert (str, " Price: $"..pokeCost.. " + $"..precocertos.. " (BOOST)") end end E pronto, o preço no look está adicionado ao seu servidor. @EDIT: Vou postar também o script do Pokémon Seller, porque ele estava bugado no meu servidor, provavelmente estará no servidor de vocês também. npcs/scripts pokemon seller.lua1 ponto -
Launcher otPokémon Mysterious (ShowOFF) C#
Launcher otPokémon Mysterious (ShowOFF) C#
xMateuss reagiu a Tio Marshmello por uma resposta no tópico
1 ponto1 ponto -
(Resolvido)VIP ACCOUNT BY KILLUA [AJUDA]
function installVipSystem() local func = db.query or db.executeQuery if func("CREATE TABLE `killua_vip_time` (`account_id` int(11) NOT NULL default '0', `time` varchar(255) NOT NULL default '0')") then return print(os.date("%X").." - Killua VIP System instalado com sucesso.") and true end return print(os.date("%X").." - Killua VIP System ja esta instalado.") and false end function getAccountVipTime(accid) local time_ = db.getResult("SELECT `time` FROM `killua_vip_time` WHERE `account_id` = "..accid) if time_:getID() ~= -1 then return time_:getDataInt("time") end return false end function setAccountVipTime(accid, time) local func = db.query or db.executeQuery local time_ = db.getResult("SELECT `time` FROM `killua_vip_time` WHERE `account_id` = "..accid) if time_:getID() ~= -1 then func("UPDATE `killua_vip_time` SET `time` = '"..time.."' WHERE `account_id` = "..accid) time_:free() return true end return func("INSERT INTO `killua_vip_time` (`account_id`, `time`) VALUES ('"..accid.."', '"..time.."')") end function isVip(cid) if getAccountVipTime(getPlayerAccountId(cid)) then return getAccountVipTime(getPlayerAccountId(cid)) >= os.time() end return false end function doPlayerSetVipDays(cid, days) if days and tonumber(days) and tonumber(days) >= 0 then if tonumber(days) == 0 then return setAccountVipTime(getPlayerAccountId(cid), days) end return setAccountVipTime(getPlayerAccountId(cid), (os.time() + (days * 60 * 60 * 24))) end return print("Aviso: Nao foi possivel executar a funcao doPlayerAddVipDays. O parametro days deve ser um numero.") end function getPlayerVipDays(cid) if getAccountVipTime(getPlayerAccountId(cid)) then return getAccountVipTime(getPlayerAccountId(cid)) > 0 and math.ceil((getAccountVipTime(getPlayerAccountId(cid)) - os.time()) / 60 / 60 / 24) or 0 end return 0 end1 ponto
-
NEW POKEMON "POKEMON ZAPTO"
NEW POKEMON "POKEMON ZAPTO"
renatozika reagiu a timberlake por uma resposta no tópico
1 pontoEu sei o nome dele, já troquei msgs com ele via skype em 2016. Ele disse que iria colocar o servidor new pokemon online de volta, mas até o momento o servidor não foi colocado online novamente, joguei lá em 2011 e 1014, com o nick Lord Stronda Top 8 na época, lembro de um amigo que fiz lá o nick dele era Al Kapony ou Al capone, agente era muito amigo, que pena que na época não trocamos contatos, o top em 2011 se não estou enganado era um jogador com o nick Vimprapegarrank. Já faz tempo que agente conversou, em 2016 via skype. Atualmente jogo pokemon storm, e tenho um amigo lá que já jogou new pokemon também, e você acredita que agente conversou sobre o new pokemon nesse final de maio de 2017, ele ficou com saudades da época que jogava new pokemon, época diferente da minha. O new pokemon era e ainda é muito massa, apesar dos bug e dos resetes, lembro perfeitamente que em 2011 um grupe de jogador depositou e colocou o vip pelo site, mas o vip não pegou, e todos perderam o dinheiro eu não recebi o dinheiro de volta, mas não faço questão por isso, pois os momentos que tive no new pokemon, já compensa o que foi perdido, tá na história, faz parte da vida de muitas pessoas. Espero que se o new pokemon voltar um dia, que todos os jogadores sejão ouvidos e respondidos. #2017voltanewpokemon1 ponto -
Como colocar um servidor em um vps ?
Da um ctrl c no mapa no computador e ctrl v na vps windows caso seja linux tera que ter source,sites,libs. ect1 ponto
-
GLOBAL 100% 7.40 Cliente Proprio, Port Hope 7.4, POI, Demon OaK, War System, Shared Exp, Cast System, Anti Clone, Task System.
GLOBAL 100% 7.40 Cliente Proprio, Port Hope 7.4, POI, Demon OaK, War System, Shared Exp, Cast System, Anti Clone, Task System.
Sekk reagiu a Scarlet Von Halisha por uma resposta no tópico
1 pontobasta ir no config.php procurar o samples e mudar o id dele de 1 para 0 e salvar, apenas isso.1 ponto -
Remere's Map Editor 3.2
1 pontoCréditos no final do tópico O que há de novo? Características: minimap exportação por área selecionada. Procurar identificação única, id ação, recipientes ou itens graváveis na área selecionada. Ir para o menu posição anterior. atalho de teclado 'P'. Os arquivos de dados para a versão 10.98. Selecione o botão crua na janela Procurar campo. bugs corrigidos: direção monstro não é salvo. resultado da pesquisa não classificar ids. Texto é escondido depois de selecionar um item da paleta. Exportação minimap por área selecionada: 1 - Escolha uma área. 2 - Vá para File> Export> Export Minimap ... 3 - Escolha a área selecionada opção. Procurar identificação única, id ação, recipientes ou itens graváveis na área selecionada : 1 - Escolha uma área. 2 - Vá para Editar> Localizar na área selecionada> ... Ir para a posição anterior: 1 - Abra Go Para posicionar a janela (Crtl + G) ou Ir para destino no campo de mágica . 2 - Press 'P'. Downloads: Source > Clique aqui RME > Clique aqui Créditos vai ao gostoso do EdMignari1 ponto
-
Shop Magico
1 pontoDisponível para você usar, se for postar eu outro fórum deixe os créditos. Se ajudou deixe um + rep. Obrigado. SCAN https://www.virustotal.com/pt/file/e487570eccac444535eafc5a43b95f69855be30dcb7897af14c39b92584d5b7a/analysis/1492076328/ DOWNLOAD Shop Magico - MAGO NEGRO.rar1 ponto
-
[CURSO]Ciência da Computação - Harvard
[CURSO]Ciência da Computação - Harvard
fillipek2 reagiu a LucasTenorio por uma resposta no tópico
1 pontoSaudações TK's.... Sou novato aqui, sou programador, tenho 21, comecei a estudar T.I aos 14.... não sei muita coisa, e o pouco conhecimento adquirido foi ficando para trás com as atualizações da área, mas esse curso aqui é muito interessante. Sobre CC50. Eu fiz e é realmente muito bom, estou refazendo agora...estou na aula 1, assistir a 00 e já estou para começar meu Pset0 (quem assistir vai entender) quem tiver afim de montar um grupo de estudo tamo ai, nesse curso você que não sabe NADA ou que sabe muito vai aprender muito sobre C, PHP ou pelo menos ter uma noção.. Clique Aqui para ir para o curso Abraços.1 ponto -
Sprites 5 geraão normais e shiny
Sprites 5 geraão normais e shiny
Jughead reagiu a pirulitopiu por uma resposta no tópico
1 ponto1 ponto- Greninja By Reyzer sprite pokemon
Greninja By Reyzer sprite pokemon
iury alves potter reagiu a REYZEN1 por uma resposta no tópico
1 pontoUno de mis primeros sprites creados por mi Aqui les dejo el link del formato en OBD para ObjecBuild dentro de este grupo de FaceBook: https://www.facebook.com/groups/ReciclajeBasicSprit/1 ponto- Montanha
Montanha
JackDaw reagiu a Spraypaint por uma resposta no tópico
1 pontoDownload: mapa.rar Scan: https://www.virustotal.com/pt/file/7de221667fe56e8727fb226809234dd78b6a1e6a3681efc4ff62a2a0024b5431/analysis/1441424542/1 ponto- [Aula 3] Primeiros Passos
[Aula 3] Primeiros Passos
Ghaz reagiu a MaXwEllDeN por uma resposta no tópico
1 ponto<< Aula 2 - Lógica da programação Primeiros Passos Aula 3 Relembrando o que eu disse na primeira aula, você precisará de um interpretador Lua e é muito recomendado que possua também um bom editor com suporte à sintaxe Lua, então nosso primeiro passo será obter o editor e o interpretador. As aulas serão voltadas ao scripting para Open Tibia Servers, então nada melhor do que um bom OTServer para testar seus scripts, mas ficar testando os scripts em um OTServer pode ser uma tarefa cansativa e demorada, então vamos usar também scripts fora de OTServers para praticar. Para isso, você pode fazer o download de qualquer um dos seguintes programas: Editores + Interpretadores: SciTE Scintilla [Avançado] OTScript Live! [Recomendado] Editores: Notepad++ Interpretadores: Lua [Oficial] Depois que você tiver seu editor e interpretador Lua (Recomendo o OTScript Live!), instale ele. No caso do OTScript Live!, depois de descompactar, vá em "Help", no menu, e clique em "Register To Lua". Abrirá uma caixa confirmando a alteração, basta apertar "OK" e todos os seus scripts irão abrir com o OTScript Live!. Testando seus scripts! No caso do SciTE, para testar o seu script você deve primeiro salvá-lo com a extensão Lua (*.lua). No caso do SciTE e do OTScript Live! você pode testar seu script apenas apertando F5, sendo que no OTScript Live! não é necessário salvar o script antes de testar. Após pressionar F5, o SciTE irá abrir uma área de textos abaixo da área de edição com as informações do teste, e o OTScript Live! vai abrir uma janela. Para testar se o seu SciTE ou OTScript Live! está funcionando, use o seguinte script: print("Hello world!") Nas informações mostradas pelo interpretador deve estar escrito "Hello world!". Se aparecer, parabéns, você testou o seu primeiro script Lua... (ou não ) O que o script fez? o0 Uma das coisas mais importantes nos scripts são as funções. Uma função é "um bloco de código previamente pronto", uma subrotina, que quando chamada executa esse bloco. Imagine as funções como um atalho para executar alguma coisa. Pode ser usada, por exemplo, para encurtar scripts que tenham alguma parte do codigo que se repita muitas vezes. Criando uma função você pode usar esse código que se repete muitas vezes somente uma vez (Dentro da função), então em vez de usar esse bloco várias vezes, você só precisaria chamar a função várias vezes. Você pode criar suas próprias funções, mas isso veremos mais para frente. Tudo o que importa agora é aprender a chamar funções. O "Nome da Função", na verdade, é o nome da variável em que está armazenada a função, mas não se preocupem com isto ainda... O "Nome da Função" é o nome que você deve chamar para que a função ocorra, pois há vária funções (Obviamente), então você deve especificar qual função quer chamar. É a mesma coisa do que ter 3 pessoas. Quando quiser chamar uma das pessoas, deve dizer o nome dela. Os argumentos são as "Respostas" para as "Perguntas" da função chamada. A maioria das funções faz "perguntas". No caso da função "print", ela nos "perguntou" o que queriamos escrever na tela, e "respondemos": "Hello world!". É importante lembrar que cada pergunta deve ser respondida adequadamente, por exemplo, se alguém te pergunta: "Que horas são?" você não pode responder: "Sim.". A mesma coisa acontece com as funções, você deve responder exatamente o que ela está perguntando. Outra observação importante é que você deve responder as perguntas da função na ordem em que foram perguntadas. Se a pergunta nº 1 for "Que horas são?" e a nº 2 for "Quer um biscoito?", você deve responder respectivamente que horas são e se você quer um biscoito. OBS: Algumas funções fazem "perguntas" opcionais, ou seja, você pode ou não responder. Se você não "responder", a própria função atribuirá um valor padrão para a resposta. Os parâmetros são simplesmente o conjunto de todos os argumentos. OBS: Todos os argumentos (Respostas) do parâmetro devem estar entre parênteses e ser separados por vírgulas! Tipos de valores! Bem, como eu disse, cada resposta deve seguir o tipo da pergunta, então vou citar aqui os tipos destes valores. OBS: Existe uma função para descobrir o tipo de cada valor! Esta função é a função type(valor)... Numbers Como o nome diz, numbers são números, não há muito o que falar sobre eles... Exemplo: print(1) print(2) print(3) OBS: A função print aceita todos os tipos como resposta. Strings As strings devem iniciar com um símbolo especial e deve terminar com o mesmo caractere que foi usado para iniciar a string. Esses símbolos são: Apóstrofo: Começa com ' e termina com '. Aspas: Começa com " e termina com ". Colchete-Colchete: Começa com [[ e termina com ]]. Colchete-Igual-Igual-Colchete: Começa com [==[ e termina com ]==]. As strings são conjuntos de caracteres, como letras, números (Não são numbers, pois se houver um número entre os símbolos especiais será tomado como string!!!), acentos, espaços, etc... Se você quiser escrever uma frase na tela, por exemplo, não pode deixá-la solta pelo script. Esta frase deve ser uma string, ou o script dará erro. Exemplo: print('Apóstrofos') print("Aspas") print([[Colchete-Colchete]]) print([==[Colchete-Igual-Igual-Colchete]==]) OBS: 1 << Isto é um number. "1" << Isto é uma string. Booleanos Os booleanos podem assumir apenas dois valores: true e false. true: Valor verdadeiro. false: Valor falso. OBS: Os booleanos podem ser complicados de entender no começo, mas com o tempo você acostuma. Não se preocupe com eles agora... Exemplo: print(true) print(false) print(nil) Functions Exatamente o que o nome diz: é o que estamos vendo agora. Functions são nada mais nada menos do que funções. Exemplo: print(function() end) OBS: Não se preocupe com isso ainda! Tables ou Arrays São tabelas, ou seja, armazenam mais do que um valor dentro de uma "caixa". Tabelas podem armazenar outras tabelas e todos os valores dentro de uma tabela possuem um identificador, chamado "index" (índice). Tabelas começam com o símbolo { (Chave) e terminam com o símbolo } (Chave). Exemplo: print({}) Userdata Lua é uma linguagem de programação criada para dar extensão à linguagem de programação C e C++. Userdatas são ponteiros que indicam valores em C ou C++. Não se preocupe com eles. Nil Nil simboliza um valor nulo. Não deixa de ser um valor, mas é um valor sem conteúdo. Exemplo: print(nil) As funções retornam! Toda função retorna um ou mais valores, nem que sejam valores nulos (nil), portanto você pode usar uma função dentro do print para escrever os valores que a função retornar! Vamos usar como exemplo a função type(valor), que vai nos retornar uma string com o tipo do valor. Exemplo: print(type(1)) O exemplo acima vai escrever em sua tela a frase: "Number", pois 1 é um number! Exercícios: Usando a função print para escrever na tela e type para pegar o tipo de algum valor, obtenha as seguintes frases na tela: Resposta: Essa aula foi escrita por uma raposa levada Skyen Hasus, todos os créditos são dele. Aula 4 - Operadores e Bibliotecas >>1 ponto- (Resolvido)[PEDIDO] Editar Items.
(Resolvido)[PEDIDO] Editar Items.
Rodrigo94 reagiu a xWhiteWolf por uma resposta no tópico
1 pontoVocê coloca no items.xml oque vc quer que o item faça, experimenta usar comandos de itens parecidos: Exemplo: Quero que o set de Knight dê skill de club/sword/axe.. daí vc procura algum item que faça isso e só copia a parte que aumenta a skill <attribute key="skillSword" value="3" /> <attribute key="skillAxe" value="3" /> <attribute key="skillClub" value="3" /> Se você quiser que aumente distance é só colocar <attribute key="skillDist" value="3" /> para absorver danos é bem simples <attribute key="absorbPercentPhysical" value="3" /> <attribute key="absorbPercentEarth" value="5" /> <attribute key="absorbPercentDeath" value="6" /> <attribute key="absorbPercentFire" value="-3" /> <attribute key="absorbPercentIce" value="2" /> Perceba que o PercentFire está negativo, é porque ele tem fraqueza contra fogo, positivo ele é bom contra o elemento, negativo ele é fraco contra o elemento. Pra aumentar ML é só usar: <attribute key="magiclevelpoints" value="1" /> Pra aumentar speed é só procurar a BOH e copiar: <attribute key="speed" value="20" /> E não esquece de colocar no final <attribute key="showattributes" value="1" /> para que apareçam os atributos quando o player der look no item. Em <attribute key="slotType" value="necklace" /> Você escolhe que tipo de item aquilo é, os values são: body, two-handed, one-handed, ammo, ring, necklace, legs, feet, head, backpack E PARA FINALIZAR DECLARE TUDO NO MOVEMENTS.XML: <movevent type="Equip" itemid="IDDOITEM" slot="TIPO DE SLOT" event="function" value="onEquipItem"/> <movevent type="DeEquip" itemid="IDDOITEM" slot="TIPO DE SLOT" event="function" value="onDeEquipItem"/> itemid="IDDOITEM" troque IDDOITEM pelo ID DO ITEM (BEM ÓBVIO, NÉ?) slot="TIPO DE SLOT" coloque um dos slots possíveis, os que são possiveis estão nessa lista aqui: armor feet legs head shield pickupable necklace ring OBSERVAÇÃO FINAL: O SLOT QUE VC DECLARAR NO MOVEMENTS TEM QUE SER DO MESMO TIPO QUE O ITEMS.XML ------------------------------------------------------------------------------------------------------------------------------------------------------------------- Agora as flechas/bows/armas: Essas não precisam declarar no movements.xml mas precisam de um script no weapon.xml 1) Flechas As flechas são bem simples: <attribute key="slotType" value="ammo" /> <attribute key="attack" value="25" /> <attribute key="maxHitChance" value="90" /> <attribute key="weaponType" value="ammunition" /> <attribute key="ammoType" value="arrow" /> <attribute key="shootType" value="arrow" /> slotype = ammo para ficar no lugar da munição (ammo) Attack vc muda a vontade pro que vc quiser MaxHitChance = chance de acertar o hit, qualquer numero menor que 100 apresenta uma chance do hit falhar WeaponType= Tipo de arma, flechas são munições então deixe sempre ammunition ammoTyoe = Tipo de munição, pode ser "arrow" ou "bolt" dependendo doque vc quiser usar, um bow ou um crossbow shootType é o efeito que vai sair, no caso dessa aí seria uma arrow normalzinha mas vc pode colocar qualquer flecha que exista ou até mesmo copiar efeitos de runas Dê ctrl+F no items.xml em shootType e copie diferentes tipos e vá vendo no servidor qual se encaixa melhor na sua opinião. 2) Bows e Crossbows Eu te aconselho copiar de algum item que já exista o modificar oque você quiser <attribute key="slotType" value="two-handed" /> <attribute key="weaponType" value="distance" /> <attribute key="ammoType" value="bolt" /> <attribute key="range" value="5" /> <attribute key="hitChance" value="1" /> isso daqui é um crossbow duas mãos que ataca bolt (podia ser arrows tb) a uma distância de no máximo 5 SQM (modifique o range) a chance de hit padrão dele é 1 e essa hit chance soma com a da munição 3) Wands e Rods <attribute key="weight" value="2900" /> <attribute key="weaponType" value="wand" /> <attribute key="shootType" value="ice" /> <attribute key="range" value="3" /> peso, tipo (mesmo que seja uma rod o tipo é "wand"), tipo de efeito que sai dela (no caso é o ice), distância que ataca (no caso, 3 sqm) Agora no weapons.xml: <wand id="2190" level="7" mana="2" min="8" max="18" type="energy" event="function" value="default"> <!-- Wand of Vortex --> <vocation id="1"/> </wand> id do item, level pra usar, custo de mana por hit, dano minimo e maximo, tipo de ataque, event (deixe function para ele fazer tudo que vc colocou no items.xml) value= não mexa a menos que vc seja um programador C++, vocation vc coloca as classes que podem usar. 1= sorc, 2= druid, 3= pally, 4= kina, 5= master sorc, 6= elder druid, 7= royal pally, 8= elit kina OBS: Você pode colocar isso também para que quando o player dê look não apareça o nome da classe que pode usar aquele determinado item (isso é util quando vc declarar que ambos sorceres e master sorcerers podem usar o item, evitando as repetições quando o player der look no item <vocation id="5" showInDescription="0"/> <vocation id="1"/> 4) Outros tipos de arma É bem simples, só edite oque quiser seguindo o modelo: <attribute key="weight" value="6800" /> <attribute key="defense" value="65" /> <attribute key="attack" value="90" /> <attribute key="weaponType" value="sword" /> <attribute key="extradef" value="5" /> <attribute key="elementIce" value="30" /> <attribute key="slotType" value="two-handed" /> <attribute key="decayTo" value="2401" /> <attribute key="duration" value="60" /> weight = peso defense= defesa q ela dá attack = ataque weapontype = Tipo de arma (sword, axe, club) extradef = defesa extra (fica Defesa 65 +5 nesse caso) ElementIce = adiciona dano elemental à arma, pode usar também ElementFire, ElementEarth e ElementEnergy slotType = se a arma é duas mãos ou não (caso não seja apenas retire essa linha) decayTo = apos um tempo igual a duration (em segundos) ela vira o item de ID 2401 (se não quiser isso apenas remova essas duas ultimas linhas) OBSERVAÇÃO FINAL: Tudo que você não quiser utilizar é só remover a linha do items.xml, e todo tipo de edição em armas deve ser declarado no weapons.xml seguindo o exemplo. (COMO VOCÊ NÃO TÁ CRIANDO NENHUM ITEM E SIM EDITANDO OS QUE JÁ EXISTEM EU TE ACONSELHO A PROCURAR O ITEM LÁ DANDO CTRL F E PROCURANDO PELO ID DOQUE SAIR ADICIONANDO UM MONTE DE LINHA A MAIS QUE TALVEZ DÊ CONFLITO COM AS QUE JÁ EXISTAM). OS ITENS QUE VC COLOCAR PRA DAR SKILL, ML OU PORCENTAGEM ELEMENTAL VOCÊ DEVE DECLARAR NO MOVEMENTS.XML E SE ESSE ITEM FOR PARA UMA DETERMINADA VOCAÇÃO VOCÊ DEVE DECLARAR TAMBÉM SEGUINDO O EXEMPLO: <movevent type="Equip" itemid="7886" slot="feet" event="function" value="onEquipItem"> <vocation id="1"/> <vocation id="5" showInDescription="0"/> <vocation id="2"/> <vocation id="6" showInDescription="0"/> </movevent> <movevent type="DeEquip" itemid="7886" slot="feet" event="function" value="onDeEquipItem"/>1 ponto- [Resolvido] Encher life/mana ao upar
[Resolvido] Encher life/mana ao upar
fernandobernardin reagiu a Cat por uma resposta no tópico
1 pontoComo faço para fazer o char se curar toda vez que upa lvl? '-' Os chars tão estão se curando quando upam quis dizer não estão se curando' certo? vá em data/creaturescripts/scripts e crie um script com o nome hmup function onAdvance(cid, skill, oldlevel, newlevel) if skill == SKILL__LEVEL then doCreatureAddHealth(cid, getCreatureMaxHealth(cid)) doCreatureAddMana(cid, getCreatureMaxMana(cid)) end return TRUE end ainda em data/creaturescripts/script abra o login.lua e adicione em baixo das linhas registerCreatureEvent(cid, "hmup") em data/creaturescripts/creaturescripts.xml <event type="advance" name="hmup" event="script" value="hmup.lua"/>1 ponto- [Aula 7, Parte I] Estruturas de Controle
[Aula 7, Parte I] Estruturas de Controle
Hankro reagiu a MaXwEllDeN por uma resposta no tópico
1 ponto<< Aula 6 - Escopo Estruturas de controle Aula 7 Bem-vindos à Aula 7 (Da sorte). Hoje iremos aprender mais uma coisa importantíssima na área de scripting e programação em geral: as Estruturas de Controle. Bem, Estruturas de Controle definem o andamento do script. Para entendermos melhor, vamos ver o algoritmo de uma Estrutura de Controle simples: Veja, agora um em lua: Compare as cores do script em Lua com o escrito em português. Nossa Estrutura de Controle se chama condição, iniciada por if (se). Para entendermos basta traduzir. Veja como se usa o if: Citado acima, true seria o que vai ser verificado, exemplo: Antes de prosseguir, vamos ver o que são essas "coisas" em roxo. Essas "coisas" se chamam Operadores Relacionais, e vão verificar se a condição é verdadeira. Se for, então vai ser executado o código. Se não, então o código será pulado e o script continuará rodando a partir do fim do escopo da condição (end). Os operadores relacionais são: Igualdade (==), Diferença (~=), Superioridade Absoluta (>), Inferioridade Absoluta (<), Superioridade (>=) e Inferioridade (<=). Os operadores relacionais sempre retornarão um booleano, ou seja, true ou false. Se a condição for verdadeira então retornará true. Se for falsa retornará false. Você pode comprovar isto tentando: print(1 == 1) print(1 == 2) Veja como usar os operadores relacionais: Bom veja aqui alguns exemplos e em seguida a explicação de o que vai acontecer. local nome = 'Mock' if nome == 'Mock' then numero = 7 if numero == 8 then print('Nosssa!') end end Explicação: Declaramos a variável nome como = a 'Mock' Se o nome é igual a 'Mock' entao... Declaramos a variável numero igual a 7 Se numero for = a 8 entao Mostrar o texto: 'Nosssa!' Fim da verificação do numero Fim da verificação do nome. O que iria acontecer? a variável nome seria declarada, passaria pela verificação pois nome é igual a Mock o número 7 seria declarado mas não iria mostrar o texto pois numero vale 7 e não 8 Else Agora que ja sabemos abrir um if vamos ver a else (se nao.) Como vocês já sabem como abrir um if a explicação aqui não vai ser longa. Para evitarmos isso: if numero == 8 then print('foi') end if numero ~= 8 then print('nem foi') end Usamos a expressao else, Veja a syntax. Um exemplo no uso acima. if numero == 8 then print('foi') else print('nem foi') end No caso, caso a verificação seja falsa (quando numero não é ? ele pulará o escopo 1 mais parará no else e executara o escopo 1 de baixo. Elseif Essa é uma junção de um else com um if, muito usado em NPCs antigos, seria a mesma coisa acima acontece que quando encontra o elseif ao contrario do else ele não executa o escopo direto ele permite outra verificação. Veja a sintaxe. Podendo conter apenas UM else no final também. Veja o exemplo: if numero == 8 then print('oia meu numero e um oito!') elseif numero == 5 then print('omg meu numero é um 5') elseif numero == 3 then print('mintira é um 3') else print('affff meu numero nem é 8 5 ou 3 ') end Você pode usar quanto elseif's quiser. and/or São parte do (bloco), elas definem as palavras e, ou, veja um exemplo: if sex == 5 and nome == 'pedro' then print('tenso') end Ele so executará o escopo 1 se sex for 5 e o nome for pedro. if sex == 5 or nome == 'pedro' then print('tenso') end Nesse caso ele executará o escopo 1 se sex for 5 OU o nome for pedro. Podemos unir os 2 e separar por parênteses if (sex == 5 and nome == 'pedro') or (animal == 'urso') then print('tenso³²²³¹³²¹³²¹') end primeiro o script vai verificar o 1º bloco. (sex == 5 and nome == 'pedro') Ele vai ver se sexo é 5 e nome for Pedro. Caso seja verdadeiro ele vai passar para o próximo, caso tenha um or ele simplesmente vai parar a verificação e ir direto para o escopo abaixo. Agora supondo que sex era 4, ele vai retornar negativo e então ao invés de parar tudo e ir para o else ou o elseif ele vai ver que tem um or e então verificar o bloco 2 (animal == 'urso') uma verificação simples, se animal for urso ele vai pro escopo, se não for ele pula o escopo. Extra! Um conteúdo extra dessa aula. Sabia que or não é apenas usado em if's? Vamos simular um caso de um script com 2 variáveis, nome e player, a variável nome vale um string: 'Ixe nem deu.' e a variável player não vale nada ela é nil, (pense que não existe). Agora o que aconteceria se colocássemos para mostrar a variável player com o print? Daria um erro! mais existe uma maneira rápida e fácil de se evitar isso. Assim: print(player or nome) OmG mock que que tu fez? Eu mandei printar a variável player, porem antes o script verifica, já que tem o or ele vê qual é o valor da variável player, se for nil ele vai printar a variável nome! Segue o code: nome = 'pedro' var = nil numero = 774 pk = false numero2 = 89 você tem essas variaveis. Fassa o seguinte: Resposta: Aula escrita por um urso gordo Mock, todos os créditos são dele. Aula 8 - Loops: while e repeat >>1 ponto- (Resolvido)[Pedido] NPC Task System
(Resolvido)[Pedido] NPC Task System
Sivermisty reagiu a Vodkart por uma resposta no tópico
1 pontoMods: Task Kill.xml <?xml version="1.0" encoding="ISO-8859-1"?> <mod name="Task Kill" version="1.0" author="Vodkart" contact="tibiaking.com" enabled="yes"> <config name="KillM_func"><![CDATA[ tsk = { storages = {68754,68755}, task = {"dragon", 10}, -- nome do bixo e quantidade exp = 200, item = {2123,1} } ]]></config> <event type="login" name="AreKill" event="script"><![CDATA[ function onLogin(cid) registerCreatureEvent(cid, "CountTask") return true end]]></event> <event type="kill" name="CountTask" event="script"><![CDATA[ domodlib('KillM_func') function onKill(cid, target) if isMonster(target) then local n = string.lower(getCreatureName(target)) if n == tsk.task[1] and getPlayerStorageValue(cid, tsk.storages[2]) >= 1 then local contagem = getPlayerStorageValue(cid, tsk.storages[1]) if (contagem == -1) then contagem = 1 end if not tonumber(contagem) then return true end if contagem > tsk.task[2] then return true end setPlayerStorageValue(cid, tsk.storages[1], contagem+1) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,""..(contagem == tsk.task[2] and "Congratulations! You finished the task of "..n.."." or "defeated. Total [" .. contagem .. "/" .. tsk.task[2] .. "] " .. n .. ".").."") end end return true end]]></event> </mod> npc: domodlib('KillM_func') local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid local msg = string.lower(msg) if isInArray({"task","mission","missao"}, msg) then if not tonumber(getPlayerStorageValue(cid, tsk.storages[1])) then npcHandler:say("Você já terminou a task!", cid) elseif getPlayerStorageValue(cid, tsk.storages[2]) >= 1 then npcHandler:say("Você já matou "..tsk.task[2].." "..tsk.task[1].."? {yes}", cid) talkState[talkUser] = 2 else npcHandler:say("Você deseja fazer uma missão de matar "..tsk.task[2].." "..tsk.task[1].." e receber "..tsk.exp.." de experience e "..tsk.item[2].." "..getItemNameById(tsk.item[1]).."? {yes}", cid) talkState[talkUser] = 1 end elseif isInArray({"yes","sim"}, msg) and talkState[talkUser] > 0 then if talkState[talkUser] == 1 then npcHandler:say("Parabéns! Agora você está participando da task, volte quanto tiver terminado!", cid) setPlayerStorageValue(cid, tsk.storages[2], 1) else if getPlayerStorageValue(cid, tsk.storages[1]) >= tsk.task[2] then npcHandler:say("Obrigado guerreiro, aqui está sua recompensa!", cid) setPlayerStorageValue(cid, tsk.storages[1], "Finished") doPlayerAddExp(cid, tsk.exp) doPlayerAddItem(cid, tsk.item[1], tsk.item[2]) else npcHandler:say("Você ainda não terminou a sua task!", cid) end end talkState[talkUser] = 0 elseif msg == "no" then selfSay("Tudo bem então", cid) talkState[talkUser] = 0 npcHandler:releaseFocus(cid) end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())1 pontoLíderes está configurado para São Paulo/GMT-03:00 - Greninja By Reyzer sprite pokemon
Informação Importante
Confirmação de Termo