Boa noite galera, tudo bem?
Venho compartilhar com vocês hoje um sisteminha que desenvolvi para as magias do tipo "shoot'. Foi feito inicialmente para funcionar com magias que usam a posição do mouse como referência e adaptei para cipclientes poderem usar em runas e magias de tiro.
O funcionamento do sistema é simples: Ao usar uma runa ou castar uma magia "shoot" com esse sistema criaturas e objetos no caminho irão interferir na trajetória, isto é, receberão o combate no lugar do alvo inicial.
Ilustrativo:
Bom, vamos ao que interessa.
Vá em data/lib/ e crie um novo arquivo chamado spellsLib.lua (pode-se utilizar também o arquivo spells.lua contido em data/spells/lib).
Dentro dele inclua as seguintes funções:
IsWalkable (by Nord)
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 getPositionsAround(pos) return { [1] = {x = pos.x, y = pos.y - 1, z = pos.z, stackpos = 0}, [2] = {x = pos.x + 1, y = pos.y - 1, z = pos.z, stackpos = 0}, [3] = {x = pos.x + 1, y = pos.y, z = pos.z, stackpos = 0}, [4] = {x = pos.x + 1, y = pos.y + 1, z = pos.z, stackpos = 0}, [5] = {x = pos.x, y = pos.y + 1, z = pos.z, stackpos = 0}, [6] = {x = pos.x - 1, y = pos.y + 1, z = pos.z, stackpos = 0}, [7] = {x = pos.x - 1, y = pos.y, z = pos.z, stackpos = 0}, [8] = {x = pos.x - 1, y = pos.y - 1, z = pos.z, stackpos = 0} } end
CheckInterceptions (by Skulls)
SetSpellTarget (by Skulls)
Feito isso, está tudo configurado. Basta agora adicionar às magias que você queira.
Abra o .lua da magia, por exemplo death strike.lua.
Lá você terá, entre outras coisas, a função onCastSpell como abaixo:
function onCastSpell(cid, var) return doCombat(cid, combat, var) end
Substitua isso por:
Um exemplo de magia que utiliza esse sistema: http://www.xtibia.com/forum/topic/239460-exori-grab-vis/
@@Daniel, na verdade move pra mim pra Downloads Spells, acho que seria mais correto.