kevin 15 Postado 18 de Janeiro Compartilhar Postado 18 de Janeiro Fala, galera! Aqui é o Kevin, e trago uma novidade fresquinha para vocês: o sistema de corrida de Pokémons com apostas acabou de sair do forno! 🏁🔥 Passei algumas boas horas ajustando e refinando cada detalhe para garantir que a experiência fosse divertida, justa e com aquele toque de adrenalina. Foram ajustes em timers, balanceamento dos multiplicadores de premiação, e até mesmo a implementação de uma taxa de 20% para manter as coisas mais realistas e estratégicas. Tudo isso pra deixar a mecânica bem afinada e trazer uma sensação de imersão para quem gosta de jogos de azar e corridas emocionantes! O que esperar? Escolha seu Pokémon favorito: Temos seis Pokémons disponíveis para as apostas. Quem será o mais rápido? Apostas e prêmios: A cada corrida, você pode apostar 100 HD. Se o seu Pokémon vencer, o prêmio será multiplicado entre 2x e 5x, com desconto de taxa. Corrida dinâmica: Posições atualizadas em tempo real a cada 5 segundos, direto no console. Competitividade e sorte: Será que você confia no seu instinto ou prefere a sorte do acaso? Ajustes e desafios durante o desenvolvimento Foram vários testes para garantir que as distâncias fossem atualizadas corretamente e que o vencedor fosse determinado de forma justa. Trabalhei no bloqueio de movimentação dos jogadores durante a corrida para evitar "truques" durante o evento — ninguém trapaceia por aqui! Refinamento das mensagens de texto para garantir que todos entendam como participar e acompanhar o progresso da corrida. Próximos passos? Já estou pensando em novas ideias para deixar a corrida ainda mais interessante. Quem sabe incluir eventos especiais ou Pokémons lendários em corridas futuras? Se vocês tiverem sugestões, manda aí! Agora é com vocês: aproveitem, apostem com responsabilidade e divirtam-se! 😎 💬 Kevin NPC Corrida de Pokémons – Sistema de Apostas Divertido e Dinâmico 💥 Descrição: Este NPC traz um sistema de corridas de Pokémons com apostas emocionantes para o seu servidor baseado no TFS 0.3.6. Os jogadores escolhem seu Pokémon favorito entre seis opções e apostam uma quantia fixa. O objetivo é torcer para que o escolhido seja o mais rápido e vença a corrida! A recompensa varia de 2x a 5x o valor apostado, com uma taxa de 20% aplicada ao prêmio final. Características 🏃 Simulação de Corrida: Cada Pokémon avança aleatoriamente a cada segundo, simulando uma corrida dinâmica. 🏆 Sistema de Apostas: Jogadores escolhem entre Bulbasaur, Charmander, Squirtle, Pikachu, Jigglypuff e Meowth para apostar 100 HD. 💰 Multiplicadores de Prêmio: O prêmio é definido aleatoriamente entre 2x e 5x o valor apostado, após a dedução de uma taxa de 20%. 📊 Atualizações de Posições: Posições atualizadas a cada 5 segundos para os jogadores que apostaram. 🔐 Restrição de Movimentação: Durante a corrida, os jogadores são imobilizados para evitar fraudes. Comandos Disponíveis "apostar": Inicia o processo de aposta escolhendo um Pokémon. "detalhes": Explica as regras e funcionamento do sistema de apostas e corrida. "voltar": Retorna ao menu inicial de escolha de Pokémon. CÓDIGO LUA. local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} local pokemons = {"Bulbasaur", "Charmander", "Squirtle", "Pikachu", "Jigglypuff", "Meowth"} local raceInProgress = false local racePositions = {} local raceUpdateInterval = 1000 -- Atualiza a cada 1 segundo local raceDuration = 30000 -- Corrida dura 30 segundos (ajustável) local raceEndTime = 0 local playersBetting = {} local chosenPokemon = "" local betAmount = 0 local lastMessageTime = 0 -- Controle para mensagens a cada 5 segundos -- Função para finalizar a corrida local function finishRace() raceInProgress = false -- Determina o vencedor baseado no Pokémon que atingiu 300 metros primeiro local winner = nil for _, racer in ipairs(racePositions) do if racer.meters >= 300 then winner = racer.name break end end if winner then -- Gera um multiplicador aleatório entre 2x e 5x local prizeMultiplier = math.random(2, 5) for _, player in ipairs(playersBetting) do if winner == chosenPokemon then local prize = betAmount * prizeMultiplier -- Aplica o custo de 20% no prêmio local fee = prize * 0.2 local finalPrize = prize - fee -- Entrega a recompensa com desconto doPlayerAddMoney(player, finalPrize) doPlayerSendTextMessage(player, MESSAGE_STATUS_CONSOLE_BLUE, "Parabéns! O Pokémon " .. winner .. " venceu! Você ganhou " .. finalPrize .. " HD com um multiplicador de " .. prizeMultiplier .. "x! (Após desconto de 20% de taxa)") -- Informa o valor da taxa de desconto doPlayerSendTextMessage(player, MESSAGE_STATUS_CONSOLE_BLUE, "Uma taxa de 20% foi aplicada ao prêmio. Taxa: " .. fee .. " HD") else doPlayerSendTextMessage(player, MESSAGE_STATUS_CONSOLE_BLUE, "Que pena! O Pokémon " .. winner .. " venceu. Você perdeu.") end -- Desbloquear o movimento do jogador após a corrida doCreatureSetNoMove(player, false) -- Libera o movimento end end -- Reseta o estado para nova aposta betAmount = 0 chosenPokemon = "" playersBetting = {} racePositions = {} end -- Atualiza as posições na corrida local function updateRacePositions() if not raceInProgress then return end -- Incrementa os "metros percorridos" dos Pokémons local addedPositions = {} -- Tabela para armazenar as novas distâncias for _, racer in ipairs(racePositions) do if racer.meters < 300 then local newMeters = racer.meters + math.random(1, 10) -- Incremento aleatório entre 1 e 10 metros -- Garantir que a distância não seja repetida while table.contains(addedPositions, newMeters) do newMeters = newMeters + 1 -- Aumenta 1 metro até que a distância seja única end racer.meters = newMeters table.insert(addedPositions, newMeters) -- Armazena a nova distância end end -- Envia mensagens para os jogadores a cada 5 segundos if os.time() * 1000 >= lastMessageTime + 5000 then local positionText = "Atualização das posições:\n" for i, racer in ipairs(racePositions) do positionText = positionText .. i .. ". " .. racer.name .. " percorreu " .. racer.meters .. " metros.\n" end for _, player in ipairs(playersBetting) do doPlayerSendTextMessage(player, MESSAGE_STATUS_CONSOLE_BLUE, positionText) end lastMessageTime = os.time() * 1000 -- Atualiza o tempo da última mensagem end -- Verifica se a corrida terminou local finished = false for _, racer in ipairs(racePositions) do if racer.meters >= 300 then finished = true break end end if finished then finishRace() -- Certifique-se de que a função 'finishRace' é chamada corretamente else -- Continua a corrida addEvent(updateRacePositions, raceUpdateInterval) end end -- Inicia a corrida local function startRace() raceInProgress = true raceEndTime = os.time() * 1000 + raceDuration lastMessageTime = os.time() * 1000 -- Inicializa a corrida com os Pokémons e "metros percorridos" em 0 racePositions = {} for _, pokemon in ipairs(pokemons) do table.insert(racePositions, {name = pokemon, meters = 0}) end -- Bloquear o movimento dos jogadores que apostaram for _, player in ipairs(playersBetting) do doCreatureSetNoMove(player, true) -- Bloqueia o movimento doPlayerSendTextMessage(player, MESSAGE_STATUS_CONSOLE_BLUE, "A corrida começou! As posições serão atualizadas a cada 5 segundos.\n") end -- Inicia a atualização das posições addEvent(updateRacePositions, raceUpdateInterval) end -- Função para verificar se a tabela contém um valor function table.contains(tbl, value) for _, v in pairs(tbl) do if v == value then return true end end return false end 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 if raceInProgress then selfSay("A corrida está em andamento. Você não pode apostar no momento.", cid) return true end if msgcontains(msg, "apostar") then selfSay("Muito bem, escolha um Pokémon para apostar: Bulbasaur, Charmander, Squirtle, Pikachu, Jigglypuff, Meowth.", cid) talkState[cid] = 1 elseif talkState[cid] == 1 then local chosen = msg:lower():gsub("^%l", string.upper) -- Formata para inicial maiúscula if table.contains(pokemons, chosen) then chosenPokemon = chosen betAmount = 100 -- Valor fixo da aposta selfSay("Você escolheu " .. chosen .. "! A aposta é de " .. betAmount .. " HD. Deseja continuar? (yes/no)", cid) talkState[cid] = 2 else selfSay("Esse Pokémon não existe. Escolha um válido.", cid) end elseif talkState[cid] == 2 then if msgcontains(msg, "yes") then -- Verificar se o jogador tem HD suficiente (100 HD ou 1 HD) if getPlayerItemCount(cid, 2152) >= 100 then removeBetAmount(cid, 2152, 100) -- Remove 100 HD (item 2152) table.insert(playersBetting, cid) selfSay("A corrida começará em breve! Boa sorte!", cid) startRace() talkState[cid] = nil elseif getPlayerItemCount(cid, 2160) >= 1 then removeBetAmount(cid, 2160, 1) -- Remove 1 HD (item 2160) table.insert(playersBetting, cid) selfSay("A corrida começará em breve! Boa sorte!", cid) startRace() talkState[cid] = nil else selfSay("Você não tem dinheiro suficiente.", cid) talkState[cid] = nil end elseif msgcontains(msg, "no") then selfSay("Aposta cancelada. Escolha outro Pokémon.", cid) talkState[cid] = 1 else selfSay("Por favor, responda 'yes' ou 'no'.", cid) end elseif msgcontains(msg, "detalhes") then selfSay("O objetivo do jogo é apostar em um Pokémon para participar de uma corrida. A corrida dura 30 segundos e as posições dos Pokémons serão atualizadas a cada 5 segundos. A cada aposta, você escolhe um Pokémon e paga 100 HD. Se o Pokémon que você escolheu vencer a corrida, você ganhará o dobro ou até mesmo o quíntuplo da sua aposta. Se o seu Pokémon não ganhar, você perde a aposta. Após isso, você pode escolher outro Pokémon para apostar ou voltar à escolha do Pokémon. Para voltar ao início, basta digitar 'voltar'.", cid) talkState[cid] = nil elseif msgcontains(msg, "voltar") then selfSay("Agora, escolha um Pokémon para apostar: Bulbasaur, Charmander, Squirtle, Pikachu, Jigglypuff, Meowth.", cid) talkState[cid] = 1 end return true end -- Função para remover a aposta function removeBetAmount(cid, itemId, amount) local hdCount = getPlayerItemCount(cid, itemId) if hdCount >= amount then doPlayerRemoveItem(cid, itemId, amount) else selfSay("Você não tem HDs suficientes para realizar a aposta.", cid) end end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) CÓDIGO XML. <?xml version="1.0" encoding="UTF-8"?> <npc name="Apostador" script="aposta.lua" walkinterval="350000" floorchange="0" speed="0" lookdir="2"> <health now="150" max="150"/> <look type="511" head="22" body="0" legs="19" feet="82"/> <parameters> <parameter key="message_greet" value="Olá |PLAYERNAME|, se você busca emoção e adrenalina, venha fazer sua aposta na corrida de pokémons! São 300 metros de pura emoção, onde só os mais rápidos chegam à linha de chegada. Quer {apostar} e saber {detalhes}?"/> </parameters> </npc> 5 Link para o comentário https://tibiadevs.com/forums/topic/833-npc-de-corrida-pokemon/ Compartilhar em outros sites Mais opções de compartilhamento...
seilaeusou 0 Postado 19 de Janeiro Compartilhar Postado 19 de Janeiro e pra fazer a animação dos pokemons correndo igual no otp? Link para o comentário https://tibiadevs.com/forums/topic/833-npc-de-corrida-pokemon/#findComment-4374 Compartilhar em outros sites Mais opções de compartilhamento...
Omega 2 Postado 19 de Janeiro Compartilhar Postado 19 de Janeiro Pelo que eu vi no código é apenas o npc, mais seria legal se fisse 1 hora atrás, seilaeusou disse: e pra fazer a animação dos pokemons correndo igual no otp? Link para o comentário https://tibiadevs.com/forums/topic/833-npc-de-corrida-pokemon/#findComment-4375 Compartilhar em outros sites Mais opções de compartilhamento...
riakisuk 0 Postado 20 de Janeiro Compartilhar Postado 20 de Janeiro Cade os credito viado ? Link para o comentário https://tibiadevs.com/forums/topic/833-npc-de-corrida-pokemon/#findComment-4388 Compartilhar em outros sites Mais opções de compartilhamento...
Posts Recomendados
Crie uma conta ou entre para comentar
Você precisar ser um membro para fazer um comentário
Criar uma conta
Crie uma nova conta em nossa comunidade. É fácil!
Crie uma nova contaEntrar
Já tem uma conta? Faça o login.
Entrar Agora