Jump to content

Gun Game


Recommended Posts

Olá, queria desenvolver um sistema de gun game para meu servidor de pvp, porem não sei por onde começar, gostaria de fazer um sistema onde seria necessario 20 pessoas na fila para iniciar o gun game, assim que possuir as 20 pessoas na fila o gun game se iniciaria e cada arma seria necessario uma quantia de kills para mudar para proximo e vence quem fizer 80 kills primeiro.

Link to comment
  • Other Languages Moderators

Olá! Seja bem-vindo(a) ao fórum. ?

O sistema que você deseja não é tão complicado de ser feito, embora seja necessário um certo conhecimento em programação. Mesmo que eu te explique aqui, não iria adiantar, pois presumo que você não saberia por onde começar.

Recomendo que você leia estes seguintes artigos:

De qualquer forma, acredito que valha a pena escrever sobre a lógica por trás. Então, serei breve:

Vamos lá. O jogo irá começar quando houver 20 pessoas esperando. Para isso, nós precisamos de uma tabela, onde os jogadores ficarão armazenados. A cada jogador que digitar o comando para participar, nós o inserimos na tabela. Caso ele saia do servidor ou morra (no jogo ?), nós o retiramos da tabela, para que não ocorra bugs desnecessários.

Mostrando isso em código, ficaria mais ou menos desta forma:

Spoiler
local queue = {} -- Tabela onde os jogadores ficarão armazenados.
local playerKills = {} -- Tabela onde as kills dos jogadores serão salvas
local gameRunning = false -- Salvar o estado do jogo

function isAParticipant(player) -- Criei essa função apenas para checar se o jogador já está participando.
    for index, participant in pairs(queue) do
        if participant == player then
            return true, index
        end
    end
    return false
end

function processKills(ammo, attacker) -- Nossa função que será usada para contabilizar as kills (o evento foi adicionado dentro da função startGame).
    if attacker and getElementType(attacker) == "player" and attacker ~= source then -- Se houve alguém que matou, que seja um jogador e também diferente de quem morreu, então:
        if isAParticipant(attacker) and playerKills[attacker] then -- Checando se o jogador é realmente um participante
            playerKills[attacker] = playerKills[attacker] + 1 -- Soma +1 a cada kill
            
            if playerKills[attacker] == 80 then -- Caso a contagem de kills do jogador contabilize, então ele ganhou. Vamos parar o jogo.
                stopGame(attacker)
            end
        end
    end
end

function bringPlayerBackToArena()
    if isAParticipant(source) then
        spawnAtArena(source)
    end
end

function spawnAtArena(player)
    setElementPosition(player, 0, 0, 3) -- Teleportamos o jogador para a arena (usei o centro de San Andreas, só para testes).
    giveWeapon(player, 30, 500, true) -- Dá uma arma para o jogador (coloquei para começar com a AK-47).
end

function startGame()
    gameRunning = true -- Altera o estado do jogo para true, ou seja, há um jogo em andamento.
    addEventHandler("onPlayerWasted", root, processKills) -- Adiciona um evento para contabilizar as kills
    addEventHandler("onPlayerSpawn", root, bringPlayerBackToArena) -- Adiciona um evento para trazer o jogador à arena, caso ele morra.
    for index, player in pairs(queue) do -- Fazemos um laço de repetição naquela tabela onde os jogadores estão armazenados.
        playerKills[player] = 0 -- Definimos que o jogador começará com 0 kills
        spawnAtArena(player) -- Spawnamos os jogadores, usando a função que criei.
    end
end

function stopGame(winner)
    if winner and isElement(winner) then -- Caso exista o winner de fato, então:
        local allPlayers = getElementsByType("player") -- Obtém todos os jogadores do servidor.
        outputChatBox(getPlayerName(winner) .. " venceu o jogo!", allPlayers, 0, 255, 0) -- Envia uma mensagem para todos do servidor.
    end
    for index, player in pairs(queue) do -- Fazemos um laço de repetição naquela tabela onde os jogadores estão armazenados.
        takeAllWeapons(player) -- Removemos todas as armas do jogador.
        playerKills[player] = nil -- Limpamos a memória RAM do servidor
    end
    removeEventHandler("onPlayerWasted", root, processKills) -- Remove o evento que contabiliza as kills.
    removeEventHandler("onPlayerSpawn", root, bringPlayerBackToArena) -- Remove o evento de respawn.
    gameRunning = false -- Altera o estado do jogo para false, ou seja, jogo finalizado.
    queue = {} -- Recria a tabela da fila.
end

addCommandHandler("participar", function(player)
    if gameRunning then -- Se o jogo já tiver iniciado, então não iremos executar o código.
        return false
    end

    if isAParticipant(player) then -- Fazendo o uso da função que criei; caso o jogador já esteja esperando, então nós paramos por aqui.
        return false -- Para o código por aqui.
    end

    table.insert(queue, player) -- Inserimos o jogador na tabela.

    if #queue == 20 then -- Ao inserir um jogador, se a tabela conter 20 elementos, então, vamos iniciar o jogo
        startGame()
    end
end)

addEventHandler("onPlayerQuit", root, function() -- Adicionamos um evento que sempre será acionado quando um jogador se desconectar.
    local await, index = isAParticipant(source) -- Essa função retorna se ele está esperando e também a posição dentro da tabela.
    if await then -- Caso ele esteja esperando, então o removemos:
        table.remove(queue, index)
		
        if #queue == 1 and gameRunning then -- Caso sobre apenas um jogador, então vamos parar o jogo, pois não há motivo para continuar.
            stopGame() -- Não vamos passar o ganhador, pois ninguém venceu.
        end
    end
    if playerKills[source] then -- Apenas limpando a memória RAM do servidor, caso um jogador saia enquanto está no jogo
        playerKills[source] = nil
    end
end)

 

É claro que falta algumas coisas, como por exemplo dar uma outra arma ao jogador, caso ele mate X jogadores. Espero que tenha ajudado de alguma forma. :)

Edited by androksi
  • Like 1
Link to comment

Obrigado, ajudou muito consigo ler o codigo e entende-lo tranquilamente, so estava com duvida por onde começar pois não entendo 100% de tabela e com sua ajuda consegui suprir minahs duvidas.

Edited by ZKL
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...