Ir para conteúdo

zipter98

Membro
  • Registro em

  • Última visita

Tudo que zipter98 postou

  1. Alterei pra só poder usar em protection zone. E não coloquei parâmetros nessa talkaction. Basta dizer a word configurada na tag.
  2. Curioso. Essa correção que enviei funcionou perfeitamente aqui. Sobre o aid, o processo é o seguinte: no arquivo pokeexp.lua, de data/creaturescripts/scripts, você seta uma actionid na corpse do pokémon. Aí, na tag desse script de autoloot, ao invés de colocar isso: <action itemid="id_das_corpses" event="script" value="arquivo.lua"/> você colocaria isso: <action actionid="aid_setado_em_pokeexp" event="script" value="arquivo.lua"/> Pra setar um actionid você usa a função doItemSetAttribute com os seguintes parâmetros: doItemSetAttribute(item, "aid", actionid_desejado)
  3. Yep. function onSay(cid, words) if not getHouseByPlayerGUID(getPlayerGUID(cid)) then return doPlayerSendCancel(cid, "You don't have a house.") elseif getCreatureCondition(cid, CONDITION_INFIGHT) then return doPlayerSendCancel(cid, "You cannot teleport to your house during a battle.") elseif not getTileInfo(getThingPos(cid)).protection then return doPlayerSendCancel(cid, "You aren't in a protection zone.") else doTeleportThing(cid, getHouseEntry(getHouseByPlayerGUID(getPlayerGUID(cid)))) doPlayerSendTextMessage(cid, 27, "You teleported to your house.") end return true end
  4. zipter98 postou uma resposta no tópico em Suporte Tibia OTServer
    Já mudei isso. Sobre seu erro, certifique-se que colocou o diretório correto na tag da spell.
  5. O intervalo de tempo é em segundos. local tab = { --[kill] = {intervalo_de_tempo, "mensagem"} [1] = {nil, "FIRST KILL!"}, [2] = {10, "DOUBLE KILL!"}, } function onKill(cid, target) if isPlayer(cid) and isPlayer(target) then local storage = getPlayerStorageValue(cid, 9018) local kills = getPlayerStorageValue(cid, 9019) > -1 and getPlayerStorageValue(cid, 9019) + 1 or 1 setPlayerStorageValue(cid, 9019, kills) setPlayerStorageValue(target, 9019, -1) if tab[kills] then if kills > 1 then if storage < os.time() then setPlayerStorageValue(cid, 9019, -1) setPlayerStorageValue(cid, 9018, -1) return true end end doBroadcastMessage(getCreatureName(cid).. " - "..tab[kills][2], MESSAGE_INFO_DESCR) if tab[kills + 1] then setPlayerStorageValue(cid, 9018, os.time() + tab[kills + 1][1]) end else setPlayerStorageValue(cid, 9019, -1) end end return true end
  6. zipter98 postou uma resposta no tópico em Suporte Tibia OTServer
    local sto = 9087 local effect = xxx --Efeito. function onCastSpell(cid, var) local target = nil if getPlayerStorageValue(cid, sto) < 1 then if not getCreatureTarget(cid) then return doPlayerSendCancel(cid, "You don't have a target.") end target = getCreatureTarget(cid) doPlayerSendTextMessage(cid, 27, "You marked your target.") setPlayerStorageValue(cid, sto, target) doSendMagicEffect(getThingPos(cid), effect) doSendMagicEffect(getThingPos(target), effect) else target = getPlayerStorageValue(cid, sto) if isCreature(target) and getClosestFreeTile(cid, getThingPos(target)) then local new_pos = getClosestFreeTile(cid, getThingPos(target)) if getTileInfo(new_pos).protection then return doPlayerSendCancel(cid, "Your target is on a protection zone.") and setPlayerStorageValue(cid, sto, -1) end doSendMagicEffect(getThingPos(cid), effect) doSendMagicEffect(new_pos, effect) doTeleportThing(cid, new_pos) setPlayerStorageValue(cid, sto, -1) else return doPlayerSendCancel(cid, "Sorry, it's impossible to teleport near your target.") end end return true end
  7. Ops, my bad. Eu errei o atributo. Editei meu comentário anterior com a correção. Ah, e esse erro que você citou não tem nada a ver com o script.
  8. A ideia do addEvent está certa, porém os parâmetros, não exatamente. addEvent(doCreateItem, 60 * 1000,cfg.rock_id,1,cfg.rock_position) Como pode-se notar, você chamou por cfg.rock_id e cfg.rock_position. Isso estaria certo se rock_id e rock_position estivessem numa tabela de nome cfg. Nesse caso, porém, elas são variáveis locais. Há duas alternativas de correção para seu código. A primeira, criando a tabela cfg e colocando rock_id e rock_position nela: function onUse(cid, item, fromPosition, item2, toPosition) local cfg = { rock_id = xxx, --ID da pedra. rock_position = {x = x, y = y, z = z}, --Posição da pedra. } local rock = getTileItemById(cfg.rock_position, cfg.rock_id).uid if rock > 0 then doRemoveItem(rock, 1) addEvent(function() doCreateItem(cfg.rock_id, 1, cfg.rock_position) end, 60 * 1000) end return true end A segunda, apenas alterando os parâmetros de doCreateItem: function onUse(cid, item, fromPosition, item2, toPosition) local rock_id = xxx --ID da pedra. local rock_position = {x = x, y = y, z = z} --Posição da pedra. local rock = getTileItemById(rock_position, rock_id).uid if rock > 0 then doRemoveItem(rock, 1) addEvent(function() doCreateItem(rock_id, 1, rock_position) end, 60 * 1000) end return true end Se você olhar bem, perceberá que alterei o addEvent. Esta função pode ser escrita de duas formas: a primeira, que você já conhece, e esta outra. A que utilizei, pessoalmente, acho melhor e mais segura. Uma vantagem que ela apresenta, demonstrarei em códigos. addEvent(doPlayerSendCancel, 30 * 1000, cid, "Hi.") Se, no momento que o doPlayerSendCancel for executado, o jogador estiver offline, ocorrerá o erro de player not found. Para evitar isso, faria-se: local function sendMessage(cid) if isPlayer(cid) then doPlayerSendCancel(cid, "Hi.") end end addEvent(sendMessage, 30 * 1000, cid) Para evitar o trabalho de fazer uma função, e depois executá-la em um addEvent, você poderia, simplesmente: addEvent(function() if isPlayer(cid) then doPlayerSendCancel(cid, "Hi.") end end, 30 * 1000) Basicamente, você "cria" uma função dentro do addEvent. Essa maneira é mais prática e segura do que a que normalmente vemos (minha opinião, claro). ps: não sou bom com explicações, mas espero que você entenda. O melhor jeito de entender isso é na prática mesmo.
  9. function onStepOut(cid, item, position, fromPosition) local rock_id = xxx --ID da pedra. local rock_position = {x = x, y = y, z = z} --Posição da pedra. local rock = getTileItemById(rock_position, rock_id).uid if rock < 1 then doCreateItem(rock_id, 1, rock_position) end return true end
  10. Não detalhei o script com mensagens ao jogador, efeitos nem nada do tipo. Só fiz o que você pediu mesmo. 1º código: function onStepIn(cid, item, position, fromPosition) local cfg = { positions = { {x = x, y = y, z = z}, --Posições dos jogadores. {x = x, y = y, z = z}, }, rock_id = xxx, --ID da pedra. rock_position = {x = x, y = y, z = z}, --Posição da pedra. } if not isPlayer(cid) then return true end for _, posis in pairs(cfg.positions) do local creature = getTopCreature(posis).uid if not isCreature(creature) or not isPlayer(creature) then return true end end local rock = getTileItemById(cfg.rock_position, cfg.rock_id).uid if rock > 0 then doRemoveItem(rock, 1) end return true end 2º código: function onUse(cid, item, fromPosition, item2, toPosition) local rock_id = xxx --ID da pedra. local rock_position = {x = x, y = y, z = z} --Posição da pedra. local rock = getTileItemById(rock_position, rock_id).uid if rock > 0 then doRemoveItem(rock, 1) end return true end Suponho que saiba fazer as tags. Caso contrário, informe aqui.
  11. Hm, curioso. Tenta esse: ps: se não se importa, eu coloquei pra mostrar os segundos também (acho mais legal e.e). caso você não goste, só avisar que eu retiro. function convertTime(time) local minutes = math.floor(time/60) local seconds = time - (minutes * 60) return {minutes, seconds} end function onUse(cid, item, frompos, item2, topos) local msg = "[Castle of Titans] Você deve aguardar %d minuto%s e %d segundo%s para usar a alavanca." local gates = { {x = 470, y = 243, z = 7}, --Posições dos portões. {x = 471, y = 243, z = 7}, } local id = 9485 --ID do portão. if getGlobalStorageValue(91801) > os.time() then local t = convertTime(getGlobalStorageValue(91801) - os.time()) return doPlayerSendCancel(cid, msg:format(t[1], t[1] > 1 and "s" or "", t[2], t[2] > 1 and "s" or "")) elseif getPlayerGuildId(cid) < 1 then return doPlayerSendCancel(cid, "You aren't member of any guild.") end for _, b in pairs(gates) do local gate = getTileItemById(b, id).uid if gate > 0 then doRemoveItem(gate, 1) doSendMagicEffect(b, 2) addEvent(function() doCreateItem(id, 1, b) end, 5 * 60 * 1000) else return doPlayerSendCancel(cid, "Someone already opened the gates.") end end broadcastMessage('Os Portões da ponte the Castle of Titans foram abertos, e se fecharão em 5 minutos', MESSAGE_EVENT_ADVANCE) addEvent(function() setGlobalStorageValue(91801, os.time() + 3600) end, 5 * 60 * 1000) return true end
  12. zipter98 postou uma resposta no tópico em Suporte Tibia OTServer
    Essa alteração no spawn.lua vai funcionar, porém apenas para pokémons selvagens. Se quiser que isso se aplique também a pokémons de jogadores, vá em data/lib/level system.lua e remova isso: if string.find(tostring(nick), "Shiny") then nick = tostring(nick):match("Shiny (.*)") end
  13. Não. As spells do PDA são escritas de maneira diferente das de Tibia. Recomendaria criar um tópico na seção de suporte de scripting solicitando que alguém faça sua spell, ou senão, pedir aqui mesmo.
  14. Opa, nesse exato momento estou almoçando. Estava pensando neste código, e então lembrei que não tinha feito nenhuma proteção contra esse bug. Editei meu comentário anterior com a correção. Sobre seu outro pedido, vou só terminar de comer e faço. EDIT: Pronto, aqui: function onUse(cid, item, frompos, item2, topos) local gates = { {x = 470, y = 243, z = 7}, --Posições dos portões. {x = 471, y = 243, z = 7}, } local id = 9485 --ID do portão. if getGlobalStorageValue(91801) > os.time() then return doPlayerSendCancel(cid, "Espere 1h para usar a alavanca novamente.") elseif getPlayerGuildId(cid) < 1 then return doPlayerSendCancel(cid, "You aren't member of any guild.") end for _, b in pairs(gates) do local gate = getTileItemById(b, id).uid if gate > 0 then doRemoveItem(gate, 1) doSendMagicEffect(b, 2) addEvent(function() doCreateItem(id, 1, b) end, 5 * 60 * 1000) else return doPlayerSendCancel(cid, "Someone already opened the gates.") end end broadcastMessage('Os Portões da ponte the Castle of Titans foram abertos, e se fecharão em 5 minutos', MESSAGE_EVENT_ADVANCE) addEvent(function() setGlobalStorageValue(91801, os.time() + 3600) end, 5 * 60 * 1000) return true end
  15. Coloque o código da spell em pokemon moves.lua, de data/lib. Depois, configure adequadamente em configuration.lua. Por exemplo, eu gostaria de adicionar a spell "Electricball" no meu servidor. Primeiro, eu escreveria o script. Depois, iria no arquivo que mencionei (pokemon moves.lua) e colocaria, abaixo do bloco de código referente as spells Reflect e Magic Coat, if spell == "Magic Coat" then eff = 11 else eff = 135 end doSendMagicEffect(getThingPosWithDebug(cid), eff) setPlayerStorageValue(cid, 21099, 1) o código da spell que quero adicionar (no caso, Electricball): elseif spell == "Electricball" then doSendDistanceShoot(getThingPos(cid), getThingPos(target), 40) addEvent(doDanoWithProtect, 200, cid, ELECTRICDAMAGE, getThingPos(target), waba, min, max, 48) Ficando: if spell == "Magic Coat" then eff = 11 else eff = 135 end doSendMagicEffect(getThingPosWithDebug(cid), eff) setPlayerStorageValue(cid, 21099, 1) elseif spell == "Electricball" then doSendDistanceShoot(getThingPos(cid), getThingPos(target), 40) addEvent(doDanoWithProtect, 200, cid, ELECTRICDAMAGE, getThingPos(target), waba, min, max, 48) Salvaria o arquivo. Depois, poderia ir em configuration.lua e alterar os pokémons com a spell que adicionei. ps: isso se seu servidor for PDA, claro. E nossa, definitivamente, não use esse programa para criar spells pra PDA. É bem diferente.
  16. zipter98 postou uma resposta no tópico em Suporte Tibia OTServer
    Simples: a função adjustWildPoke está sendo executada em um pokémon que não possui specialattack configurado na tabela pokes, de configuration.lua. Se possível, tente descobrir qual pokémon está causando esse erro, e informe aqui.
  17. Tá acontecendo esse erro com todos os pokémons, ou só com algum específico?
  18. zipter98 postou uma resposta no tópico em Suporte Tibia OTServer
    Claro. Poste o conteúdo do arquivo removewall2.lua, de data/creaturescripts/scripts.
  19. Exatamente, coloquei pra usar só em players. My bad. Logo edito meu comentário removendo essa condição. Pronto, editei. Agora você pode usar a runa em criaturas em geral (com exceção de NPCs). E, como suspeitei, as runas são actions. Basta, então, criar um arquivo com extensão .lua em data/actions/scripts e colocar meu código. A tag, suponho que você saiba fazer. Caso contrário, informe aqui. Já sobre as charges da runa, provavelmente são configuradas em items.xml.
  20. Er, sou meio newbie quanto a runas. Como exatamente elas funcionam? São actions? No código delas, é necessário setar o exhaust/remover o item, ou isso já é configurado na tag da mesma? Se puder me explicar (: (ps: um exemplo de script também seria de grande ajuda) Pra todo caso, fiz uma action básica que cumpre seus requisitos. Se quiser, você pode adaptá-la para o formato de um código de runa. local function isWalkable(pos, creature, proj, pz)-- by Nord if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end if getTopCreature(pos).uid > 0 and creature then return false end if getTileInfo(pos).protection and pz then return false, true end local n = not proj and 3 or 2 for i = 0, 255 do pos.stackpos = i local tile = getTileThingByPos(pos) if tile.itemid ~= 0 and not isCreature(tile.uid) then if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then return false end end end return true end function onUse(cid, item, fromPosition, item2, toPosition) local effect = xxx --Efeito. local exh = xxx --Exhaust, em segundos. if isCreature(item2.uid) and not isNpc(item2.uid) then if getPlayerStorageValue(cid, 1870) > os.time() then local msg = "Wait %d seconds to use this rune again." return doPlayerSendCancel(cid, msg:format(getPlayerStorageValue(cid, 1870) - os.time())) end local positions = { [0] = {x = getThingPos(cid).x, y = getThingPos(cid).y - 1, z = getThingPos(cid).z}, [1] = {x = getThingPos(cid).x + 1, y = getThingPos(cid).y, z = getThingPos(cid).z}, [2] = {x = getThingPos(cid).x, y = getThingPos(cid).y + 1, z = getThingPos(cid).z}, [3] = {x = getThingPos(cid).x - 1, y = getThingPos(cid).y, z = getThingPos(cid).z}, } local lookdir = getCreatureLookDirection(cid) local newPosition = positions[lookdir] if not isWalkable(newPosition) then newPosition = getClosestFreeTile(cid, getThingPos(cid)) end if newPosition then doTeleportThing(item2.uid, newPosition) doSendMagicEffect(newPosition, effect) doSendMagicEffect(toPosition, effect) setPlayerStorageValue(cid, 1870, os.time() + exh) else return doPlayerSendCancel(cid, "Couldn't execute the rune.") end else return doPlayerSendCancel(cid, "Use this rune only on creatures.") end return true end
  21. local tab = { ["10-30"] = CONST_ME_MAGIC_GREEN, --["minLevel-maxLevel"] = effect, ["31-40"] = CONST_ME_MAGIC_BLUE, ["41-50"] = CONST_ME_MAGIC_RED, } function ariseText(cid) local eff = nil for level, effect in pairs(tab) do local l = level:explode("-") if getPlayerLevel(cid) >= tonumber(l[1]) and getPlayerLevel(cid) <= tonumber(l[2]) then eff = effect break end end if eff then doSendMagicEffect(getThingPos(cid), eff) addEvent(function() if isCreature(cid) then ariseText(cid) end end, 600) end return true end function onLogin(cid) ariseText(cid) return true end
  22. Se você colocar o uniqueid na tag desta action, não vai ser necessário checá-lo no código. Se não se importa, removi esta linha, que, ao meu ver, era inútil: doTransformItem(item.uid, item.itemid) Do jeito que fiz, na minha opinião, a configuração é mais fácil (se quiser adicionar um novo portão, basta colocar a posição na tabela gates). Enfim, aqui o código: ps: o tempo começa a ser contado depois de 5 minutos, no momento em que os portões são criados. function onUse(cid, item, frompos, item2, topos) local gates = { {x = 470, y = 243, z = 7}, --Posições dos portões. {x = 471, y = 243, z = 7}, } local id = 9485 --ID do portão. if getGlobalStorageValue(91801) > os.time() then return doPlayerSendCancel(cid, "Espere 1h para usar a alavanca novamente.") end for _, b in pairs(gates) do local gate = getTileItemById(b, id).uid if gate > 0 then doRemoveItem(gate, 1) doSendMagicEffect(b, 2) addEvent(function() doCreateItem(id, 1, b) end, 5 * 60 * 1000) else return doPlayerSendCancel(cid, "Someone already opened the gates.") end end broadcastMessage('Os Portões da ponte the Castle of Titans foram abertos, e se fecharão em 5 minutos', MESSAGE_EVENT_ADVANCE) addEvent(function() setGlobalStorageValue(91801, os.time() + 3600) end, 5 * 60 * 1000) return true end

Informação Importante

Confirmação de Termo