Postado Junho 10, 2016 9 anos 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
Postado Junho 12, 2016 9 anos 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 Junho 12, 2016 9 anos por admkhbr Falta de acentos devido ao meu layout de teclado. (veja o histórico de edições)
Postado Junho 13, 2016 8 anos Autor 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 Junho 13, 2016 8 anos por poko360 (veja o histórico de edições)
Postado Junho 13, 2016 8 anos 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?
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.