Ir para conteúdo
Banner com Efeitos

xWhiteWolf

Héroi
  • Registro em

  • Última visita

Solutions

  1. xWhiteWolf's post in (Resolvido)Script para Dar Cargos e Renomear os Nomes! was marked as the answer   
    formata pra ansi, se o erro persistir deleta a primeira linha e reescreve ela
  2. xWhiteWolf's post in (Resolvido)[PEDIDO]Função onAttack e onCombat was marked as the answer   
    cara não entendi nada doque vc falou/fez, ele não vira na diagonal pq não dá e não é bug porque se vc estiver com um player normal o bixo vai se movimentar ao seu redor e fazer você virar. Quando eu falei em usar a function  getDistanceBetween(fromPosition, toPosition) não era dessa forma.

    Era assim:
    function onAttack(cid, target)     if isCreature(cid) and isCreature(target) then         dir = getDirectionTo(getCreaturePosition(cid), getCreaturePosition(target))         doCreatureSetLookDirection(cid, dir) if getPlayerVocation(cid) == 4 or getPlayerVocation(cid) == 8 then     if getDistanceBetween(getCreaturePosition(cid), getCreaturePosition(target)) then         doSendMagicEffect(getCreaturePosition(cid), 10)     end end     end return true end
  3. xWhiteWolf's post in (Resolvido)[PEDIDO] Meteor spell tfs 1.0 was marked as the answer   
    para de citar meus comentários toda hora mano, tá fazendo spam desnecessário no fórum e fica chovendo notificação sua cada vez que vc faz isso. Apenas comente oque vc quer falar direto. Esse erro é bug, se vc tiver pelo notepad clica em formatar > converter para ansi e dps disso dá reload.
  4. xWhiteWolf's post in (Resolvido)Dúvida na função was marked as the answer   
    function getPlayerExhaust(player, number) local before = getPlayerStorageValue(player,number) exhaust = (before - os.time()) > 0 and (before - os.time()) or 0 return exhaust end pronto, ele retorna o exhaust que o player tem naquele determinado storage. 

    De quebra ainda fiz uma função pra setar o exhaust no storage
    function setPlayerExhaust(player, number, time) local before = getPlayerStorageValue(player,number) a = before > os.time() and before or os.time() return setPlayerStorageValue(player, number, a + time) end Pra escrever em uma action é só fazer:
     
    doPlayerSendTextMessage(cid, 22, "Espere ".. getPlayerExhaust(cid, >STORAGE VEM AQUI<).." segundo(s).")
  5. xWhiteWolf's post in (Resolvido)Como eu faço o Sistema Training igual ao NTO BR was marked as the answer   
    local config = { number = 130, --- numero de salas firstPos = {x = 160, y = 54, z = 7}, --- pos da primeira sala (coloque a pos de onde o player irá ficar ao entrar) rangex = 11, --- distancia em X entre cada uma das pos de cada sala rangey = 12 --- distancia em Y entre cada uma das pos de cada sala } function onStepIn(cid, item, position, fromPosition) local room = nil for i = 0, (config.number - 1) do pos = {x = config.firstPos.x + (i * config.rangex), y = config.firstPos.y + (i * config.rangey), z = config.firstPos.z} if isWalkable(pos, true, true, true) then room = pos break end end if room ~= nil then doTeleportThing(cid, room) else doPlayerSendCancel(cid, "All rooms are full") doTeleportThing(cid, fromPosition) doSendMagicEffect(fromPosition, 2) end return true end coloca em movements por actionid/uniqueid e coloca esse action/unique no teleporte. Abraço
  6. xWhiteWolf's post in (Resolvido)Spell que regenera porcentagem de HP por segundo was marked as the answer   
    Seguinte meu caro, os combats/conditions tem que ser colocados antes do script rodar, certo? (antes do callback). Porém, você só pode usar coisas relacionadas ao cid após o callback rodar!.

    O problema está justamente aqui:
    pois até você executar a magia o server não server oque é esse cid. E ele só executa a magia no final do script;
     

    O tibia tem uma maneira de resolver esse tipo de coisa porém a maneira deles é uma maneira meio bronze (ruim) e que não funciona em todos os servers aparentemente, que é fazendo um combat callback de alguma informação do player. Eu não vou entrar em detalhes porque é uma solução burra mas você pode fazer essa mesma spell através de scripts dentro do callback, tendo um resultado idêntico ao que vc quer e deixado o script mais bonito e configurável.
    Veja: http://www.tibiaking.com/forum/topic/44593-mass-healing/
     
  7. xWhiteWolf's post in (Resolvido)[PEDIDO] Personagem Brilhando! was marked as the answer   
    resolvido http://www.tibiaking.com/forum/topic/47038-gran-castle-event-854/
  8. xWhiteWolf's post in (Resolvido)Spell que faz chover arrows was marked as the answer   
    local waves = 8 --- numero de vezes que vão cair as flechas local water = {490, 491, 492, 493, 4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625} local combat = createCombatObject() local meteor = createCombatObject() setCombatParam(meteor, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(meteor, COMBAT_PARAM_USECHARGES, TRUE) setCombatParam(meteor, COMBAT_PARAM_EFFECT, 9) setCombatFormula(meteor, COMBAT_FORMULA_LEVELMAGIC, -30, -50, -40, -55) local meteor_water = createCombatObject() setCombatParam(meteor_water, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(meteor_water, COMBAT_PARAM_USECHARGES, TRUE) setCombatParam(meteor_water, COMBAT_PARAM_EFFECT, 1) setCombatFormula(meteor, COMBAT_FORMULA_LEVELMAGIC, -30, -50, -40, -55) combat_arr = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 3, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} } local combat_area = createCombatArea(combat_arr) setCombatArea(combat, combat_area) local function meteorCast(p) doCombat(p.cid, p.combat, positionToVariant(p.pos)) end local function stunEffect(cid) doSendMagicEffect(getThingPos(cid), CONST_ME_STUN) end function onTargetTile(cid, pos) if (math.random(0, 6) == 6) then local ground = getThingfromPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}) if (isInArray(water, ground.itemid) == TRUE) then local newpos = {x = pos.x - 7, y = pos.y - 6, z = pos.z} doSendDistanceShoot(newpos, pos, CONST_ANI_HOLY) addEvent(meteorCast, 200, {cid = cid, pos = pos, combat = meteor_water}) else local newpos = {x = pos.x - 7, y = pos.y - 6, z = pos.z} doSendDistanceShoot(newpos, pos, CONST_ANI_ARROW) addEvent(meteorCast, 200, {cid = cid,pos = pos, combat = meteor}) end end end setCombatCallback(combat, CALLBACK_PARAM_TARGETTILE, "onTargetTile") function onCastSpell(cid, var) for i = 0, waves do addEvent(function() if isCreature(cid) then doCombat(cid, combat, var) end end, 200 * i) end return true end <instant name="Supreme Paladin" words="exevo mas gran con" lvl="350" mana="1500" prem="1" needtarget="1" exhaustion="2000" needlearn="0" event="script" value="especiais/paladin.lua"> <vocation id="7"/> </instant> Prontinho, editei e agr tá igualzinho vc quer.
  9. xWhiteWolf's post in (Resolvido)[Ajuda] Dano spell was marked as the answer   
    function onCastSpell(cid, var) if getCreatureHealth(variantToNumber(var)) <= (0.2 * getCreatureMaxHealth(variantToNumber(var)) ) then doTargetCombatHealth(cid, variantToNumber(var), 1, -getCreatureMaxHealth(variantToNumber(var)), -getCreatureMaxHealth(variantToNumber(var)), CONST_ME_STUN) doCreatureSay(cid, "EXECUTIONER", 20, false) doSendMagicEffect(getCreaturePosition(variantToNumber(var)), CONST_ME_GIANTICE) doSendDistanceShoot(getCreaturePosition(cid), getCreaturePosition(variantToNumber(var)), CONST_ANI_SMALLICE) else doPlayerSendCancel(cid, "You can only cast this spell in creatures with less than 20% of life.") return false end return true end só lembre de colocar needtarget="1" qnd for declarar a spell no spells.xml
  10. xWhiteWolf's post in (Resolvido)Vancini was marked as the answer   
    não faço a mínima idéia, tenta dar um ctrl + f em onThink. 

    Seu server é que versão? É TFS? Se for procura na pasta do server (antes de data) uma pasta chamada doc e abre o arquivo SCRIPTSYSTEM_HELP; Lá dentro vai ter todos os callbacks que existem no seu servidor.
  11. xWhiteWolf's post in (Resolvido)[Ajuda] Adicionando variáveis? was marked as the answer   
    local arr1 = { {1, 1, 1}, {1, 2, 1}, {1, 1, 1} } local area1 = createCombatArea(arr1) local arr2 = { {1, 1, 1}, {1, 2, 1}, {1, 1, 1} } local area2 = createCombatArea(arr2) function onCastSpell(cid, var) local maglevel, level, mana = getPlayerMagLevel(cid), getPlayerLevel(cid), getCreatureMana(cid) local axe, sword, club, distance = getPlayerSkillLevel(cid, 3), getPlayerSkillLevel(cid, 2), getPlayerSkillLevel(cid, 1), getPlayerSkillLevel(cid, 4) local shield, health = getPlayerSkillLevel(cid, 5), getCreatureHealth(cid) local formula = { min = (level + maglevel + axe + sword + club + shield + mana), max = (level + maglevel + axe + sword + club + shield + mana + health) } addEvent(function() if isCreature(cid) then doAreaCombatHealth(cid, 1, getCreaturePosition(cid), area1, -formula.min, -formula.max, 9) end end, 100) addEvent(function() if isCreature(cid) then doAreaCombatHealth(cid, 1, getCreaturePosition(cid), area1, -formula.min, -formula.max, 0) end end, 500) return true end só configura na formula os valores minimos e máximos que vc quer. Ali em cima é a area
    Aqui vc tem a primeira spell:
    e aqui tem a segunda
     

    1 ali é o tipo de dano, 1 significa dano físico mas vc pode alterar seguindo essa tabela:
    COMBAT_NONE = 0 COMBAT_PHYSICALDAMAGE = 1 COMBAT_ENERGYDAMAGE = 2 COMBAT_EARTHDAMAGE = 4 COMBAT_POISONDAMAGE = 4 COMBAT_FIREDAMAGE = 8 COMBAT_UNDEFINEDDAMAGE = 16 COMBAT_LIFEDRAIN = 32 COMBAT_MANADRAIN = 64 COMBAT_HEALING = 128 COMBAT_DROWNDAMAGE = 256 COMBAT_ICEDAMAGE = 512 COMBAT_HOLYDAMAGE = 1024 COMBAT_DEATHDAMAGE = 2048 area1 e 2 são as areas lá em cima do script e as formulas vc edita da forma que quiser. O 9 e o 0 são os efeitos que saem;

    abaixo dos combats vc vai ter isso daqui: 
    esse 100 e o outro 500 lá representam o tempo em milisegundos até o combat sair, se vc quiser aumentar o tempo entre as duas spells é só aumentar esse valor (lembrando que é em milisegundos [1 segundo = 1000 milisegundos]. Da forma que está colocado a primeira spell sai em 0,1 segundo e a segunda sai em 0,4 segundos dps da primeira.. as duas spells acabam dps de meio segundo. Espero que tenha entendido
  12. xWhiteWolf's post in (Resolvido)Clean em determinada posição was marked as the answer   
    troca function onThink(cid, interval, lastExecution) pelo callback da talkaction, e depois troca o script de pasta e adiciona no talkactions.xml. 
  13. xWhiteWolf's post in (Resolvido)Alterar outfit ao andar depois de usar spell was marked as the answer   
    local config = { tempo = 10, -- tempo de uso da spell, é a duração que ela vai ter storage = 32710, -- storage em que vai ser salvo o tempo outfit = 137, --- lookType da outfit que irá ser modificada ao andar cooldown = 12 -- tempo entre 1 uso e outro (sempre deixar maior que tempo de uso da spell) } local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) local condition = createConditionObject(CONDITION_ATTRIBUTES) setConditionParam(condition, CONDITION_PARAM_TICKS, config.tempo * 1000) setConditionParam(condition, CONDITION_PARAM_SKILL_MELEEPERCENT, 135) setConditionParam(condition, CONDITION_PARAM_SKILL_SHIELDPERCENT, -100) setConditionParam(condition, CONDITION_PARAM_BUFF, true) setCombatCondition(combat, condition) function outfit(uid, key, id, tempo, lastPos) if getPlayerStorageValue(uid, key) - os.time() >= 0 then lastPos = lastPos or getCreaturePosition(uid) if getCreaturePosition(uid).x ~= lastPos.x or getCreaturePosition(uid).y ~= lastPos.y or getCreaturePosition(uid).z ~= lastPos.z  then lastPos = getCreaturePosition(uid) local atual = getCreatureOutfit(uid) atual.lookType = id doSetCreatureOutfit(uid, atual, tempo) end addEvent(function() if isCreature(uid) then outfit(uid, key, id, tempo, lastPos) end end, tempo) end end function onCastSpell(cid, var) if getPlayerStorageValue(cid, config.storage) - os.time() < (config.tempo - config.cooldown) then doCombat(cid, combat, var) setPlayerStorageValue(cid, config.storage, os.time() + config.tempo) outfit(cid, config.storage, config.outfit, 150, nil) else doPlayerSendCancel(cid, "Your spell is in cooldown") end return true end só substituir o script por esse, pra configurar é só alterar as coisas lá em cima lembrando que o exhaust da magia de agr em diante vai ser cooldown - o tempo pra usar ela. Logo nesse exemplo ai são 2 segundos de exhaust. Você usa uma vez, ela dura 10 segundos e dai vc tem que esperar 2 segundos pra poder usar ela novamente e ter mais 10 segundos de duração dela. Espero que tenha gostado ;]
  14. xWhiteWolf's post in (Resolvido)[ERRO] Codigo Simples was marked as the answer   
    monster = { ["Shiny Magmar"] = {itemid = 13131, count = 10} } function onKill(cid, target, lastHit) if monster[getCreatureName(target)] then doPlayerAddItem(cid, monster[getCreatureName(target)].itemid, monster[getCreatureName(target)].count) sendMsgToPlayer(cid, 20, "Parabens voce acaba de ganhar "..monster[getCreatureName(target)].count.." TowerCoins") end return true end pronto
  15. xWhiteWolf's post in (Resolvido)[Ajuda] CreatureScripts was marked as the answer   
    dá uma olhada no aegis of dimension que tem no meu perfil, é bem parecido.. Se tiver determinado storage e morrer é teleportado e tem a vida enchida, olhar lá vai te dar uma idéia de como fazer.
  16. xWhiteWolf's post in (Resolvido)Duvida em spell (buff nos clones) was marked as the answer   
    -- parte modificada local summons = getCreatureSummons(cid) if #summons > 0 then for k = 1, #summons do if getCreatureName(cid) == getCreatureName(summons[k]) then local pos = getCreaturePosition(summons[k]) local positions = {x = pos.x + 1, y = pos.y, z = pos.z} doSendMagicEffect(positions, effect[i]) end end end -- fim da parte modificada troca a parte modificada por essa daqui e seja feliz
  17. xWhiteWolf's post in (Resolvido)Ajuda com Lua + SQL was marked as the answer   
    os comandos de SQL são ADD, INSERT, DELETE, UPDATE, ALTER e SELECT

    aqui tem uns exemplos de comandos diretamente na SQL que vc pode fazer

    Mas se vc quiser fazer esses comandos por Lua vc pode utilizar db.Query/db.query/db.executeQuery (dependendo da sua versão)
    Aqui tem um exemplo
    db.executeQuery("ALTER TABLE `players` ADD `teste` INTEGER NOT NULL DEFAULT 1;") Isso vai criar um campo teste na tabela players com valor padrão 1.

    Se eu quisesse que o valor padrão fosse null era só retirar o "NOT NULL DEFAULT 1"
    Se eu quisesse que fosse uma string eu mudava de INTEGER pra TEXT (não sei se STRING funcionaria), enfim, isso é só a definição de tipos.

    Pra pegar um valor existente você usa db.getResult mas tem que fazer uma iteração por todo o resultado da tabela, observe:
    local result = db.getResult('SELECT `id` FROM `houses` WHERE `owner` > 0') if result:getID() ~= -1 then repeat -- aqui vem o código que vc vai fazer pra mudar esse resultado. until not result:next() end Isso pode ter soado bem vago, banco de dados são complexos mas vc pode ir brincando aí e fazendo diversos testes a partir dessas funções. Espero que tenha ajudado.
  18. xWhiteWolf's post in (Resolvido)[Ajuda] Account Manager habilita 3 dias de Vip na account was marked as the answer   
    function onLogin(cid) local days = 2 if getPlayerStorageValue(cid, 76534) <= 0 then doPlayerAddPremiumDays(cid, days) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você recebeu "..days.." dias de VIP, bom jogo!") setPlayerStorageValue(cid, 76534, 1) end return true end
  19. xWhiteWolf's post in (Resolvido)[PEDIDO URGENTE] Spell hits por segundo was marked as the answer   
    Tópico dado como resolvido à pedido do autor.
  20. xWhiteWolf's post in (Resolvido)[PEDIDO URGENTE] NPC RESETER was marked as the answer   
  21. xWhiteWolf's post in (Resolvido)[PEDIDO] Red Star Diferente was marked as the answer   
    o vídeo ficou uma bosta e não dá pra enxergar onde começa e onde termina mas em todo caso eu fiz essa função aqui  que deve funcionar da forma que vc quer
    function loopEffect(uid, effect, tempo) local pos = getCreaturePosition(uid) local effectPositions = { [1] = {x = pos.x - 1, y = pos.y - 1, z = pos.z, stackpos = 0}, [2] = {x = pos.x, y = pos.y - 1, z = pos.z, stackpos = 0}, [3] = {x = pos.x + 1, y = pos.y - 1, z = pos.z, stackpos = 0}, [4] = {x = pos.x + 1, y = pos.y, z = pos.z, stackpos = 0}, [5] = {x = pos.x + 1, y = pos.y + 1, z = pos.z, stackpos = 0}, [6] = {x = pos.x, y = pos.y + 1, z = pos.z, stackpos = 0}, [7] = {x = pos.x - 1, y = pos.y + 1, z = pos.z, stackpos = 0}, [8] = {x = pos.x - 1, y = pos.y, z = pos.z, stackpos = 0}, [9] = {x = pos.x, y = pos.y, z = pos.z, stackpos = 0} } doSendDistanceShoot(effectPositions[math.random(#effectPositions)], effectPositions[math.random(#effectPositions)], effect) addEvent(function() if isCreature(uid) then loopEffect(uid, effect, tempo) end end, 1000 * tempo) return true end  só colocar ela no final de data\lib\constant.lua e no script que vc quiser que adicione ela você coloca essa linha:

    loopEffect(cid, 18, 0.3)
  22. xWhiteWolf's post in (Resolvido)Checar de fromPos até toPos was marked as the answer   
    eu criei uma função que faz esse tipo de coisa, testa aí e me fala se funciona:
     
    function hasGroundInDistance(cid, distance, tablegrama) local checker = {} -- deixe assim local pos = getThingPos(cid) for i = -distance, distance do for j = -distance, distance do local position = {x = pos.x + i, y = pos.y + j, z = pos.z, stackpos = 0} if i ~= 0 or j ~= 0 then local grama = getThingFromPos(position).itemid for k = 1, #tablegrama do if tablegrama[k] == grama then table.insert(checker, 1) end end end end end if distance >= 1 then local total = 0 for x = 1, distance do number = x * 2 + 1 t = (number * 2) + (2* (number-2)) total = total + t end end return (#checker == total and true or false) end pra usar vc precisa colocar isso daí tudo que tá no spoiler no começo do script e quando quiser saber se o player está cercado por grama/agua/lava/etc. vc faz:
    local itemid = {todos os ids do piso que vc quer analisar} local distancia = 1 -- distancia a ser analisada.. como vc quer só 1 sqm da posição do player a distancia é 1. if hasGroundInDistance(cid, distancia, itemid) thenfaz isso end Se vc quisesse a seguinte area abaixo:
     
     
    Você colocaria distancia = 2.

    Bom, espero ter ajudado

    PS : minha internet quebrou e to pelo tablet.

    no Lugar de local total = 0 coloca só total = 0
  23. xWhiteWolf's post in (Resolvido)[logica de programacao] como balancear times? was marked as the answer   
    local times = { [1] = globalStorage do time1, [2] = globalStorage do time2, [3] = globalStorage do time3,  ​[4] = globalStorage do time4 } local minor = getGlobalStorageValue(times[1]) -- seta um valor inicial for _, v in pairs (times) do if getGlobalStorageValue(v) <= minor then minor = getGlobalStorageValue(v) index = v end end colocar o player no time cujo globalStorage seja (v) e setar o global storage do v e o valor de minor como sendo o atual + 1 essa é a melhor lógica que você pode usar pra qualquer quantidade de times. É ainda melhor até que ternário.
  24. xWhiteWolf's post in (Resolvido)[Dúvida] Possivel almentar mais que 255 o effect de magias do server na sourcer? was marked as the answer   
    sim, é possível. Vai até 256 porque o tibia separa 1 byte de informação pra guardar os efeitos.

    Pra ter mais que isso vc precisaria editar praticamente tudo e acho realmente dificil vc achar alguém que saiba fazer isso e esteja disposto a ensinar.

    Lembrando que 1 byte = 8 bits e bits contém 0's e 1's. Logo 2^8 = 256 (numero de efeitos possíveis). Como a contagem começa do efeito 0 o último que temos é de fato o 255. Espero ter resolvido sua dúvida. Vou colocar o tópico como resolvido por razões já apresentadas, se tiver mais alguma dúvida pode comentar aqui.

    Edit: Muitas das coisas no Tibia contém exatamente 1 byte de informação, portanto, é correto dizer que 256 é um número cabalístico no mundo do Tibia haha. 256 também são as cores que você utilizar.. 

    O tibia inicialmente possuia 1 byte pra armazenar os outfits mas como isso não foi suficiente eles separaram mais 1 bit, aumentando a quantidade de outfits no jogo de 256 pra 512. Não sei se as versões mais atuais trabalham com 10 bits mas acho dificil porque é informação pra caralho KKKK

    Se tiver vontade de se aprofundar no assunto você pode conferir esse pdf de uma aula da Universidade Federal do ABC sobre a natureza da informação
    clicando >aqui<
  25. xWhiteWolf's post in (Resolvido)Teleport was marked as the answer   
    actions\scripts
    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, frompos, itemEx, topos) if isWalkable(topos, true, true, true) then doTeleportThing(cid, topos) addEvent(function() if isPlayer(cid) then doSendMagicEffect(getCreaturePosition(cid), 10) end end, 100) doSendMagicEffect(frompos, 10) else doPlayerSendCancel(cid, "This position is not reachable") end return false end e no actions.xml
    <action itemid="2379" script="kunai.lua" allowfaruse="1"/> Testado e funcionando em 8.54, vc só vai ter que garantir que não exista nenhum outro script usando esse mesmo id.

Informação Importante

Confirmação de Termo