Boooas galera! E ai, tudo bem? Ontem a noite eu estava tomando um Redbull e percebi que não ira dormir tão cedo, então eu resolvi bolar um pequeno jogo que terá novas versões em breve. O mais impressionante é que eu fiz e deu certo quase de primeira.
Bom, vamos parar com a conversa fiada e vamos logo as explicações:
Como funciona:
Um breve resumo: dois jogadores devem ficar em duas posições escolhidas no script. Um comando inicial !start inicia o jogo, assim cada um recebe um número de carta, que pode variar de 1 a 20. Certo, depois disso vem a segunda parte, a seção de aposta. O primeiro jogador que apostar algo acima de 0 e menor que 1000 com o comando !bet Número vai ser o mandante. Depois disso, os dois jogadores devem falar !accept para ver quem tem a maior carta, assim o vencedor ganhará o dinheiro da aposta. Se algum jogador usar a palavra !reject ao invés de !accept o jogo reiniciará.
Algumas prevenções de bugs do sistema:
Se o oponente demorar muito para fazer sua jogada, tal como aceitar a aposta, é possível, depois de 3 minutos, o jogador falar !quitgame e o jogo reiniciar. Qualquer membro da staff com acesso maior que 3 pode usar o comando /endgame para encerrar algum jogo em andamento.
O script não deixa jogadores com o mesmo ip utilizarem o sistema por motivos claros.
Há um script de movement para não deixar os jogadores sair do tile após começar o jogo.
Há um script de creaturescripts para não deixar os jogadores logarem após começar o jogo.
Bom, é isso, acho que deu pra entender. Eu fiz o script tentando evitar o máximo que algum jogador abuse de bugs.
Talkaction:
function onSay(cid, words, param) local random1 = math.random(1, 20) local pos1 = getThingFromPos({x=, y=, z=, stackpos=253}).uid local pos2 = getThingFromPos({x=, y=, z=, stackpos=253}).uid local place1 = {x=, y=, z=} local place2 = {x=, y=, z=} local tempo = 180 local random2 = math.random(1, 20) if words == "!start" then if isPlayer(pos1) and isPlayer(pos2) and (pos1 == cid or pos2 == cid) then if getPlayerStorageValue(pos1, 30001) == -1 and getPlayerStorageValue(pos2, 30001) == -1 then if getPlayerIp(pos1) ~= getPlayerIp(pos2) then setGlobalStorageValue(30002, -1) doPlayerSendTextMessage(pos1, 22, "Game starting...") doPlayerSendTextMessage(pos2, 22, "Game starting...") setPlayerStorageValue(pos1, 30001, 1) setPlayerStorageValue(pos2, 30001, 1) setPlayerStorageValue(pos1, 30002, random1) setPlayerStorageValue(pos2, 30002, random2) doPlayerSendTextMessage(pos1, 4, "Sua carta é " .. random1) doPlayerSendTextMessage(pos2, 4, "Sua carta é " .. random2) doSendMagicEffect(getThingPos(pos1), 65) doSendMagicEffect(getThingPos(pos2), 65) setGlobalStorageValue(30002, tempo + os.time()) else doPlayerSendCancel(cid, "Você e seu companheiro tem o mesmo ip.") doSendMagicEffect(getCreaturePosition(cid), 2) end else doPlayerSendCancel(cid, "Você já esta no meio de um jogo.") doSendMagicEffect(getCreaturePosition(cid), 2) end else doPlayerSendCancel(cid, "Você precisa ser um dos dois participantes.") doSendMagicEffect(getCreaturePosition(cid), 2) end end if words == "!bet" then if isNumber(tonumber(param)) and tonumber(param) <= 1000 and tonumber(param) > 0 then if isPlayer(pos1) and isPlayer(pos2) and (pos1 == cid or pos2 == cid) then if getPlayerStorageValue(pos1, 30001) == 1 and getPlayerStorageValue(pos2, 30001) == 1 then setGlobalStorageValue(30002, -1) setGlobalStorageValue(30001, tonumber(param)) setPlayerStorageValue(pos1, 30001, 2) setPlayerStorageValue(pos2, 30001, 2) doPlayerSendTextMessage(pos1, 4, "The bet is " .. param) doPlayerSendTextMessage(pos2, 4, "The bet is " .. param) setGlobalStorageValue(30002, tempo + os.time()) else doPlayerSendCancel(cid, "O jogo não esta no estagio de apostas.") doSendMagicEffect(getCreaturePosition(cid), 2) end else doPlayerSendCancel(cid, "Você precisa ser um dos dois participantes.") doSendMagicEffect(getCreaturePosition(cid), 2) end else doPlayerSendCancel(cid, "A aposta deve ser menor 1000 e maior que 0.") doSendMagicEffect(getCreaturePosition(cid), 2) end end if words == "!accept" then if isPlayer(pos1) and isPlayer(pos2) and (pos1 == cid or pos2 == cid) then if (getPlayerStorageValue(pos1, 30001) == 3 and pos1 ~= cid) or (getPlayerStorageValue(pos2, 30001) == 3 and pos2 ~= cid) then local winner = getPlayerStorageValue(pos1, 30002) > getPlayerStorageValue(pos2, 30002) and pos1 or pos2 if getPlayerStorageValue(pos1, 30002) == getPlayerStorageValue(pos2, 30002) then doPlayerSendTextMessage(pos1, 4, "Empate.") doPlayerSendTextMessage(pos2, 4, "Empate.") setPlayerStorageValue(pos1, 30001, -1) setPlayerStorageValue(pos2, 30001, -1) setPlayerStorageValue(pos1, 30002, -1) setPlayerStorageValue(pos2, 30002, -1) doPlayerSendTextMessage(pos1, 4, "O jogo foi resetado.") doPlayerSendTextMessage(pos2, 4, "O jogo foi resetado.") setGlobalStorageValue(30001, -1) setGlobalStorageValue(30002, -1) doSendMagicEffect(getThingPos(pos1), 37) doSendMagicEffect(getThingPos(pos2), 37) else doPlayerAddMoney(winner, getGlobalStorageValue(30001)) doPlayerSendTextMessage(pos1, 4, "O ganhador é " .. getCreatureName(winner)) doPlayerSendTextMessage(pos2, 4, "O ganhador é " .. getCreatureName(winner)) setPlayerStorageValue(pos1, 30001, -1) setPlayerStorageValue(pos2, 30001, -1) setPlayerStorageValue(pos1, 30002, -1) setPlayerStorageValue(pos2, 30002, -1) doPlayerSendTextMessage(pos1, 4, "O jogo foi resetado.") doPlayerSendTextMessage(pos2, 4, "O jogo foi resetado.") setGlobalStorageValue(30001, -1) setGlobalStorageValue(30002, -1) doSendMagicEffect(getThingPos(pos1), 37) doSendMagicEffect(getThingPos(pos2), 37) end elseif getPlayerStorageValue(pos1, 30001) > 1 and getPlayerStorageValue(pos2, 30001) > 1 and (getPlayerStorageValue(pos1, 30001) ~= 3 or getPlayerStorageValue(pos2, 30001) ~= 3) then setGlobalStorageValue(30002, -1) setPlayerStorageValue(cid, 30001, 3) doPlayerSendTextMessage(pos1, 4, getCreatureName(cid) .. " Aceitou a aposta.") doPlayerSendTextMessage(pos2, 4, getCreatureName(cid) .. " Aceitou a aposta.") setGlobalStorageValue(30002, tempo + os.time()) end end end if words == "!reject" then if isPlayer(pos1) and isPlayer(pos2) and (pos1 == cid or pos2 == cid) then if getPlayerStorageValue(pos1, 30001) > 1 and getPlayerStorageValue(pos2, 30001) > 1 and (getPlayerStorageValue(pos1, 30001) ~= 3 or getPlayerStorageValue(pos2, 30001) ~= 3) then setPlayerStorageValue(pos1, 30001, -1) setPlayerStorageValue(pos2, 30001, -1) setPlayerStorageValue(pos1, 30002, -1) setPlayerStorageValue(pos2, 30002, -1) doPlayerSendTextMessage(pos1, 4, "O jogo foi resetado.") doPlayerSendTextMessage(pos2, 4, "O jogo foi resetado.") setGlobalStorageValue(30001, -1) setGlobalStorageValue(30002, -1) doSendMagicEffect(getThingPos(pos1), 37) doSendMagicEffect(getThingPos(pos2), 37) else doPlayerSendCancel(cid, "Você não esta no estagio para rejeitar uma aposta.") doSendMagicEffect(getCreaturePosition(cid), 2) end else doPlayerSendCancel(cid, "Você precisa ser um dos dois participantes.") doSendMagicEffect(getCreaturePosition(cid), 2) end end if words == "/endgame" or words == "!endgame" then if getPlayerAccess(cid) > 3 then if isPlayer(pos1) and isPlayer(pos2) then if getPlayerStorageValue(pos1, 30001) ~= -1 and getPlayerStorageValue(pos2, 30001) ~= -1 then setPlayerStorageValue(pos1, 30001, -1) setPlayerStorageValue(pos2, 30001, -1) setPlayerStorageValue(pos1, 30002, -1) setPlayerStorageValue(pos2, 30002, -1) doTeleportThing(pos1, place1) doTeleportThing(pos2, place2) doPlayerSendTextMessage(pos1, 4, "O jogo foi resetado por " .. getCreatureName(cid)) doPlayerSendTextMessage(pos2, 4, "O jogo foi resetado por " .. getCreatureName(cid)) setGlobalStorageValue(30001, -1) doSendMagicEffect(getThingPos(pos1), 37) doSendMagicEffect(getThingPos(pos2), 37) setGlobalStorageValue(30002, -1) else doPlayerSendCancel(cid, "O jogo ainda não começou.") doSendMagicEffect(getCreaturePosition(cid), 2) end else doPlayerSendCancel(cid, "Não há dois jogadores nas posições marcadas.") doSendMagicEffect(getCreaturePosition(cid), 2) end else doPlayerSendCancel(cid, "Você não pode executar este comando.") doSendMagicEffect(getCreaturePosition(cid), 2) end end if words == "!quitgame" then if isPlayer(pos1) and isPlayer(pos2) and (pos1 == cid or pos2 == cid) then if getGlobalStorageValue(30002) - os.time() <= 0 and getGlobalStorageValue(30002) ~= -1 then setPlayerStorageValue(pos1, 30001, -1) setPlayerStorageValue(pos2, 30001, -1) setPlayerStorageValue(pos1, 30002, -1) setPlayerStorageValue(pos2, 30002, -1) doPlayerSendTextMessage(pos1, 4, "O jogo foi resetado.") doPlayerSendTextMessage(pos2, 4, "O jogo foi resetado.") setGlobalStorageValue(30001, -1) setGlobalStorageValue(30002, -1) doSendMagicEffect(getThingPos(pos1), 37) doSendMagicEffect(getThingPos(pos2), 37) else doPlayerSendCancel(cid, "Você não pode desistir a menos que seu companheiro tenha ficado inativo por muito tempo.") doSendMagicEffect(getCreaturePosition(cid), 2) end else doPlayerSendCancel(cid, "Você precisa ser um dos dois participantes.") doSendMagicEffect(getCreaturePosition(cid), 2) end end return TRUE end
Explicações:
Pos1 e Pos2 são as posições onde os jogadores devem estar.
Place1 e Place2 são as posições para onde os jogadores serão teleportados caso o membro da staff usar o comando /endgame.
Tag:
<talkaction words="!start;!bet;!accept;!reject;!quitgame;/endgame;!endgame" script="NomeDoArquivo.lua" />
MoveEvent:
function StepOut(cid, item, position, fromPosition) if getPlayerStorageValue(cid, 30001) > 0 then doTeleportThing(cid, fromPosition) else return TRUE end end
Explicação:
Coloque um Action Id nos dois tiles onde os jogadores devem estar.
Tag:
<movevent event="StepOut" actionid="Action ID" script="NomeDoArquivo.lua" />
CreatureScript:
function onLogout(cid) if getPlayerStorageValue(cid, 30001) > 0 then doPlayerSendCancel(cid, "You can't logout while you are in a game.") return FALSE else return TRUE end end
Tag:
<event type="logout" name="Game" event="script" value="NomeDoArquivo.lua"/>
Prevenção de alguns bugs:
Em alguns Ots, é possível que os Storages 30001 e 30002 já estejam sendo usados, caso acontecer, troque no script acima ou troque no outro arquivo que esta sendo usado os Storages.
Servidor Testado: New Styller Yourots 0.7.5
Instalando e testando o sistema:
http://www.youtube.com/watch?v=SrzO8P28GuM
Acho que é isso galera, espero que gostem, até mais galera.