Ir para conteúdo
Propaganda

Posts Recomendados

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>
  • Like 5
Link para o comentário
https://tibiadevs.com/forums/topic/833-npc-de-corrida-pokemon/
Compartilhar em outros sites

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

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 conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
  • Criar Novo...