• 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!

TFS 0.X loot ring bug

Wix

Banned User
Joined
Jan 3, 2021
Messages
29
Solutions
1
Reaction score
14
Location
Krypton
Regarding this mod [MOD] Loot Ring (https://otland.net/threads/mod-loot-ring.99748/) I have used it in tfs 0.3.7 it gives to all the players the same new rate. however this only works with the one who wears the ring but it's isn't. could someone help?
XML:
<?xml version="1.0" encoding="UTF-8"?>
<mod name="Loot Ring" version="1.0" author="Cykotitan" contact="otland.net" enabled="yes">
    <event type="kill" name="lootring" event="script"> <![CDATA[
local t = {
    item = 2179,
    slot = CONST_SLOT_RING,
    newRate = 5
}

local rate = getConfigInfo('rateLoot')

function getContentDescription(uid, comma)
    local ret, i, containers = '', 0, {}
    while i < getContainerSize(uid) do
        local v, s = getContainerItem(uid, i), ''
        local k = getItemInfo(v.itemid)
        if k.name ~= '' then
            if v.type > 1 and k.stackable and k.showCount then
                s = v.type .. ' ' .. getItemInfo(v.itemid).plural
            else
                local article = k.article
                s = (article == '' and '' or article .. ' ') .. k.name
            end
            ret = ret .. (i == 0 and not comma and '' or ', ') .. s
            if isContainer(v.uid) and getContainerSize(v.uid) > 0 then
                table.insert(containers, v.uid)
            end
        else
            ret = ret .. (i == 0 and not comma and '' or ', ') .. 'an item of type ' .. v.itemid .. ', please report it to gamemaster'
        end
        i = i + 1
    end
    for i = 1, #containers do
        ret = ret .. getContentDescription(containers[i], true)
    end
    return ret
end

local function send(cid, pos, corpseid, monster, party)
    local corpse = getTileItemById(pos, corpseid).uid
    local ret = isContainer(corpse) and getContentDescription(corpse)
    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'Loot of ' .. monster .. ': ' .. (ret ~= '' and ret or 'nothing'))
    if party then
        for _, pid in ipairs(getPartyMembers(party)) do
            doPlayerSendChannelMessage(pid, '', 'Loot of ' .. monster .. ': ' .. (ret ~= '' and ret or 'nothing'), TALKTYPE_CHANNEL_W, CHANNEL_PARTY)
        end
    end
end

local function createLoot(i, ext)
    local item = type(i.id) == 'table' and i.id[math.random(#i.id)] or i.id
    local random = math.ceil(math.random(100000) / (ext and t.newRate or rate))
    local tmpItem

    if random < i.chance then
        tmpItem = doCreateItemEx(item, getItemInfo(item).stackable and random % i.count + 1 or 1)
    end

    if not tmpItem then
        return
    end

    if i.subType ~= -1 then
        doItemSetAttribute(tmpItem, 'subType', i.subType)
    end

    if i.actionId ~= -1 then
        doItemSetAttribute(tmpItem, 'aid', i.actionId)
    end

    if i.uniqueId ~= -1 then
        doItemSetAttribute(tmpItem, 'uid', i.uniqueId)
    end

    if i.text ~= '' then
        doItemSetAttribute(tmpItem, 'text', i.text)
    end

    return tmpItem
end

local function createChildLoot(parent, i, ext)
    if #i == 0 then
        return true
    end

    local size, cap = 0, getContainerCap(parent)
    for k = 1, #i do
        if size == cap then
            break
        end
        local tmp = createLoot(i[k], ext)
        if tmp then
            if isContainer(tmp) then
                if createChildLoot(tmp, i[k].child, ext) then
                    doAddContainerItemEx(parent, tmp)
                    size = size + 1
                else
                    doRemoveItem(tmp)
                end
            else
                doAddContainerItemEx(parent, tmp)
                size = size + 1
            end
        end
    end

    return size > 0
end

local function dropLoot(pos, v, ext)
    local corpse = getTileItemById(pos, v.lookCorpse).uid
    if isContainer(corpse) then
        for i = 1, getContainerSize(corpse) do
            doRemoveItem(getContainerItem(corpse, 0).uid)
        end
        local size, cap = 0, getContainerCap(corpse)
        for i = 1, #v.loot do
            if size == cap then
                break
            end
            local tmp = createLoot(v.loot[i], ext)
            if tmp then
                if isContainer(tmp) then
                    if createChildLoot(tmp, v.loot[i].child, ext) then
                        doAddContainerItemEx(corpse, tmp)
                        size = size + 1
                    else
                        doRemoveItem(tmp)
                    end
                else
                    doAddContainerItemEx(corpse, tmp)
                    size = size + 1
                end
            end
        end
    end
end

function onKill(cid, target, lastHit)
    if lastHit and isMonster(target) then
        local v = getMonsterInfo(getCreatureName(target))
        if v.lookCorpse > 0 then
            local master = getCreatureMaster(target)
            if not master or master == target then
                addEvent(dropLoot, 0, getThingPos(target), v, getPlayerSlotItem(cid, t.slot).itemid == t.item)
            end
            addEvent(send, 100, cid, getThingPos(target), v.lookCorpse, v.description, getPlayerParty(cid))
        end
    end
    return true
end
    ]]></event>
<event type="login" name="Loot Ring" event="buffer"><![CDATA[
        registerCreatureEvent(cid, "lootring")
    ]]></event>
</mod>
 
Last edited:
Back
Top