Jump to content

Leaderboard


Popular Content

Showing content with the highest reputation since 09/13/20 in all areas

  1. 5 points
    iluargrott

    [Pedido] SPRITES MAIORES

    Veio se discutindo ao longo do tempo várias possibilidades de aumento de sprites no OTClient, com IA, alterar os programas Remeres, OTitem, Object builder. Porém todas essas modificações necessitaria uma equipe para dar suporte aos erros futuros e presentes que vieram se apresentando a todos aqueles que realizavam todas estas modificações. Em contato com o editor do ObjectBuilder e Remeres para 64x64, 96x96, ele mesmo disse que pela presença de erros, não valeria à pena investir num servidor com estes aumentos de sprites. Então como brasileiro, imaginei uma possível gambiarra. Segue abaixo, o meu pedido 😃 Este seria um sistema para a analise de movimento do personagem/criaturas. Como todos sabem o tibia tem um "hitbox"/square de movimento de 32x32. Este square impede que o player suba em outro square de 32x32 que seja "sólido" ou que esteja marcado para não ser passado por cima, ex: Pedras, agua, bordas, parede, porta fechada, caule da arvore, outro square de player. Porém qualquer imagem que ultrapasse os 32x32 na linha de baixo, corre o grande risco de sair "atropelando" em cima de objetos, player e etc. Sendo assim, imaginei a possibilidade de algum script que averiguasse o movimento das criaturas/players, checando se nos 32x32 aos arredores do player há algum objeto que não seja passável, assim forçando-o a não "pisar" em cima deste. ex: Como pode ser visto, a região mais escura de cada "demon" seria o limitador de movimento, como um sqm à esquerda há outro demon ,ele não poderia se mover para a esquerda, pois teria um "obstaculo". Esse limitador seria apenas para movimentos. Com esse sistema, o uso de sprites maiores sem o grande erro de atropelar alguém / objetos, o uso de sprites maiores para projetos alternativos sairia muito mais " limpo. Estou utilizando TFS 1.2, mas qualquer servidor está valendo para conseguir esta benção de sistema para aumentar a qualidade dos gráficos de um projeto alternativo. Deixo aqui este pedido para alguma alma generosa que queira auxiliar o desenvolvimento de novos jogos com sprites maiores Obrigado pela sua atenção,
  2. 4 points
    Transformar Modelos 3d em Sprites 2d p45 Créditos pelo tutorial: OtavioGFL (ele que me ensinou) Antes de tudo, pra isso funcionar, você vai precisar de: - Blender - Arquivo contendo as configurações para perspectiva 45 graus: perspective_45 by OtavioGFL.blend - Modelos: Você encontra diversos tipos de modelos 3d no Deviant Art e em outros sites. Pesquise EXEMPLO model + o formato => mmd, xna e dae. (mmd e xna precisa usar addon pra importar, neste tutorial trabalharei com o formato .dae) 1 - Abra o arquivo perspective 45 by OtavioGFL no blender. 2 - Vá em arquivo -> importar -> Collada (.dae) e selecione o modelo baixado. 3 - Vai abrir como na imagem abaixo, clique em Modificar Propriedades: 4 - Clique em Adicionar Modificador: 5 - Seleciona a modificação Treliça: 6 - Agora clique em Objeto: 7 - Selecione Lattice dentro de Objeto: 8 - O modelo de boneco 3d está em perspectiva 45 graus e pronto para ser convertido, veja a imagem abaixo, agora vamos para o próximo passo que é modificar tamanho, rotação, partes do corpo, etc. E em seguida finalizar a conversão. 9 - Para mudar o tamanho, selecione os bones (clique exatamente na ponta da flecha amarela), e pressione a tecla S: 10 - Para mover peças ou partes do corpo e fazer outras alterações use diferentes tipos de Object Mode, eles ajudam na seleção dos bones (selecione com o botão esquerdo). Para visualizar melhor os bones e saber quais mover, continue abaixo: 11 - Mudar visualização do modelo (camera): 12 - Visualização e gerenciamento de arquivo O boneco está pronto para ser convertido, pressione F12: Resultado Final: Se quiserem testar com o modelo que eu usei está abaixo: NTBSS_Orochimaru.rar
  3. 4 points
    WooX

    Zombie Event [DIFERENCIADO]

    Zombie Event Zombie Event é um evento já muito conhecido em que os participantes são jogados em uma arena e zombies são invocados até que reste apenas um jogador, quando um jogador é tocado por um zombie ele é teleportado para o templo, o ultimo jogador a ficar na arena é definido como vencedor e o evento é finalizado ai. Já faz um bom tempo que tive a ideia de mudar o funcionamento deste tradicional evento e finalmente decidi por a mão na massa, irei explicar melhor o que foi alterado abaixo. Sobre o sistema O sistema foi testado apenas em OTX2, mas provavelmente também funcione em TFS 0.4 Pra quem quiser esse evento funcional para TFS 1.x, o @Movie se comprometeu a fazer a adaptação, então podem mandar mensagem privada pra ele cobrando que ele gosta. Quem é familiar com filmes e séries de zombies sabe que quando um zombie morde alguém a pessoa que foi mordida não simplesmente morre, mas ela se torna um zombie, é isso que torna a ideia de um apocalipse zombie tão aterrorizante. Pensando nisso eu tive a ideia de alterar o sistema pra que quando algum player fosse pego por um zombie ele também se transformasse em um e não fosse simplesmente teleportado para o templo. Essa alteração deixa a interação entre os jogadores no evento mais dinâmica pois eventualmente se torna um jogo de Player vs Player ao invés de Player vs Maquina, embora no fim continue sendo uma batalha entre vivos e mortos. Irei listar abaixo mais algumas características do evento. É possivel configurar para que seja permitido ou não o uso de MCs. Todos os jogadores ao entrar na arena ficam com a mesma velocidade. Para tornar mais competitivo e divertido, não é permitido utilizar a função Follow dentro do evento. O jogador que foi transformado em zombie que mais contaminar outros jogadores também recebe uma recompensa. Os jogadores que forem transformados em zombies podem subir de rank conforme forem contaminando outros jogadores, alterando assim sua aparência e velocidade na arena. Vídeozinho Instalação Este sistema utiliza de funções contidas na lib do link abaixo, então antes de mais nada é necessário adicionar esta lib no servidor. Todos os arquivos necessários para instalação do evento estão anexados no tópico, irei apenas mostrar como deve ser configurado. Toda configuração do sistema se encontra na lib do mesmo, segue abaixo explicação de como configurar. startTime: configuração de horários para inicio do evento a depender do dia da semana (para cada horário diferente definido aqui um registro extra é necessário no globalevents.xml) announcement: mensagem a ser exibida quando o teleporte para o evento for aberto. startEvent: mensagem a ser exibida quando o teleporte para o evento for fechado e o evento iniciado. playerBitten: mensagem a ser exibida quando um jogador for mordido por um zombie. endEvent: mensagem a ser exibida quando o evento for finalizado. notEnoughPlayers: mensagem a ser exibida quando não houver players suficiente para o evento. zombiesRant: falas que serão randomicamente selecionadas para um jogador que foi transformado em zombie falar. minOnlinePlayers: define a quantidade minima de jogadores online para o teleporte do evento ser aberto. minPlayers: define a quantidade minima de jogadores na arena para o evento ser iniciado. closeTeleportTime: tempo para fechar o teleporte após o anuncio (o valor deve ser definido em minutos). countDownTime: tempo para iniciar o evento após o fechamento do teleporte (o valor deve ser definido em segundos). zombieRatio: define a quantidade inicial de zombies baseado na quantidade de jogadores participando do evento. playerSpeed: define a velocidade que o jogador terá durante o evento (valido apenas para jogadores que não foram transformados em zombies). delayToTransform: define o intervalo para um jogador que foi mordido se transformar em um zombie (o valor deve ser definido em segundos). allowMultiClient: pode ser definido como true ou false, se definido como falso não irá permitir a entrada de jogadores com o mesmo IP no evento. rewards: define as recompensas a serem entregues tanto para o ultimo sobrevivente na arena como para o zombie que mais contaminar outros jogadores. zombiesRank: define os ranks dos zombies, a quantidade de pontos necessária para avançar de rank, aparência e velocidade (valido apenas para jogadores que foram transformados em zombies). area: define a área onde ocorrerá o evento, deve ser preenchido as coordenadas do ponto superior-esquerdo, ponto inferior-direito e o andar do local. teleportAid: define a actionID a ser adicionado no teleporte de entrada do evento (este valor deve ser o mesmo a ser registrado na tag XML do script de movements). teleportPos: define as coordenadas onde deve ser criado o teleporte de entrada para o evento. Créditos event zombie.xml lib_zombie.lua zombieEvent.lua zombieEvent_creature.lua zombieEvent_movement.lua
  4. 3 points
    Yinz

    Hati New AAC

    Hey lindões, o projeto tá andando ein! Ainda falta muita coisa, parece que cada funcionalidade me toma um milhão de dias! A gente que já viu muitos AACS, colocou vários servidores on, nem imagina o quão trabalhoso é né? Tenho visto muitos conceitos, adicionar um Blog dentro de um site, adicionar reações igual do facebook, instagram, como Curtir, Comentários, tem sido uns desafios p mim, masssssss tá fluindo! vou deixar uma screen aqui, de uma das alterações que fiz esses dias; ainda tenho que trabalhar na parte visual do outfiter, pretendo fazer meu proprio sistema, pois todo mundo usa do gesior, que é em php e tals. mas é isto!
  5. 3 points
    xWhiteWolf

    Volatile Spiderling

    Fala galera do TK, hoje eu venho mais uma vez trazer uma das magias mais incríveis que eu já vi até hoje (sério). A magia original foi feita em outro fórum mas para a versão 10.1... como eu vi que ninguém conseguiu adaptar pra versões inferiores eu decidi criar a minha própria volatile spiderling. Confesso que no começo eu tive muita dificuldade em achar as funções certas mas depois de tentar ajudar o membro @234567890z no suporte eu tive uma epifania. Sem mais delongas eu vou explicar oque o script faz e em seguida ensinar a colocá-lo no seu server. • Explicação: A magia foi feita baseada na personagem Elise do jogo League of Legends: você faz uma cria que anda até os oponentes e se explodem causando dano em area e deixando eles envenenados. Aqui tem um gif da magia funcionando obs: note que esse gif não fui eu que fiz mas ele demonstra exatamente como a magia funciona. • Instalação: Pra instalá-lo no seu servidor vai ser um pouco complicado pois ele requer diversas modificações... antes de mais nada, coloque essas linhas no seu spells.xml: <instant name="Volatile Spiderling" words="utevo res tera" lvl="40" mana="20" prem="1" selftarget="1" exhaustion="2000" groups="1,2000" icon="88" needlearn="0" event="script" value="especiais/spiderling.lua"> <vocation id="3"/> <vocation id="7"/> </instant> <instant name="poison explosion" words="poison explosion" lvl="0" mana="0" prem="0" aggressive="1" exhaustion="3000" needlearn="1" event="script" value="especiais/newspider.lua"> </instant> Agora você vai ter que criar os dois arquivos na pasta spells\scripts\especiais. Em newspider.lua coloque o seguinte: agora em spiderling.lua coloque o seguinte: Agora feito isso vc vai precisar criar o monstro que usará essa spell.. vá em monster\monsters.xml e adicione a seguinte linha: <monster name="Clone Spider" file="arachnids/newspider.xml"/> agora crie o arquivo data\monsters\arachnids\newspider.xml e adicione o seguinte nele: local poisonpowder = createConditionObject(CONDITION_POISON) setConditionParam(poisonpowder, CONDITION_PARAM_DELAYED, 1) local damageTable = { {4, -3}, {9, -2}, {20, -1} } for i = 1, #damageTable do local t = damageTable[i] addDamageCondition(poisonpowder, t[1], 4000, t[2]) end local arr = { {0, 1, 0}, {1, 3, 1}, {0, 1, 0} } local area = createCombatArea(arr) function onPrepareDeath(cid, deathList) if isMonster(cid) and getCreatureName(cid):lower() == 'clone spider' then doAreaCombatHealth(cid, 1, getThingPos(cid), area, -1, -30, 20) doAreaCombatCondition(cid, getThingPos(cid), area, poisonpowder, 255) doSendMagicEffect(getThingPos(cid), 16) end return true end Agora eu vou ensinar vocês a editarem... não tem muito oque mudar, apenas se vc quiser alterar os danos da spell vá em newspider.lua e será possível editar os danos do poison e da explosão: local damageTable = { {4, -3}, {9, -2}, {20, -1} } aqui você muda quantos danos serão e quanto cada um tirará.. no caso serão 4 hits de -3, depois 9 hits de -2 e por fim 20 hits de -1 até o poison parar. Lembrando que esses danos saem de 4 em 4 segundos. Se você quiser que eles sejam mais rápidos é só editar aqui: addDamageCondition(poisonpowder, t[1], 4000, t[2]) (4000 significa 4 segundos). Feito isso será possível editar também a area e o dano da explosão respectivamente em: Area: Dano: doAreaCombatHealth(cid, 1, getThingPos(cid), area, -1, -30, 20) Em vermelho temos o dano mínimo, analogamente, em azul, temos o dano máximo. Em verde é possível editar o efeito da explosão Só lembrando que as edições que forem feitas no newspider.lua devem ser feitas no spider.lua para que a magia tenha graça.. se não o dano da explosão/poison ao explodir será diferente caso ela morrer antes. Em spiderling.lua vc pode editar a quantidade máxima de crias que um player pode ter... o normal está setado para 2 mas vc pode sentir-se livre pra colocar quantas queira. local maxsummon = 2 (Só lembre-se que ao explodir uma aranha pode acertar outra então não é muito bom deixar um numero maior que 3); Se você for daqueles bem chatinhos com a magia você ainda pode editar algumas coisas importantes tais como: O efeito que sai quando ela explode por morte ou pela spell: doSendMagicEffect(getThingPos(cid), 16) O tempo em que ela executa a spell, a chance da spell sair naquele tempo e quantos sqm de distancia a criatura alvo deve estar pra aranha se explodir: <attack name="poison explosion" interval="1000" range="1" chance="50"/> interval = de quantos em quantos segundos ela executa a spell range = distancia em sqm que o alvo deve estar pra que ela execute a spell chance = chance de executar a spell a cada interval (nesse caso a cada 1 segundo tem 50% de chance dela soltar a magia) Você ainda pode editar aqui em vermelho: o tempo que leva pra criatura executar a magia.. Por padrão eu deixei 2 segundos, ou seja... eu sumono a aranha, ela vai até o alvo e a cada segundo q ela passa grudada no alvo (1 sqm de distancia) ela tem 50% de chance de ativar a spell e ficar parada no lugar durante 2 segundos até explodir. Se você quiser que ela leve menos tempo pra explodir é só baixar o 2000 (em milisegundos).. Se você quiser aumentar o dano e deixar ela parada por mais tempo até explodir pode editar a vontade aumentando os 2000. • Bom, isso é tudo que dava pra eu explicar... é óbvio que dá pra editar muito mais coisa mas se você não é scripter e não tem muita idéia de como editar eu dei uma ensinada básica doque você está autorizado a mexer. Espero que vocês curtam a spell e deem aquele REP+ pra fortalecer kkkk Eu não pretendia liberar essa spell visto que ela é extremamente complexa e nenhum servidor tem ela, mas, acho que seria muito babaca da minha parte ficar guardando um script tão bonito hahaha. Qualquer erro ou dúvida postem nos comentários que eu tento ajudar. ah, mais uma coisa: Os créditos são 90% meus visto que eu fiz praticamente tudo.. 9% é pro cara que fez a magia original (se vcs derem uma procurada vcs vão ver que não tem quase nada a ver com a minha mas os créditos dele são por ele ter me dado a idéia) e 1% pro cara no suporte que me pediu ajuda numa spell do mesmo gênero e me fez correr atrás de uma forma de fazer essa magia pra versões inferiores a TFS 1.0
  6. 3 points
    Cjaker

    Tibia 8.60 Editor

    Heyo, desenvolvi uma ferramenta pra facilitar na criação de um cliente 8.60 customizado. > As funcionalidades do software estão visíveis na imagem desse tópico. Tutorial: extraia o arquivo pra qualquer diretório, abra o executável 'Tibia86Editor.exe', dentro do software selecione o executável do seu Tibia 8.60 (tem que ser original da CipSoft), selecione um ícone (formato .ico), marque a caixa 'Edit IP' e preencha o seu IP ao lado. Existem também outras opções oferecendo maior liberdade de customização Não testei todas as opções em um servidor online, sinta-se à vontade pra reportar quaisquer problemas nesse tópico. [Imagem] [Download] Tibia 8.60 Editor.zip Scan: https://www.virustotal.com/gui/file/94502bf5a279ef5c567360adb8a7f38885bf0ca96b47574c8bbe2c9475fb7ba9/detection
  7. 3 points
    0,4 @EDIT Salve galera, consegui resolver soozinho. Para quem tiver o mesmo problema faça o seguinte.... 1) mude para 'db.query' no lugar de db.executeQuery 2) exclua seu z_ots_comutication e execute isso no Sql E Na Sua DATABABE exclua sua tabela z_ots_comunication e adicione esta -- phpMyAdmin SQL Dump -- version 4.2.11 -- http://www.phpmyadmin.net -- -- Host: 127.0.0.1 -- Generation Time: 08-Jan-2015 às 02:48 -- Versão do servidor: 5.6.21 -- PHP Version: 5.5.19 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; -- -- Database: `global` -- -- -------------------------------------------------------- -- -- Estrutura da tabela `z_ots_comunication` -- CREATE TABLE IF NOT EXISTS `z_ots_comunication` ( `id` int(11) NOT NULL, `name` varchar(255) NOT NULL, `type` varchar(255) NOT NULL, `action` varchar(255) NOT NULL, `param1` varchar(255) NOT NULL, `param2` varchar(255) NOT NULL, `param3` varchar(255) NOT NULL, `param4` varchar(255) NOT NULL, `param5` varchar(255) NOT NULL, `param6` varchar(255) NOT NULL, `param7` varchar(255) NOT NULL, `delete_it` int(2) NOT NULL DEFAULT '1' ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1; -- -- Indexes for dumped tables -- -- -- Indexes for table `z_ots_comunication` -- ALTER TABLE `z_ots_comunication` ADD PRIMARY KEY (`id`); -- -- AUTO_INCREMENT for dumped tables -- -- -- AUTO_INCREMENT for table `z_ots_comunication` -- ALTER TABLE `z_ots_comunication` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=2; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
  8. 2 points
    Caso o do amigo acima não funcione, teste com esse: local voc = {716, 717, 718, 719, 720, 721, 722, 723, 724, 725} -- ID das vocações que poderão usar o Pergaminho. local corpse = {3058} local id = 26684 -- Id do edo pergaminho local edo = { ["[EDO TENSEI] Anbu"] = {hp = 50000, maxhp = 50000, corpse = 3058, chance = 100}, -- Nome do Edo, HP do Edo quando summoned, max hp do edo , corpo do edo, chance de falhar. } function onUse(cid, item, frompos, item2, topos) if(not(isInArray(voc, getPlayerVocation(cid)))) then return doPlayerSendTextMessage(cid, 25, "Voce nao tem a vocacao nescessaria") end if(not(isInArray(corpse, item2.itemid))) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_DEFAULT, "voce precisa usar o pergaminho em um corpse") doSendMagicEffect(getThingPos(cid), 21) return true end local perga = doPlayerAddItem(cid, id, 1) for edo_tensei, v in pairs(edo) do if item2.itemid == v.corpse then if math.random(0,100) <= v.chance then doSendMagicEffect(getThingPos(cid), 21) doPlayerSendTextMessage(cid, 27, "".. edo_tensei .. " foi selado nesse pergaminho.") doRemoveItem(item.uid, 1) doRemoveItem(item2.uid, 1) doItemSetAttribute(perga, "namepet", edo_tensei) doItemSetAttribute(perga, "description", "Neste pergaminho foi selado um ".. edo_tensei ..".") doItemSetAttribute(perga, "lifepet", v.hp) doItemSetAttribute(perga, "maxlifepet", v.maxhp) else doPlayerSendTextMessage(cid, 27, "O pergaminho falhou") end end end return true end
  9. 2 points
    FlameArcixt

    Arcixt Freelance Mapping

    [BR] Opá pessoal, venho aqui anunciar meu serviço de mapping, trabalho a 5 anos na area, trabalho com todas versoes, derivados ou não. [US] Hey guys, I’m here to announce my mapping service, I’ve been working for 5 years in the field, I work with all versions, derivatives or not. Discord: Arcixt#1329 Whatsapp: +55 54 99912-3282 Facebook Page: www.facebook.com/ArcixtMapping Portofolio Academia de mapping: https://discord.gg/rHQP8dj
  10. 2 points
    Fala pessoal, como vocês estão? Na academia de codding um usuário pediu ajuda para montar um "gerenciador" de quests, para que todas ficassem no mesmo arquivo sem ficar com aquele "spam" de quests nas actions. Esse script foi feito para a TFS 1.X mas, usando a lib do @Mathias Kenfi, você consegue utilizar para TFS 0.X também. O link para as libs: https://github.com/kenfi2/KenfiLib Na pasta actions/scripts crie um arquivo chamado quests.lua config = { quests = { [7172] = { -- ActionID que será colocado no baú name = "dos Crystal Coins", -- Nome da quest rewards = { {id = 2160, count = 100}, -- Prêmio: ID - Count }, level = { active = true, -- Level minimo para pegar? min = 150, -- Se true, qual o minimo }, storage = { active = true, -- Player poderá pegar somente uma vez? key = 91143, -- Apenas uma key por quest }, effectWin = 30, -- Efeito que vai aparecer quando fizer a quest }, [7171] = { -- ActionID que será colocado no baú name = "dos Coins", -- Nome da quest rewards = { {id = 2160, count = 100}, -- Prêmio: ID - Count {id = 2152, count = 100}, -- Prêmio: ID - Count }, level = { active = true, -- Level minimo para pegar? min = 150, -- Se true, qual o minimo }, storage = { active = true, -- Player poderá pegar somente uma vez? key = 91140, -- Apenas uma key por quest }, effectWin = 29, -- Efeito que vai aparecer quando fizer a quest }, }, messages = { notExist = "Essa quest não existe.", win = "Você fez a quest %s.", notWin = "Você já fez a quest %s.", level = "Você precisa de level %d ou maior para fazer a quest %s.", }, } function onUse(cid, item, fromPosition, target, toPosition, isHotkey) local player = Player(cid) local choose = config.quests[item.actionid] if not choose then player:sendCancelMessage(config.messages.notExist) player:getPosition():sendMagicEffect(CONST_ME_POFF) return true end if choose.level.active and player:getLevel() < choose.level.min then player:sendCancelMessage(config.messages.level:format(choose.level.min, choose.name)) player:getPosition():sendMagicEffect(CONST_ME_POFF) return true end if choose.storage.active and player:getStorageValue(choose.storage.key) >= 0 then player:sendCancelMessage(config.messages.notWin:format(choose.name)) player:getPosition():sendMagicEffect(CONST_ME_POFF) return true end for i = 1, #choose.rewards do player:addItem(choose.rewards[i].id, choose.rewards[i].count) end player:setStorageValue(choose.storage.key, 1) player:sendCancelMessage(config.messages.win:format(choose.name)) player:getPosition():sendMagicEffect(choose.effectWin) return true end Para configurar é só utilizar ler os comentários deixados e para adicionar mais quests apenas use o mesmo padrão que deixei aí Utilize a tag no actions.xml desse forma <action fromaid="7171" toaid="7172" script="quests.lua" /> Sendo que o "fromaid" é a actionid inicial, e o "toaid" é a última actionid registrada no arquivo. Qualquer problema, relate nesse tópico.
  11. 2 points
    L3K0T

    Teleporte Summon tfs 0.3.6

    TUTORIAL - TELEPORTE SUMMON Introdução: Fala pessoal, hoje vim aqui liberar um código para que futuros criadores de pokemon não usem GLOBALEVENTS ou MOVEMENTS para teleportar seus pokemons a distancia... hoje irei ensinar a você não usar mais esses scripts que aonde da maioria da vezes crash o servidores em WINDOWS em testes. Sobre o Sistema: Esse sistema tem a função de teleportar seu pokemon a certos sqm, tipo assim, você tem um pokemon e a distancia dele é 7 sqm, ao passar os 7 sqm ele teleporta para você, seja em qualquer lugar até de baixo da terra ou lugares super longe (Não se preocupe o problema do pokemon Morrer com source novas será removido e assim ele não vai morrer) Creature.cp Tutorial: Vá em sua source procure por creature.cpp e abra com algum editor de texto e ache: if(!summons.empty()) { std::list<Creature*>::iterator cit; std::list<Creature*> despawnList; for(cit = summons.begin(); cit != summons.end(); ++cit) { const Position pos = (*cit)->getPosition(); if((std::abs(pos.z - newPos.z) > 2) || (std::max(std::abs(( newPos.x) - pos.x), std::abs((newPos.y - 1) - pos.y)) > 30)) despawnList.push_back((*cit)); } for(cit = despawnList.begin(); cit != despawnList.end(); ++cit) g_game.removeCreature((*cit), true); } Mude para: /*if(!summons.empty()) { std::list<Creature*>::iterator cit; std::list<Creature*> despawnList; for(cit = summons.begin(); cit != summons.end(); ++cit) { const Position pos = (*cit)->getPosition(); if((std::abs(pos.z - newPos.z) > 2) || (std::max(std::abs(( newPos.x) - pos.x), std::abs((newPos.y - 1) - pos.y)) > 30)) despawnList.push_back((*cit)); } for(cit = despawnList.begin(); cit != despawnList.end(); ++cit) g_game.removeCreature((*cit), true); }*/ Agora salve ctrl+s e feche. Monster.cpp Tutorial: Agora procure por Monster.cpp e ache: void Monster::onThink(uint32_t interval) abaixo de: if(teleportToMaster && doTeleportToMaster()) teleportToMaster = false; coloque: if(getMaster()){ if(!Position::areInRange<6,6,0>(getPosition(), getMaster()->getPosition())) doTeleportToMaster(); } salve ctrl+s e revompila no modo rebuilde não esqueça de habilitar as opções em config.lua -- Summons maxPlayerSummons = 1 teleportAllSummons = true teleportPlayerSummons = true lembre se de remover qualquer scripts que teleporta seu pokemon a distancia. Créditos: By L3K0T
  12. 2 points
    L3K0T

    Teleporte Summon tfs 0.3.6

    /*if(!summons.empty() && (!g_config.getBool(ConfigManager::TELEPORT_SUMMONS) || (g_config.getBool(ConfigManager::TELEPORT_PLAYER_SUMMONS) && !getPlayer()))) { std::list<Creature*>::iterator cit; std::list<Creature*> despawnList; for(cit = summons.begin(); cit != summons.end(); ++cit) { const Position pos = (*cit)->getPosition(); if((std::abs(pos.z - newPos.z) > 2) || (std::max(std::abs(( newPos.x) - pos.x), std::abs((newPos.y - 1) - pos.y)) > 30)) despawnList.push_back(*cit); } for(cit = despawnList.begin(); cit != despawnList.end(); ++cit) g_game.removeCreature((*cit), true); }*/
  13. 2 points
    Tá na mão! http://www.mediafire.com/file/d8ztfpwho5c1d5q/Tibia.rar/file
  14. 2 points
    Kramer

    [Pedido] SPRITES MAIORES

    Tibia é como um tabuleiro, cada peça ocupa o seu próprio espaço, imagino que seria um retrabalho muito grande pra fazer isso, mas daria para elaborar novas mecânicas. Pode ser que alguma equipe de projetos grandes já elaborou isso, achei bastante interessante.
  15. 2 points
    Olá galera, hoje vim trazer um tutorial bem completinho para vocês do sistema de "Target Animada pela source do OTC" renovada para otcliente 0.6.6 e 0.6.7 e espero que gostem Imagens do Target Azul;; Imagens do Target Vermelho;; VIÍDEO:;; TUTORIAL 1° Vai na pasta do seu otcliente e ache a pasta da source dele otclient-0.6.6\src\client dentro dela abre o arquivo creature.cpp e procure;; void Creature::draw(const Point& dest, float scaleFactor, bool animate, LightView *lightView) { if(!canBeSeen()) return; Point animationOffset = animate ? m_walkOffset : Point(0,0); if(m_showTimedSquare && animate) { g_painter->setColor(m_timedSquareColor); g_painter->drawBoundingRect(Rect(dest + (animationOffset - getDisplacement() + 2)*scaleFactor, Size(28, 28)*scaleFactor), std::max<int>((int)(2*scaleFactor), 1)); g_painter->setColor(Color::white); } if(m_showStaticSquare && animate) { g_painter->setColor(m_staticSquareColor); g_painter->drawBoundingRect(Rect(dest + (animationOffset - getDisplacement())*scaleFactor, Size(Otc::TILE_PIXELS, Otc::TILE_PIXELS)*scaleFactor), std::max<int>((int)(2*scaleFactor), 1)); g_painter->setColor(Color::white); } internalDrawOutfit(dest + animationOffset * scaleFactor, scaleFactor, animate, animate, m_direction); m_footStepDrawn = true; if(lightView) { Light light = rawGetThingType()->getLight(); if(m_light.intensity != light.intensity || m_light.color != light.color) light = m_light; // local player always have a minimum light in complete darkness if(isLocalPlayer() && (g_map.getLight().intensity < 64 || m_position.z > Otc::SEA_FLOOR)) { light.intensity = std::max<uint8>(light.intensity, 3); if(light.color == 0 || light.color > 215) light.color = 215; } if(light.intensity > 0) lightView->addLightSource(dest + (animationOffset + Point(16,16)) * scaleFactor, scaleFactor, light); } } altere para;; void Creature::draw(const Point& dest, float scaleFactor, bool animate, LightView *lightView) { if(!canBeSeen()) return; Point animationOffset = animate ? m_walkOffset : Point(0,0); /* if(m_showTimedSquare && animate) { g_painter->setColor(m_timedSquareColor); g_painter->drawBoundingRect(Rect(dest + (animationOffset - getDisplacement() + 2)*scaleFactor, Size(28, 28)*scaleFactor), std::max<int>((int)(2*scaleFactor), 1)); g_painter->setColor(Color::white); } if(m_showStaticSquare && animate) { g_painter->setColor(m_staticSquareColor); g_painter->drawBoundingRect(Rect(dest + (animationOffset - getDisplacement())*scaleFactor, Size(Otc::TILE_PIXELS, Otc::TILE_PIXELS)*scaleFactor), std::max<int>((int)(2*scaleFactor), 1)); g_painter->setColor(Color::white); } */ if(m_showTimedSquare && animate) { /*ImagePtr L3K0Tt = Image::load("data/images/target.png"); //se preferir usar por imagem TexturePtr L3K0T = TexturePtr(new Texture(L3K0Tt, false)); g_painter->drawTexturedRect(Rect(dest + (animationOffset - getDisplacement() + 2)*scaleFactor, Size(L3K0T->getHeight(), L3K0T->getWidth())*scaleFactor), L3K0T);*/ EffectPtr efeitoL3K0T = EffectPtr(new Effect()); efeitoL3K0T->setId(653); //id da sprite do efeito g_painter->setColor(m_timedSquareColor); Rect rect = Rect(dest + (animationOffset - getDisplacement())*scaleFactor, Size(Otc::TILE_PIXELS, Otc::TILE_PIXELS)*scaleFactor); g_painter->drawTexturedRect(rect, efeitoL3K0T->getThingType()->getTexture(0)); g_painter->setColor(Color::white); g_painter->setColor(Color::white); // by L3K0T g_painter->setOpacity(0.9); } if(m_showStaticSquare && animate) { /*ImagePtr L3K0Tt = Image::load("data/images/target.png"); //se preferir usar por imagem TexturePtr L3K0T = TexturePtr(new Texture(L3K0Tt, false)); g_painter->drawTexturedRect(Rect(dest + (animationOffset - getDisplacement() + 2)*scaleFactor, Size(L3K0T->getHeight(), L3K0T->getWidth())*scaleFactor), L3K0T);*/ EffectPtr efeitoL3K0T = EffectPtr(new Effect()); efeitoL3K0T->setId(653); //id da sprite do efeito g_painter->setColor(m_staticSquareColor); Rect rect = Rect(dest + (animationOffset - getDisplacement())*scaleFactor, Size(Otc::TILE_PIXELS, Otc::TILE_PIXELS)*scaleFactor); g_painter->drawTexturedRect(rect, efeitoL3K0T->getThingType()->getTexture(0)); g_painter->setColor(Color::white); //1 para não piscar e fixar no vermelho } internalDrawOutfit(dest + animationOffset * scaleFactor, scaleFactor, animate, animate, m_direction); m_footStepDrawn = true; if(lightView) { Light light = rawGetThingType()->getLight(); if(m_light.intensity != light.intensity || m_light.color != light.color) light = m_light; // local player always have a minimum light in complete darkness if(isLocalPlayer() && (g_map.getLight().intensity < 64 || m_position.z > Otc::SEA_FLOOR)) { light.intensity = std::max<uint8>(light.intensity, 3); if(light.color == 0 || light.color > 215) light.color = 215; } if(light.intensity > 0) lightView->addLightSource(dest + (animationOffset + Point(16,16)) * scaleFactor, scaleFactor, light); } } salve. 2° agora volte na pasta da source do otclient e abra o arquivo thingtype.h e procure por;; const TexturePtr& getTexture(int animationPhase); altere para /*const TexturePtr& getTexture(int animationPhase);*/ depois ache;; std::vector<int> getSprites() { return m_spritesIndex; } abaixo cole;; const TexturePtr& getTexture(int animationPhase); dps é só abrir o object guilder e importar o efeito do target;; >>>>> effect_653.obd tem outras sprite doadas por mim segue o link Depois de recortar é só por o efeito no otc e colocar o ID da sprite ali aonde tá o numero 653 no código. Ajudei?? REP+ Créditos:; -Eu por alterar outras coisas que faltou. -Jair Kevick (código base)
  16. 2 points
    Não sei se já tem aqui no TK (não frequento muito a área de Otserver), caso tenha... Avisem que eu apagarei! The Forgotten Server 10.31 Nova Ab'dendriel Nova Venore Nova Drefia Zao e Gnome Base Todos os NPC´s Quests 100% (Annihilator, Demon Helmet, Pits of Inferno, The Inquisition Quest, In Service of Yalahar, Isle of Evil, The Djinn War, The Ancient Tombs, Dreamer's Challenge, Bright Sword, The Unnatural Selection quest, Banshee Quest, Demon Oak, Svargrond Arena e muito mais.) Razachai & Quirefang Task (Killing in the name...) Warzone Novas magias Sistema de Banco Treiner Off Vagões de Kazzordon Tamanho do Mapa 100MB (Mapa Global) Download: [4Shared] Scan: [VirusTotal] Créditos: Rafaeru
  17. 1 point
    Faysal

    Regeneração de Mana nos Trainers

    tenta assim <attack name="manadrain" interval="1000" chance="7" range="7" min="900" max="10000"> <attribute key="shootEffect" value="energy" /> <attribute key="areaEffect" value="poff" /> </attack>
  18. 1 point
    L3K0T

    Regeneração de Mana nos Trainers

    Este tópico foi movido para a seção de Suporte Otserv.
  19. 1 point
    Bom galera hoje vou ensinar a vocês como acelerar as Sprites do seu jogo pra ficar como do Tíbia Global, assista o vídeo abaixo que você vai entender. Primeiramente vá na source do seu OTClient 0.6.6 "otclient-0.6.6\src\client"ou superior e abre o game.cpp depois de aberto procure. if(version >= 1050) mude para if(version <= 1050) Salve e Agora vá em const.h e procure. INVISIBLE_TICKS_PER_FRAME = 500, ITEM_TICKS_PER_FRAME = 500, mude para INVISIBLE_TICKS_PER_FRAME = 100, ITEM_TICKS_PER_FRAME = 100, Feito isso salve e da Rebuild no compilador do otcliente que voce usa "recompilação limpa" Depois de compilar vá no seu Object Builder e compile seu cliente pra "Improved Animations" pronto, agora só usar ATENÇÃO USE SOMENTE EM CASO DE ERROS DO OTCLIENT, CASO NÃO LER SEU CLIENTE; ache function load() local version = g_game.getClientVersion() em baixo coloca g_game.enableFeature(GameSpritesU32)
  20. 1 point
    JZDJ

    Mapa Lion Sanctum

    Pra quem ainda não tem hj trago o mapa de Lion Sanctum. Lion Sanctum.rar SCAN
  21. 1 point
    Nolis

    Arcixt Freelance Mapping

    Recomendo 👍
  22. 1 point
    Madarada

    Mega Sorteio Underwar 13 anos

    Bacana sorteio, adorei a caneca e almofadinha s2 vou participar.
  23. 1 point
    diarmaint

    Teleporte Summon tfs 0.3.6

    @L3K0T meee, só percebi que você desativou a função depois que colei no lugar. zzzz kkkk Funcionou perfeitamente cara, Valeuzão!
  24. 1 point
    Cjaker

    Tibia 8.60 Editor

    É extremamente recomendável você editar um cliente 8.60 ORIGINAL da própria Cip. Essas dlls não são dependência do editor presente nesse tópico, o requisito mínimo do software é: - Windows Vista pra frente - .NET Framework (preferência 4.5) Tente editar o Tibia 8.60 original da própria Cip. Testei em 3 sistemas operacionais diferentes e tudo ocorreu como deveria.
  25. 1 point
    Coloquei em meu servidor 8.60 (TFS 0.4) e funcionou de primeira sem erros na distro ou algo parecido. Sistema perfeito. Rep + !! Uma dica para quem quer imitar o global com este sistema e ter uma ''ilha'' igual a Adventurer's Guild (onde os player só podem pegar as recompensas de loot dos bosses no baú daquele local), basta criar a ilha, colocar apenas 1 depot bem centralizado (afinal, é nele que os players irão pegar seus rewards) e definir a ilha como uma town (faz isso pelo RME mesmo). Depois basta modificar isto no primeiro script > town_id = 1 para o número da town que você colocou na ilha. É uma gambiarra, eu sei. Mas foi uma maneira fácil que achei de deixar um pouco parecido com o sistema do global.
  26. 1 point
    .HuRRiKaNe

    Global Map Full - By NvSo

    Informações: » Map RL 8.60, Com Novas Áreas; » Distro 100% - Sem Erros; » Magias Novas; » Monstros 100% RL; » Addons 100% RL; » NPC's 98% RL; » Addon Bonus 100%; » Items 95%; » War System 100%; » Quests RL 90%; » Servidor 100% Estável; Screen's: Download Server / Scan: » Download Server: http://www.mediafire.com/?9dw90td7e8bp955 » Scan Server: OBS: Não realizei o scan porque o arquivo ultrapassa o limite de 32MB no virustotal! Account GOD: tibia / tibia Créditos: NvSo Kaiser e The OTX Team TheForgotten Server Cipsoft Animal Pak
  27. 1 point
    Werner

    Best Baiak Completo

    Eae pessoal do Tk Trago aqui um Baiak (BestBaiak) com um novo visual e completo! Se trata de um Servidor 8.60, completo e ja pronto para ser colocado Online, sem bugs. (funciona melhor em MySql) + de 50 Hunts Free Muitos trainers, assim não ficara sem. Vocations Equilibradas. War System com escudos. Itens donates balanceados. Contando com todos os Eventos atuais: Zombie Event Snowball War Event Capture the Flag Battlefield Desert War Defend The Tower Fire storm Boss King Conta também com: Castle 24h Castle 48h Vip1 e Vip2 Free Area Donate SuperUp Dodge e Critical system Extra Cidade com mais houses MiniGames Sistema de !autoloot já instalado Quest Promotion 2 Npc que troca itens por EventCoins Monstros exclusivos ScreenShots do Servidor Donwload: Servidor completo 4shared: Clique Aqui! Servidor completo Mediafire: Clique Aqui! Scan VirusTotal:(Acusando malware por conta das executáveis): Clique Aqui! Créditos: Coisas como items.xml e items.otb com os itens donate já editados podem ser encontrados aqui no tópico. Suporte para alguns bugs encontrados até o momento também se encontram no tópico. Espero que gostem.
  28. 1 point
    coroy o bixo é brabo :o
  29. 1 point
    ta ae manito WoDBO_Warks.rar
  30. 1 point
    Consegui, muito obrigado! Obrigado pela ajuda Jean! Fabio, você teria um SCRIPT em que posso movimentar X,Y de uma DISTANCE EFFECT? Quero colocar pra sair Efeitos Missle iguais ao mesmo tempo, porém em posições diferentes. Exemplo:
  31. 1 point
  32. 1 point
    Repete esta linha addEvent(targetEffect, 1000, cid, 419, {2,0}) --addEvent(targetEffect, 1000(TEMPO EM MILÉSIMOS PARA EFEITO), cid, 419(NUMERO DO EFEITO), {2,0}(AJUSTAR X E Y))
  33. 1 point
    local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -130.2, 1, -140.2, 1) function targetEffect(cid, effect, ajust) -- efeito sai no target if isCreature(cid) and isCreature(getCreatureTarget(cid)) then local t_Pos = getCreaturePosition(getCreatureTarget(cid)) doSendMagicEffect({x= t_Pos.x+ajust[1], y = t_Pos.y+ajust[2], z = t_Pos.z}, effect) end end local delay = 1000 -- tempo para o segundo efeito, em milésimos function onCastSpell(cid, var) local waittime = 2 -- Tempo de exhaustion local storage = 120033 if exhaustion.check(cid, storage) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Aguarde " .. exhaustion.get(cid, storage) .. " segundos para usar a spell novamente.") return false end targetEffect(cid, 419, {1,0}) addEvent(targetEffect, delay, cid, 419, {2,0}) exhaustion.set(cid, storage, waittime) return doCombat(cid, combat, var) end
  34. 1 point
    Ackerzin

    DLL ANT AUTO TARGET ELFBOT

    Olá, hoje irei disponibilizar uma dll que foi feita com a função de bloquear o Auto Target e o Aimbot. A dll e a modificação na source foi feita e disponibilizada pelo @Reason Moderador da OTX Depois que foi vazado o codigo e a dll pelo NTO HARD, muitas pessoas estão vendendo essa modificação, apos conversar com o @Reason, ele disponibilizou ela para mim, para que eu postasse aqui. core.dll Modificação na SOURCE configmanager.cpp configmanager.h protocolgame.ccp protocolgame.h config.lua Se foi postado no local errado, favor mover para o certo, não achei ao certo qual era o local exato para criar esse topico, obrigado! Creditos: 20% do NTO HARD - Disponibilizar as Alterações na Source 80% do Reason184 - Criar a dll/alteração e disponibilizar https://github.com/Reason184
  35. 1 point
    Atualização de 29/06/2019. Olá meus amigos, essa é a minha última contribuição free que faço na área de OTserver, fiz uma atualização bem completa do Gesior comparando com os que existem disponíveis, não vou falar muito pois grande parte já conhecem... Vou apenas posta algumas imagem das mudanças feitas. Sempre gostei de evoluir e de oferecer aos demais uma facilidade de obter um material grátis e de qualidade, nunca utilizei meu pouco conhecimento para prejudicar os demais, pelo o contrario sempre foi na intenção de ajudar e se em algum momento falhei, falhei inconscientemente. - Foi mudado algumas imagens de layout para renovar a estrutura. - Server Info + Most Power Ful Guilds na mesma estrura. - Create Account exigindo senhas com letras minusculas, maiúsculas e números, fortalecendo a segurança do seu cliente e dificultando futuras dores de cabeças. - Adicionado o mecanismo que identifica os valores de Premuim Points e Backup Points. - Algumas mudanças de layout. - Nome do player abaixo linkado. - Adicionado um Box de doação, com a intenção apenas de complementar o layout enriquecendo a pagina. - Fixado o bug edit town, e melhorado o layout. - Characters.php refeito, nesta imagem é uma visão de uma conta com access admin. - Visão normal. - Inventário completo. - Guilds com visão ampliada. - Detalhes... - Novo SHOP com as estrutura de layout melhorada e modernizada. - Sem BUGs lembre-se do CTRL + F5 para atualizar os cookies nesta pagina. - Detalhes... - Detalhes... - Detalhes... - Histórico do SHOP... DOWNLOAD SITE SHOP.LUA XAMPP 1.7.3 DATABASE LIMPA MYSQL DATABASE COMPLETA MYSQL TUTORIAIS ÚTEIS E COMPATÍVEIS PARA O SITE: PAGSEGURO AUTOMATICO SHOPGUILD BACKUP_POINTS SISTEMA VIP_TIME Créditos: Gesior.pl(WEBMaster) Felipe Monteiro(WEBMaster, WEBDesigner) Natanael Beckman(WEBNada) Nailan (WEBMaster) Ivens Pontes (WEBMaster) Marcio Porto (WEBMaster) Danyel Varejão (Programmer LUA, C++)
  36. 1 point
    LeoTK

    [Limite Skill] Colocar Limite em Skills

    Salve galera bom demorou mas consegui trazer esse conteúdo para vocês com ajuda de diversos amigos créditos no final do tópico. Bom vamos lá é um conjunto de configurações + script que vai permitir todas as skills do servidor ficar limitada até 250 Primeiramente vamos até o config.lua do servidor e deixa a Rate Magic em 0.01 Ficando assim rateMagic = 0.01 Logo depois disso vamos ao vocation.xml e procure por manamultiplier="1.2" Use o notepad++ Aperte ctrl + H para substituir todos os manamultiplier="1.2" por manamultiplier="1.0" manamultiplier="1.0" Essa modificação vai permitir a sua magic level chegar a 250 Depois faça isso com as demais skills Club / Sword / Axe / Distance / Shield / Fishing - Mude todos para 1.0 Depois disso agora vamos instalar os scripts para criar limites para as skills não bugarem e também vamos configurar a rate do magic level para não bugar também Vá em data/creaturescripts/creaturescripts.xml e adicione essas tags <!-- Skills Block / Stages Skills --> <event type="advance" name="skillblock" event="script" value="skillblock.lua"/> <event type="login" name="skillblock2" event="script" value="skillblock2.lua"/> <event type="death" name="skillblock3" event="script" value="skillblock3.lua"/> <event type="advance" name="skillblock4" event="script" value="skillblock4.lua"/> <event type="login" name="skillblock6" event="script" value="skillblock6.lua"/> Agora abra o login.lua e adicione isso registerCreatureEvent(cid, "skillblock") registerCreatureEvent(cid, "skillblock2") registerCreatureEvent(cid, "skillblock3") registerCreatureEvent(cid, "skillblock4") Crie o arquivo skillblock.lua e adicione isso dentro Lembre-se coloque um numero anterior ao limite ou seja o limite de fist e 250 mas no maxLevel esta 254 Crie o Arquivo skillblock2.lua e adicione isso dentro Crie o Arquivo skillblock3.lua e adicione isso dentro Crie o Arquivo skillblock4.lua e adicione isso dentro Crie o Arquivo skillblock5.lua e adicione isso dentro Crie um Arquivo skillblock6.lua e adicione isso dentro Algumas imagens mostrando funcionando no meu caso eu configurei para enviar a mensagem em uma channel caso se interessar nesse sistema basta seguir o link Clicando Aqui Créditos: @movie @Coltera @lordzetros @Yan Liima @aspira Night Wolf
  37. 1 point
    Lurk

    Sistema de Medalhões! Solicite aqui!

    atualiza aqui pfvr?
  38. 1 point
    r0bert0lol

    Hati New AAC

    Show, acompanhando e vou contribuir !
  39. 1 point
    WooX

    Cave Exclusiva [SUPER UP] by WooX

    Cave Exclusiva Cave exclusiva ou também conhecido como Super UP é um sistema que assim como o nome indica proporciona ao jogador acesso a uma cave exclusiva, onde somente ele tem acesso e pode caçar sem ser perturbado. Eu particularmente não gosto da ideia do sistema, mas querendo ou não é bem popular nos servidores Baiak. Escrevi esse sistema a mais ou menos uns 2 anos atrás quando um amigo que era dono de um servidor Baiak na época estava tendo problemas com o sistema que usava, sistema esse que acredito ser o que vem por padrão nas bases de Baiak por ai e o que provavelmente é o mais usado até hoje. Sobre o sistema O sistema foi testado apenas em OTX2, mas provavelmente também funcione em TFS 0.4 Com a intenção de fazer com que fosse de fácil configuração, eu escrevi o sistema mantendo as funções principais e configurações em uma Lib separada dos arquivos, irei citar algumas características do sistema. Reiniciar o servidor ou manter ativo o global save não interfere na funcionalidade do sistema, todas as caves são entregues novamente no momento de abertura do servidor. O sistema funciona através de global storage e devido a isto não é necessário modificação alguma no banco de dados. O jogador tem a liberdade de escolher a cave que quiser, desde que ela esteja livre. O jogador pode verificar o status de cada uma das caves registradas no sistema e ver informações como quem é o dono de determinada cave e o tempo restante para que a cave esteja livre novamente. Algumas imagens Instalação Este sistema utiliza de funções contidas na lib do link abaixo, então antes de mais nada é necessário adicionar esta lib no servidor. Todos os arquivos necessários para instalação do sistema estão anexados no tópico, irei apenas mostrar como deve ser configurado. Como auxilio para saber onde vai cada um, todos os scripts contém a tag XML a ser registrada. Como mencionado anteriormente toda configuração do sistema se encontra na lib do mesmo, segue abaixo explicação de como configurar. caveExclusiva = { config = { rentTime = 4 * 60 * 60, buyItemID = 11758, caveStats = true, buyMessage = "Você comprou a cave de %s por %s.", timeLeftMessageInCave = "Seu tempo na cave de %s acabou e você foi teleportado para o templo.", timeLeftMessage = "Seu tempo na cave de %s acabou.", signs = { useSigns = true, signID = 1815, signLook = "Esta cave pertence a %s, estará livre novamente as %s." } }, caves = { [9851] = { gStor = 7330, caveName = "Cave 1", enterPos = {x=0, y=0, z=7}, signPos = {x=0, y=0, z=7} }, [9852] = { gStor = 7331, caveName = "Cave 2", enterPos = {x=0, y=0, z=7}, signPos = {x=0, y=0, z=7} } }, storages = { cave = 35070, inCave = 35071, time = 35072 } } rentTime: tempo que o jogador vai permanecer como dono de uma cave, o valor deve ser definido em segundos. buyItemID: ID do item em que o jogador deve usar o item definido na action para comprar uma cave. caveStats: pode ser definido como true ou false, se definido como falso não irá permitir o uso da talkaction que exibe informações sobre as caves. buyMessage: esta é a mensagem que irá aparecer quando o jogador comprar uma cave. timeLeftMessageInCave: esta é a mensagem que irá aparecer quando acabar o tempo e o player estiver dentro da cave. timeLeftMessage: esta é a mensagem que irá aparecer quando acabar o tempo e o player estiver fora da cave. useSigns: pode ser definido como true ou false, se definido como verdadeiro irá exibir o dono e o tempo restante em um quadro ou qualquer item configurado na variável abaixo. signID: ID do item em que será exibido as informações da cave. signLook: mensagem a ser exibida ao dar look no item definido na variável acima. As caves devem ser adicionadas e configuradas da seguinte maneira: [9851] = { -- Action ID, um pra cada cave. gStor = 7330, -- Global storage, um valor pra cada cave. caveName = "Cave 1", -- Nome da cave. enterPos = {x=0, y=0, z=7}, -- Posição que o player vai ser teleportado ao entrar na cave. signPos = {x=0, y=0, z=7} -- Posição do item que foi configurado na variavel signID no mapa. }, No mapa é necessário adicionar tudo que foi definido na configuração do sistema, isso inclui action IDs e os items configurado em buyItemID e signID, veja abaixo alguns exemplos. Créditos @Baalszor por testar todo o sistema. cave_action.lua cave_creaturescript.lua cave_enter.lua cave_exit.lua cave_start.lua cave_talkaction.lua lib_exclusivecave.lua
  40. 1 point
    Yinz

    Hati New AAC

    Bom, eu tenho feito algumas coisas no projeto, mas pouco tempo para fazer. Basicamente já funciona Login/Logout, criação de account/characters. Irei começar a criar componentes, e passar todo o layout de html p jsx, e é uma parada meio maçante, ctrl c e ctrl v. Irei aproveitar p usar styled components, pra limpar os assets do projeto. è isto, como estou fazendo por hobbie, estudos, não tenho pressa. você pode acompanhar um pouco mais aqui : https://github.com/pedrogiampietro/Hati
  41. 1 point
    Yan Liima

    [System] Trade Points

    #Introdução Reparei que muitas pessoas estão atrás desse sistema que o DBOBR e NTOBR usa, e atualmente o VitorSubhi postou um, porém é necessário modificar as sources. Apesar de achar o dele bem melhor, estarei deixando este meu sistema(não é necessário mexer nas sources). #Funcionamente O jogador vai até um NPC e compra um papel, após ter comprado ele pode estar dando trade nesse papel e negociando com algum jogador em troca de qualquer item. Ao finalizar a negociação, os points são transferidos/removidos(caso houver points na conta). Também é possivel comprar o papel por comando, estarei disponibilizando ambos para vocês. #Alguns prints: Estarei deixando o script para vocês em inglês, modifique como quiser Então vamos lá... #Instalação Em data/lib crie um arquivo chamado tradepoints.lua cole isto dentro: Em data/creaturescripts/tradepoints.lua: TAG: <event type="tradeaccept" name="Trade_Points" event="script" value="tradepoints.lua"/> <event type="traderequest" name="Trade_Points_Request" event="script" value="tradepoints.lua"/> login.lua registerCreatureEvent(cid, "Trade_Points") registerCreatureEvent(cid, "Trade_Points_Request") NPC XML: <?xml version="1.0" encoding="UTF-8"?> <npc name="Frodo" script="data/npc/scripts/trade_points.lua" walkinterval="2000" floorchange="0" access="5" level="1" maglevel="1"> <health now="150" max="150"/> <look type="275" head="114" body="113" legs="113" feet="113" corpse="2212"/> <parameters> <parameter key="module_shop" value="1" /> <parameter key="message_greet" value="Hello |PLAYERNAME|. I sell some utensils and Premium Points Transfer for you to transfer points to other players, remember to buy use '10' to 10 points." /> </parameters> </npc> Data/npc/scripts/trade_points.lua: Caso queira que a compra do papel seja feita por talkactions, aqui está: Prontinho xD Agradecimentos ao @lordzetros por ajudar na função scanContainer. obs: testado em TFS 0.4
  42. 1 point
    Ackerzin

    Sistema de Medalhões! Solicite aqui!

    lança umas medalhas pra nos
  43. 1 point
    Rutserzim

    Sistema de Medalhões! Solicite aqui!

    opa, quero tbm
  44. 1 point
    NathanAmaro

    Análise de servidor 8.60

    Eai galera, tudo certo? Sempre quis abrir um OtServer, vivia viciado em um das antigas o Viking Server 8.0, até que um dia comprei o mapa do antigo dono e comecei a customizar ele só que nunca coloquei online, mas queria pedir opinião de vocês para ver se algo assim iria vingar. Vou fazer uma breve apresentação do server que está quase pronto já. Então, é um servidor com mapa custom sem teleports de versão 8.60, mas o fato dele não ter teleports não influencia tanto por que o servidor possui uma sala com tps para cidades e nessas cidades estão os lugares de caça, esses lugares são bem intuitivos como servidores de pokémon. A experiência do servidor giraria em torno de 300~500x só para não ficar muito desequilibrado e a galera ter como brigar pelo top. Gosto bastante de RPG, então as quests que irão vir vão ser todas de enigmas e historinhas curtas. Na parte de donation pretendo colocar Premium Account de começo mas ainda estou analisando o fato de colocar itens donate mas não aqueles P2W são itens para os jogadores iniciantes começarem mesmo (aceito sugestões). Se alguém tiver mais alguma pergunta fico á disposição de responder, vou seguir com alguns prints do mapa que eu mesmo comprei cru e customizei com pedaços de mapas disponibilizados aqui mesmo no TibiaKing. Cidade principal: 1- Esse é o DP, ele possui um teleport para ir na sala de TPS onde o jogador tem acesso aos Treiners, Cidades, Área Premium, Arena PVP e aos Boss 2- Esse é o Templo, nele também se encontra o NPC que vende bless 3- Esse é o mercado, onde fica todos npc comerciantes Castelo de guerra: Esse é o castelo que fica ao norte da cidade principal, ele vai funcionar simples, todo domingo ele será abeto e as guilds vão andar até ele e tentar puxar a alavanca no último andar, a última guild que estiver em posse do castelo quando o tempo acabar vai ter acesso á monstros únicos por uma semana. Cidade do fogo: Cidade de gelo: Cidade de floresta: Cidade do deserto: Ainda tá pequeno mas tá tudo devidamente separado, somente falta as quests e alguns sitemas. Me deem opinião galera, vlww
  45. 1 point
    ERROR na linha 27 portal2:remove(1) end, 1*60*1000, 26394, 1, posCorpo) Está apenas faltando um () portal2:remove(1) end, (1*60*1000, 26394, 1, posCorpo)
  46. 1 point
    funcionou obrigado +REP
  47. 1 point
    Hadggar

    [TalkAction] Sistema de Jail !

    Opa galera blz? hoje vou trazer um sistema para vocês de jail, então vamos la ! Algumas Funções ! Funções: *Exemplo, GM quer prender um player que ta fazeno algu de errado, ai ele fala !jail ,4(no exemplo ele ficara 4 minutos preso), éo nome do fulano, !jail 4,fulano ,!jail 15,fulano ou !jail 30,fulano. * Verificação jogador o tempo de prisão (mostra data unjail) * auto unjail jogadores * Kick todos os jogadores da prisão depois de acidente / restart [teletransporte para jogador templo] Primeiramente vá em \data\talkactions e abra o talkactions.xml é lá adicione: <talkaction words="!jail" script="jailsystem.lua"/> <talkaction words="!unjail" script="jailsystem.lua"/> <talkaction words="/jail" script="jailsystem.lua"/> <talkaction words="/unjail" script="jailsystem.lua"/> Agora vá em \data\talkactions\scripts é crie um arquivo chamado jailsystem.lua é la adicione : -- Default jail time in seconds -- default_jail = 30 -- The permission you need to jail someone -- grouprequired = 4 -- StorageValue that the player gets -- jailedstoragevalue_time = 1338 jailedstoragevalue_bool = 1339 -- Set the position of the jail: -- jailpos = { x = 1037, y = 1004, z =7 } -- Set the position once unjailed: -- unjailpos = { x = 1029, y = 1005, z =7 } -- auto kicker, dont edit jail_list = {} jail_list_work = 0 function checkJailList(param) addEvent(checkJailList, 1000, {}) for targetID,player in ipairs(jail_list) do if isPlayer(player) == TRUE then if getPlayerStorageValue(player, jailedstoragevalue_time) < os.time() then doTeleportThing(player, unjailpos, TRUE) setPlayerStorageValue(player, jailedstoragevalue_time, 0) setPlayerStorageValue(player, jailedstoragevalue_bool, 0) table.remove(jail_list,targetID) doPlayerSendTextMessage(player,MESSAGE_STATUS_CONSOLE_ORANGE,'You were kicked from jail! See you later :)') end else table.remove(jail_list,targetID) end end end function onSay(cid, words, param) if jail_list_work == 0 then jail_list_work = addEvent(checkJailList, 1000, {}) end if param == '' and (words == '!unjail' or words == '/unjail') then if getPlayerStorageValue(cid, jailedstoragevalue_time) > os.time() then doPlayerSendTextMessage ( cid, MESSAGE_INFO_DESCR, 'You are jailed until ' .. os.date("%H:%M:%S", getPlayerStorageValue(cid, jailedstoragevalue_time)) .. ' (now is: ' .. os.date("%H:%M:%S", os.time()) .. ').') else if getPlayerStorageValue(cid, jailedstoragevalue_bool) == 1 then table.insert(jail_list,cid) doPlayerSendTextMessage ( cid, MESSAGE_INFO_DESCR, 'You will be kicked from jail in one second.') else doPlayerSendTextMessage ( cid, MESSAGE_INFO_DESCR, 'You are not jailed.') end end return TRUE end local jail_time = -1 for word in string.gmatch(tostring(param), "(%w+)") do if tostring(tonumber(word)) == word then jail_time = tonumber(word) end end local isplayer = getPlayerByName(param) if isPlayer(isplayer) ~= TRUE then isplayer = getPlayerByName(string.sub(param, string.len(jail_time)+1)) if isPlayer(isplayer) ~= TRUE then isplayer = getPlayerByName(string.sub(param, string.len(jail_time)+2)) if isPlayer(isplayer) ~= TRUE then isplayer = getPlayerByName(string.sub(param, string.len(jail_time)+3)) end end end if jail_time ~= -1 then jail_time = jail_time * 60 else jail_time = default_jail end if words == '!jail' or words == '/jail' then if getPlayerGroupId ( cid ) >= grouprequired then if isPlayer(isplayer) == TRUE then doTeleportThing(isplayer, jailpos, TRUE) setPlayerStorageValue(isplayer, jailedstoragevalue_time, os.time()+jail_time) setPlayerStorageValue(isplayer, jailedstoragevalue_bool, 1) table.insert(jail_list,isplayer) doPlayerSendTextMessage ( cid, MESSAGE_INFO_DESCR, 'You jailed '.. getCreatureName(isplayer) ..' until ' .. os.date("%H:%M:%S", getPlayerStorageValue(isplayer, jailedstoragevalue_time)) .. ' (now is: ' .. os.date("%H:%M:%S", os.time()) .. ').') doPlayerSendTextMessage ( isplayer, MESSAGE_INFO_DESCR, 'You have been jailed by '.. getCreatureName(cid) ..' until ' .. os.date("%H:%M:%S", getPlayerStorageValue(isplayer, jailedstoragevalue_time)) .. ' (now is: ' .. os.date("%H:%M:%S", os.time()) .. ').') return TRUE else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Player with this name doesn\'t exist or is offline.") return FALSE end else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You don't have access to unjail other players.") return FALSE end elseif words == '!unjail' or words == '/unjail' then if getPlayerGroupId ( cid ) >= grouprequired then if isPlayer(isplayer) == TRUE then doTeleportThing(isplayer, unjailpos, TRUE) setPlayerStorageValue(isplayer, jailedstoragevalue_time, 0) setPlayerStorageValue(isplayer, jailedstoragevalue_bool, 0) table.remove(jail_list,targetID) doPlayerSendTextMessage(isplayer,MESSAGE_STATUS_CONSOLE_ORANGE,getCreatureName(cid) .. ' let you go out from jail! See you later :)') doPlayerSendTextMessage ( cid, MESSAGE_INFO_DESCR, 'You unjailed '.. getCreatureName(isplayer) ..'.') else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Player with this name doesn\'t exist or is offline.") return FALSE end else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You don't have access to unjail other players.") return FALSE end end return FALSE end Algumas configurações grouprequired = 4 -- aki séra até o grupo que poderar usar no caso group 4 pra baixo. jailpos = { x = 1037, y = 1004, z =7 } -- aki séra a posição para aonde o player irar quando for preso. unjailpos = { x = 1029, y = 1005, z =7 }- -aki séra para aonde ele for quando ele n tiver mais preso, no caso unjail. Creditos: Gesior.pl EU. Lembre-se eu testei em tibia 8.54 é 8.60 é funcionou perfeitamente !
  48. 1 point
    SlowMCZ

    Best Baiak Completo

    Para quem não está conseguindo adicionar as tabelas castle_dono e z_ots_comunication em databases sqlite, eu criei elas manualmente, e as querys para adicioná-las são estas duas: (No final do post tem uma db com elas já adicionadas, para os preguiçosos). Query castle_dono: CREATE TABLE castle_dono ( id INT( 11 ) NOT NULL, name VARCHAR( 255 ) NOT NULL, [action] VARCHAR( 255 ) NOT NULL, param1 VARCHAR( 255 ) NOT NULL, param2 VARCHAR( 255 ) NOT NULL, param3 VARCHAR( 255 ) NOT NULL, param4 VARCHAR( 255 ) NOT NULL, param5 VARCHAR( 255 ) NOT NULL, param6 VARCHAR( 255 ) NOT NULL, param7 VARCHAR( 255 ) NOT NULL, delete_it INT( 2 ) NOT NULL DEFAULT ( 1 ), guild_id INT( 11 ) NOT NULL DEFAULT ( 0 ), PRIMARY KEY ( id ) ); Query z_ots_comunication: CREATE TABLE z_ots_comunication ( id INT( 11 ) NOT NULL, name VARCHAR( 255 ) NOT NULL, type VARCHAR( 255 ) NOT NULL, [action] VARCHAR( 255 ) NOT NULL, param1 VARCHAR( 255 ) NOT NULL, param2 VARCHAR( 255 ) NOT NULL, param3 VARCHAR( 255 ) NOT NULL, param4 VARCHAR( 255 ) NOT NULL, param5 VARCHAR( 255 ) NOT NULL, param6 VARCHAR( 255 ) NOT NULL, param7 VARCHAR( 255 ) NOT NULL, delete_it INT( 2 ) NOT NULL DEFAULT ( 1 ), PRIMARY KEY ( id ) ); Lembrando que estas querys não funcionam para databases mysql, somente para sqlite. Se quiser elas para mysql, já estão no servidor do tópico anexadas em txt. @Werner, acho interessante que as coloque no servidor como fez para o mysql. Database com as tabelas já adicionadas. otxserver.s3db
  49. 1 point
    MaXwEllDeN

    [Aula 3] Primeiros Passos

    << 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 >>
  50. 1 point
    Vodkart

    ANSWERED [Pedido] NPC Task System

    Mods: 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())
This leaderboard is set to Sao Paulo/GMT-03:00

Open Tibia Server

Quer aprender a criar seu próprio servidor de Tibia? Então está no lugar certo, aqui você encontrará milhares de tutorias, scripts, códigos, mapas e utilitários para que você possa fazer o seu próprio servidor de Tibia começando do zero.

Redes Sociais

Anuncie no Tibia King

Precisa de mais visibilidade em seus projetos? Quer fazer um plano publicitário para o seu servidor? Anuncie no Tibia King e faça sua divulgação, possuímos centenas de acessos simultâneos e milhares diários, com certeza será a sua solução!

Tibia King Recomenda

DokeHost - Soluções em Hospedagem

VPS Windows
VPS Linux
Servidor VPS
×
×
  • Create New...