Jump to content

Search the Community

Showing results for tags 'Sistema TFS 0.X'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Tibia King
    • Rules
    • Portal
    • FeedBack
  • Open Tibia
    • Otserv
    • Tools
    • Codes
    • Clients
    • Maps
    • Websites
  • Management of Ot Servers
    • Otserv Discussions & Research
    • Support and Requests
    • Otserv Tutorials
  • Tibia and Bots
    • Tibia
    • Bots
  • Others
    • Announcements
    • Other Programming Languages
    • Graphics and Design
    • Playground (Off-topic)

Calendars

  • Official Calendar
  • OTServs Calendar
  • Several Calendars

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Localization


My character


Favorite OTServ


Bot preferred


Interests

Found 17 results

  1. Olá pessoal, resolvi criar um sistema de recompensa parecido com o sistema do tibia global para a versão 8.60, mas tie que fazer varias "gambiarras" para ele funcionar nesta versão. Para quem não conhece: http://www.tibiawiki.com.br/wiki/Loot#Sistema_de_Recompensas Basicamente meu sistema funciona da seguinte forma: • você determina as criaturas que irão funcionar com esse sistema (normalmente bosses). • durante a batalha com a criatura o sistema conta pontos aos jogadores por ataque, bloqueio e suporte ("healar" quem esta na batalha). • quando a criatura é morta o sistema cria um "loot" de acordo com os pontos e envia-o ao depot do jogador em uma bag determinada nas configurações. Primeiramente vamos criar o arquivo das configurações gerais, crie uma pasta dentro do "data" com o nome de sistemas e dentro cria um arquivo rewardchest.lua: Depois em creaturescript crie dois arquivos: rewardchest_boss.lua: e rewardchest_pontos.lua: Lembrando que em todas as criaturas que forem adicionadas ao sistema além de coloca-las no rewarchest.lua você deve add isso no xml do monstro: <script> <event name="RewardChestDeath"/> <event name="RewardChestMonster"/> </script> E isso no creaturescript.xml: <!-- Sistema de recompensa criado por luanluciano93 --> <event type="login" name="RewardChestLogin" event="script" value="rewardchest_pontos.lua"/> <event type="statschange" name="RewardChestStats" event="script" value="rewardchest_pontos.lua"/> <event type="death" name="RewardChestDeath" event="script" value="rewardchest_boss.lua"/> <event type="statschange" name="RewardChestMonster" event="script" value="rewardchest_boss.lua"/> Basicamente é isso, qualquer dúvida postem aqui ... abraços! LINK DO SCRIPT NO GITHUB: https://github.com/luanluciano93/ESTUDOS/tree/master/LUA/REWARD_SYSTEM_860
  2. Como diz o titulo? você pode gerar suas funções do seu tfs em um arquivo texto, para fazer isso é só ir na lib 050 e adicionar isso no final, depois é só ligar o seu servidor e assim todas funções do seu server vai aparecer no arquivo txt. "Isso é bom pra resolver problemas de scripts e trabalhar de forma melhor, com a manipulação do mesmo." function getLuaFunctions() local str = "" for f,k in pairs(_G) do if type(k) == 'function' then str = str..f..',' elseif type(k) == 'table' then for d,o in pairs(k) do if type(o) == 'function' then if f ~= '_G' and d ~= "_G" and f ~= 'package' then str = str..f.."."..d..',' end elseif type(o) == 'table' then for m,n in pairs(o) do if type(n) == 'function' then if d == "_M" and m ~= "_M" and f ~= "_G" and f ~= 'package' then str = str..f.."."..m.."," elseif f ~= '_G' and m ~= "_G" and d ~= "_G" and f ~= 'package' then str = str..f.."."..d..'.'..m..',' end elseif type(n) == 'table' then for x,p in pairs(n) do if type(p) == 'function' then if m == "_M" and d ~= "_M" and f ~= "_G" and f ~= 'package' then str = str..f.."."..d..'.'..x..',' elseif m == "_M" and d == "_M" and f ~= "_G" and f ~= 'package' then str = str..f.."."..x..',' elseif m ~= "_M" and d == "_M" and f ~= "_G" and f ~= 'package' then str = str..f..'.'..m..'.'..x..',' elseif f ~= '_G' and m ~= "_G" and d ~= "_G" and f ~= 'package' then str = str..f.."."..d..'.'..m..'.'..x..',' end end end end end end end end end return string.explode(str,',') end local k = getLuaFunctions() local file__ = io.open('funcoes do seu servidor.txt','w') table.sort(k) for i=1,#k do if k[i] ~= "" then file__:write((i-1)..' - '..k[i]..'\n') end end file__:close() Créditos: Mock
  3. 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. Olá meus caros do Tibia King, hoje vim trazer pra vocês um sistema que bolei pra um concurso em outro fórum mas acabei ficando descontente e nunca cheguei a disponibilizar. Eu gostaria de agradecer inicialmente à três acontecimentos que sem eles não seriam possíveis a criação desse sistema. - A otlist obrigar que os servidores utilizem anti idle - Os mages do meu servidor reclamarem que não dava pra treinar ml nos trainers - Ao @Storm Night, que embora tenha me irritado muito nesse tópico aqui , botou a sementinha dessa idéia na minha cabeça. Explicação É a combinação de dois sistemas que eu ja havia feito, o primeiro escolhe entre todas as salas de treiner aquela que está vazia pra te alocar e o segundo te mantém alimentado e rodando pra simular o anti idle. (Nota: ele não impede o anti idle de fato, se vc quiser fazer isso vc vai precisar editar o script de anti idle que vc utiliza pra ignorar players com determinado storage e adicionar o storage no player quando ele entrar na sala e tirar ao sair.. mas não sei até que ponto isso pode provocar ban da OTservlist por isso decidi não ensinar isso aqui.) Sem mais delongas, talk is cheap, show me the code. Idéia Basicamente dá pra reduzir toda a idéia do código nessa foto aqui: Você tem diversas salas com trainers nesse formato (pode ser em linha reta horizontal ou vertical tb, mas assim fica melhor distribuído). Você inclusive pode criar salas no meio do void de forma que a distancia de uma vc nao consiga ver a outra e vai ser uma experiencia muito amigável para o player ver que está treinando sozinho na paz. Ao entrar no tp ele te aloca na primeira sala vazia, se não houverem salas vazias ele retorna que não tem posições livres Instalação Você precisa criar as salinhas dos trainers equidistantemente, ou seja, tendo a mesma distância A em X e mesma distância B em Y. Sério, se vc errar nessa parte é porque vc não sabe oque significa equidistante. Vai pesquisar preguiçoso!! Já aviso que não vou dar suporte quanto à isso. Você vai precisar criar salas parecidas com isso daqui: Perceba que não tem como ter acesso a essa sala, não tem como ser puxado pra fora do trainer, não tem dor de cabeça nenhuma e quando o player quiser sair ele só entra no tp e volta pro templo ou pra onde vc definir. Nesse teleport da sala vc adiciona o actionid 14877 e não bota nenhuma posição nele. Naquele tile que o player irá ficar que inclusive tem id diferente vc bota actionid 14878. Agora seleciona a area dessa sala no rme e vai copiando e colando percebendo sempre se vc tá criando as salas com mesma distância em X. Se o ponto inicial de uma sala é 140 e vc quer que todas tenham 12 sqm de distancia vc cria em 152, 164, 178.. por aí vai. Quando terminar as salas que quiser e tiver montado as linhas e colunas da forma que desejou, vc vai criar um tp principal pra alocar os players nessa sala: Lembrando que ele não deve ter posição no rme, vc só bota o actionID 14876 e deixa a toPos dele 0, 0, 0. Ele não tem q te teleportar pra nenhum lugar pois a posição será decidida por script. Se você fez tudo certo até agora vc deve ter algo +- assim: O importante é manter a distancia certinha entre cada sala. Aí no caso eu fiz rX = 11 e rY = 8 (é a terceira ou quarta vez q eu to falando isso, se vcs errarem pqp eu vou ficar muito irritado); Vc não bota os trainers, e ali embaixo do spawn vc tem que botar um outro obstáculo pra impedir que o player ande pra baixo e dê a sala como livre. Feito isso só adicionar os scripts abaixo: movements.xml <movevent type="StepIn" actionid="14876" event="script" value="trainertp.lua"/> <movevent type="StepIn" actionid="14877" event="script" value="trainertp2.lua"/> <movevent type="StepIn" actionid="14878" event="script" value="foodtrainer.lua"/> movements/scripts/trainertp.lua: movements/scripts/trainertp2.lua: movements/scripts/foodtrainer.lua: FIM, qualquer dúvida ou comentário ou sugestão coloquem abaixo. Se gostou REP+, se não gostou REP+ pq deu trabalho e vai ser útil pra alguém, mesmo que de estudo. Abraços do Lobo. E ao cara do outro fórum que ficou falando que ia dar erro e quis ficar me corrigindo e mandando scripts sem noção pra "mostrar" que sabia de lua:
  5. Trade Offline V2.0 Esse sistema me foi pedido a alguns meses atrás e hoje tirei um tempinho pra trazer aqui. O sistema consiste em permitir que jogadores negociem sem contato direto entre comprador e vendedor. Mas como assim? O vendedor pode criar um anuncio de venda informando item, valores ou até mesmo items que ele queira em troca, após feito o anuncio todas essas informações ficam armazenadas no banco de dados do servidor, permitindo assim serem exibidas em uma página no site para interessados, junto de todas informações fornecidas pelo vendedor é exibido um comando para que os interessados possam adquirir a oferta exibida na página. Sobre o sistema O sistema foi testado apenas em OTX2, mas provavelmente também funcione em TFS 0.4 Como mencionado acima, o sistema funciona de forma semelhante ao Market System das versões atuais porem sem exibição gráfica das ofertas in-game, para isso o sistema vai acompanhado de uma página para o Gesior AAC. Este sistema existe no fórum há um bom tempo e já é familiar pra muitos jogadores, essa versão trás consigo algumas melhorias e diferenças que irei listar abaixo. Sistema Agora é possivel vender um item exigindo outro item em troca ao invés de dinheiro. Containers com um conjunto de items dentro agora podem ser anunciados. Agora o sistema verifica as cargas e durações dos items antes de criar uma oferta. Novo parâmetro adicionado para verificar informações de ofertas in-game. Agora todo valor recebido vai diretamente para o banco do vendedor. Página A depender da quantidade de ofertas existentes no servidor, a página agora irá separa-las por páginas. Agora além do valor é exibido também imagem da moeda a depender do valor da oferta. Agora é possivel ver as características tanto dos items ofertados como dos items exigidos pelo vendedor. Adicionado filtros para exibir somente ofertas de items vip, containers ou trocas. Adicionado barras de pesquisas para filtrar as ofertas por items ou nome do jogador. Algumas imagens Instalação Antes de mais nada é necessário citar os requisitos necessários para o funcionamento correto do sistema, ele utiliza de algumas funções que não estão no script principal e portanto é necessário a instalação de uma lib extra, também é necessário instalar as funções doItemSetDuration e getItemDurationTime na source do servidor, ambos os links se encontram abaixo. Todos os arquivos necessários para a instalação estão anexados no tópico, irei apenas dizer onde instalar e como deve ser configurado. Primeiramente importe o arquivo schema.sql no banco de dados, ou se preferir pode executar as queries a seguir. CREATE TABLE IF NOT EXISTS `trade_off_offers` ( `id` int(11) NOT NULL auto_increment, `player_id` int(11) NOT NULL, `type` int(1) NOT NULL DEFAULT '0', `item_id` int(11), `item_count` int(11) NOT NULL DEFAULT '1', `item_charges` int(11) NULL, `item_duration` int(11) NULL, `item_name` varchar(255), `item_trade` tinyint(1) NOT NULL DEFAULT '0', `cost` bigint(20) UNSIGNED NOT NULL, `cost_count` int(11) NOT NULL DEFAULT '1', `date` bigint(20), PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; CREATE TABLE IF NOT EXISTS `trade_off_container_items` ( `offer_id` int(11) NOT NULL, `item_id` int(11), `item_charges` int(11) NULL, `item_duration` int(11) NULL, `count` int(11) DEFAULT '1' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; ALTER TABLE `trade_off_container_items` ADD KEY `offer_id` (`offer_id`); ALTER TABLE `trade_off_container_items` ADD CONSTRAINT `offer_id_fk` FOREIGN KEY (`offer_id`) REFERENCES `trade_off_offers`(`id`) ON DELETE CASCADE; Configuração no arquivo tradeoff.lua: -- Trade Offline 2.0 by WooX -- local config = { priceLimit = 2000000000, -- 2kkk offerLimit = 3, offerLimitStor = 86420, infoOnPopUp = true, infoMsgType = MESSAGE_STATUS_CONSOLE_BLUE, errorMsgType = MESSAGE_STATUS_CONSOLE_RED, successMsgType = MESSAGE_INFO_DESCR, helpMsg = "Enter the parameters (add, remove, active, buy, info).", goldItems = {2148, 2152, 2160}, itemsVIP = {4540, 4545, 4560}, } priceLimit: define o valor máximo de uma oferta. offerLimit: define o valor máximo de ofertas que um jogador pode adicionar. offerLimitStor: storage que irá armazenar quantas ofertas ativas o jogador possui. infoOnPopUp: pode ser definido como true ou false, se definido como falso irá enviar os detalhes da oferta no default ao invés de como é mostrado nas imagens acima. infoMsgType: define como será exibido uma mensagem de informação ao jogador (não recomendo mexer a menos que saiba o que está fazendo). errorMsgType: define como será exibido uma mensagem de erro ao jogador (não recomendo mexer a menos que saiba o que está fazendo). successMsgType: define como será exibido uma mensagem de ação sucedida ao jogador (não recomendo mexer a menos que saiba o que está fazendo). helpMsg: mensagem que será enviada para o jogador caso ele erre os parâmetros do comando. goldItems: nesta tabela deve ser preenchido todos os IDs de moedas no servidor como gold coins, platinum coins, etc. itemsVIP: nesta tabela deve ser preenchido os IDs dos items vips existentes no servidor. Agora para a instalação da página, no arquivo mysql_db.php deve ser preenchido os dados para conexão no banco de dados do servidor. /** * Host do banco de dados * @var string */ private static $DB_HOST = 'localhost'; /** * Usuario de conexao ao banco de dados * @var string */ private static $DB_USER = 'root'; /** * Senha de conexao ao banco de dados * @var string */ private static $DB_PASS = 'SUA_SENHA'; /** * Nome do banco de dados * @var string */ private static $DB_NAME = 'NOME_BANCO'; Após feito isso, o arquivo paginationClass.php em conjunto do arquivo mysql_db.php devem ser adicionados no seguinte diretório do Gesior AAC. classes/ Finalizado isto, basta jogar o arquivo tradeoff.php dentro do diretório informado abaixo e o sistema estará pronto para uso. pages/ Avisos Eu escrevi somente o sistema, não sou o autor da página para o Gesior AAC portanto não estarei dando suporte em relação a página que não seja sobre a instalação da mesma no Gesior AAC 2012. Foram mais de 600 linhas de código sem contar funções extras e alterações na source, além de muitas horas de testes para garantir que tudo estava funcionando corretamente, tudo que peço em troca é que não removam os créditos no arquivo quando forem usar. Créditos @MatheusDuarte pela página do Gesior AAC. schema.sql tradeoff.lua tradeoff.php mysql_db.php paginationClass.php
  6. E ai pessoal, vi que muitas pessoas tem problemas em instalar, e achar um script de autoloot 100% funcional. Foi ai que decidi postar aqui para vocês, um script totalmente novo e que realmente funciona, pronto para usar e abusar dele kkk. Bom, vamos parar de lero lero e bora ao que interessa. Fixados: Dinheiro Duplicado; Coleta itens até mesmo dentro das bag dos monstros; Lembrando que esse script NÃO é de minha autoria, e que já existe no Tk, mas em tópicos diferentes. Como eu uso ele já vou deixar tudo certo para o uso do mesmo. 1° Passo - Dentro da pasta data/actions/scripts crie um arquivo chamado autoloot_boost.lua Em data/actions/actions.xml registre o script assim: <action itemid="ITEMID" event="script" value="autoloot_boost.lua"/> 2° Passo - Vá na pasta data/creaturescripts/script e crie dois arquivos, um chamado autoloot.lua e o outro fimautoloot.lua depois, adicione os seguintes códigos: autoloot.lua fimautoloot.lua Agora em data/creaturescripts/creaturescripts.xml você vai registrar esses scripts dessa forma: <event type="kill" name="autoloot" event="script" value="autoloot.lua"/> <event type="login" name="fimautoloot" event="script" value="fimautoloot.lua"/> Abra o arquivo login.lua localizado na mesma pasta e adicione este código abaixo de outro registerCreatureEvent registerCreatureEvent(cid, "autoloot") Depois de instalar tudo, vamos para a pasta data/talkactions/script nela você irá criar um arquivo chamado autoloot.lua e vai adicionar este código: Em data/talkactions/talkcations.xml resgistra o script assim: <talkaction words="!autoloot" event="script" value="autoloot.lua"/> Vá na pasta lib, e crie um arquivo chamado autoloot, e cole isso dentro: Ainda na pasta lib crie um arquivo .lua e coloque esse script dentro, ou faça o download do mesmo logo abaixo: Download: killua's lib.lua Isso é tudo pessoal! Informações: Este sistema funciona através de Premium Account, junto com ele vem o sistema de Autoloot Booster, que consiste em vender automaticamente os itens coletados. Foi testado em um servidor de Tibia 8.60 utilizando OTX 2. Créditos: @lordzetros @KOLISAO @Dwarfer
  7. Galera do TibiaKing, esse sistema não é de autoria minha. Só estou trazendo esse sistema de outro Fórum. Acho que vai ajudar muito aos OT-ADMIN de poketibia, então Rep+ ai Olá! O sistema funciona com Poketibia e Tibia! Vamos deixar de enrolação e adicionar o sistema! Lembrando também que funciona com tfs 0.3.6 e tfs 0.4! Não testei com tfs 1.x mas acho que não funciona. Vá em creaturescripts.xml e adicione isso: <event type="kill" name="KillTask" event="script" value="task.lua"/> No login.lua adiciona isso com os demais: registerCreatureEvent(cid, "KillTask") Agora crie um arquivo chamado task.lua e adicione isso: local tasksss = { [1] = {name = "Blastoise", sto = 10212, count = 3, time_sto = 5457, time = 1*24*60*60, sto_count = 14129, money = 100, rewardid = 7621, rewardcount = 100, rewardexp = 10000, text = "Congratulations! You finished this task. In 24h, you will be able to do it again."}, [2] = {name = "Charizard", sto = 10213, count = 5, time_sto = 5458, time = 1*24*60*60, sto_count = 14130, money = 100, rewardid = 7621, rewardcount = 100, rewardexp = 10000, text = "Congratulations! You finished this task. In 24h, you will be able to do it again."}, } function onKill(cid, target) for _, t in ipairs(tasksss) do local total_count = t.count local m_sto = t.sto local count_sto = t.sto_count if getPlayerStorageValue(cid, m_sto) ~= -1 then if getCreatureName(target) == t.name then if (total_count - getPlayerStorageValue(cid, count_sto)) == 1 then setPlayerStorageValue(cid, count_sto, getPlayerStorageValue(cid, count_sto) + 1) doPlayerSendTextMessage(cid, 20, "You are killed ".. getPlayerStorageValue(cid, count_sto) .." " .. t.name .. " and finished the task!") return true elseif (total_count - getPlayerStorageValue(cid, count_sto)) >= 1 then setPlayerStorageValue(cid, count_sto, getPlayerStorageValue(cid, count_sto) + 1) doPlayerSendTextMessage(cid, 20, "You are killed ".. getPlayerStorageValue(cid, count_sto) .." of ".. total_count .." " .. t.name .. " kills to finish the task.") return true end end end end return true end Agora vá em npc/scripts e crie um arquivo chamado task.lua e adicione isso: local tasksss = { [1] = {name = "Blastoise", sto = 10212, count = 3, time_sto = 5457, time = 1*24*60*60, sto_count = 14129, money = 100, rewardid = 7621, rewardcount = 100, rewardexp = 10000, text = "Congratulations! You finished this task. In 24h, you will be able to do it again."}, [2] = {name = "Charizard", sto = 10213, count = 5, time_sto = 5458, time = 1*24*60*60, sto_count = 14130, money = 100, rewardid = 7621, rewardcount = 100, rewardexp = 10000, text = "Congratulations! You finished this task. In 24h, you will be able to do it again."}, } 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 value = -1 for i = 1, #tasksss do if msgcontains(msg, tasksss[i].name) and not value ~= -1 then value = i end end if value == -1 then selfSay('I don\'t have a this task!', cid) talkState[talkUser] = 0 return true end local configss = tasksss[value] local name = configss.name local m_sto = configss.sto local time_sto = configss.time_sto local count_sto = configss.sto_count local total_count = configss.count local rest = total_count - getPlayerStorageValue(cid, count_sto) if getPlayerStorageValue(cid, time_sto) < os.time() then -- verifica se o player ainda está no prazo if getPlayerStorageValue(cid, m_sto) <= 0 then -- verifica se o player não pegou está task selfSay('Ready! Now you need kill a '.. total_count .. ' '.. name .. '!', cid) setPlayerStorageValue(cid, m_sto, 1) setPlayerStorageValue(cid, total_count, 0) talkState[talkUser] = 0 else if rest <= 0 then -- Verifica se o player matou todos os monstros nescessários doPlayerAddItem(cid, configss.rewardid, configss.rewardcount) setPlayerStorageValue(cid, count_sto, 0) setPlayerStorageValue(cid, m_sto, -1) setPlayerStorageValue(cid, time_sto, os.time() + configss.time) doPlayerAddExperience(cid, configss.rewardexp) doSendAnimatedText(getCreaturePosition(cid), configss.rewardexp, 215) selfSay(configss.text, cid) talkState[talkUser] = 0 else selfSay('You need to kill '..rest..' '..name..' to gain a reward.', cid) talkState[talkUser] = 0 end end else selfSay('You already did this task, player. Wait '..math.ceil((getPlayerStorageValue(cid, time_sto) - os.time())/(60*60))..' hours to do it again.', cid) talkState[talkUser] = 0 end end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Pronto, agora volte para a pasta npc e crie um novo arquivo .xml chamado de Task e adicione isso lá: <?xml version="1.0" encoding="UTF-8"?> <npc name="Npc Nome" script="task.lua" walkinterval="350000" floorchange="0" speed="0"> <health now="150" max="150"/> <look type="369" head="91" body="102" legs="83" feet="0"/> <parameters> <parameter key="message_greet" value="You want gain a task of {Blastoise}?"/> </parameters> </npc> Pronto, agora o sistema de task está funcionando, e para adicionar um novo monstro pra fazer a task? Basta editar a tabela, mas não esqueça que tem que atualizar a tabela nos 2 scripts .lua !! local tasksss = { [1] = {name = "Blastoise", sto = 10212, count = 3, time_sto = 5457, time = 1*24*60*60, sto_count = 14129, money = 100, rewardid = 7621, rewardcount = 100, rewardexp = 10000, text = "Congratulations! You finished this task. In 24h, you will be able to do it again."}, [2] = {name = "Charizard", sto = 10213, count = 5, time_sto = 5458, time = 1*24*60*60, sto_count = 14130, money = 100, rewardid = 7621, rewardcount = 100, rewardexp = 10000, text = "Congratulations! You finished this task. In 24h, you will be able to do it again."}, } Para configurar siga as seguintes instruções: Créditos pelo Sistema: Criador: @miguel223 Drazyn1291 -- Editou e reformulou muita coisa!
  8. Olá amigos, membros, visitantes, papagaios, enfim... Depois de muito me pedirem o evento SNOWBAL WAR EVENT, trago ele 100% pra vocês. Como funciona? Os jogadores irão se divertir em uma emocionante partida de guerra de bolas de neve. O objetivo principal do evento é derrubar o número máximo de jogadores durante uma partida - atirando bolas de neve contra seus inimigos. O jogador que mais pontos fizer até o termino do evento será o vencedor (recompensa pode ser configurada). Sem delongas, vamos ao que interessa... Em data/actions abra o seu actions.xml e insira a seguinte linha: <action actionid="7900" event="script" value="snowballaction.lua" /> Em data/actions/scripts crie um arquivo com o nome de snowballaction.lua e insira o seguinte conteúdo: function onUse(cid, item, frompos, item2, topos) if item.actionid == 7900 then if(SBW_AMMOINFI) then doPlayerSendTextMessage(cid, 27, "as bolas de neve sao infinitas, nao ha necessidade que voce compre-as.") else if (getPlayerStorageValue(cid, SBW_SCORE) > 0) and (getPlayerStorageValue(cid, SBW_AMMO) < 30) then doPlayerSetStorageValue(cid, SBW_SCORE, getPlayerStorageValue(cid, SBW_SCORE)-1) doPlayerSetStorageValue(cid, SBW_AMMO, getPlayerStorageValue(cid, SBW_AMMO)+SBW_AMMOBUY) doPlayerSendTextMessage(cid, 27, "Voce trocou " .. SBW_AMMOBUY .. "x bolas de neve por 1 ponto de placar.") doSendMagicEffect(getCreaturePosition(cid),4) else doPlayerSendTextMessage(cid, 27, "Voce nao possui pontos de jogo o suficiente ou ja esta carregando muitas bolas de neve.") end end end end Em data/talkactions abra o seu talkactions.xml e insira a seguinte linha: <talkaction words="!snowball" event="script" value="snowballtalk.lua"/> Em data/talkactions/scripts crie um arquivo com o nome de snowballtalk.lua e insira o seguinte conteúdo: function onSay(cid, words, param, channel) local k = string.explode(param, ",") if(k[1] ~= nil) then if(string.upper(k[1]) == 'INFO') then local score = {} local output = "Voce tem " .. getPlayerStorageValue(cid, SBW_SCORE) .. " pontos.\nVoce tem "..getPlayerStorageValue(cid, SBW_AMMO).."x municoes.\n------------------\nO maior matador:\n" for _, pid in ipairs(getPlayersOnline()) do if getPlayerStorageValue(pid, SBW_INEVENT) then table.insert(score, {getCreatureName(pid), getPlayerStorageValue(pid, SBW_SCORE)}) end end local lx = table.getn(score) if(lx > 3) then lx = 3 end table.sort(score, function(a, b) return a[2] > b[2] end) for k = 1,lx do output = output .. k..". "..score[k][1] .." [".. score[k][2] .."].\n" end doPlayerPopupFYI(cid, output) end if (string.upper(k[1]) == 'ATIRAR') then if(getPlayerStorageValue(cid, SBW_INEVENT) == 1) and not getTileInfo(getThingPos(cid)).protection then if getPlayerStorageValue(cid, SBW_EXAUSTHED) <= 1 then if(getPlayerStorageValue(cid, SBW_AMMO) > 0) then if SBW_STATUS == 'on' then if(SBW_AMMOINFI == false) then doPlayerSetStorageValue(cid, SBW_AMMO, getPlayerStorageValue(cid, SBW_AMMO)-1) end doPlayerSetStorageValue(cid, SBW_EXAUSTHED, 2) lineAnimation(getPlayerLookDirection(cid),getCreaturePosition(cid),12,cid,1,0,1,0,0,0,1,0) addEvent(doPlayerSetStorageValue, SBW_SHOOTEXAUSTHED, cid, SBW_EXAUSTHED, 1) if (getPlayerStorageValue(cid, SBW_AMMO) ~= 1) then doPlayerSendTextMessage(cid, 27, "Restam "..getPlayerStorageValue(cid, SBW_AMMO).."x bolas de neve.") else doPlayerSendTextMessage(cid, 27, "Usando sua ultima bola de neve, recarregue.") end end else doPlayerSendCancel(cid, "Voce esta sem bolas de neve, recarregue no centro do campo ou mate um inimigo.") doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) end else doPlayerPopupFYI(cid, "Acalme-se voce deve esperar para atirar novamente.") doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) return false end else doPlayerPopupFYI(cid, "Voce precisa estar dentro evento ou fora da pz.") doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) end end end return true end function lineAnimation(lookDir,playerPos,effect,cid,fvar,fpos,ffound,fposV,fcheck,fvcid,floopCounter,fvpid, name) local var = fvar local pos = fpos local found = ffound local posV = fposV local check = fcheck local vcid = fvcid local loopCounter = floopCounter local vpid = fvpid local storage = SBW_EXAUSTHED if var < 2 then vcid = cid end pos = playerPos if not isInWallArray(convert(lookDir,pos)) then--isInWallArray({x=convert(lookDir,pos).x, y=convert(lookDir,pos).y,z=convert(lookDir,pos).z}) then --isInArray(t.onShoot.misc.walls_id, getThingfromPos({x=convert(lookDir,pos).x, y=convert(lookDir,pos).y,z=convert(lookDir,pos).z, stackpos=0}).itemid) then doSendDistanceShoot(pos, convert(lookDir,pos),effect) pos = convert(lookDir,pos) var=var+1 posV = convertV(lookDir,playerPos) for _, pid in ipairs(getPlayersOnline()) do if (getCreaturePosition(pid).x == pos.x and getCreaturePosition(pid).y == pos.y and getCreaturePosition(pid).z == pos.z) then --if loopCounter > 2 then vpid = pid --end if (vpid ~= vcid) then if var > 2 then if (getCreaturePosition(pid).x == posV.x and getCreaturePosition(pid).y == posV.y and getCreaturePosition(pid).z == posV.z) then killPlayer(pid,pos,getCreatureName(vcid)) if (lookDir == 0) or (lookDir == 2) then var = 6 else var = 8 end end end killPlayer(pid,pos,vcid) if (lookDir == 0) or (lookDir == 2) then var = 6 else var = 8 end end end loopCounter = loopCounter +1 end if (lookDir == 0) or (lookDir == 2) then if var ~= 6 then addEvent(lineAnimation, SBW_BALLSPEED, lookDir,pos,effect,nil,var,pos,found,posV,check,vcid,loopCounter,vpid) else var = 1 end else if var ~= 8 then addEvent(lineAnimation, SBW_BALLSPEED, lookDir,pos,effect,nil,var,pos,found,posV,check,vcid,loopCounter,vpid) else var = 1 end end else doSendMagicEffect(convert(lookDir,pos),2) var = 1 end end local ret = {} function convert(lookDir,pos) local positions = { [0] = {x = pos.x, y = pos.y-1, z = pos.z}, [1] = {x = pos.x+1, y = pos.y, z = pos.z}, [2] = {x = pos.x, y = pos.y+1, z = pos.z}, [3] = {x = pos.x-1, y = pos.y, z = pos.z} } ret = positions[lookDir] return ret end local ret = {} function convertV(lookDir,pos) local positions = { [0] = {x = pos.x, y = pos.y+1, z = pos.z}, [1] = {x = pos.x-1, y = pos.y, z = pos.z}, [2] = {x = pos.x, y = pos.y-1, z = pos.z}, [3] = {x = pos.x+1, y = pos.y, z = pos.z} } ret = positions[lookDir] return ret end function isInWallArray(pos) for k = 0, table.getn(SBW_WALLSID) do if getTileItemById(pos, SBW_WALLSID[k]).itemid == SBW_WALLSID[k] then --this doesn't even make sense but tried other ways and it gave errors, so meh 2lazy2search return true end end return false end function killPlayer(cid, pos, killer) local t_l = SBW_AREA[1] local b_r = SBW_AREA[2] local posti = {} local isPossibleToTeleportPlayer = false while (isPossibleToTeleportPlayer == FALSE) do posti = Position(math.random(t_l.x,b_r.x), math.random(t_l.y, b_r.y), 7) if isInWallArray(posti) == FALSE then isPossibleToTeleportPlayer = TRUE end end doTeleportThing(cid, posti) doSendMagicEffect(pos,2) doSendMagicEffect(posti,6) doSendAnimatedText(pos, ""..getCreatureName(killer).." ", 55) doPlayerSendTextMessage(cid, 27, "Voce morreu para "..getCreatureName(killer)..".") doPlayerSetStorageValue(killer, SBW_SCORE, getPlayerStorageValue(killer, SBW_SCORE)+SBW_POINTSKILL) doPlayerSendTextMessage(killer, 27, "You've killed "..getCreatureName(cid)..".") if SBW_LOSTSCORE then doPlayerSetStorageValue(cid, SBW_SCORE, getPlayerStorageValue(cid, SBW_SCORE)-1) end if SBW_RESETAMMO then doPlayerSetStorageValue(cid, SBW_AMMO, SBW_MINAMMO) end end Em data/globalevents abra o seu globalevents.xml e insira a seguinte linha: <globalevent name="StartSBW" time="19:00" event="script" value="events/snowballglobalevent.lua"/> Em data/globalevents/scripts crie um arquivo com o nome de snowballglobalevent.lua e insira o seguinte conteúdo: function onTime() function isInWallArray(pos) for k = 0, table.getn(SBW_WALLSID) do if (getTileItemById(pos, SBW_WALLSID[k]).itemid == SBW_WALLSID[k]) then return true end end return false end function endsnowball() local score = {} if not SBW_USEWAIT then doRemoveItem(getTileItemById(SBW_TP, 1387).uid) end for _, pid in ipairs(getPlayersOnline()) do if getPlayerStorageValue(pid, SBW_INEVENT) > 0 then table.insert(score, {getCreatureName(pid), getPlayerStorageValue(pid, SBW_SCORE)}) doPlayerSetStorageValue(pid, SBW_INEVENT, 0) doPlayerSetStorageValue(pid, SBW_SCORE, 0) doPlayerSetStorageValue(pid, SBW_AMMO, 0) doTeleportThing(pid, SBW_TPEND) end end table.sort(score, function(a, b) return a[2] > b[2] end) --local random_item = SBW_REWARDS[math.random(1, #SBW_REWARDS)] local hora = os.date("%X") local data = os.date("%x") if table.getn(score) > 0 then if SBW_ADDREWARD then for _, pid in ipairs(getPlayersOnline()) do if getCreatureName(pid) == score[1][1] then for op,ad in pairs(SBW_REWARDS) do doPlayerAddItem(pid, ad[1], ad[2]) end break end end end db.query("INSERT INTO `snowballwar` VALUES ('', ".. db.escapeString(score[1][1]) .. ",".. score[1][2] ..", ".. db.escapeString(data) ..", ".. db.escapeString(hora) ..");") db.query("UPDATE `players` SET `sbw_points`=`sbw_points`+".. score[1][2] .." WHERE `name` = " .. db.escapeString(score[1][1]) .. ";") doBroadcastMessage("[SNOWBALL EVENT] encerrou-se, parabens ao jogador "..score[1][1].." que venceu o SnowBall Event com "..score[1][2].." pontos.") end return true end local t_l = SBW_AREA[1] local b_r = SBW_AREA[2] function moveToEvent() for _, pid in ipairs(getPlayersOnline()) do if isInRange(getCreaturePosition(pid), SBW_WAITROOM[1], SBW_WAITROOM[2]) then local posti = {} local isPossibleToTeleportPlayer = false while (isPossibleToTeleportPlayer == FALSE) do posti = Position(math.random(t_l.x,b_r.x), math.random(t_l.y, b_r.y), 7) if (isInWallArray(posti) == FALSE) then isPossibleToTeleportPlayer = TRUE end end doTeleportThing(pid, posti) doPlayerSetStorageValue(pid, SBW_INEVENT, 1) doPlayerSetStorageValue(pid, SBW_AMMO, SBW_MINAMMO) doPlayerSetStorageValue(pid, SBW_SCORE, 0) doPlayerSendTextMessage(pid, 27, "[SNOWBALL WAR] Seja bem vindo, aqui estao os comandos que voce vai usar durante o evento\n!snowball atirar --Atirar uma bola de neve.\n!snowball info --Isso mostra seus pontos de jogos e a quantia de bolas de neve que voce tem. Tambem mostra o ranking de pontos do evento.\n Recarregue suas bolas de neve clicando em frente ao gerador no centro do campo.\nAltamente recomendado adicionar estes comandos a sua hotkeys.") end end doRemoveItem(getTileItemById(SBW_TP, 1387).uid) addEvent(endsnowball, SBW_DURATION*1000*60) doBroadcastMessage(SBW_MSGSTART) end local time = os.date("*t") local timeopen1 = math.ceil(SBW_TIMEWAIT / 4) local timeopen2 = math.ceil(SBW_TIMEWAIT / 2) if (SBW_STARTAUTO) and (isInArray(SBW_DAYS,time.wday)) then doBroadcastMessage(SBW_MSGWARNING) if SBW_USEWAIT then addEvent(doBroadcastMessage, timeopen1*1000*60, "[SNOWBALL WAR] - Resta(m) ".. timeopen2 .." minuto(s) para iniciar o evento!") if (timeopen2 ~= timeopen1) then addEvent(doBroadcastMessage, timeopen2*1000*60, "[SNOWBALL WAR] - Resta(m) ".. timeopen1 .." minuto(s) para iniciar o evento!") end addEvent(moveToEvent, SBW_TIMEWAIT*1000*60) doCreateTeleport(1387, SBW_TPGO, SBW_TP) else if SBW_TFS == "0.3" then doItemSetAttribute(doCreateItem(1387, SBW_TP), "aid", 2880) else doSetItemActionId(doCreateItem(1387, SBW_TP), 2880) end if(SBW_DURATION > 0) then addEvent(endsnowball, SBW_DURATION*1000*60) end end end return true end Em data/movements abra o seu movements.xml e insira a seguinte linha: <movevent type="StepIn" actionid ="2880" event="script" value="snowballmovement.lua"/> Em data/movements/scripts crie um arquivo com o nome de snowballglobalmovement.lua e insira o seguinte conteúdo: function onStepIn(cid, item, pos) doTeleportThing(cid, SBW_TPGO) doBroadcastMessage("[SNOWBALL WAR] O " ..getCreatureName(cid).. " player esta participando do evento snowball.", MESSAGE_STATUS_CONSOLE_ORANGE) doPlayerSetStorageValue(cid, SBW_INEVENT, 1) doPlayerSetStorageValue(cid, SBW_AMMO, SBW_MINAMMO) doPlayerSetStorageValue(cid, SBW_SCORE, 0) end Já estamos quase terminando! Agora em data/lib crie um arquivo com o nome de SBW.lua com o seguinte conteúdo: -- This script is part of Snow Ball War Event Tibiaking Absolute -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see <http://www.gnu.org/licenses/>. -- // -- POSIÇÕES IMPORTANTES SBW_AREA = {{x = 1214, y = 1205, z = 7}, {x = 1251, y = 1242, z = 7}}-- AREA DO EVENTO | Canto superior esquerdo / inferior direito SBW_WAITROOM = {{x = 1229, y = 1220, z = 6}, {x = 1235, y = 1226, z = 6}} -- AREA DE ESPERA | Canto superior esquerdo / inferior direito SBW_TP = {x = 165, y = 45, z = 7} -- local onde teleport sera criado (entrada de jogadores) SBW_TPGO = {x = 1232, y = 1223, z = 6} -- local onde teleport vai levar (saida de jogadores) SBW_TPEND = {x = 155, y = 54, z = 7} -- local onde serao teleport ao final do evento SBW_GERADOR = {x = 1232, y = 1223, z = 7} -- local onde gerador vai ficar -- CONFIGURAÇÕES DO EVENTO SBW_DAYS = {1,2,3,4,5,6,7} -- dias de semana que vai abrir SBW_DURATION = 10 -- duração do evento em minutos SBW_POINTSKILL = 1 -- pontos de jogo por morte SBW_AMMOBUY = 20 -- quantia de munições compradas por cada ponto SBW_MINAMMO = 50 -- munição inicial dos jogadores SBW_TIMEWAIT = 3 -- tempo na sala de espera em minutos SBW_AMMOINFI = false SBW_LOSTSCORE = true SBW_RANDOMIZE = true SBW_RESETAMMO = true SBW_STARTAUTO = true SBW_USEWAIT = true --PREMIO DO EVENTO SBW_ADDREWARD = true SBW_REWARDS = { {6527,500}, {2345,1} } -- // Não mexa daqui para baixo SBW_TFS = "0.4" -- STORAGES SBW_EXAUSTHED = 2455 SBW_INEVENT = 2460 SBW_SCORE = 2465 SBW_AMMO = 2400 SBW_WALLSID = {5324,7003,7021,6712,7023,7002,6713,6714,6869,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6707,6708,6709,6710,6711,2698,2697,7020,6719,6720,6721,6722,6723,6724,6725,6726,6727,6761,6762,6768,6769,4608,4609,4610,4611,4612,4613,4614,4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4664,4665,4666,7008,7009,7010,7011,8239,7004,7005,7006,7007,6627,6628,6629,6630,6631,6632,6633,6634,6635,6636,6637,6638,7022} SBW_BALLSPEED = 150 SBW_SHOOTEXAUSTHED = 1000 SBW_SHOOTDIR = 0 SBW_STATUS = 'on' -- MENSAGENS SBW_MSGWARNING = "[SNOWBALL WAR] Abriu o teleport de ingresso para o evento, para participar se dirija ate o templo do servidor." SBW_MSGSTART = "[SNOWBALL WAR] O teleport foi removido e o evento foi iniciado, boa sorte a todos participantes." A frente das configuração solicitadas explica onde devem ser modificados. E por fim, vá até o seu banco de dados (phpmyadmin) e insira a seguinte query: CREATE TABLE IF NOT EXISTS `snowballwar` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `score` int(11) NOT NULL, `data` varchar(255) NOT NULL, `hora` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `id` (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; Ainda no phpmyadmin execute: ALTER TABLE `players` ADD `sbw_points` int(11); Importe o arquivo SNOWBALL.otbm em seu mapa! Imagem do mapa: Download do mapa: https://www.sendspace.com/file/mae37z Scan do mapa: https://www.virustotal.com/pt/file/94a507c71ef4cc241e415f2a8290441f7fa77809d804e24be18e9581a85c4740/analysis/1479161634/ É importante lembrar que peguei o script de um autor e realizei as modificações o tornando público para a comunidade exclusiva do TIBIAKING. Espero que façam um ótimo proveito. See you later.
  9. Fala galerinha linda do TK, vejo muita gente reclamando do battlefield do nosso amigo Vodkart, mas aqui funciona 100%, creio que seja rejeição nos TFS, mas então resolvi trazer a vocês um battlefield que venho customizando a algum tempo, o mesmo possui em alguns servidores poloneses, globalwar e cia. O Evento é um pouco modificado do que o tradicional battlefield, porém acho que ficou mais legal, é de pegar a bandeira do time inimigo, para dar um pouco mais de emoção que tal? rs. Preste atenção nos arquivos e como configurar, estarei explicando tudo passo a passo. Atenção, o comando para abrir o evento é: /battlefield 20 (o 20 é o número de participantes, no caso 10 no time vermelho e 10 no preto, coloque sempre números pares para balancear corretamente o evento) Vamos ao que interessa: Primeiramente, em data/libs crie um arquivo com o nome de battlefield.lua e adicione o seguinte dentro: battlefield = { storage = 201206300801, storage2 = 201206300802, tpPos = {x=32342, y=32213, z=7}, -- aonde aparecerá o teleport pos_team_1 = {x=31621,y=31860,z=7}, -- posição do team 1 (do lado direito) pos_team_2 = {x=31582,y=31860,z=7}, -- posição do team 2 (do lado esquerdo) spectors = {{x=31593,y=31853,z=6},{x=31609,y=31853,z=6},{x=31593,y=31866,z=6},{x=31609,y=31866,z=6}}, -- aonde aparecerá os espectadores (em volta do battlefield) team1Name = "Black Assassins", team2Name = "Red Barbarians", } function doBroadCastBattle(type,msg) for _, cid in pairs(getPlayersOnline()) do if getPlayerStorageValue(cid, battlefield.storage2) ~= -1 then doPlayerSendTextMessage(cid,type,msg) end end return true end function removeTp() local t = getTileItemById(battlefield.tpPos, 1387) if t then doRemoveItem(t.uid, 1) doSendMagicEffect(battlefield.tpPos, CONST_ME_POFF) end end function OpenWallBattle() local x = true local B = { [1] = {1056,{x=31601, y=31858, z=6, stackpos = 1}}, -- posição da barreira [2] = {1056,{x=31601, y=31859, z=6, stackpos = 1}}, -- posição da barreira [3] = {1056,{x=31601, y=31860, z=6, stackpos = 1}}, -- posição da barreira [4] = {1056,{x=31601, y=31861, z=6, stackpos = 1}} -- posição da barreira } for i = 1, #B do if getTileItemById(B[i][2], B[i][1]).uid == 0 then x = false end if x == true then doRemoveItem(getThingfromPos(B[i][2]).uid,1) else doCreateItem(B[i][1], 1, B[i][2]) end end end function getWinnersBattle(storage) local team = storage == 1 and battlefield.team1Name or battlefield.team2Name doBroadcastMessage("Players from team ".. team .." won the event battlefield,they received a Master Surprise Bag!") setGlobalStorageValue(battlefield.storage, -1) removeTp() OpenWallBattle() for _, cid in pairs(getPlayersOnline()) do if getPlayerStorageValue(cid, battlefield.storage2) ~= -1 then doRemoveCondition(cid, CONDITION_OUTFIT) doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) if getPlayerStorageValue(cid, battlefield.storage2) == storage then doPlayerAddItem(cid,6571,1) end setPlayerStorageValue(cid, battlefield.storage2, -1) end end end Como configurar este passo; Pós o primeiro passo, crie um arquivo em actions/scripts com o nome de battlefieldAbsolute.lua e adicione o seguinte dentro: function onUse(cid, item, fromPosition, itemEx, toPosition) local team = getPlayerStorageValue(cid, battlefield.storage2) if (item.actionid == 45001 and team == 1) or (item.actionid == 45002 and team == 2) then getWinnersBattle(team) end return true end Em actions.xml, adicione as seguintes linhas: <action actionid="49901" event="script" value="battlefieldAbsolute.lua"/> <action actionid="45002" event="script" value="battlefieldAbsolute.lua"/> Pós o segundo passo, vá até sua pasta creaturescripts/scripts e crie um arquivo com o nome de combat.lua e adicione o seguinte: function onLogin(cid) if getGlobalStorageValue(_Lib_Battle_Info.TeamOne.storage) == -1 then setGlobalStorageValue(_Lib_Battle_Info.TeamOne.storage, 0) setGlobalStorageValue(_Lib_Battle_Info.TeamTwo.storage, 0) setGlobalStorageValue(_Lib_Battle_Info.storage_count, 0) end registerCreatureEvent(cid, "BattleTeam") registerCreatureEvent(cid, "BattleDeath") return true end function onCombat(cid, target) if isPlayer(cid) and isPlayer(target) then if getPlayerStorageValue(cid, _Lib_Battle_Info.TeamOne.storage) == 1 and getPlayerStorageValue(target, _Lib_Battle_Info.TeamOne.storage) == 1 then doPlayerSendCancel(cid, "You may not attack your team mates.") return false end if getPlayerStorageValue(cid, _Lib_Battle_Info.TeamTwo.storage) == 1 and getPlayerStorageValue(target, _Lib_Battle_Info.TeamTwo.storage) == 1 then doPlayerSendCancel(cid, "You may not attack your team mates.") return false end return true end return true end function onPrepareDeath(cid, deathList, lastHitKiller, mostDamageKiller) if getPlayerStorageValue(cid, _Lib_Battle_Info.TeamOne.storage) >= 1 then setPlayerStorageValue(cid, _Lib_Battle_Info.TeamOne.storage, -1) setGlobalStorageValue(_Lib_Battle_Info.TeamOne.storage, getGlobalStorageValue(_Lib_Battle_Info.TeamOne.storage)-1) doRemoveCondition(cid, CONDITION_OUTFIT) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "[Battle Field] You Are Dead!") if getGlobalStorageValue(_Lib_Battle_Info.TeamOne.storage) == 0 then getWinnersBattle(_Lib_Battle_Info.TeamTwo.storage) else doBroadCastBattle(23,"[BattleField Information] ".._Lib_Battle_Info.TeamOne.name.." "..getGlobalStorageValue(_Lib_Battle_Info.TeamOne.storage).." VS "..getGlobalStorageValue(_Lib_Battle_Info.TeamTwo.storage).." " .._Lib_Battle_Info.TeamTwo.name) end elseif getPlayerStorageValue(cid, _Lib_Battle_Info.TeamTwo.storage) >= 1 then setPlayerStorageValue(cid, _Lib_Battle_Info.TeamTwo.storage, -1) setGlobalStorageValue(_Lib_Battle_Info.TeamTwo.storage, getGlobalStorageValue(_Lib_Battle_Info.TeamTwo.storage)-1) doRemoveCondition(cid, CONDITION_OUTFIT) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "[Battle Field] You Are Dead!") if getGlobalStorageValue(_Lib_Battle_Info.TeamTwo.storage) == 0 then getWinnersBattle(_Lib_Battle_Info.TeamOne.storage) else doBroadCastBattle(23,"[BattleField Information] ".._Lib_Battle_Info.TeamOne.name.." "..getGlobalStorageValue(_Lib_Battle_Info.TeamOne.storage).." VS "..getGlobalStorageValue(_Lib_Battle_Info.TeamTwo.storage).." " .._Lib_Battle_Info.TeamTwo.name) end end return true end Ainda na mesma pasta crie outro arquivo com o nome de pdeath.lua com o seguinte conteúdo: (ATENÇÃO QUE NA MESMA PASTA SÃO 2 ARQUIVOS) function onPrepareDeath(cid, corpse, lastHitKiller, mostDamageKiller) if getPlayerStorageValue(cid, config_tvt.green_kills) > 0 then doTeleportThing(cid, config_tvt.green_pos) setGlobalStorageValue(red_kills, getGlobalStorageValue(red_kills) + 1) end if getPlayerStorageValue(cid, config_tvt.red_kills) > 0 then doTeleportThing(cid, config_tvt.red_pos) setGlobalStorageValue(red_kills, getGlobalStorageValue(green_kills) + 1) end doPlayerSendTextMessage(cid, 27, "You dead! by Absolute") return true end Em creaturescripts/creaturescripts.xml adicione as seguintes linhas: <event type="preparedeath" name="BattlefieldP" event="script" value="pdeath.lua"/> <event type="combat" name="BattlefieldC" event="script" value="combat.lua"/> Pós o terceiro passo, em movements/scripts crie um arquivo com o nome de battlefieldAbsolute.lua e adicione o seguinte: local conditionBlack = createConditionObject(CONDITION_OUTFIT) setConditionParam(conditionBlack, CONDITION_PARAM_TICKS, -1) addOutfitCondition(conditionBlack, {lookType = 134, lookHead = 114, lookBody = 114, lookLegs = 114, lookFeet = 114}) local conditionRed = createConditionObject(CONDITION_OUTFIT) setConditionParam(conditionRed, CONDITION_PARAM_TICKS, -1) addOutfitCondition(conditionRed, {lookType = 143, lookHead = 94, lookBody = 94, lookLegs = 94, lookFeet = 94}) function onStepIn(cid, item, position, fromPosition) if getPlayerAccess(cid) > 3 then doTeleportThing(cid, battlefield.pos_team_1) return true elseif getGlobalStorageValue(battlefield.storage) == 0 then doTeleportThing(cid, battlefield.spectors[math.random(#battlefield.spectors)]) return true end if getGlobalStorageValue(battlefield.storage) > 0 then if getGlobalStorageValue(battlefield.storage) % 2 == 0 then setPlayerStorageValue(cid, battlefield.storage2, 1) doAddCondition(cid, conditionBlack) doTeleportThing(cid, battlefield.pos_team_1) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You will join the team " .. battlefield.team1Name .. "!") else setPlayerStorageValue(cid, battlefield.storage2, 2) doAddCondition(cid, conditionRed) doTeleportThing(cid, battlefield.pos_team_2) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You will join the team " .. battlefield.team2Name .. "!") end setGlobalStorageValue(battlefield.storage, getGlobalStorageValue(battlefield.storage)-1) if getGlobalStorageValue(battlefield.storage) == 0 then doBroadcastMessage("Battlefield will start in 1 minute, please create your strategy!") addEvent(doBroadcastMessage, 60*1000, "BattleField will begin now!") addEvent(OpenWallBattle, 60*1000) else doBroadcastMessage("We are waiting "..getGlobalStorageValue(battlefield.storage).." players to Battlefield starts.") end end return true end Em movements.xml adicione a seguinte linha: <movevent type="StepIn" actionid="45000" event="script" value="battlefieldAbsolute.lua"/> Á pedidos fiz o comando para abrir manualmente, então em talkactions/scripts crie um arquivo com o nome de battlefieldopenAbsolute.lua e coloque: function onSay(cid, words, param) if getGlobalStorageValue(battlefield.storage) ~= -1 then doPlayerSendCancel(cid, "The event is already open.") return true elseif not tonumber(param) or param % 2 ~= 0 then doPlayerSendCancel(cid, "You must choose an even number.") return true end doBroadcastMessage("The event BattleField was opened and We are waiting "..param.." Players! Team divided into "..((param)/2).." VS "..((param)/2)) setGlobalStorageValue(battlefield.storage, tonumber(param)) local tp = doCreateItem(1387, 1, battlefield.tpPos) doItemSetAttribute(tp, "aid", 45000) return true end Em talkactions.xml adicione a linha: <talkaction words="/battlefield" access="3" event="script" value="battlefieldopenAbsolute.lua"/> Screenshots do mapa do evento; Clique em spoiler para ver. Download & Scan do mapa;
  10. Depot Locker System Escrevi esse sistema no ano passado a pedido de um amigo e finalmente deixei a preguiça de lado pra postar ele aqui. Aviso de antemão que o sistema é funcional apenas para OTX2 e TFS 0.4, para utilizar a função doShowTextDialog da maneira como está no sistema no TFS 0.4 e inferiores é necessário uma alteração na source, link abaixo. O que faz? Este sistema consiste em adicionar um layer extra de segurança para o jogador, permitido criar uma senha para acesso do depot. Isso possibilita o jogador passar sua senha a amigos em que não confia totalmente e a estar precavido até certo ponto no caso de hacking. Vídeo 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. Depois de instalado a lib, basta baixar os arquivos anexados no tópico, adicionar em seus respectivos locais e registrar as tags XML contidas nos mesmos. Após isso é necessário adicionar o action id configurado no piso dos depots em que o sistema deve funcionar. Toda configuração do sistema se encontra dentro do arquivo lib_depotlocker.lua, segue explicação da seção de configuração. config = { useBoard = false, passMinLength = 4, passMaxLength = 12, askPassOnlyOneTimePerLogin = true, boardIDs = {1811, 1818}, -- West/East and North/South depotIDs = {2589, 2590, 2591, 2592}, -- South, West, North and East typeYourPassMsg = "Digite sua senha: ", rightPassMsg = "Senha correta, depot liberado.", wrongPassMsg = "Senha incorreta, tente novamente.", wrongTries = { limitTries = true, triesBeforeBlock = 5, blockTime = 15 * 60, -- 15 Minutos triesLeftMsg = "Senha incorreta, você ainda tem %s tentativa.", blockMsg = "Depot bloqueado, tente novamente em %s." }, } useBoard: pode ser definido como true ou false, se definido como verdadeiro irá criar um quadro ao lado do depot para o player poder digitar a senha, da mesma forma que é mostrada no vídeo, (eu recomendo deixar esta opção ativada somente se utilizar paredes como separador entre um depot e outro). passMinLength/passMaxLength: definem o valor minimo e máximo de caracteres que uma senha pode ter. askPassOnlyOneTimePerLogin: pode ser definido como true ou false, se definido como verdadeiro irá pedir a senha novamente apenas se o jogador sair e entrar novamente. boardIDs: aqui é preenchido os IDs dos quadros em que o player deve digitar a senha, um ID para vertical e outro para a horizontal. depotIDs: aqui é preenchido os IDs dos depots na respectiva ordem, sul, oeste, norte e leste. typeYourPassMsg: esta é a mensagem que irá aparecer na caixa de texto orientando o jogador a digitar a senha. rightPassMsg: esta é a mensagem que irá aparecer quando o jogador digitar a senha correta. wrongPassMsg: esta é a mensagem que irá aparecer quando o jogador digitar a senha incorreta. limitTries: pode ser definido como true ou false, se definido como verdadeiro irá bloquear as tentativas do jogador caso ele digite a senha incorreta um determinado numero de vezes. triesBeforeBlock: quantidade de tentativas incorretas para realizar o bloqueio. blockTime: Tempo de bloqueio (valor é definido em segundos). triesLeftMsg: esta é a mensagem que será enviada para o jogador com a quantidade de tentativas que ele ainda possui. blockMsg: esta é a mensagem que será enviada para o jogador caso todas suas tentativas falhem e ele seja bloqueado. Lembrando que o action id configurado em depotTile deve ser o mesmo registrado no script de movement e deve ser adicionado no piso do depot. Créditos @Yan Liima pela idealização do sistema e vídeo de demonstração. @Baiakeiro por testar a versão final do sistema. locker_action.lua locker_creature.lua locker_movement.lua npc.lua npc.xml
  11. Lua demo in-game Quando me deparei com a necessidade de ter que fazer e registrar uma talkaction sempre quando fosse testar algum algoritmo ou função Lua, eu decidi fazer esse sisteminha. Ele permite executar códigos e instruções Lua in-game sem a necessidade de dar reload ou sequer sair do client do Tibia, também é possivel executar qualquer função Lua existente na engine em execução no servidor. Algumas imagens Instalação Crie um arquivo chamado lua.lua dentro do seguinte diretório e com o conteúdo exibido abaixo: data/talkactions/scripts/ function onSay(cid, words, param) registerCreatureEvent(cid, "luaDemo") doShowTextDialog(cid, 1947, true) return true end Após isso crie um outro arquivo, dessa vez chamado lua_demo.lua dentro do seguinte diretório e com o conteúdo exibido abaixo: data/creaturescripts/scripts/ function onTextEdit(cid, item, newText) if item.itemid == 1947 then _G.cid = cid local lines = {} for line in newText:gmatch("[^\n]+") do table.insert(lines, line) end for i = 1, #lines do local func = loadstring(lines[i]) if func then local ret, err = pcall(func) if not ret then doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "[Lua error]:\nline "..i..": "..err) end end end unregisterCreatureEvent(cid, "luaDemo") end return true end Depois basta registrar ambos os scripts conforme indicado abaixo: data/talkactions/talkactions.xml <talkaction log="yes" words="/lua" access="5" event="script" value="lua.lua"/> data/creaturescripts/creaturescript.xml <event type="textedit" name="luaDemo" event="script" value="lua_demo.lua"/> É isso... o sistema da grandes possibilidades aos administradores que souberem Lua e praticidade pra quem for desenvolver ou debugar algum código Lua.
  12. 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
  13. Então, estou afim de criar um enforced, só que existe um sistema que existiam em algum que gostaria de implementar no meu. Quando Puxamos um player de perto existe um delay(que não quero mexer), Quando puxamos o player de 1 sqm de distancia, o puxe sai na mesma hora, so que quando você da um segundo chute no player, se for muito rapido, o delay que existe no servidor faz o chute nao sair, eu gostaria de tirar esse delay. se alguem puder me ajudar! Se publiquei na area errada desculpe desde já!.
  14. #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
  15. Boa noite, não sei se já existe este script aqui no fórum caso não aqui está. Este script foi testado na versão 8.6 TFS 0.4, funciona em servidores de Tibia, Pokemon, Narutibia etc... Bom neste script eu tive como base o script de banner da PXG aonde você coloca ele em uma Hunt e ganha uma porcentagem X a mais de experiencia. Instalando o Script - Vá em data/lib crie um arquivo com o nome bannerExp.lua e cole o código abaixo nele: -- Configurações -- effect_invoke_banner = 10 -- efeito que saira no banner quando ele for colocado no chao effect_decay_banner = 2 -- efeito que saira no banner quando o tempo dele acabar effect_kill_banner = 36 -- efeito que saira no banner quando o player matar um monstro e ganhar o bonus de exp banner_radius_x = 5 -- distancia maxima em x que ira ocorreu o bonus banner_radius_y = 5 -- distancia maxima em y que ira ocorreu o bonus time_in_minutes = 60 -- configurado em minutos (caso queira em horas só colocar 60 * 60) remove_banner_item = false -- Se estiver TRUE o item de criacao do banner sera removido do player, caso esteja FALSE o item não sera removido. config_banner = { --[ID DO ITEM CRIAR O BANNER] = {banner_id = ID DO BANNER, exp_bonus = % EXP PLAYER IRA GANHAR, time_left = TEMPO PARA SUBIR O BANNER}, [4865] = {banner_id = 8617, exp_bonus = 20, time_left = 20}, [4866] = {banner_id = 8618, exp_bonus = 25, time_left = 10}, [4867] = {banner_id = 8619, exp_bonus = 35, time_left = 15}, [4868] = {banner_id = 8620, exp_bonus = 45, time_left = 20}, } -- Não Mexer -- time_banner = 7899987 player_use_banner = 78999788 storage_banner_x = 7889911 storage_banner_y = 7889912 storage_banner_z = 7889913 storage_banner_id = 7884544 storage_exp = 7889915 rate_level = SKILL__LEVEL - Agora vá em data/actions/scripts e crie um arquivo chamado bannerexp.lua e cole isto dentro: function onUse(cid, item, frompos, itemEx, topos) if (getPlayerStorageValue(cid, player_use_banner) >= 1) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Voce ja esta usando o banner.") return true end if (config_banner[item.itemid]) then local banner = config_banner[item.itemid] if (remove_banner_item == true or remove_banner_item == TRUE) then doPlayerRemoveItem(cid, item.itemid, 1) end CreateBanner(cid, banner, itemEx) TimeBannerCheck(cid, banner, getThingPos(itemEx.uid)) EffectBanner(getThingPos(itemEx.uid)) end end function CreateBanner(cid, banner, itemEx) doCreateItem(banner.banner_id, getThingPos(itemEx.uid)) doSendMagicEffect(getThingPos(itemEx.uid), effect_invoke_banner) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Voce usou o banner de ["..banner.exp_bonus.."% EXP], ele tem duração de "..banner.time_left.." minuto(s).") setPlayerStorageValue(cid, storage_banner_x, getThingPos(itemEx.uid).x) setPlayerStorageValue(cid, storage_banner_y, getThingPos(itemEx.uid).y) setPlayerStorageValue(cid, storage_banner_z, getThingPos(itemEx.uid).z) setPlayerStorageValue(cid, storage_banner_id, banner.banner_id) setPlayerStorageValue(cid, storage_exp, banner.exp_bonus) setPlayerStorageValue(cid, player_use_banner, 1) setPlayerStorageValue(cid, time_banner, os.time() + (banner.time_left * time_in_minutes)) end function TimeBannerCheck(cid, banner, banner_pos) if not isCreature(cid) then doRemoveItem(getTileItemById(banner_pos, banner.banner_id).uid) doSendMagicEffect(banner_pos, effect_decay_banner) return true end if (getPlayerStorageValue(cid, time_banner) == os.time()) then doRemoveItem(getTileItemById(banner_pos, banner.banner_id).uid) doSendMagicEffect(banner_pos, effect_decay_banner) setPlayerStorageValue(cid, player_use_banner, -1) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "O Banner de ["..banner.exp_bonus.."% EXP] terminou.") return true end addEvent(function() TimeBannerCheck(cid, banner, banner_pos) end, 1000) end - Em Actions.XML cole esta tag: <action itemid="4865" script="bannerexp.lua"/> Aonde está 4865 você coloca o(s) ITEM_ID que será usado para summonar o banner no chão. - Agora vá em data/creatureevents/scripts crie um arquivo chamado bannerexp.lua e cole isto dentro dele: function onKill(cid, target) if not isMonster(target) then return true end if (getPlayerStorageValue(cid, storage_banner_id) <= -1) then return true end local banner_pos = {x=getPlayerStorageValue(cid, storage_banner_x), y=getPlayerStorageValue(cid, storage_banner_y), z=getPlayerStorageValue(cid, storage_banner_z)} if (getTileItemById(banner_pos, getPlayerStorageValue(cid, storage_banner_id)).uid >= 1) then if not (CheckPlayerInArea(cid, banner_pos)) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Voce esta fora da area do bonus.") end else doPlayerSetRate(cid, rate_level,1) end return true end function CheckPlayerInArea(cid, banner_pos) for x=banner_pos.x-banner_radius_x, banner_pos.x+banner_radius_x do for y=banner_pos.y-banner_radius_y, banner_pos.y+banner_radius_y do local banner_area = {x=x,y=y,z=banner_pos.z} local player = getTopCreature(banner_area).uid if (isPlayer(player)) then AddBonusExp(cid, banner_pos) return true end end end end function AddBonusExp(cid, banner_pos) doPlayerSetExperienceRate(cid, (1+(getPlayerStorageValue(cid, storage_exp)/100))+(getPlayerExtraExpRate(cid)/100)) doSendMagicEffect(banner_pos, effect_kill_banner) end function getPlayerExtraExpRate(cid) return (getPlayerRates(cid)[rate_level]-1)*100 end - Em Creatureevents.XML cole está tag: <event type="kill" name="BannerExp" event="script" value="bannerexp.lua"/> - Agora no arquivo login.lua em data/creatureevents/scripts cole este código antes do último return true: registerCreatureEvent(cid, "BannerExp") if (getPlayerStorageValue(cid, 78999788) >= 1) then setPlayerStorageValue(cid, 78999788, -1) end Explicação: (Configuração fica no arquivo adicionado no data/lib) 1° Aqui você configura a área em que o player tem que estar matando o monstro para poder ganhar o bônus banner_radius_x = 5 -- distancia maxima em x que ira ocorreu o bonus banner_radius_y = 5 -- distancia maxima em y que ira ocorreu o bonus 2° Aqui você adiciona um novo banner (Lembre-se de adicionar o itemid que você colocar entre colchetes lá na tag em Actions.XML) -[ID DO ITEM CRIAR O BANNER] = {banner_id = ID DO BANNER, exp_bonus = % EXP PLAYER IRA GANHAR, time_left = TEMPO PARA SUMIR O BANNER}, É isso... Script básico mais eu acho que vai ser bastante útil para muitos servidores. -- ATUALIZAÇÃO -- - Adicionado mensagem quando o player sair da área do bônus! - Adicionado variável que controla se o item da criação do banner será removido do player ou não. (Alterar a variável remove_banner_item em data/lib/bannerExp.lua).
  16. Eu acho que está no lugar errado, desculpa ae, mas to com dor de cabeça disso já Em 2017 eu criei um otserv mas parei, e ontem resolvi voltar, porem para criar uma Vocation eu lembro que nao era simplesmente chegar e escrever e pronto, tinha COISA A MAIS, eu entro no vocation escrevo no ID o ID DO NEWTYPE, mas nao sei se é isso, me ajudem um PASSO A PASSO DE TUDO PARA ADICIONAR UM PERSONAGEM NOVO, COM SKIN CERTA OBS: JA COLOQUEI NO TRANSFORMAR.LUA O NEWTYPE E AI SIM FUNCIONA, A SKIN VAI CERTA QUANDO FALO TRANSFORMAR, MAS QUANDO CRIA A CONTA NAO É UMA SKIN ALEATORIA AJUDAAAAAAAAAAAAAAAAAAAAAAAAAAA
  17. UPDATE 05/02/2019: - Colocado exhauted na venda de items para não bugar a venda de itens com elf bot! Descrição do Arquivo *Sobre o Sistema* Labia System é um sistema que proporciona ao jogador a capacidade de aprimorar sua habilidade de venda, aumentando assim sua Labia Skill e obtendo maiores lucros em futuras vendas de itens. O Skill de Labia, pode ser upado enquanto Free ou Premmy Account em qualquer level que você queira! Basta vender itens no NPC Soya Master. Lembrando que sendo free, sua lábia pode ser upada apenas até skill 90. Já sendo premmium até a lábia 120. Se o player for premmy account, de repente ficar free... sua lábia cai para 90, e todos os itens serão vendidos com preços avaliados dentro dessa lábia! Quanto mais caro for, o item vendido, maior será a porcentagem de lábia upada. *Exclusividade* O Sistema também conta com uma configuração exclusiva, tendo a possibilidade de jogadores Premmy account possam upar mais rapído a sua Skill de Labia! Sem falar no comando inovador: !labia info -- Ensinando ao jogador como usar o sistema !labia level -- Mostrando ao jogador quanto de skill Try falta para o próximo level!! *Benefícios da Lábia* Quanto maior for sua Labia Skill, maior será o valor pago pelas NPC Soya Master em troca do seu item ! Lembrando que, este é um benefício apenas, para premiuns!, Desta maneira, jogadores premiuns com labia skill alta, conseguem maiores lucros ao vender seus itens! O valor do item varia de acordo com a Labia upada! Quanto mais skill, mais lucro na venda! A maior Labia alcançada é você que decide nas suas configurações! por exemplo no RPG Brasil a é Skill 120. *exemplo da fórmula para cálculos do valor do item de acordo com uma Lábia desejada* P = PI + PI * 0,025 * (L / 2) Onde: P ~ Preço que o item será vendido na lábia L. PI ~ Preço Inicial do item, preço do item para um lábia 0. L ~ Labia em que o item será vendido! Vale lembrar que se L for um nº ímpar, deve-se reduzir uma unidade deste número, ou seja, 13 vira 12, 27 vira 26, 91 vira 90, nesse esquema, apenas se L for í­mpar! Exemplo: Preço de uma Golden Legs na lábia 95: P = PI + PI * 0,025 * (L / 2) Como L é í­mpar (95), reduzimos uma unidade, 95 vira 94: P = 48000 + 48000 * 0,025 * (94 / 2) P = 48000 + 48000 * 0,025 * 47 P = 48000 + 56400 P = 104400 GP's ou 104,4 k Sistema Labia.rar

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...