Ir para conteúdo

RobinHood

Membro
  • Registro em

  • Última visita

Histórico de Curtidas

  1. Gostei
    RobinHood deu reputação a MaXwEllDeN em [Aula 7, Parte I] Estruturas de Controle   
    << Aula 6 - Escopo
    Estruturas de controle
    Aula 7
    Bem-vindos à Aula 7 (Da sorte). Hoje iremos aprender mais uma coisa importantíssima na área de scripting e programação em geral: as Estruturas de Controle. Bem, Estruturas de Controle definem o andamento do script. Para entendermos melhor, vamos ver o algoritmo de uma Estrutura de Controle simples:
    Veja, agora um em lua:
    Compare as cores do script em Lua com o escrito em português. Nossa Estrutura de Controle se chama condição, iniciada por if (se). Para entendermos basta traduzir.
    Veja como se usa o if:
    Citado acima, true seria o que vai ser verificado, exemplo:
    Antes de prosseguir, vamos ver o que são essas "coisas" em roxo.
    Essas "coisas" se chamam Operadores Relacionais, e vão verificar se a condição é verdadeira. Se for, então vai ser executado o código. Se não, então o código será pulado e o script continuará rodando a partir do fim do escopo da condição (end). Os operadores relacionais são: Igualdade (==), Diferença (~=), Superioridade Absoluta (>), Inferioridade Absoluta (<), Superioridade (>=) e Inferioridade (<=).
    Os operadores relacionais sempre retornarão um booleano, ou seja, true ou false. Se a condição for verdadeira então retornará true. Se for falsa retornará false. Você pode comprovar isto tentando:
      print(1 == 1) print(1 == 2) Veja como usar os operadores relacionais:
    Bom veja aqui alguns exemplos e em seguida a explicação de o que vai acontecer.
      local nome = 'Mock' if nome == 'Mock' then numero = 7 if numero == 8 then print('Nosssa!') end end Explicação:
      Declaramos a variável nome como = a 'Mock' Se o nome é igual a 'Mock' entao... Declaramos a variável numero igual a 7 Se numero for = a 8 entao Mostrar o texto: 'Nosssa!' Fim da verificação do numero Fim da verificação do nome. O que iria acontecer? a variável nome seria declarada, passaria pela verificação pois nome é igual a Mock o número 7 seria declarado mas não iria mostrar o texto pois numero vale 7 e não 8 Else Agora que ja sabemos abrir um if vamos ver a else (se nao.) Como vocês já sabem como abrir um if a explicação aqui não vai ser longa. Para evitarmos isso:
      if numero == 8 then print('foi') end if numero ~= 8 then print('nem foi') end Usamos a expressao else, Veja a syntax.
    Um exemplo no uso acima.
      if numero == 8 then print('foi') else print('nem foi') end No caso, caso a verificação seja falsa (quando numero não é ? ele pulará o escopo 1 mais parará no else e executara o escopo 1 de baixo. Elseif Essa é uma junção de um else com um if, muito usado em NPCs antigos, seria a mesma coisa acima acontece que quando encontra o elseif ao contrario do else ele não executa o escopo direto ele permite outra verificação. Veja a sintaxe.
    Podendo conter apenas UM else no final também. Veja o exemplo:
      if numero == 8 then print('oia meu numero e um oito!') elseif numero == 5 then print('omg meu numero é um 5') elseif numero == 3 then print('mintira é um 3') else print('affff meu numero nem é 8 5 ou 3 ') end Você pode usar quanto elseif's quiser.
     
     
    and/or
    São parte do (bloco), elas definem as palavras e, ou, veja um exemplo:
     
     
    if sex == 5 and nome == 'pedro' then print('tenso') end  
    Ele so executará o escopo 1 se sex for 5 e o nome for pedro.
      if sex == 5 or nome == 'pedro' then print('tenso') end Nesse caso ele executará o escopo 1 se sex for 5 OU o nome for pedro. Podemos unir os 2 e separar por parênteses
      if (sex == 5 and nome == 'pedro') or (animal == 'urso') then print('tenso³²²³¹³²¹³²¹') end primeiro o script vai verificar o 1º bloco. (sex == 5 and nome == 'pedro') Ele vai ver se sexo é 5 e nome for Pedro. Caso seja verdadeiro ele vai passar para o próximo, caso tenha um or ele simplesmente vai parar a verificação e ir direto para o escopo abaixo. Agora supondo que sex era 4, ele vai retornar negativo e então ao invés de parar tudo e ir para o else ou o elseif ele vai ver que tem um or e então verificar o bloco 2 (animal == 'urso') uma verificação simples, se animal for urso ele vai pro escopo, se não for ele pula o escopo.
     
    Extra!
    Um conteúdo extra dessa aula. Sabia que or não é apenas usado em if's?
     
    Vamos simular um caso de um script com 2 variáveis, nome e player, a variável nome vale um string: 'Ixe nem deu.' e a variável player não vale nada ela é nil, (pense que não existe).
     
    Agora o que aconteceria se colocássemos para mostrar a variável player com o print? Daria um erro! mais existe uma maneira rápida e fácil de se evitar isso. Assim:
      print(player or nome) OmG mock que que tu fez? Eu mandei printar a variável player, porem antes o script verifica, já que tem o or ele vê qual é o valor da variável player, se for nil ele vai printar a variável nome! Segue o code:
      nome = 'pedro' var = nil numero = 774 pk = false numero2 = 89 você tem essas variaveis. Fassa o seguinte:
    Resposta:
    Aula escrita por um urso gordo Mock, todos os créditos são dele.
    Aula 8 - Loops: while e repeat >>
  2. Gostei
    RobinHood deu reputação a Zathao em [Sistema] Futebol com torcida e juiz!   
    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}

Informação Importante

Confirmação de Termo