Tudo que Garou postou
-
[MOD] Killed Monsters Count
Nossa, parabéns hein, Renato. Você me surpreende, está avançando bastante na programação Lua Reputado!
-
[Dúvida] Itens
Você irá precisar de dois aplicativos: - .dat editor - OT Item Editor Com o primeiro, você irá editar o tibia.dat (ou o que for) e assinalar a opção container para um certo itemtype. E com o segundo, você irá criar um id funcional para o items.xml e assinalar que é do tipo container.
-
Preciso comprar um novo Celular
Eu tenho um Milestone 2 e não me arrependo, é bem rápido, roda vários apps e jogos, não trava D:
- Callbacks
-
Vivendo e aprendendo né ferlations
Caraca, eu fico pensando se ele não sabia só essa estranha simbologia ou também não sabe exponencial em base 10 e tal '-'
- Como funcionaria o sistema de premium
-
Portfólio - Mophus
A primeira tá bem estranha, mas as duas últimas ficaram fodas, como eu disse por msn você tem que treinar essa sua tipografia.
-
Santa inclusão digital.
- [Aula I] Conceitos básicos de C
Acho que seu tutorial está um pouco superficial para o tema - conceitos básicos. Eu não vi explicações detalhadas, vi você "empurrando" uns códigos prontos e explicando cada linha e, creio eu, isso não é apresentar conceitos. Seu tutorial também não é linear, você explicou o código, depois no fim, voltou e explicou que era necessário adicionar duas linhas do nada. Se eu não soubesse C++, ficaria com várias dúvidas, do tipo: "O que é #include?" Algumas sugestões É a principal classe de um programa, onde todo código deve ser escrito. Essa definição de "ponto inicial" ficou básica. "int" é uma palavra-chave reservada para classificar o tipo de valor de uma variável, no caso, int é de 4 bytes, abreviação de integer - traduzido fica "inteiro". Achei muito fraco essa definição de dizer que 0 significa sucesso. O main() retorna 0 como um padrão e o sistema operacional traduz isso como "ocorreu tudo normalmente na execução". No mais, obrigado pela contribuição.- Aula II - Lógica, Algoritmo e Operadores
LÓGICA, ALGORITMO E OPERADORES Na aula passada, você aprendeu qual a linguagem usada nos servidores, onde surgiu a programação Lua, o que é scripting e como se tornar um scripter. Nessa segunda aula, você irá aprenderá a pensar como um programador, irá aprender a transformar seu raciocínio lógico em uma sequência de instruções e finalmente, com a apresentação do que são operadores, você irá montar um script básico, mas eficaz. Lógica e Algoritmo Toda linguagem de programação, inclusive a Lua, segue uma certa lógica para funcionar corretamente. A isso, damos o nome de lógica de programação. Para fazer um script em Lua não é diferente, você precisa criar uma lógica que relacione sua ideia e o script, uma sequência de instruções que, depois, se torne o script em si. Isso é um algoritmo. Vamos então pegar um exemplo de algoritmo aplicado a Open Tibia, um exemplo simples, algo como a Pedra do Sexo. Algoritmos podem ser escritos em forma gráfica, o que podemos chamar de fluxograma, segue a sequência de instruções em fluxograma abaixo: Algoritmos são uma grande ajuda para os scripters. Pessoalmente, sempre rabisco um fluxograma parecido com esse acima quando o script que vou fazer é um tanto mais elaborado. Agora, com a apresentação dos conceitos abaixo, você irá transformar esse algoritmo em um script funcional. Operadores aritméticos e operadores relacionais. Nessa parte da aula, você irá aprender um pouco mais sobre os operadores aritméticos, aqueles bem conhecidos das suas aulas de Matemática. Os operadores relacionais que comparam coisas hmm Os operadores aritméticos, como você deve bem conhecer, fazem operações de cálculo simples. Creio que você os conhece com certeza. Temos outros operadores aritméticos de utilização um pouco mais "rara", assim dizendo: Você pode testar o funcionamento dos operadores, utilizando-se da função print(), veja abaixo: print(4+7) -- Retorna 11 print(7-4) -- Retorna 3 print(5*4) -- Retorna 20 print(4/4) -- Retorna 1 Os operadores relacionais são muito usados também no âmbito da matemática. Na programação, eles comparam dois tipos de objetos e retornam apenas valores true e false. Os operadores relacionais são listados abaixo: O operador de igualdade (==) compara o tipo dos argumentos envolvidos, caso o tipo seja diferente, será retornado false. Caso o tipo seja igual, ele compara o valor dos argumentos e novamente, se o valor é diferente, é retornado false, caso os dois valores sejam iguais, será retornado true. O operador de diferença (~=) é simplesmente a negação do operador de igualdade (==). Ou seja, ele retornará true para tipos ou valores diferentes e false para tipos/valores iguais. Os operadores de ordem (>, <, >=, <=) funcionam simples como na matemática. Se os dois operadores são números, então eles são comparados como tais. Eles só irão retornar true, caso a comparação seja realmente verdadeira e false caso não seja. Veja abaixo alguns exemplos: Agora vamos combinar esses operadores aritméticos e relacionais com os chamados operadores de controle que expressam a idéia de condição. Operadores de controle A estrutura de um operador de controle pode retornar qualquer valor. Tanto os valores false e nil são considerados como falsos e todos os outros valores diferentes são considerados como verdadeiros. A estrutura de controle criada a partir de um operador, só executa o bloco de código associado se o valor retornado pela condição seja verdadeiro. Existem cinco operadores de controle: if, elseif, else, repeat e until. Os dois últimos não serão explicados nessa aula. O operador if significa 'se', remete a uma estrutura sintática e condicional, você já deve ter visto uma sintaxe do tipo: Vou grifar em vermelho uma parte muito importante dessa frase e em azul seu bloco: Veja que para a parte em azul ocorrer, então a condição tem que "retornar" verdadeiro, ou seja você tem que estudar muito. Na programação Lua não é diferente, não. O bloco azul é simplesmente todo o código que será executado se a condição relacionada ao if retornar verdadeiro: if true then (...) end Pois é, para algo retornar verdadeiro, você deve fazer uma comparação entre dois argumentos, usando nada mais que os operadores relacionais. Note que: O if precisa de um then, este significa 'então'. Ele fecha a estrutura sintática do if, nunca esqueça dele. E também o end que fecha a verificação do if. Mas para toda condição, existe uma chance de ocorrer algo contrário, certo? Por exemplo, se o camarada não tivesse estudado, nada ocorreria? Na programação, nós tratamos dessa sintaxe com o else. O else é simplesmente a negação do if, se a construção do operador if retorna falso, então o que estiver atribuído ao else será executado. Vamos completar a frase: E nosso código fica assim: if false then (...) -- não será executado else (...) -- será executado end Note que: O else não precisa de then. Como ele é a negação do if, ele "meio que" se aproveita do then e end do if. E por último, temos o controlador elseif, ele é bem simples, é usado quando você tem muitos outros blocos para outras várias condições. Mas os blocos ligados ao elseif só irão ser executados quando o bloco do if retornar falso, parecido com o funcionamento do else. if false then (...) -- não será executado, temos false no if elseif true then -- será executado temos true aqui (...) end Note que: O elseif precisa de then igual ao if, mesmo que seja auxiliar ao if, ele é uma condição totalmente diferente. Ele só não precisa do end. Finalizamos por aqui- Quiz NPC
QUIZ Fala, grande reino! Tudo beleza? Eu estava aqui a deriva, sem nada para fazer, quando um colega me chamou no msn e pediu para eu revisar um código que ele havia feito para um NPC. A função era bem simples, o tal NPC iria fazer perguntas ao jogador que devia responder-las corretamente, caso errasse, duas criaturas configuráveis iriam aparecer. Quando eu dei uma olhada no código, tomei um grande susto, era algo caótico, tudo embaralhado. Se você quer dar uma olhada, tenha certeza de ter um coração forte. Claro que eu, como scripter, não podia deixar algo tão caótico reinar sobre os servidores alheios. Decidi então apagar tudo, recriar o NPC do zero, preservando a função que ele deveria desempenhar. Veja abaixo! INSTALAÇÃO E CONFIGURAÇÃO data/npc/scripts --[[ NPC de Perguntas e Respostas Criado por Bruno Lopes / Lpz © 2011 TibiaKing ]]-- local focuses = {} local talk_start = 0 local topic = {} local var = 0 local quiz = { [1] = {"What is the ring of mana?", "energy ring"}, [2] = {"Who sells addons?", "raphael"} } local monster = {"Orc", 2} local prize = { question = 100, all = 10000 } function onCreatureSay(cid, type, msg) local msg = msg:lower() or "" if getNpcDistanceTo(cid) > 3 then return false end if doMessageCheck(msg, {"hi", "hello"}) and not(isFocused(cid, focuses)) then selfSay("Hello, ".. getCreatureName(cid) ..". Can you answer my questions? heh...", cid) addFocus(cid, focuses) selfFocus(cid) topic[cid] = 100 talk_start = os.clock() elseif doMessageCheck(msg, {"hi", "hello"}) and #focuses ~= 0 then selfSay("Sorry, ".. getCreatureName(cid) ..". I am talking with another person, wait!", cid) end if doMessageCheck(msg, {"bye", "farewell", "goodbye"}) and isFocused(cid, focuses) then selfSay("Bye-bye, hehe!", cid) removeFocus(cid, focuses) end if topic[cid] == 100 then if doMessageCheck(msg, "yes") then selfSay("To start my challenge, just say {ready}. I will ask you some questions.", cid) topic[cid] = 1 elseif doMessageCheck(msg, "no") then selfSay("Huh? Why are you here then?", cid) removeFocus(cid, focuses) topic[cid] = 0 end elseif topic[cid] == 1 then if var == 0 then if doMessageCheck(msg, "ready") then var = 1 selfSay(quiz[var][1], cid) end elseif var >= 1 then if var <= #quiz then if doMessageCheck(msg, quiz[var][2]) then selfSay("CORRECT!", cid) doPlayerAddMoney(cid, prize.question) var = var+1 if var > #quiz then selfSay("CONGRATULATIONS! YOU HAVE FINISHED ALL QUESTIONS!", cid) doPlayerAddMoney(cid, prize.all) else selfSay(quiz[var][1], cid) end else selfSay("YOU HAVE WRONG MY QUESTION! GUARDS, COME HERE!", cid) var = 0 topic[cid] = 0 removeFocus(cid, focuses) for i = 1, monster[2] do doCreateMonster(monster[1], getNpcPos()) end end end end end return true end function onThink() for _, cid in ipairs(focuses) do if isPlayer(cid) and isFocused(cid, focuses) then if os.clock() > (talk_start + 180) then talk_start = 0 selfSay("Hmph!") closeShopWindow(cid) removeFocus(cid, focuses) elseif getNpcDistanceTo(cid) > 3 then talk_start = 0 selfSay("How Rude!") closeShopWindow(cid) removeFocus(cid, focuses) end end end lookAtFocus(focuses) end Bom, eu fiz o arquivo .lua que você iria associar a algum npc de seu servidor, deixo o arquivo .xml por sua conta. Como é um NPC que faz perguntas, você pode configurar o seu NPC do jeito que você quiser, com as perguntas que você quiser. Veja abaixo como proceder: local quiz = { [1] = {"What is the ring of mana?", "energy ring"}, [2] = {"Who sells addons?", "raphael"} } Para adicionar novas perguntas, basta você colocar uma vírgula na última linha e criar uma nova linha conforme o modelo: local quiz = { [1] = {"What is the ring of mana?", "energy ring"}, [2] = {"Who sells addons?", "raphael"}, [3] = {"PERGUNTA", "RESPOSTA"}, [4] = {"PERGUNTA", "RESPOSTA"} } Há também algumas outras configurações básicas para você fazer, as criaturas que irão aparecer caso o jogador erre a pergunta e a quantidade. Também você pode configurar a quantidade de dinheiro que o jogador ganha quando acerta uma pergunta e a quantidade de dinheiro do prêmio final. local monster = {"Orc", 2} local prize = { question = 100, all = 10000 } OBSERVAÇÕES Para evitar quaisquer erros no script, substitua o conteúdo de npc.lua em data/npc/lib por este que estou passando abaixo: É isso aê, galerinha do tibiaKing! Até o próximo tópico.- [ Traduzindo ] Inglês para Espanhol
EHUEHEUEHUEHEUEHUEHEUEHUEH eu ri muito agora- Entrar no ot editado
Não é possível, claro. Você baixou um servidor para a versão 8.5x do Tibia, não dá para jogar ele com o seu Tibia que está instalado. Você precisa baixar um servidor de acordo com a versão do seu Tibia ou então baixar um Tibia que se adeque. Para acesso a todas versões do Tibia: http://tibiaclient.com/ Abraço- OTServer pelo hamachi
Tem sim. Mas, preste atenção, ip = "127.0.0.1" Você irá colocar, no campo acima, o ip do seu hamachi e todos que estiverem conectados na sua rede poderão entrar no seu servidor. Se você gostar, dê uma olhada em alguns tutoriais dessa área: Internet Compartilhada. Pois se seu modem é roteado, você poderá desbloquear as portas de conexão e jogo do servidor e não necessitará de Hamachi.- [TalkAction] Teleport
Muito bom, desempenha uma função básica para os servidores, porém foi bem programado. Tenho certeza que com uma simples adição de uma tabela (como você fez no outro script), ele poderá ser simplificado ainda mais. Reputado+- [Action] Recarregar Soft e Firewalker boots
Ótimo, Kimoszin. Gostei muito de você ter utilizado uma tabela no código. Só uma dica que eu tenho pra fazer hehehe doRemoveItem(item.uid, 1) doPlayerAddItem(cid, boots[item.itemid].new, 1) Isso poderia ser substituído por: doTransformItem(item.uid, boots[item.itemid].new) Reputado+- Cadastros do TibiaKing superam 100 num dia
Parabéns, TibiaKing Me orgulho de ter escolhido um fórum desses como "nova casa".- Um novo modo de criar magias?
UM NOVO MODO DE CRIAR MAGIAS? Tudo bem com vocês, grandes tibianos desse reino? Quando eu criava magias, eu sempre notei a quantidade de linhas que uma boa e trabalhada magia adquire ao se finalizar o script. Por um tempinho, estudei como funcionava toda a estrutura e pensei em como criar um único bloco de código para configurar a magia uma vez só. Os spellmakers de plantão comprovam: Se uma magia com vários efeitos e tipos de dano é criada, você precisa criar muitas variáveis locais. Então, resolvi criar uma tabela que tratava essas variáveis locais como indexes e seus atributos como conteúdo de tabelas secundárias. Nascia esse novo modo de programar magias, que parece um tanto versátil e ao mesmo tempo, reduz o tamanho de uma magia. O SCRIPT O script é bem simples, uma tabela bem básica que qualquer criança configura e se diverte e blocos de códigos que, olha que legal, você não precisa mexer. Veja abaixo o novo modelo: local spell = { { damage = COMBAT_ICEDAMAGE, effect = {CONST_ME_ICEATTACK}, formula = {0.2, 3, 0.2, 4.2, 200, 300}, area = createCombatArea({ {0, 0, 0, 0, 0}, {0, 0, 1, 0, 0}, {0, 1, 2, 1, 0}, {0, 0, 1, 0, 0}, {0, 0, 0, 0, 0}}) } } local returnSpell = {} for var, config in ipairs(spell) do returnSpell[var] = createCombatObject() setCombatParam(returnSpell[var], COMBAT_PARAM_TYPE, config.damage) setCombatParam(returnSpell[var], COMBAT_PARAM_EFFECT, (type(config.effect) == "table" and config.effect[1] or config.effect)) if type(config.effect) == "table" and config.effect[2] ~= nil then setCombatParam(returnSpell[var], COMBAT_PARAM_DISTANCEEFFECT, config.effect[2]) end if config.area then setCombatArea(returnSpell[var], config.area) end function getSpellDamage(cid, level, maglevel) local min = ((level*config.formula[1] + maglevel*config.formula[2]) + config.formula[5]) local max = ((level*config.formula[3] + maglevel*config.formula[4]) + config.formula[6]) return -min, -max end setCombatCallback(returnSpell[var], CALLBACK_PARAM_LEVELMAGICVALUE, "getSpellDamage") end function onCallCombat(parameters) return doCombat(unpack(parameters)) end function onCastSpell(cid, var) if #returnSpell > 1 then for i = 1, #returnSpell do addEvent(onCallCombat, (i*280)+32, {cid, returnSpell[i], var}) end else doCombat(cid, ret[1], var) end return true end Parece que eu compliquei tudo, né? Pois bem, finja que você não vê nada aí, apenas essa tabela abaixo: local spell = { { damage = COMBAT_ICEDAMAGE, effect = {CONST_ME_ICEATTACK}, formula = {0.2, 3, 0.2, 4.2, 200, 300}, area = createCombatArea({ {0, 0, 0, 0, 0}, {0, 0, 1, 0, 0}, {0, 1, 2, 1, 0}, {0, 0, 1, 0, 0}, {0, 0, 0, 0, 0}}) } } Aqui que você irá configurar sua magia, como ela vai funcionar, que área que ela irá atingir e etcétera. Vou comentar cada linha da tabela para que você entenda: local spell = { { damage = COMBAT_ICEDAMAGE, effect = {CONST_ME_ICEATTACK}, formula = {0.2, 3, 0.2, 4.2, 200, 300}, area = createCombatArea({ {0, 0, 0, 0, 0}, {0, 0, 1, 0, 0}, {0, 1, 2, 1, 0}, {0, 0, 1, 0, 0}, {0, 0, 0, 0, 0}}) } } Sobre a fórmula, você não precisa mais ter dor de cabeça como você vai diminuir o dano da sua magia e etcétera. Veja o quê cada número significa abaixo: formula = {MIN_LEVEL, MIN_MAGLEVEL, MAX_LEVEL, MAX_MAGLEVEL, MIN_OFFSET, MAX_OFFSET} min = (level*MIN_LEVEL + maglevel * MIN_MAGLEVEL) + MIN_OFFSET max = (level*MAX_LEVEL + maglevel * MAX_MAGLEVEL) + MAX_OFFSET E sobre a área, você pode usar áreas pré-configuras naquele arquivo spells.lua dentro de spells/lib, assim você diminuirá ainda mais o código. area = createCombatArea(AREA_BEAM4) Se a magia for do tipo "strike", você pode configurar o efeito de distância assim: effect = {CONST_ME_ICEATTACK, CONST_ANI_ICE} Para criar uma magia com múltiplos danos, basta duplicar, triplicar, conforme sua necessidade a sub-tabela dentro da tabela principal - atenção - não esqueça de separar as várias subtabelas com uma vírgula, por exemplo: local spell = { { damage = COMBAT_ICEDAMAGE, -- O tipo de dano effect = {CONST_ME_ICEATTACK}, -- Os efeitos da magia formula = {0.2, 3, 0.2, 4.2, 200, 300}, -- A formula de dano da magia area = createCombatArea({ -- Area da magia {0, 0, 0, 0, 0}, {0, 0, 1, 0, 0}, {0, 1, 2, 1, 0}, {0, 0, 1, 0, 0}, {0, 0, 0, 0, 0}}) }, -- virgula { damage = COMBAT_ICEDAMAGE, -- O tipo de dano effect = {CONST_ME_ICEATTACK}, -- Os efeitos da magia formula = {0.2, 3, 0.2, 4.2, 200, 300}, -- A formula de dano da magia area = createCombatArea({ -- Area da magia {0, 0, 0, 0, 0}, {0, 0, 1, 0, 0}, {0, 1, 2, 1, 0}, {0, 0, 1, 0, 0}, {0, 0, 0, 0, 0}}) } } [/code] [size=3][font=tahoma,geneva,sans-serif]Essa é uma magia com dois hits de gelo, se você entendeu todo o tópico [/font][/size] [size=3][font=tahoma,geneva,sans-serif][hr][/font][/size] [size=4][b][font=tahoma,geneva,sans-serif]CONCLUSÃO[/font][/b][/size] [size=3][font=tahoma,geneva,sans-serif][hr][/font][/size] [size=3][font=tahoma,geneva,sans-serif]Eu reconheço que esse novo modelo parece um pouco inútil e estranho, mas ele foi criado com intuíto de otimizar magias com múltiplos efeitos e tipos de dano.[/font][/size] [size=3][font=tahoma,geneva,sans-serif]Até o próximo tópico, abraços.[/font][/size] [size=3][font=tahoma,geneva,sans-serif][hr][/font][/size]- Aula I - Introdução a Programação LUA
INTRODUÇÃO A PROGRAMAÇÃO Lua Olá, se você está aqui lendo essa aula, provavelmente é porque abriu aqueles arquivos estranhos da pasta do seu servidor e viu uns escritos místicos que você não conseguiu entender. Primeiro, você tentou mexer naqueles escritos e - BOOM! - as quests do seu servidor começaram a dar erros, as poções do jogo começaram a ficar desequilibradas, magias começaram a ficar "apelonas" e, enfim, seu servidor foi para o espaço. Aqui nesse conjunto de aulas, você aprenderá a milenar arte de programar scripts e sua única ferramenta será a linguagem LUA. No fim delas, você poderá bater no peito e falar, eu sou um scripter. SCRIPTING? SCRIPTS? Antes de mais nada, você precisa entender o que é scripting e o que são scripts. Scripting é, nada mais, o ato de programar em uma certa linguagem. Já scripts são blocos de código escritos nessa linguagem, que, através de um interpretador, são lidos e... bem... interpretados. Essa certa linguagem é a Lua, uma potente ferramenta de programação, que oferece recursos e suporte para orientação a objetos ou dados, como também programação funcional. Por ser de fácil utilização e entendimento, a linguagem LUA foi implementada como uma biblioteca ao código C++ do projeto Open Tibia. O QUE EU PRECISO PARA SER SCRIPTER? Muita gente acha dá de cara com os obstáculos e, pronto, desiste. Isso é um dos "defeitos" que você deve abrir mão, se quiser ser um futuro programador. Você deve ter força de vontade e determinação, olhar para a linguagem e falar: "Eu sou foda e vou fazer isso funcionar". Além disso, você precisa ter paciência, nem sempre você vai conseguir entender os mais difíceis conceitos e estruturas, quando isso ocorre, você deve ter garra e tirar suas dúvidas. Nem sempre você vai pegar um bloco vazio, escrevinhar um código e ele vai funcionar do jeito que você queria e, por isso, você não pode desanimar e/ou desistir. Um scripter também precisa ter criatividade e muita vontade, a primeira para ter ideias e a segunda para concluir e tornar essa ideia real. Você acha que vai ter a ideia, olhar para a tela do computador e sem cansar a mão de tanto escrever, a ideia vai surgir pronta? Não mesmo. E, por fim, você precisa de ferramentas, não é? Afinal, o que é um técnico sem suas ferramentas de trabalho. Lua necessita de um interpretador que leia seus scripts e, entendendo, execute as funções programadas nele, para isso você já tem um interpretador e ele é seu próprio servidor. Como disse antes, o código do projeto Open Tibia, tem bibliotecas Lua, o que faz do executável um interpretador. E você irá precisar de uma ferramenta para escrever o código, para isso, recomendo o Notepad++, que possui suporte a Lua. CONCLUSÃO Essa aula termina aqui, ela é curta, pois introduz apenas os conceitos básicos, afinal, você não quer ler um pequeno artigo e se tornar o melhor, melhor do mundo em programar scripts, certo? Na próxima aula, juntos iremos aprender que a programação tem uma certa lógica entre-linhas, criaremos um algoritmo e com a apresentação detalhada de algumas estruturas léxicas, iremos criar nosso primeiro script! Bem-vindo ao mundo do scripting, padawan!- ENEM 2011
Nem vou fazer, esse ano estou bem preparado e só irei prestar Fuvest e Unicamp Boa sorte a todos que irão prestar ENEM, é uma prova cansativa e desgastante, exige muita concentração. São textos longos e muitas das vezes, você nem precisa ler, pois as alternativas incorretas estão muito "na cara".- Votação Mophus x Ferlations
Mophus- Oibls///
- #1 Desmembrando seu Script
Creio que você não está ensinando a programar scripts, você está desmembrando um código já pronto e explicando as partes dele. Assim, quando alguém tiver uma ideia de script, não conseguirá desenvolver-la, pois só conseguirá ter esse modelo fixo em mente. No entanto, obrigado pela contribuição ao fórum. Reputação+- [MOD] Reflect System 0.1
- [MoveEvent] Portal para virar morador
Seu script ficou bem desenvolvido, conseguiu fazer algo interativo, de modo que o dono de um servidor precise apenas colocar um actionid no portal. Recomendo adicionar uma função para verificar se a cidade existe antes de efetuar todo o resto do escopo. Observação: Dê uma revisada no código postado no tópico, pois a formatação trouxe alguns erros. - [Aula I] Conceitos básicos de C
Informação Importante
Confirmação de Termo