• 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 [TFS 0.X] Improve Reward Chest System

potinho

Advanced OT User
Joined
Oct 11, 2009
Messages
1,447
Solutions
17
Reaction score
170
Location
Brazil
Hello guys,

This system bellow was created by @Luan Luciano (i guess this is the original one) but I'm having difficulty adjusting the rewards and scores, leaving something fairer between healers, damage dealers and blockers. Could anyone help me find the best way to configure it, in order to make it simpler to understand and make the rewards fairer between participants?

LUA:
REWARDCHEST = {
    rewardBagId = 2595,
    formula = {hit = 3, block = 1, suport = 9},
    storageExaust = 60000,
    town_id = 1,
<!--bellow i have boss names and items-->

LUA:
dofile('data/sistemas/rewardchest.lua')

local function addRewardLoot(uid, bossName, tabela_reward)
    local money = math.random(10, 40)
    local msg = "The following items are available in your reward chest:"
    local chest = doCreateItemEx(REWARDCHEST.rewardBagId)

    doItemSetAttribute(chest, "description", "Reward System has kill the boss ".. bossName ..".")

    if table.maxn(tabela_reward) > 0 then
        for x = 1, table.maxn(tabela_reward) do
            local rand = math.random(100)
            if rand <= tabela_reward[x][3] then
                local count = math.random(1, tabela_reward[x][2])
                doAddContainerItem(chest, tabela_reward[x][1], count)
                msg = msg .. " ".. (count > 1 and count or "") .." "..getItemNameById(tabela_reward[x][1])..","
            end
        end
        doPlayerSendTextMessage(uid, MESSAGE_INFO_DESCR, msg .. " and ".. money .." platinum coins.")
    else
        doPlayerSendTextMessage(uid, MESSAGE_INFO_DESCR, msg .. " ".. money .." platinum coins.")
    end

    doAddContainerItem(chest, 2152, money)
    doPlayerSendMailByName(getPlayerName(uid), chest, REWARDCHEST.town_id)

    local boss = REWARDCHEST.bosses[bossName]
    setPlayerStorageValue(uid, boss.storage, 0)
    doSendMagicEffect(getPlayerPosition(uid), CONST_ME_MAGIC_BLUE)
end

local function addLoot(tabela_loot, tabela_reward, all_loot)
    if table.maxn(tabela_loot) > 0 then
        if all_loot then
            for x = 1, table.maxn(tabela_loot) do
                table.insert(tabela_reward, tabela_loot[x])
            end
        else
            table.insert(tabela_reward, tabela_loot[math.random(table.maxn(tabela_loot))])
        end
    end

    return tabela_reward
end

local function rewardChestSystem(bossName)
    local players = {}
    local boss = REWARDCHEST.bosses[bossName]

    for _, uid in ipairs(getPlayersOnline()) do
        if getPlayerStorageValue(uid, boss.storage) > 0 then
            table.insert(players, uid)
        end
    end

    if not players[1] then
        return
    end

    table.sort(players, function(a, b) return getPlayerStorageValue(a, boss.storage) > getPlayerStorageValue(b, boss.storage) end)

    local porcentagem = math.ceil(getPlayerStorageValue(players[1], boss.storage))

    for i = 1, table.maxn(players) do

        local tabela_reward = {}
        local pontos = getPlayerStorageValue(players[i], boss.storage)

        if i == 1 then
            addLoot(boss.comum, tabela_reward, false)
            addLoot(boss.semi_raro, tabela_reward, false)
            addLoot(boss.raro, tabela_reward, false)
            addLoot(boss.sempre, tabela_reward, true)
        elseif i >= 2 and pontos >= math.ceil((porcentagem * 0.8)) then
            addLoot(boss.comum, tabela_reward, false)
            addLoot(boss.semi_raro, tabela_reward, false)
            addLoot(boss.raro, tabela_reward, false)
            addLoot(boss.muito_raro, tabela_reward, false)
        elseif pontos < math.ceil((porcentagem * 0.8)) and pontos >= math.ceil((porcentagem * 0.6)) then
            addLoot(boss.comum, tabela_reward, false)
            addLoot(boss.semi_raro, tabela_reward, false)
            addLoot(boss.raro, tabela_reward, false)
        elseif pontos < math.ceil((porcentagem * 0.6)) and pontos >= math.ceil((porcentagem * 0.4)) then
            addLoot(boss.comum, tabela_reward, false)
            addLoot(boss.semi_raro, tabela_reward, false)
        elseif pontos < math.ceil((porcentagem * 0.4)) and pontos >= math.ceil((porcentagem * 0.1)) then
            addLoot(boss.comum, tabela_reward, false)
        end

        addRewardLoot(players[i], bossName, tabela_reward)
    end
end

function onDeath(cid, corpse, killer)
    local boss = REWARDCHEST.bosses[getCreatureName(cid):lower()]
    if boss then
        addEvent(rewardChestSystem, 1000, getCreatureName(cid):lower())
    end
    return true
end

function onStatsChange(cid, attacker, type, combat, value)
    if isMonster(cid) and type == STATSCHANGE_HEALTHLOSS and isPlayer(attacker) then
        local boss = REWARDCHEST.bosses[getCreatureName(cid):lower()]
        if boss and attacker then
            setPlayerStorageValue(attacker, boss.storage, getPlayerStorageValue(attacker, boss.storage) + math.ceil((value / REWARDCHEST.formula.hit)))
        end
    end
    return true
end

LUA:
dofile('data/sistemas/rewardchest.lua')

function onLogin(cid)
    for key, value in pairs(REWARDCHEST.bosses) do
        if getPlayerStorageValue(cid, value.storage) > 0 then
            setPlayerStorageValue(cid, value.storage, 0)
        end
    end
    registerCreatureEvent(cid, "RewardChestStats")
    return true
end

function onStatsChange(cid, attacker, type, combat, value)
    if isMonster(attacker) and (type == STATSCHANGE_HEALTHLOSS or type == STATSCHANGE_MANALOSS) then
        local boss = REWARDCHEST.bosses[getCreatureName(attacker):lower()]
        if boss then
            setPlayerStorageValue(cid, boss.storage, getPlayerStorageValue(cid, boss.storage) + math.ceil((value / REWARDCHEST.formula.block)))
            setPlayerStorageValue(cid, REWARDCHEST.storageExaust, os.time() + 5)
        end
    elseif (isPlayer(attacker) and (type == STATSCHANGE_HEALTHGAIN or type == STATSCHANGE_MANAGAIN) and (getCreatureHealth(cid) < getCreatureMaxHealth(cid)) and (getPlayerStorageValue(cid, REWARDCHEST.storageExaust) >= os.time())) then
        for key, valor in pairs(REWARDCHEST.bosses) do
            if getPlayerStorageValue(cid, valor.storage) > 0 then
                if getCreatureHealth(cid) + value > getCreatureMaxHealth(cid) then
                    local add = getCreatureMaxHealth(cid) - getCreatureHealth(cid)
                    setPlayerStorageValue(attacker, valor.storage, getPlayerStorageValue(attacker, valor.storage) + math.ceil((add / REWARDCHEST.formula.suport)))
                else
                    setPlayerStorageValue(attacker, valor.storage, getPlayerStorageValue(attacker, valor.storage) + math.ceil((value / REWARDCHEST.formula.suport)))
                end
            end
        end
    end
    return true
end
 
maybe something like register 3 values in tables for each class different,

damage dealer = percentage of damage dealt as global percent count
blocker = 25% of damage dealt / 75 of damage taken as global percent count
healer = 10% of damage dealt / 10% of damage taken / 80% of healed teammates as global percent count,

code sucks to edit, so i leave only here idea
 
maybe something like register 3 values in tables for each class different,

damage dealer = percentage of damage dealt as global percent count
blocker = 25% of damage dealt / 75 of damage taken as global percent count
healer = 10% of damage dealt / 10% of damage taken / 80% of healed teammates as global percent count,

code sucks to edit, so i leave only here idea
My main objective is to simplify the code and simplify the calculation, as it stands the player needs to reach a certain score to get the reward. I would like it to be based on rarity, something similar to normal loot.
 

Similar threads

Back
Top