Informações Gerais
Nome: Sistema de futebol
Autor: Zathao
Testado em: The Forgotten Server 0.3.6
Versão Tibia: 8.54
Sistema
O sistema se resume em uma partida completa
de futebol entre 2 jogadores, sendo controlada por um juiz e
apoiada por uma torcida para cada player.
Juiz: Da informações referentes ao placar,
ao tempo de espera para iniciar o lance e informa
quando é gol.
Torcida: Apoia os jogadores. Cada jogador
tem uma torcida fanática que
não para de dar forças, apoiando com isentivos e
comemorando loucamente um gol!
Ao termino do jogo, o vencedor recebe um troféu
com o nome do ganhador e do vencedor!
Video Demonstrativo
Instalação
- Crie um arquivo chamado futebol.lua na pasta data/actions/scripts/
- Adicione este codigo dentro do arquivo:
----------------------------------------
----- ### Sistema de Futebol ### -----
----------------------------------------
-- Feito por: zathao --
-- Msn:
[email protected] --
-- email:
[email protected] --
----------------------------------------
-- Configurações Gerais
local config = {
-- Posição que o jogadores devem estar na hora de puxar a alavanca
posJogador1 = {x=82,y=153,z=7, stackpos=1},
posJogador2 = {x=84,y=153,z=7, stackpos=1},
-- Posição inicial dos jogadores na partida
posTeleporte1 = {x=81,y=160,z=7, stackpos=1},
posTeleporte2 = {x=85,y=160,z=7, stackpos=1},
posBola = {x=83,y=160,z=7, stackpos=1}, -- Posição inicial da bola
nomeNpc = "Juiz", -- Lembrando que o npc deve existir
posNpc = {x=83,y=155,z=7, stackpos=1}, -- Posição inicial do npc
gols = 5, -- Quantidade de gols para ganhar o jogo
tempoPrePartida = 5, -- Tempo de espera para começar a partida (segundos)
quantidadeTorcedores = 7, -- Para cada equipe
-- Posição inicial em que o script irá começar preencher com os torcedores
posTorcida1 = {x=76,y=165,z=7, stackpos=1},
posTorcida2 = {x=84,y=165,z=7, stackpos=1},
-- Posição dos gols
posGol1 = {
{x=75,y=159,z=7, stackpos=1},
{x=75,y=160,z=7, stackpos=1},
{x=75,y=161,z=7, stackpos=1}
},
posGol2 = {
{x=91,y=159,z=7, stackpos=1},
{x=91,y=160,z=7, stackpos=1},
{x=91,y=161,z=7, stackpos=1}
}
}
local jogador1 = nil
local jogador2 = nil
local listaTorcedores1 = ""
local listaTorcedores2 = ""
local npcUid = nil
local placar = { 0,0 }
local eventoTorcida = nil
local eventoGol = nil
local function inicioJogo()
doCreatureSay(npcUid, "Valendo!", TALKTYPE_YELL)
doSendMagicEffect(config.posTeleporte1, 12)
doSendMagicEffect(config.posTeleporte2, 12)
doCreatureSetNoMove(jogador1, false)
doCreatureSetNoMove(jogador2, false)
end
local function torcida(nome1, nome2)
local chanceTorcida1 = math.random(1,2)
local chanceTorcida2 = math.random(1,2)
if(chanceTorcida1>1)then
local uids = string.explode(listaTorcedores1, ",")
local torcedor = uids[math.random(1,#uids)]
doCreatureSay(torcedor, "Vai "..nome1.."!", TALKTYPE_YELL)
end
if(chanceTorcida2>1)then
local uids = string.explode(listaTorcedores2, ",")
local torcedor = uids[math.random(1,#uids)]
doCreatureSay(torcedor, "Vai "..nome2.."!", TALKTYPE_YELL)
end
eventoTorcida = addEvent(torcida,4000, nome1, nome2)
end
local function delayMsg(msg)
doCreatureSay(npcUid, msg, TALKTYPE_YELL)
end
local function testeGol(nome1,nome2)
for i=1,#config.posGol1 do
for j=1,10 do
local testPos = {x=config.posGol1[i].x, y=config.posGol1[i].y, z=config.posGol1[i].z, stackpos=j}
local thing = getThingFromPos(testPos)
if(thing.itemid==2109)then
if(placar[2]==config.gols-1)then
doPlayerSendTextMessage(jogador2, MESSAGE_INFO_DESCR, "Parabéns! Você ganhou a partida.")
doPlayerSendTextMessage(jogador1, MESSAGE_INFO_DESCR, "Lamento, mas você perdeu o jogo.")
doTeleportThing(jogador1, config.posJogador1)
doTeleportThing(jogador2, config.posJogador2)
doSendMagicEffect(config.posJogador1, 12)
doSendMagicEffect(config.posJogador2, 12)
local item = doPlayerAddItem(jogador2, 5805)
doItemSetAttribute(item, "description", nome2.." conquistou este troféu apos derrotar "..nome1.." em uma partida de futebol.")
doRemoveCreature(npcUid)
stopEvent(eventoTorcida)
stopEvent(eventoGol)
local uids1 = string.explode(listaTorcedores1, ",")
local uids2 = string.explode(listaTorcedores2, ",")
for k = 1, #uids1 do
doRemoveCreature(uids1[k])
doRemoveCreature(uids2[k])
end
jogador1 = nil
jogador2 = nil
listaTorcedores1 = ""
listaTorcedores2 = ""
config.posTorcida1 = {x=76,y=165,z=7, stackpos=1}
config.posTorcida2 = {x=84,y=165,z=7, stackpos=1}
npcUid = nil
placar = { 0,0 }
else
doTeleportThing(jogador1, config.posTeleporte1)
doTeleportThing(jogador2, config.posTeleporte2)
doSendMagicEffect(config.posTeleporte1, 10)
doSendMagicEffect(config.posTeleporte2, 10)
doCreatureSetNoMove(jogador1, true)
doCreatureSetNoMove(jogador2, true)
doCreatureSetLookDirection(jogador1, 1)
doCreatureSetLookDirection(jogador2, 3)
doCreateItem(2109, 1, config.posBola)
doSendMagicEffect(config.posBola, 13)
local uids = string.explode(listaTorcedores2, ",")
for k = 1, #uids do
doCreatureSay(uids[k], "GOOOOL!", TALKTYPE_YELL)
end
placar[2] = placar[2]+1
local msg = "Gol do "..nome2.."! O placar atual é "..nome1..": "..placar[1].." e "..nome2..": "..placar[2].."."
addEvent(delayMsg,1000, msg)
msg = "A próxima rodada irá começar em cerca de "..config.tempoPrePartida.." segundos. Concentrem-se!"
addEvent(delayMsg,6000, msg)
addEvent(inicioJogo,7000+(config.tempoPrePartida*1000))
end
doRemoveItem(thing.uid)
end
end
end
for i=1,#config.posGol2 do
for j=1,10 do
local testPos = {x=config.posGol2[i].x, y=config.posGol2[i].y, z=config.posGol2[i].z, stackpos=j}
local thing = getThingFromPos(testPos)
if(thing.itemid==2109)then
if(placar[1]==config.gols-1)then
doPlayerSendTextMessage(jogador1, MESSAGE_INFO_DESCR, "Parabéns! Você ganhou a partida.")
doPlayerSendTextMessage(jogador2, MESSAGE_INFO_DESCR, "Lamento, mas você perdeu o jogo.")
doTeleportThing(jogador1, config.posJogador1)
doTeleportThing(jogador2, config.posJogador2)
doSendMagicEffect(config.posJogador1, 12)
doSendMagicEffect(config.posJogador2, 12)
local item = doPlayerAddItem(jogador1, 5805)
doItemSetAttribute(item, "description", nome1.." conquistou este troféu apos derrotar "..nome2.." em uma partida de futebol.")
doRemoveCreature(npcUid)
stopEvent(eventoTorcida)
stopEvent(eventoGol)
local uids1 = string.explode(listaTorcedores1, ",")
local uids2 = string.explode(listaTorcedores2, ",")
for k = 1, #uids1 do
doRemoveCreature(uids1[k])
doRemoveCreature(uids2[k])
end
jogador1 = nil
jogador2 = nil
listaTorcedores1 = ""
listaTorcedores2 = ""
config.posTorcida1 = {x=76,y=165,z=7, stackpos=1}
config.posTorcida2 = {x=84,y=165,z=7, stackpos=1}
npcUid = nil
placar = { 0,0 }
else
doTeleportThing(jogador1, config.posTeleporte1)
doTeleportThing(jogador2, config.posTeleporte2)
doSendMagicEffect(config.posTeleporte1, 10)
doSendMagicEffect(config.posTeleporte2, 10)
doCreatureSetNoMove(jogador1, true)
doCreatureSetNoMove(jogador2, true)
doCreatureSetLookDirection(jogador1, 1)
doCreatureSetLookDirection(jogador2, 3)
doCreateItem(2109, 1, config.posBola)
doSendMagicEffect(config.posBola, 13)
local uids = string.explode(listaTorcedores1, ",")
for k = 1, #uids do
doCreatureSay(uids[k], "GOOOOL!", TALKTYPE_YELL)
end
placar[1] = placar[1]+1
local msg = "Gol do "..nome1.."! O placar atual é "..nome1..": "..placar[1].." e "..nome2..": "..placar[2].."."
addEvent(delayMsg,1000, msg)
msg = "A próxima rodada irá começar em cerca de "..config.tempoPrePartida.." segundos. Concentrem-se!"
addEvent(delayMsg,7000, msg)
addEvent(inicioJogo,8000+(config.tempoPrePartida*1000))
end
doRemoveItem(thing.uid)
end
end
end
eventoGol = addEvent(testeGol,100,nome1,nome2)
end
function onUse(cid, item, fromPosition, itemEx, toPosition)
if (isPlayer(jogador1) == true and isPlayer(jogador2) == true)then
doPlayerSendCancel(cid, "Lamento, mas o campo ja está em uso.")
doSendMagicEffect(fromPosition, 2)
return false
end
local coisa1 = getThingFromPos(config.posJogador1).uid
local coisa2 = getThingFromPos(config.posJogador2).uid
if(isPlayer(coisa1))then
jogador1 = coisa1
end
if(isPlayer(coisa2))then
jogador2 = coisa2
end
if(jogador1==nil or jogador2==nil)then
doPlayerSendCancel(cid, "Desculpe, mas você precisa de outro player para começar um jogo.")
doSendMagicEffect(fromPosition, 2)
return false
else
doTeleportThing(jogador1, config.posTeleporte1)
doTeleportThing(jogador2, config.posTeleporte2)
doSendMagicEffect(config.posTeleporte1, 10)
doSendMagicEffect(config.posTeleporte2, 10)
doCreatureSetNoMove(jogador1, true)
doCreatureSetNoMove(jogador2, true)
doCreatureSetLookDirection(jogador1, 1)
doCreatureSetLookDirection(jogador2, 3)
doCreateItem(2109, 1, config.posBola)
doSendMagicEffect(config.posBola, 13)
npcUid = doCreateNpc(config.nomeNpc, config.posNpc)
doCreatureSetLookDirection(npcUid, 2)
doSendMagicEffect(config.posNpc, 10)
doCreatureSetNoMove(npcUid, true)
local nome1 = getCreatureName(jogador1)
local nome2 = getCreatureName(jogador2)
local msg = "Saudações "..nome1.." e "..nome2..". Serei o juiz desta partida. Ganhará o primeiro a fazer "..config.gols.." gols."
addEvent(delayMsg,1000, msg)
msg = "A partida irá começar em cerca de "..config.tempoPrePartida.." segundos. Concentrem-se!"
addEvent(delayMsg,9000, msg)
local uidMonstro
local randomOutfit
for i=1,config.quantidadeTorcedores do
uidMonstro = doCreateMonster("Torcedor",config.posTorcida1)
doCreatureSetLookDirection(uidMonstro, 0)
doSendMagicEffect(config.posTorcida1, 10)
doCreatureSetNoMove(uidMonstro, true)
config.posTorcida1.x = config.posTorcida1.x + 1
randomOutfit = {
lookType = 128,
lookHead = math.random(1,66),
lookAddons = math.random(0,2),
lookLegs = math.random(1,66),
lookFeet = math.random(1,66)
}
doCreatureChangeOutfit(uidMonstro, randomOutfit)
if(listaTorcedores1=="")then
listaTorcedores1 = uidMonstro
else
listaTorcedores1 = listaTorcedores1..","..uidMonstro
end
end
for i=1,config.quantidadeTorcedores do
uidMonstro = doCreateMonster("Torcedor",config.posTorcida2)
doCreatureSetLookDirection(uidMonstro, 0)
doSendMagicEffect(config.posTorcida2, 10)
doCreatureSetNoMove(uidMonstro, true)
config.posTorcida2.x = config.posTorcida2.x + 1
randomOutfit = {
lookType = 128,
lookHead = math.random(67,132),
lookAddons = math.random(0,2),
lookLegs = math.random(67,132),
lookFeet = math.random(67,132)
}
doCreatureChangeOutfit(uidMonstro, randomOutfit)
if(listaTorcedores2=="")then
listaTorcedores2 = uidMonstro
else
listaTorcedores2 = listaTorcedores2..","..uidMonstro
end
end
addEvent(inicioJogo,10000+(config.tempoPrePartida*1000))
eventoTorcida = addEvent(torcida,10000+(config.tempoPrePartida*1000), nome1, nome2)
eventoGol = addEvent(testeGol,10000+(config.tempoPrePartida*1000), nome1, nome2)
local teste = string.explode(listaTorcedores1,",")
end
return true
end
- Posição do Npc:
{x=83,y=155,z=7, stackpos=1}
- Posição inicial de preenchimento das torcidas:
posTorcida1 = {x=76,y=165,z=7, stackpos=1}
posTorcida2 = {x=84,y=165,z=7, stackpos=1}
- Posição dos gols
posGol1 = {
{x=75,y=159,z=7, stackpos=1}
{x=75,y=160,z=7, stackpos=1}
{x=75,y=161,z=7, stackpos=1}
}
posGol2 = {
{x=91,y=159,z=7, stackpos=1}
{x=91,y=160,z=7, stackpos=1}
{x=91,y=161,z=7, stackpos=1}
}
--
É isso pessoal, espero que tenham gostado.
Esse é o primeiro script que posto aqui. Todo tipo de crítica será bem vinda.
Obrigado!
- Agora adicione no arquivo actions.xml em data/actions este conteúdo:
<action actionid="5000" event="script" value="futebol.lua">
- Crie um arquivo chamado juiz.lua em data/npc/scripts e cole
este conteúdo:
local focuses = {}
local function isFocused(cid)
for i, v in pairs(focuses) do
if(v == cid) then
return true
end
end
return false
end[/left]
local function addFocus(cid)
if(not isFocused(cid)) then
table.insert(focuses, cid)
end
end
local function removeFocus(cid)
for i, v in pairs(focuses) do
if(v == cid) then
table.remove(focuses, i)
break
end
end
end
local function lookAtFocus()
for i, v in pairs(focuses) do
if(isPlayer(v)) then
doNpcSetCreatureFocus(v)
return
end
end
doNpcSetCreatureFocus(0)
end
function onCreatureAppear(cid)
end
function onCreatureDisappear(cid)
if(isFocused(cid)) then
selfSay("Hmph!")
removeFocus(cid)
if(isPlayer(cid)) then --Be sure he's online
closeShopWindow(cid)
end
end
end
function onCreatureSay(cid, type, msg)
end
function onPlayerCloseChannel(cid)
if(isFocused(cid)) then
selfSay("Hmph!")
closeShopWindow(cid)
removeFocus(cid)
end
end
function onThink()
for i, focus in pairs(focuses) do
if(not isCreature(focus)) then
removeFocus(focus)
else
local distance = getDistanceTo(focus) or -1
if((distance > 4) or (distance == -1)) then
selfSay("Hmph!")
closeShopWindow(focus)
removeFocus(focus)
end
end
end
lookAtFocus()
end
- E conclua com a criação de um arquivo chamado juiz.xml em data/npc/ contendo este conteúdo:
<!--?xml version="1.0" encoding="UTF-8"?-->
<npc name="Juiz" script="juiz.lua" walkinterval="2000" floorchange="0">
<health now="100" max="100">
<look type="128" head="17" body="54" legs="114" feet="0" addons="2">
<parameters>
</parameters>
</look></health></npc>
- E por ultimo, vamos criar nosso torcedor fanático! torcedor.xml em data/monster/ contendo isto:
<!--?xml version="1.0" encoding="UTF-8"?-->
<monster name="Torcedor" namedescription="a torcedor" race="blood" experience="0" speed="0" manacost="250">
<health now="20" max="20">
<look type="255" head="114" body="132" legs="132" feet="132" corpse="6080">
<targetchange interval="2000" chance="20">
<strategy attack="100" defense="0">
<flags>
<flag summonable="1">
<flag attackable="1">
<flag hostile="1">
<flag illusionable="1">
<flag convinceable="1">
<flag pushable="1">
<flag canpushitems="0">
<flag canpushcreatures="0">
<flag targetdistance="1">
<flag staticattack="90">
<flag runonhealth="20">
</flag></flag></flag></flag></flag></flag></flag></flag></flag></flag></flag></flags>
<attacks>
<attack name="melee" interval="2000" skill="0" attack="0">
</attack></attacks>
<defenses armor="1" defense="2">
<elements>
<element firepercent="-10">
</element></elements>
<voices interval="5000" chance="10">
</voices>
<loot>
<item id="3976" countmax="10" chance="50000"><!-- worm -->
<item id="2666" countmax="3" chance="80000"><!-- meat -->
<item id="2671" countmax="2" chance="70000"><!-- ham -->
</item></item></item></loot>
</defenses></strategy></targetchange></look></health></monster>
- Finalizando com a adição desde código em monsters.xml em data/monster/
contendo isto:
<monster name="Torcedor" file="torcedor.xml">
Pronto esta tudo pronto! Indo para ultima parte.
Configuração
- Primeiramente, seria bom ter um campo com as mesmas dimensões
como na imagem:
- No cabeçalho do código, esta uma série de configurações
pré-definidas para facilitar a entrada e adaptação do script em um no ot. Sendo elas:
- Alavanca!
Coloque um item de sua preferencia com a action id 5000
- Posição que o jogadores devem estar na hora de puxar a alavanca:
posJogador1 = {x=82,y=153,z=7, stackpos=1}
posJogador2 = {x=84,y=153,z=7, stackpos=1}
- Posição inicial de partida, a qual os jogadores serão teleportados:
posTeleporte1 = {x=81,y=160,z=7, stackpos=1}
posTeleporte2 = {x=85,y=160,z=7, stackpos=1}
- Posição da bola:
posBola = {x=83,y=160,z=7, stackpos=1}