• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Lua Spell problem TIBIA 860 Distro Crying Damson

FilipeJF

New Member
Joined
Jan 9, 2012
Messages
124
Reaction score
4
First of all, I would like to thank Printer for the spell he posted in the post below:
https://otland.net/threads/ninja-vocation-spells.223635/

So, that's the script:

Lua:
function isWalkable(cid, pos)
    local tile = Tile(pos)
    if not tile then
        return false
    end
    if tile:queryAdd(cid) == 1 and not tile:hasFlag(TILESTATE_PROTECTIONZONE) then
        return true
    end
    return false
end
local function jumpBehindTarget(cid, target)
    local player = Player(cid)
    local target = Creature(target)
    local targetPos = target:getPosition()
    local targetPositions = {
        north = Position(targetPos.x, targetPos.y-1, targetPos.z),
        east = Position(targetPos.x+1, targetPos.y, targetPos.z),
        west = Position(targetPos.x-1, targetPos.y, targetPos.z),
        south = Position(targetPos.x, targetPos.y+1, targetPos.z)
    }
    local targetDir = target:getDirection()
    if targetDir == NORTH then
        dir = targetPositions.south
    elseif targetDir == EAST then
        dir = targetPositions.west
    elseif targetDir == WEST then
        dir = targetPositions.east
    elseif targetDir == SOUTH then
        dir = targetPositions.north
    end
    return dir
end
local function oldPos(cid, oldPos)
    local player = Player(cid)
    if not player then
        return
    end
    player:teleportTo(oldPos)
end
local function checkHasTarget(cid, count, oldPos)
    local player = Player(cid)
    if not player then
        return
    end
    if count < 1 then
        player:setGhostMode(false)
        return
    end

    local target = player:getTarget()
    if target then
        local behindTarget = jumpBehindTarget(cid, target:getId())
        if isWalkable(cid, behindTarget) then
            player:teleportTo(behindTarget)
        else
            player:teleportTo(target:getPosition())
            addEvent(backOldPos, 100, cid, oldPos)
        end
        player:setDirection(target:getDirection())
        player:setGhostMode(false)
        doTargetCombatHealth(cid, target, COMBAT_PHYSICALDAMAGE, -20, -100, CONST_ME_FIREATTACK)
        return true
    end
    addEvent(checkHasTarget, 1 * 100, cid, count - 1)
end
function onCastSpell(creature, var)
    local playerPos = creature:getPosition()
    creature:setGhostMode(true)
    playerPos:sendMagicEffect(CONST_ME_POFF)
    addEvent(checkHasTarget, 1 * 250, creature:getId(), 50, playerPos)
    return false
end

And that's the error that I've been receiving:

Code:
[Error - Spell Interface]
data/spells/scripts/attack/ninja.lua:onCastSpell
Description:
data/spells/scripts/attack/ninja.lua:75: attempt to index local 'creature' (a number value)
stack traceback:
        data/spells/scripts/attack/ninja.lua:75: in function <data/spells/scripts/attack/ninja.lua:74>

I suppose this spell system is outdated, but since I'm a rookie on this department I don't know what to change to make it functionable. I don't even know if it's possible to make it functionable.
 
Solution
A few of parts of the code needed to be rewritten

quick explanation on how addEvent works:
addEvent(functionName, time in ms b4 execution, parameters)

example:
doCreatureSay(cid, "Hello World")
to do the above with 2 seconds delay
addEvent(doCreatureSay, 2000, cid, "Hello World")

Lua:
local condition = createConditionObject(CONDITION_INVISIBLE)
setConditionParam(condition, CONDITION_PARAM_TICKS, 5000)

local function isWalkable(cid, pos)
    pos.stackpos = 253
    if doTileQueryAdd(cid, pos) == 1 then -- checks if we can add cid to a position of choice
        return true
    end
    return false
end

local function jumpBehindTarget(cid, target)

    local tPos = getCreaturePosition(target)
    local tPositions = {
        north = {x...
no
the isWalkable function was faulty and so was getPlayerLookDir it returns numbers not NORTH EAST etc
also in several parts it was checking if cid is a player for no reason.
With the player checks, if a monster casted the spell nothing would happen, so why even add the spell to a monster?
i was referring to his post
 
A few of parts of the code needed to be rewritten

quick explanation on how addEvent works:
addEvent(functionName, time in ms b4 execution, parameters)

example:
doCreatureSay(cid, "Hello World")
to do the above with 2 seconds delay
addEvent(doCreatureSay, 2000, cid, "Hello World")

Lua:
local function isWalkable(cid, pos)
    pos.stackpos = 253
    if doTileQueryAdd(cid, pos) == 1 then -- checks if we can add cid to a position of choice
        return true
    end
    return false
end

local function jumpBehindTarget(cid, target)

    local tPos = getCreaturePosition(target)
    local tPositions = {
        north = {x = tPos.x, y = tPos.y - 1, z = tPos.z},
        east = {x = tPos.x + 1, y = tPos.y, z = tPos.z},
        west = {x = tPos.x - 1, y = tPos.y, z = tPos.z},
        south = {x = tPos.x, y = tPos.y + 1, z = tPos.z}
    }
    local tDir = getPlayerLookDir(target)

    if tDir == 0 then
        dir = tPositions.south
    elseif tDir == 1 then
        dir = tPositions.west
    elseif tDir == 3 then
        dir = tPositions.east
    elseif tDir == 2 then
        dir = tPositions.north
    end

    return dir
end

local function checkHasTarget(cid, oldPos)

    local target = getCreatureTarget(cid)

    if target then
        local behindTarget = jumpBehindTarget(cid, target)

        if isWalkable(cid, behindTarget) then
            doTeleportThing(cid, behindTarget)
            addEvent(doTeleportThing, 100, cid, oldPos)
        else
            doTeleportThing(cid, getCreaturePosition(target))
            addEvent(doTeleportThing, 100, cid, oldPos)
        end

        doCreatureSetLookDir(cid, getPlayerLookDir(target))
        doTargetCombatHealth(cid, target, COMBAT_PHYSICALDAMAGE, -20, -100, CONST_ME_FIREATTACK)
        return true
    end

end

function onCastSpell(cid, var)
    local pPos = getCreaturePosition(cid)
    doSendMagicEffect(pPos, CONST_ME_POFF)
    addEvent(checkHasTarget, 50, cid, pPos)
    return true
end

Well, it worked, but it isn't what I truly wanted. Even though, I would appreciate if you could help me solving the error, which appears only when I'm not targeting the creature. I tried adding target necessary in spell.xml but it's not
making any effect.

Lua:
[Error - Spell Interface]
In a timer event called from:
data/spells/scripts/attack/ninja.lua:onCastSpell
Description:
(luaGetThingPosition) Thing not found

[Error - Spell Interface]
In a timer event called from:
data/spells/scripts/attack/ninja.lua:onCastSpell
Description:
data/spells/scripts/attack/ninja.lua:13: attempt to index local 'tPos' (a boolean value)
stack traceback:
        data/spells/scripts/attack/ninja.lua:13: in function 'jumpBehindTarget'
        data/spells/scripts/attack/ninja.lua:38: in function <data/spells/scripts/attack/ninja.lua:33>

But, as you can see in gif below, the spell does just like the gif below:

C9kyGonr.gif


While the corrected spell is working, it's mostly like a simplified version of the one listed above. But, if things gets too complicated, care not of helping me. Just helping me with the distro bug would be greatly appreciated.
 
Back
Top