• 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 Need help with 2 functions

therrax

Member
Joined
Jul 12, 2012
Messages
262
Solutions
1
Reaction score
11
TFS 1.0
Code:
Lua Script Error: [Action Interface]
data/actions/scripts/slotremove.lua:onUse
data/actions/scripts/slotremove.lua:21: attempt to index a nil value
stack traceback:
        [C]: in function '__index'
        data/actions/scripts/slotremove.lua:21: in function <data/actions/scripts/slotremove.lua:17>
Code:
function getSlotType_full(n)
   if not n then
     return false
   end
   if n:match('%[(.+)%]') then
     n = n:match('%[(.+)%]')
     if n == '?' then
       return 0,n
     else
       return n
     end
   else
     return false
   end
end

function onUse(cid, item, fromPosition, itemEx, toPosition)
item_slots_a = 0
item_slots_n = ""
item_slots_t = {}
   for _ in Item(itemEx.uid):getAttribute(ITEM_ATTRIBUTE_DESCRIPTION):gmatch('(%[.-%])') do
     item_slots_a = item_slots_a + 1
     item_slots_t[item_slots_a] = getSlotType_full(_)
   end
  
   if item_slots_t[1] == nil then
     return false
   end

   for i = 1, #item_slots_t - 1 do
   item_slots_n = item_slots_n .. "[" .. item_slots_t[i] .. "]"
   end
  
   doRemoveItem(item.uid,1)
   doSendMagicEffect(toPosition,CONST_ME_MAGIC_RED)
   doSetItemSpecialDescription(itemEx.uid, item_slots_n)
   doPlayerSendTextMessage(cid,20,"Attribute removed.")
return true
end
 
Code:
Lua Script Error: [CreatureScript Interface]
data/creaturescripts/scripts/playerdeath.lua:onDeath
data/creaturescripts/scripts/playerdeath.lua:70: attempt to index a nil value
stack traceback:
        [C]: in function '__index'
        data/creaturescripts/scripts/playerdeath.lua:70: in function <data/creaturescripts/scripts/playerdeath.lua:4>
Code:
local deathListEnabled = true
local maxDeathRecords = 5

function onDeath(cid, corpse, killer, mostDamage, unjustified, mostDamage_unjustified)
    local player = Player(cid)

    player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You are dead.")
    if not deathListEnabled then
        return
    end

    local byPlayer = 0
    local killerCreature = Creature(killer)
    if killerCreature == nil then
        killerName = "field item"
    else
        if killerCreature:isPlayer() then
            byPlayer = 1
        else
            local master = killerCreature:getMaster()
            if master and master ~= killerCreature and master:isPlayer() then
                killerCreature = master
                byPlayer = 1
            end
        end
        killerName = killerCreature:getName()
    end

    local byPlayerMostDamage = 0
    if mostDamage == 0 then
        mostDamageName = "field item"
    else
        local mostDamageKiller = Creature(mostDamage)
        if mostDamageKiller:isPlayer() then
            byPlayerMostDamage = 1
        else
            local master = mostDamageKiller:getMaster()
            if master and master ~= mostDamageKiller and master:isPlayer() then
                mostDamageKiller = master
                byPlayerMostDamage = 1
            end
        end
        mostDamageName = mostDamageKiller:getName()
    end

    local playerGuid = player:getGuid()
    db.query("INSERT INTO `player_deaths` (`player_id`, `time`, `level`, `killed_by`, `is_player`, `mostdamage_by`, `mostdamage_is_player`, `unjustified`, `mostdamage_unjustified`) VALUES (" .. playerGuid .. ", " .. os.time() .. ", " .. player:getLevel() .. ", " .. db.escapeString(killerName) .. ", " .. byPlayer .. ", " .. db.escapeString(mostDamageName) .. ", " .. byPlayerMostDamage .. ", " .. unjustified .. ", " .. mostDamage_unjustified .. ")")
    local resultId = db.storeQuery("SELECT `player_id` FROM `player_deaths` WHERE `player_id` = " .. playerGuid)

    local deathRecords = 0
    local tmpResultId = resultId
    while tmpResultId ~= false do
        tmpResultId = result.next(resultId)
        deathRecords = deathRecords + 1
    end

    if resultId ~= false then
        result.free(resultId)
    end

    while deathRecords > maxDeathRecords do
        db.query("DELETE FROM `player_deaths` WHERE `player_id` = " .. playerGuid .. " ORDER BY `time` LIMIT 1")
        deathRecords = deathRecords - 1
    end

    if byPlayer == 1 then
        local guild = player:getGuild()
        local targetGuild = guild and guild:getId()
        if targetGuild ~= 0 then
            local killerGuild = killerCreature:getGuild():getId()
            if killerGuild ~= 0 and targetGuild ~= killerGuild and isInWar(cid, killerCreature) then
                local warId = false
                resultId = db.storeQuery("SELECT `id` FROM `guild_wars` WHERE `status` = 1 AND ((`guild1` = " .. killerGuild .. " AND `guild2` = " .. targetGuild .. ") OR (`guild1` = " .. targetGuild .. " AND `guild2` = " .. killerGuild .. "))")
                if resultId ~= false then
                    warId = result.getDataInt(resultId, "id")
                    result.free(resultId)
                end

                if warId ~= false then
                    db.query("INSERT INTO `guildwar_kills` (`killer`, `target`, `killerguild`, `targetguild`, `time`, `warid`) VALUES (" .. db.escapeString(killerName) .. ", " .. db.escapeString(player:getName()) .. ", " .. killerGuild .. ", " .. targetGuild .. ", " .. os.time() .. ", " .. warId .. ")")
                end
            end
        end
    end
end
 
I guess there is no ITEM_ATTRIBUTE_DESCRIPTION for some of the items and that's why it returns "nothing/nil" for some items in that line.
Pretty much like the first error, I guess the function player:getGuild() returns "nothing/nil" if a player has no guild.
You can either change the functions or check if some of the functions return a nil value and then skip the rest of the function.
 
Code:
for _ in Item(itemEx.uid):getAttribute(ITEM_ATTRIBUTE_DESCRIPTION):gmatch('(%[.-%])') do
this for loop is not correctly setup, however I don't really understand what you want to accomplish with it anyway
 
Back
Top