Ir para conteúdo
  • Cadastre-se

(Resolvido)[PEDIDO] ACTION - Porta que so passa 1 player por IP


Ir para solução Resolvido por admkhbr,

Posts Recomendados

Tem um evento no meu server que voce puxa a alavanca e ganha uma recompensa, só que os players criam varios characters para puxar a alavanca varias vezes, alguem sabe criar uma porta que so passa 1 player por IP? ou algo semelhante a isso

 

se alguem puder ajudar c:

Editado por poko360 (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Eu sugiro level mínimo para participar desse evento. Assim dificulta a criação de chars fakes pra obtenção de prêmios.

 

Em todo caso, posta o script atual dessa alavanca. Posso tentar fazer algo cara, mas não prometo nada. Meus conhecimentos de LUA são bem limitados.

Link para o post
Compartilhar em outros sites

mas tem players level baixo que querem participar, (os que nao sao MC) por isso pedi um action por IP, msm assim obg por tentar (:

Link para o post
Compartilhar em outros sites

Compreendo, foi só uma sugestão. Ainda assim, posso tentar trabalhar no seu script. Mas repito, preciso ver como ele funciona atualmente. Se você puder postar o script da alavanca, posso tentar trabalhar nisso.

 

Abraço

Link para o post
Compartilhar em outros sites
function onUse(cid, item, frompos, item2, topos)
      -- 10cc Quest
      if item.uid == 2929 then
          queststatus = getPlayerStorageValue(cid,2929)
          if queststatus == -1 then
              if getPlayerLevel(cid) >= 1 then
                doCreatureSay(cid, "Voce ganhou 3 items.", TALKTYPE_ORANGE_1)
                  doPlayerAddItem(cid,11217,50)
                  doPlayerAddItem(cid,1746,1)
                  doPlayerAddItem(cid,2160,100)
                  setPlayerStorageValue(cid,2929,1)
                doSendMagicEffect(getPlayerPosition(cid), 30)
              else
                doCreatureSay(cid, "Voce precisa de level 1+ para ganhar.", TALKTYPE_ORANGE_1)
                doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF)
              end
          else
            doCreatureSay(cid, "Voce ja ganhou sua recompensa.", TALKTYPE_ORANGE_1)
            doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF)
          end
      end
end

 

Link para o post
Compartilhar em outros sites

Bom, eu fiz o que eu pude sozinho.

 

Como havia lhe dito antes, não estou acostumado com a linguagem LUA, nem com sua sintaxe, nem com a forma que essa linguagem trabalha. Com base em uma pesquisada, tentei colocar minha ideia no script, contudo é bem possível que não funcione, já que não entendo muito bem a forma que o LUA trabalha com arquivos externos. Conforme lhe avisei por MP, não disponho de uma distro aqui para ir testando o que eu estava fazendo, tampouco você atendeu minha solicitação pedindo por um contato para que pudéssemos indo testando o script conforme eu escrevia. Então meio que foi um tiro no escuro. Não tenho como saber se funciona, já que não pude testar as etapas do código.

 

Enfim, segue o script. Se funcionar é lucro.

function onUse(cid, item, frompos, item2, topos)

      if item.uid == 2929 then
          queststatus = getPlayerStorageValue(cid,2929)
          if queststatus == -1 then
          questipdone = 0
          file = io.open('eiplist.txt','a')
          for line in io.lines() do
              if getPlayerIp(cid) == io.read("*line") then
                  questipdone = 1
              end
          end
          file:close()
              if questipdone == 0 then
                  if getPlayerLevel(cid) >= 1 then
                      doCreatureSay(cid, "Voce ganhou 3 items.", TALKTYPE_ORANGE_1)
                      doPlayerAddItem(cid,11217,50)
                      doPlayerAddItem(cid,1746,1)
                      doPlayerAddItem(cid,2160,100)
                      setPlayerStorageValue(cid,2929,1)
                      doSendMagicEffect(getPlayerPosition(cid), 30)
                      playerip = getPlayerIp(cid)
                      file = io.open('eiplist.txt','a')
                      file:write( .. playerip .. "\n")
                      file:close()
                  else
                  doCreatureSay(cid, "Voce precisa de level 1+ para ganhar.", TALKTYPE_ORANGE_1)
                  doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF)
                  end
              else
              doCreatureSay(cid, "Por precaução, somente um jogador por PC ganha a recompensa!", TALKTYPE_ORANGE_1)
              end
          else
            doCreatureSay(cid, "Voce ja ganhou sua recompensa.", TALKTYPE_ORANGE_1)
            doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF)
          end
      end

end

 

Link para o post
Compartilhar em outros sites
  • Solução

Ok cara, vamos lá. Como você não me mandou seu contato pra ajudar, criei uma máquina virtual aqui pra fazer os testes. Fiz uns ajustes aqui (coisas da linguagem que eu desconhecia... como eu disse, não sou familiarizado com LUA). Dessa vez funcionou. Inclusive já testei pra você. Vou te mandar um passo-a-passo, por favor, faça exatamente o que eu disser.

 

Vá na sua pasta /data/actions/scripts e crie dois arquivos: ipevent1.lua e ipevent2.lua

 

Feito isso, abra o ipevent1.lua e cole o seguinte conteúdo nele:

function onUse(cid, item, frompos, item2, topos)

      if item.uid == 2929 then
          queststorage = 2929
          queststatus = getPlayerStorageValue(cid,queststorage)
          if queststatus == -1 then
          questipdone = 0
          playerip = getPlayerIp(cid)
          file = io.open('data/actions/scripts/ipevent2.lua', 'r')
          while true do
              local line = file:read("*l")
              if line == nil then break end
              if line == tostring(playerip) then questipdone = 1 end
          end
          file:close()
              if questipdone == 0 then
                  if getPlayerLevel(cid) >= 1 then
                      doCreatureSay(cid, "Voce ganhou 3 items.", TALKTYPE_ORANGE_1)
                      doPlayerAddItem(cid,11217,50)
                      doPlayerAddItem(cid,1746,1)
                      doPlayerAddItem(cid,2160,100)
                      setPlayerStorageValue(cid,queststorage,1)
                      doSendMagicEffect(getPlayerPosition(cid), 30)
                      file = io.open('data/actions/scripts/ipevent2.lua','a')
                      file:write("" .. playerip .. "\n")
                      file:close()
                  else
                  doCreatureSay(cid, "Voce precisa de level 1+ para ganhar.", TALKTYPE_ORANGE_1)
                  doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF)
                  end
              else
              doCreatureSay(cid, "Por precaução, somente um jogador por PC ganha a recompensa!", TALKTYPE_ORANGE_1)
              end
          else
            doCreatureSay(cid, "Voce ja ganhou sua recompensa.", TALKTYPE_ORANGE_1)
            doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF)
          end
      end

end

Por outro lado, eu quero que você deixe o ipevent2.lua em branco. Isso mesmo. Deixe ele em branco. Entenda que você DEVE OBRIGATORIAMENTE criar o arquivo ipevent2.lua, mas você não deve escrever nada nele, pois ele servirá para guardar os IPs dos players que participaram do evento.

 

Apos isso, vá no seu actions.xml e procure pela tag referente ao script do seu evento (isto é, a tag na qual você adicionou aquele script que lhe pedi pra postar). Nessa tag, substitua, no parâmetro value, o seu script antigo pelo ipevent1.lua que acabamos de criar. Não se preocupe, pois o evento irá funcionar da mesma maneira que antigamente. Inclusive, ele só funcionará para itens com a UniqueID 2929, assim como era no script que você me passou. A única diferença é que agora haverá uma checagem de IP antes de conceder o prêmio. Por segurança, mantenha o seu script antigo inalterado para fins de backup.

 

Bom, feito isso, precisamos acertar só mais um detalhe. O script que fiz pra você funciona criando uma especie de "lista negra". Isso significa que os jogadores com os IPs armazenados não poderão pegar os prêmios. É necessário que você possua uma forma de limpar essa lista negra. Porém, eu não sei exatamente qual a sua necessidade (seu evento ocorre várias vezes ao dia? Um jogador que participou dele uma vez pode participar uma segunda vez, ou, uma vez que o jogador participa, a ideia é que ele nunca mais participe de novo? Seu servidor faz o evento periodicamente, sem você estar online?). Por isso, optei por criar uma talkaction que tem como função limpar a lista negra. Por exemplo, após o término do evento você usa a talkaction a fim de que, da próxima vez que o evento abra, os players que participaram dele da primeira vez possam participar de novo (ou pelo menos os PCs, afinal, nem sempre um mesmo PC significa um mesmo jogador, eu mesmo divido o PC com minha irmã e ambos jogamos OTServ). Independentemente das respostas às perguntas, recomendo que vez ou outra você limpe a lista negra, pois quanto mais gente na lista, maior a tendência de a checagem demorar, pois são mais IPs para verificar.

 

Enfim, vamos à talkaction... abra sua pasta data/talkactions/scripts e crie um novo arquivo chamado ipevent3.lua e cole o seguinte conteúdo nesse arquivo:

function onSay(cid, words, param)

          file = io.open('data/actions/scripts/ipevent2.lua', 'w')
          file:write("")
          file:close()
          return true

end

Obviamente, você pode adaptar o script acima para suas necessidades. Isto é, caso o seu evento ocorra periodicamente de forma automática, você pode transformar a talkaction em um globalevent, ou fazer para que a lista negra seja apagada sempre ao término do evento. Mas como eu disse anteriormente, não conheço com exatidão sua necessidade, então optei por fazer isso na forma de talkaction.

 

Uma vez criado o arquivo ipevent3.lua, vá no seu talkactions.xml e adicione a seguinte tag:

	<talkaction log="yes" words="/eventblclear" access="5" event="script" value="ipevent3.lua"/>

De forma que bastará executar o comando /eventblclear para limpar a lista negra do evento.

 

Agora, caso seu servidor esteja ligado, basta dar um /reload action e um /reload talkaction para que as mudanças surtam efeito. Caso o servidor esteja desligado, da próxima vez que ele for ligado, já estará tudo pronto.

 

Uma última ressalva: da próxima vez que você pedir ajuda em um fórum e uma pessoa disposta a ajudar te mandar mensagem privada pedindo por sua colaboração, colabore. É o mínimo que você pode fazer. A pessoa está cedendo seu tempo e esforço para algo pra você, sem pedir nada em troca. O mínimo que você pode fazer é auxiliar nisso. Na boa, minha vontade de te ajudar caiu em 90% depois de ver sua falta de prestatividade. Sem ressentimento cara, só dando o toque mesmo, porque eu quase desisti de insistir no teu caso, e é possível que da próxima vez você não dê tanta sorte e a pessoa realmente desista de te ajudar.

 

Enfim, é isso. Qualquer problema avisa.

Abraço.

Editado por admkhbr
Falta de acentos devido ao meu layout de teclado. (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

tipo, tenho um globalevent que ele limpa a storage 2929 a cada 2 horas, seria nescessario eu colocar esse talkactions??

 

 

PS: o evento ocorre ( 3x ao dia )

de 10h, 16h e 21h

Editado por poko360 (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Você poderia colocar o talkaction. Mas como você possui um global event que é justamente responsável por limpar o storage, recomendo que você anexe o script da talkaction nesse global event, de forma que ele limpe tanto o storage como a lista negra de 2h em 2h. Se você limpar só o storage, o jogador ficará habilitado a pegar o prêmio novamente, mas o IP dele continuará na lista negra e ele não poderá reinvindicar seu prêmio por estar bloqueado.

 

Se você me passar o script desse global event, posso acrescentar a limpeza da lista negra nele também, de forma que a talkaction fica dispensável.

 

No mais, funcionou o script?

Link para o post
Compartilhar em outros sites

voce é foda cara, funcionou tudo certinho, consegui colocar pra limpar o ip no globalevents com oque voce mandou

mudei pra isso aqui function onThink(cid, interval, lastExecution)

Editado por poko360 (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Show de bola cara!! Fico feliz que tenha dado certo =D

 

Era exatamente isso ai que você tinha de fazer. No caso, vc optou por criar um novo globalevent pra limpar o IP, e não tem problema nenhum nisso. Particularmente, eu optaria por acrescentar o codigo que te mandei àquele outro script q vc ja tinha pra limpar storage, a fim de ficar tudo no msm script e ficar mais organizado (tenho TOC), mas o que você fez aí tem o mesmo resultado.

 

Enfim, tudo de bom pro seu servidor aí (se a facul não estivesse tão pesada, até pediria o IP pra jogar hehe eu e minha irmã tinhamos combinado de jogar um serv faz um tempinho)

Abraço.

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo