• 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 Skinning with checking corpse owner TFS [1.2]

Moj mistrz

Monster Creator
Joined
Feb 1, 2008
Messages
932
Solutions
10
Reaction score
295
Location
Poland
Hello, I've got a little problem with skinning script. Obviously it wasn't made by me so I have no idea how to reproduce errors with corpse owner check. To the point - there's the script with little function which SHOULD check corpse owner. If the owner is correct the script should let him skin that corpse, else it should return YOUARENOTTHEOWNER.

Code:
local config = {
    [5908] = {
        -- Minotaurs
        [5969] = {value = 25000, newItem = 5878, after = 2831}, -- [2830] original
        [2871] = {value = 25000, newItem = 5878},
        [2866] = {value = 25000, newItem = 5878},
        [2876] = {value = 25000, newItem = 5878},
        [3090] = {value = 25000, newItem = 5878},
        [23463] = {value = 25000, newItem = 5878},
        [23467] = {value = 25000, newItem = 5878},
        [23471] = {value = 25000, newItem = 5878},

        -- Low Class Lizards
        [4259] = {value = 25000, newItem = 5876},
        [4262] = {value = 25000, newItem = 5876},
        [4256] = {value = 25000, newItem = 5876},

        -- High Class Lizards
        [11288] = {value = 25000, newItem = 5876},
        [11280] = {value = 25000, newItem = 5876},
        [11272] = {value = 25000, newItem = 5876},
        [11284] = {value = 25000, newItem = 5876},

        -- Dragons
        [3104] = {value = 25000, newItem = 5877},
        [2844] = {value = 25000, newItem = 5877},

        -- Dragon Lords
        [2881] = {value = 25000, newItem = 5948},

        -- Behemoths
        [2931] = {value = 35000, newItem = 5893},

        -- Bone Beasts
        [3031] = {value = 25000, newItem = 5925},

        -- The Mutated Pumpkin
        [8961] = { { value = 5000, newItem = 7487 }, { value = 10000, newItem = 7737 }, { value = 20000, 6492 }, { value = 30000, newItem = 8860 }, { value = 45000, newItem = 2683 }, { value = 60000, newItem = 2096 }, { value = 90000, newItem = 9005, amount = 50 } },

        -- Marble
        [11343] = { {value = 10000, newItem = 11345, desc = "This shoddy work was made by |PLAYERNAME|." }, {value = 35000, newItem = 11345, desc = "This little figurine made by |PLAYERNAME| has some room for improvement." }, { value = 60000, newItem = 11346, desc = "This little figurine of Tibiasula was masterfully sculpted by |PLAYERNAME|." } },

        -- Ice Cube
        [7441] = {value = 25000, newItem = 7442},
        [7442] = {value = 25000, newItem = 7444},
        [7444] = {value = 25000, newItem = 7445},
        [7445] = {value = 25000, newItem = 7446},
    },
    [5942] = {
        -- Demon
        [2916] = {value = 25000, newItem = 5906},

        -- Vampires
        [2956] = {value = 25000, newItem = 5905},
        [9654] = {value = 25000, newItem = 5905, after = 9658},
        [8938] = {value = 25000, newItem = 5905},
        [21275] = {value = 25000, newItem= 5905}
    }
}

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    local skin = config[item.itemid][target.itemid]
   
    local owner = target:hasAttribute(ITEM_ATTRIBUTE_CORPSEOWNER)
    if owner ~= 0 and owner ~= player:getId() then
        player:sendTextMessage(MESSAGE_STATUS_SMALL, "You are not the owner.")
    return true
    end
   
    if not skin then
        player:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE)
        return true
    end

    local random, effect, transform = math.random(1, 100000), CONST_ME_MAGIC_GREEN, true
    if type(skin[1]) == 'table' then
        local added = false
        local _skin
        for i = 1, #skin do
            _skin = skin[i]
            if random <= _skin.value then
                if target.itemid == 11343 then
                    effect = CONST_ME_ICEAREA
                    local gobletItem = player:addItem(_skin.newItem, _skin.amount or 1)
                    if gobletItem then
                        gobletItem:setDescription(_skin.desc:gsub('|PLAYERNAME|', player:getName()))
                    end
                    added = true
                elseif isInArray({7441, 7442, 7444, 7445}, target.itemid) then
                    player:addItem(_skin.newItem, _skin.amount or 1)
                    effect = CONST_ME_HITAREA
                    added = true
                else
                    player:addItem(_skin.newItem, _skin.amount or 1)
                    added = true
                end
                break
            end
        end

        if not added and target.itemid == 8961 then
            effect = CONST_ME_POFF
            transform = false
        end
    elseif random <= skin.value then
        if target.itemid == 11343 then
            effect = CONST_ME_ICEAREA
            local gobletItem = player:addItem(skin.newItem, skin.amount or 1)
            if gobletItem then
                gobletItem:setDescription(skin.desc:gsub('|PLAYERNAME|', player:getName()))
            end
        elseif isInArray({7441, 7442, 7444, 7445}, target.itemid) then
            if skin.newItem == 7446 then
                player:addAchievement('Ice Sculptor')
            end
            player:addItem(skin.newItem, skin.amount or 1)
            effect = CONST_ME_HITAREA
        else
            player:addItem(skin.newItem, skin.amount or 1)
        end
    else
        if isInArray({7441, 7442, 7444, 7445}, target.itemid) then
            player:say('The attempt of sculpting failed miserably.', TALKTYPE_MONSTER_SAY)
            effect = CONST_ME_HITAREA
        else
            effect = CONST_ME_POFF
        end
    end

   
    toPosition:sendMagicEffect(effect)
    if transform then
        target:transform(skin.after or target.itemid + 1)
    end

    return true
end

The bug is that whenever I use my obsidian knife it returns me you are not the owner. Even when I am. It also returns it when I use obsidian knife on the item which is not a corpse at all.
Any help is appreciated. :)
 
local owner = target:hasAttribute(ITEM_ATTRIBUTE_CORPSEOWNER) and target:getAttribute(ITEM_ATTRIBUTE_CORPSEOWNER) or 0

Edit: You should check whether the target is an item or not before checking the corpse owner.
 
item:hasAttribute(ITEM_ATTRIBUTE_CORPSEOWNER) will return a boolean. So you should do something like

Code:
if owner and target:getAttribute(ITEM_ATTRIBUTE_CORPSEOWNER) ~= player:getId() then
 
@Ninja @MatheusMkalo

Thanks you guys, working like a charm, gonna upload fixed script if someone else will need it:).

#edit:
Would be good if it check if the owner is in a party with someone else so the other guy can skin aswell.
 
Code:
local config = {
    [5908] = {
        -- Minotaurs
        [5969] = {value = 25000, newItem = 5878, after = 2831}, -- [2830] original
        [2871] = {value = 25000, newItem = 5878},
        [2866] = {value = 25000, newItem = 5878},
        [2876] = {value = 25000, newItem = 5878},
        [3090] = {value = 25000, newItem = 5878},
        [23463] = {value = 25000, newItem = 5878},
        [23467] = {value = 25000, newItem = 5878},
        [23471] = {value = 25000, newItem = 5878},

        -- Low Class Lizards
        [4259] = {value = 25000, newItem = 5876},
        [4262] = {value = 25000, newItem = 5876},
        [4256] = {value = 25000, newItem = 5876},

        -- High Class Lizards
        [11288] = {value = 25000, newItem = 5876},
        [11280] = {value = 25000, newItem = 5876},
        [11272] = {value = 25000, newItem = 5876},
        [11284] = {value = 25000, newItem = 5876},

        -- Dragons
        [3104] = {value = 25000, newItem = 5877},
        [2844] = {value = 25000, newItem = 5877},

        -- Dragon Lords
        [2881] = {value = 25000, newItem = 5948},

        -- Behemoths
        [2931] = {value = 35000, newItem = 5893},

        -- Bone Beasts
        [3031] = {value = 25000, newItem = 5925},

        -- The Mutated Pumpkin
        [8961] = { { value = 5000, newItem = 7487 }, { value = 10000, newItem = 7737 }, { value = 20000, 6492 }, { value = 30000, newItem = 8860 }, { value = 45000, newItem = 2683 }, { value = 60000, newItem = 2096 }, { value = 90000, newItem = 9005, amount = 50 } },

        -- Marble
        [11343] = { {value = 10000, newItem = 11345, desc = "This shoddy work was made by |PLAYERNAME|." }, {value = 35000, newItem = 11345, desc = "This little figurine made by |PLAYERNAME| has some room for improvement." }, { value = 60000, newItem = 11346, desc = "This little figurine of Tibiasula was masterfully sculpted by |PLAYERNAME|." } },

        -- Ice Cube
        [7441] = {value = 25000, newItem = 7442},
        [7442] = {value = 25000, newItem = 7444},
        [7444] = {value = 25000, newItem = 7445},
        [7445] = {value = 25000, newItem = 7446},
    },
    [5942] = {
        -- Demon
        [2916] = {value = 25000, newItem = 5906},

        -- Vampires
        [2956] = {value = 25000, newItem = 5905},
        [9654] = {value = 25000, newItem = 5905, after = 9658},
        [8938] = {value = 25000, newItem = 5905},
        [21275] = {value = 25000, newItem= 5905}
    }
}

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    local skin = config[item.itemid][target.itemid]
    if not skin then
        player:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE)
        return true
    end
 
    local allowSkinning = false
    local owner = target:getAttribute(ITEM_ATTRIBUTE_CORPSEOWNER)
    local party = player:getParty()
    if party then
        for _, member in ipairs(party:getMembers()) do
            if owner == member:getId() or owner == party:getLeader():getId() then
                allowSkinning = true
            end
        end
    else
        if owner == player:getId() then
            allowSkinning = true
        end
    end

    if allowSkinning then
        local random, effect, transform = math.random(1, 100000), CONST_ME_MAGIC_GREEN, true
        if type(skin[1]) == 'table' then
            local added = false
            local _skin
            for i = 1, #skin do
                _skin = skin[i]
                if random <= _skin.value then
                    if target.itemid == 11343 then
                        effect = CONST_ME_ICEAREA
                        local gobletItem = player:addItem(_skin.newItem, _skin.amount or 1)
                        if gobletItem then
                            gobletItem:setDescription(_skin.desc:gsub('|PLAYERNAME|', player:getName()))
                        end
                        added = true
                    elseif isInArray({7441, 7442, 7444, 7445}, target.itemid) then
                        player:addItem(_skin.newItem, _skin.amount or 1)
                        effect = CONST_ME_HITAREA
                        added = true
                    else
                        player:addItem(_skin.newItem, _skin.amount or 1)
                        added = true
                    end
                    break
                end
            end

            if not added and target.itemid == 8961 then
                effect = CONST_ME_POFF
                transform = false
            end
        elseif random <= skin.value then
            if target.itemid == 11343 then
                effect = CONST_ME_ICEAREA
                local gobletItem = player:addItem(skin.newItem, skin.amount or 1)
                if gobletItem then
                    gobletItem:setDescription(skin.desc:gsub('|PLAYERNAME|', player:getName()))
                end
            elseif isInArray({7441, 7442, 7444, 7445}, target.itemid) then
                if skin.newItem == 7446 then
                    player:addAchievement('Ice Sculptor')
                end
                player:addItem(skin.newItem, skin.amount or 1)
                effect = CONST_ME_HITAREA
            else
                player:addItem(skin.newItem, skin.amount or 1)
            end
        else
            if isInArray({7441, 7442, 7444, 7445}, target.itemid) then
                player:say('The attempt of sculpting failed miserably.', TALKTYPE_MONSTER_SAY)
                effect = CONST_ME_HITAREA
            else
                effect = CONST_ME_POFF
            end
        end

        toPosition:sendMagicEffect(effect)
        if transform then
            target:transform(skin.after or target.itemid + 1)
        end
    else
        player:sendTextMessage(MESSAGE_STATUS_SMALL, "You are not the owner.")
    end

    return true
end
 
Last edited:
Code:
local config = {
    [5908] = {
        -- Minotaurs
        [5969] = {value = 25000, newItem = 5878, after = 2831}, -- [2830] original
        [2871] = {value = 25000, newItem = 5878},
        [2866] = {value = 25000, newItem = 5878},
        [2876] = {value = 25000, newItem = 5878},
        [3090] = {value = 25000, newItem = 5878},
        [23463] = {value = 25000, newItem = 5878},
        [23467] = {value = 25000, newItem = 5878},
        [23471] = {value = 25000, newItem = 5878},

        -- Low Class Lizards
        [4259] = {value = 25000, newItem = 5876},
        [4262] = {value = 25000, newItem = 5876},
        [4256] = {value = 25000, newItem = 5876},

        -- High Class Lizards
        [11288] = {value = 25000, newItem = 5876},
        [11280] = {value = 25000, newItem = 5876},
        [11272] = {value = 25000, newItem = 5876},
        [11284] = {value = 25000, newItem = 5876},

        -- Dragons
        [3104] = {value = 25000, newItem = 5877},
        [2844] = {value = 25000, newItem = 5877},

        -- Dragon Lords
        [2881] = {value = 25000, newItem = 5948},

        -- Behemoths
        [2931] = {value = 35000, newItem = 5893},

        -- Bone Beasts
        [3031] = {value = 25000, newItem = 5925},

        -- The Mutated Pumpkin
        [8961] = { { value = 5000, newItem = 7487 }, { value = 10000, newItem = 7737 }, { value = 20000, 6492 }, { value = 30000, newItem = 8860 }, { value = 45000, newItem = 2683 }, { value = 60000, newItem = 2096 }, { value = 90000, newItem = 9005, amount = 50 } },

        -- Marble
        [11343] = { {value = 10000, newItem = 11345, desc = "This shoddy work was made by |PLAYERNAME|." }, {value = 35000, newItem = 11345, desc = "This little figurine made by |PLAYERNAME| has some room for improvement." }, { value = 60000, newItem = 11346, desc = "This little figurine of Tibiasula was masterfully sculpted by |PLAYERNAME|." } },

        -- Ice Cube
        [7441] = {value = 25000, newItem = 7442},
        [7442] = {value = 25000, newItem = 7444},
        [7444] = {value = 25000, newItem = 7445},
        [7445] = {value = 25000, newItem = 7446},
    },
    [5942] = {
        -- Demon
        [2916] = {value = 25000, newItem = 5906},

        -- Vampires
        [2956] = {value = 25000, newItem = 5905},
        [9654] = {value = 25000, newItem = 5905, after = 9658},
        [8938] = {value = 25000, newItem = 5905},
        [21275] = {value = 25000, newItem= 5905}
    }
}

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    local skin = config[item.itemid][target.itemid]
    if not skin then
        player:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE)
        return true
    end
 
    local allowSkinning = false
    local owner = target:getAttribute(ITEM_ATTRIBUTE_CORPSEOWNER)
    local party = player:getParty()
    if party then
        for _, member in ipairs(party:getMembers())
            if owner == member:getId() or owner == party:getLeader():getId() then
                allowSkinning = true
            end
        end
    else
        if owner == player:getId() then
            allowSkinning = true
        end
    end

    if allowSkinning then
        local random, effect, transform = math.random(1, 100000), CONST_ME_MAGIC_GREEN, true
        if type(skin[1]) == 'table' then
            local added = false
            local _skin
            for i = 1, #skin do
                _skin = skin[i]
                if random <= _skin.value then
                    if target.itemid == 11343 then
                        effect = CONST_ME_ICEAREA
                        local gobletItem = player:addItem(_skin.newItem, _skin.amount or 1)
                        if gobletItem then
                            gobletItem:setDescription(_skin.desc:gsub('|PLAYERNAME|', player:getName()))
                        end
                        added = true
                    elseif isInArray({7441, 7442, 7444, 7445}, target.itemid) then
                        player:addItem(_skin.newItem, _skin.amount or 1)
                        effect = CONST_ME_HITAREA
                        added = true
                    else
                        player:addItem(_skin.newItem, _skin.amount or 1)
                        added = true
                    end
                    break
                end
            end

            if not added and target.itemid == 8961 then
                effect = CONST_ME_POFF
                transform = false
            end
        elseif random <= skin.value then
            if target.itemid == 11343 then
                effect = CONST_ME_ICEAREA
                local gobletItem = player:addItem(skin.newItem, skin.amount or 1)
                if gobletItem then
                    gobletItem:setDescription(skin.desc:gsub('|PLAYERNAME|', player:getName()))
                end
            elseif isInArray({7441, 7442, 7444, 7445}, target.itemid) then
                if skin.newItem == 7446 then
                    player:addAchievement('Ice Sculptor')
                end
                player:addItem(skin.newItem, skin.amount or 1)
                effect = CONST_ME_HITAREA
            else
                player:addItem(skin.newItem, skin.amount or 1)
            end
        else
            if isInArray({7441, 7442, 7444, 7445}, target.itemid) then
                player:say('The attempt of sculpting failed miserably.', TALKTYPE_MONSTER_SAY)
                effect = CONST_ME_HITAREA
            else
                effect = CONST_ME_POFF
            end
        end

        toPosition:sendMagicEffect(effect)
        if transform then
            target:transform(skin.after or target.itemid + 1)
        end
    else
        player:sendTextMessage(MESSAGE_STATUS_SMALL, "You are not the owner.")
    end

    return true
end

Wouldn't it be easier to get the player's party leader and then check if its the same as the owner's party leader?
 
Code:
local config = {
    [5908] = {
        -- Minotaurs
        [5969] = {value = 25000, newItem = 5878, after = 2831}, -- [2830] original
        [2871] = {value = 25000, newItem = 5878},
        [2866] = {value = 25000, newItem = 5878},
        [2876] = {value = 25000, newItem = 5878},
        [3090] = {value = 25000, newItem = 5878},
        [23463] = {value = 25000, newItem = 5878},
        [23467] = {value = 25000, newItem = 5878},
        [23471] = {value = 25000, newItem = 5878},

        -- Low Class Lizards
        [4259] = {value = 25000, newItem = 5876},
        [4262] = {value = 25000, newItem = 5876},
        [4256] = {value = 25000, newItem = 5876},

        -- High Class Lizards
        [11288] = {value = 25000, newItem = 5876},
        [11280] = {value = 25000, newItem = 5876},
        [11272] = {value = 25000, newItem = 5876},
        [11284] = {value = 25000, newItem = 5876},

        -- Dragons
        [3104] = {value = 25000, newItem = 5877},
        [2844] = {value = 25000, newItem = 5877},

        -- Dragon Lords
        [2881] = {value = 25000, newItem = 5948},

        -- Behemoths
        [2931] = {value = 35000, newItem = 5893},

        -- Bone Beasts
        [3031] = {value = 25000, newItem = 5925},

        -- The Mutated Pumpkin
        [8961] = { { value = 5000, newItem = 7487 }, { value = 10000, newItem = 7737 }, { value = 20000, 6492 }, { value = 30000, newItem = 8860 }, { value = 45000, newItem = 2683 }, { value = 60000, newItem = 2096 }, { value = 90000, newItem = 9005, amount = 50 } },

        -- Marble
        [11343] = { {value = 10000, newItem = 11345, desc = "This shoddy work was made by |PLAYERNAME|." }, {value = 35000, newItem = 11345, desc = "This little figurine made by |PLAYERNAME| has some room for improvement." }, { value = 60000, newItem = 11346, desc = "This little figurine of Tibiasula was masterfully sculpted by |PLAYERNAME|." } },

        -- Ice Cube
        [7441] = {value = 25000, newItem = 7442},
        [7442] = {value = 25000, newItem = 7444},
        [7444] = {value = 25000, newItem = 7445},
        [7445] = {value = 25000, newItem = 7446},
    },
    [5942] = {
        -- Demon
        [2916] = {value = 25000, newItem = 5906},

        -- Vampires
        [2956] = {value = 25000, newItem = 5905},
        [9654] = {value = 25000, newItem = 5905, after = 9658},
        [8938] = {value = 25000, newItem = 5905},
        [21275] = {value = 25000, newItem= 5905}
    }
}

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    local skin = config[item.itemid][target.itemid]
    if not skin then
        player:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE)
        return true
    end

    local allowSkinning = false
    local owner = target:getAttribute(ITEM_ATTRIBUTE_CORPSEOWNER)
    local party = player:getParty()
    if party then
        for _, member in ipairs(party:getMembers())
            if owner == member:getId() or owner == party:getLeader():getId() then
                allowSkinning = true
            end
        end
    else
        if owner == player:getId() then
            allowSkinning = true
        end
    end

    if allowSkinning then
        local random, effect, transform = math.random(1, 100000), CONST_ME_MAGIC_GREEN, true
        if type(skin[1]) == 'table' then
            local added = false
            local _skin
            for i = 1, #skin do
                _skin = skin[i]
                if random <= _skin.value then
                    if target.itemid == 11343 then
                        effect = CONST_ME_ICEAREA
                        local gobletItem = player:addItem(_skin.newItem, _skin.amount or 1)
                        if gobletItem then
                            gobletItem:setDescription(_skin.desc:gsub('|PLAYERNAME|', player:getName()))
                        end
                        added = true
                    elseif isInArray({7441, 7442, 7444, 7445}, target.itemid) then
                        player:addItem(_skin.newItem, _skin.amount or 1)
                        effect = CONST_ME_HITAREA
                        added = true
                    else
                        player:addItem(_skin.newItem, _skin.amount or 1)
                        added = true
                    end
                    break
                end
            end

            if not added and target.itemid == 8961 then
                effect = CONST_ME_POFF
                transform = false
            end
        elseif random <= skin.value then
            if target.itemid == 11343 then
                effect = CONST_ME_ICEAREA
                local gobletItem = player:addItem(skin.newItem, skin.amount or 1)
                if gobletItem then
                    gobletItem:setDescription(skin.desc:gsub('|PLAYERNAME|', player:getName()))
                end
            elseif isInArray({7441, 7442, 7444, 7445}, target.itemid) then
                if skin.newItem == 7446 then
                    player:addAchievement('Ice Sculptor')
                end
                player:addItem(skin.newItem, skin.amount or 1)
                effect = CONST_ME_HITAREA
            else
                player:addItem(skin.newItem, skin.amount or 1)
            end
        else
            if isInArray({7441, 7442, 7444, 7445}, target.itemid) then
                player:say('The attempt of sculpting failed miserably.', TALKTYPE_MONSTER_SAY)
                effect = CONST_ME_HITAREA
            else
                effect = CONST_ME_POFF
            end
        end

        toPosition:sendMagicEffect(effect)
        if transform then
            target:transform(skin.after or target.itemid + 1)
        end
    else
        player:sendTextMessage(MESSAGE_STATUS_SMALL, "You are not the owner.")
    end

    return true
end
@Printer
Code works for monsters, but not for example ice cube(says - "You are not the owner") and there is missing 'do' at line 73. :). Anyways thanks.
 
Wouldn't it be easier to get the player's party leader and then check if its the same as the owner's party leader?
Depends, if all memebers should be able to share the same corpse or not. He can edit what seems to fit him.
@Printer
Code works for monsters, but not for example ice cube(says - "You are not the owner") and there is missing 'do' at line 73. :). Anyways thanks.
Ups, fixed
 
Depends, if all memebers should be able to share the same corpse or not. He can edit what seems to fit him.

Ups, fixed
@Printer
Still don't work on items such as piece of marble rock or ice cube, and also on mutated pumpkin corpse even when you kill it. :p
 
Last edited:
Back
Top