
admkhbr
Membro
-
Registro em
-
Última visita
Solutions
-
admkhbr's post in (Resolvido)[PEDIDO] Summon Indo para onde vc for e conforme lvl upado ele fica mais forte também was marked as the answerEi amigo! Só passando pra informar que finalizei a primeira parte do seu pedido. Peço desculpas pela demora, conforme lhe expliquei, minha faculdade é realmente puxada, agora mesmo estou virando a noite estudando, mas dei uma pausa e resolvi trabalhar no que você pediu pra esfriar a cabeça.
Enfim, fiz a parte sobre o summon seguir o jogador. Vamos lá.
Vá na pasta data/globalevents/scripts e crie um novo arquivo chamado summonseguir.lua e cole o seguinte conteúdo nele:
function onThink(cid, interval) for _, pid in ipairs(getPlayersOnline()) do local distmax = 3 local efeito = CONST_ME_TELEPORT if #getCreatureSummons(pid) > 0 then local tmp = #getCreatureSummons(pid) if getTilePzInfo(getCreaturePosition(pid)) then return true else while tmp > 0 do if getDistanceBetween(getCreaturePosition(pid), getCreaturePosition(getCreatureSummons(pid)[tmp])) > distmax then doTeleportThing(getCreatureSummons(pid)[tmp], getCreaturePosition(pid), false) doSendMagicEffect(getCreaturePosition(getCreatureSummons(pid)[tmp]), efeito) end tmp = tmp - 1 end end end end return true end
Logo no início do script você vê algumas variáveis locais. O valor da variável distmax representa, logicamente, a distância máxima que pode existir entre o summon e o jogador para que o summon seja teleportado. No caso eu coloquei 3, mas no script que você pegou tinha 7, então acho que é a melhor escolha usar igual aos de Pokémon. Por outro lado, a variável efeito foi criada mesmo só pra você conseguir alterar facilmente o efeito que aparecerá no summon quando ele for teleportado. Enfim, é basicamente isso de configuração. Continuemos.
Após ter criado o arquivo do script, vá no seu globalevents.xml e adicione a seguinte tag:
<globalevent name="Summon Seguir" interval="????" event="script" value="summonseguir.lua"/>
Perceba que no parâmetro interval eu coloquei interrogações. No lugar dessas interrogações, você deve colocar o tempo em milissegundos que leva para ocorrer a checagem de posição. Em outras palavras, é o delay pra que o summon seja teleportado. Quanto mais tempo, mais demorará a checagem, e maior é a probabilidade de o summon ficar muito distante. Eu realmente não faço ideia de quanto tempo eles usam nos OTs pokémon, mas acredito que seja uns 1000ms. Como eu te disse por MP, o problema da função onThink é que ela deixa o servidor muito pesado, então é bom não abusar. Contudo, pelos scripts que você postou, os próprios servidores de Pokémon usam desse jeito, então acho que não há problema.
O script que você passou dos servidores de pokémon teleportava apenas o primeiro summon do jogador. No caso de Poketibias, isso não atrapalha, pois cada jogador pode summonar no máximo uma criatura. Contudo, como seu servidor não é um Poketibia, fiz o script pensando em teleportar todos os summons que o jogador invocou, independentemente de qual a quantidade máxima de summons que seu servidor permite (aquela que você configura no config.lua). Porém, fique avisado que quanto maior for o número máximo de summons, mais pesado ficará o script, pois maior será a checagem. De um pra dois summons máximos parece coisa pouca, mas entenda que não é simplesmente "um" summon a mais, e sim um summon a mais por jogador. Dependendo de quantos jogadores online seu servidor tenha, isso é bastante coisa. Por isso, recomendo que deixe no máximo 2 summons por vez.
Enfim, é isso cara. Consegui arranjar um tempo pra fazer essa primeira parte, vou tentar não demorar muito pra concluir a segunda, mas como já te disse por MP meu tempo é apertado. Qualquer novidade posto nesse tópico e te aviso por MP.
Abraço.
@EDIT: Para quem tiver a mesma necessidade do dono do tópico, desenvolvi uma base para a magia Summon Creature na forma de MOD. Essa magia no TFS 0.4 é uma função pré-definida, impedindo que se faça algum tipo de alteração nela via script. Porém, como o que o autor do tópico queria era justamente uma personalização da Summon Creature, fez-se necessário reescrever a magia por completo na forma de script, e deixarei aqui para quem tiver interesse. Para utilizar, basta desativar a Summon Creature original no arquivo spells.xml e adicionar a seguinte mod ao seu servidor:
<?xml version="1.0" encoding="UTF-8"?> <mod name="Summon Monster Personalizado" version="1.0" author="Tiago Melo Juca" contact="TibiaKing" enabled="yes"> <talkaction words="utevo res" filter="word-spaced" event="script"><![CDATA[ -- General Configuration local lvlmin = 25 local exhaustion = 2000 local needlearn = 0 local learnstorage = 77890 local vocations = {1, 2, 5, 6} local maxsummons = getConfigValue("maxPlayerSummons") summonlist = { [1] = {'rat', 50}, [2] = {'wolf', 100}, [3] = {'demon skeleton', 300} } -- Player Info local lvl = getPlayerLevel(cid) local vocp = getPlayerVocation(cid) local mana = getCreatureMana(cid) local pos = getCreaturePosition(cid) -- Statements local learned = 0 local voccan = 0 local cansummon = 0 local manacost = 0 local exhaustorage = 77889 -- Loop Control local vocs = #vocations local slistn = #summonlist -- Conversions param = string.lower(param) param = string.gsub(param, '\"', '') exhaustion = exhaustion/1000 -- Initial Verification if needlearn == 0 then learned = 1 end if needlearn == 1 and getPlayerStorageValue(cid, learnstorage) > 0 then learned = 1 end while vocs > 0 do if vocp == vocations[vocs] then voccan = 1 end vocs = vocs - 1 end while slistn > 0 do if param == summonlist[slistn][1] then cansummon = 1 manacost = summonlist[slistn][2] end slistn = slistn - 1 end -- Summon Monster if getTilePzInfo(pos) then doPlayerSendCancel(cid, 'This action is not permitted in a protection zone.') else if lvl < lvlmin then doSendMagicEffect(pos, CONST_ME_POFF) doPlayerSendCancel(cid, 'You do not have enough level.') else if learned == 1 then if voccan == 1 then if getPlayerStorageValue(cid, exhaustorage) >= os.time() then doSendMagicEffect(pos, CONST_ME_POFF) doPlayerSendCancel(cid, 'You are exhausted.') else if cansummon == 1 then if mana >= manacost then if #getCreatureSummons(cid) < maxsummons then doSendMagicEffect(pos, CONST_ME_MAGIC_BLUE) doCreatureAddMana(cid, 0-manacost, false) local summon = doCreateMonster(param, pos) doConvinceCreature(cid, summon) doSendMagicEffect(getCreaturePosition(summon), CONST_ME_TELEPORT) setPlayerStorageValue(cid, exhaustorage, os.time()+exhaustion) else doSendMagicEffect(pos, CONST_ME_POFF) doPlayerSendCancel(cid, 'You cannot summon more creatures.') end else doSendMagicEffect(pos, CONST_ME_POFF) doPlayerSendCancel(cid, 'You do not have enough mana.') end else doSendMagicEffect(pos, CONST_ME_POFF) doPlayerSendCancel(cid, 'Sorry, not possible.') end end else doSendMagicEffect(pos, CONST_ME_POFF) doPlayerSendCancel(cid, 'Your vocation cannot use this spell.') end else doSendMagicEffect(pos, CONST_ME_POFF) doPlayerSendCancel(cid, 'You need to learn this spell first.') end end end return ]]></talkaction> </mod> A MOD acima nada mais é do que a magia Summon Creature do próprio Tibia reescrita na forma de script, a fim de poder fazer personalizações nela (no caso do autor do tópico, deixar os summons mais fortes de acordo com Level e Magic Level). Através dessa base, é possível fazer variações mais elaboradas da magia Summon Creature.
Lembrando que, por motivos de limitação do próprio TFS, monstros summonados por essa MOD devem, obrigatoriamente, apresentar a flag convinceable ligada em seu arquivo XML. Contudo, não é necessário que a flag summonable seja ligada; na realidade, pouco importa se ela está ligada ou desligada, pois a MOD trabalha com a flag convinceable e não summonable (uma vez que o TFS trabalha com doCreateMonster + doConvinceCreature). Outra ressalva é que todos os monstros que podem ser summonados devem ser adicionados naquela listinha no início do script, mas isso por incompetência minha mesmo, não arranjei uma forma mais fácil de fazer isso. Qualquer monstro que não esteja naquela listinha (nome e custo de mana para invocá-lo), não poderá ser summonado (será a mesma coisa de tentar summonar um Demon no tibia global, por ex, ele vai dizer que não é possível).
Bem, é isso. Espero que essa base para a magia ajude quem precisar de uma Summon Creature customizada! Por motivos éticos, não disponibilizarei a versão final adaptada para a necessidade do rheyn, já que é do projeto dele. Porém com a MOD que eu passei vocês facilmente incrementam a magia sozinhos.
Abraço.
-
admkhbr's post in (Resolvido)[PEDIDO] ACTION - Porta que so passa 1 player por IP was marked as the answerOk 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.