ZKL Posted August 25, 2021 Share Posted August 25, 2021 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 androksi Posted August 25, 2021 Other Languages Moderators Share Posted August 25, 2021 (edited) 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: Como a Wiki funciona. Tutorial Lua para iniciantes. Playlist para você aprender a escrever os seus próprios scripts. Curso sobre algoritmos. 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 August 26, 2021 by androksi 1 Link to comment
ZKL Posted August 26, 2021 Author Share Posted August 26, 2021 (edited) 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 August 26, 2021 by ZKL Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now