• 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 orb siphoning Simle Re-Edit

God Nixez

Member
Joined
Sep 20, 2009
Messages
410
Reaction score
17
Well, i.ve been trying to modify these script to fit my ot server and i finally got this working
Big Thanks To @Static_
-What i actually noticed is that the orb can be created on an "Un-Walkable tile" ex.depot box,stone,etc
Can this be avoided by creating a if Condition?
-Also the orbs created are usually near the end of the screen like 5 sqm afar from where the monster is killed
Can this get control by setting the orb to be created atleast 2 sqm far and max of 4? on every direction

The code IS below
Lua:
function sendRandom(r)
    return math.random(-r, r)
end
local version = 1098
-- you can put these in global
ORB_TIME = 16
ORB_INCREMENTS = 1000
--
function cashRandom(min, max)
    return math.random(min, max)
end
function comma_value(amount)
  local formatted = amount
  while true do
    formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2')
    if (k==0) then
      break
    end
  end
  return formatted
end
function getExpForLevel(level)
    level = level - 1
    return ((50 * level * level * level) - (150 * level * level) + (400 * level)) / 3
end
function giveMoney(m)
    local g = m
    local nug, cc, plat, gold, t = 1000000, 10000, 100, 1, {}
    while(m ~= 0) do
        if m >= nug then
            local c = m / nug
            m = m - (c * nug)
            table.insert(t, {2157, c}) -- nuggets
        elseif m >= cc then
            local c = math.floor(m / cc)
            m = m - (c * cc)
            table.insert(t, {2160, c}) -- crystal coin
        elseif m >= plat then
            local c = math.floor(m / plat)
            m = m - (c * plat)
            table.insert(t, {2152, c}) -- plat coins
        elseif m >= gold then
            local c = math.floor(m / gold)
            m = m - (c * gold)
            table.insert(t, {2148, c}) -- gold coins
        end
    end
    return t, g
end
function sendOrbEffect(cid, tier)
    local player = Player(cid)
    if not player then
        return false
    end
    local colors = {5,30,35,95,108,129,143,155,180,198,210,215}
    local xp = player:getExperience()
    local exp = getExpForLevel(player:getLevel() + 1)
    local orbs = {
        {
            type_ = "cash",
            name = "~* gold *~",
            symbol = "$$",
            itemid = function(x)
                local tier = x or 1
                local cash = 0
                local min_coin = (tier * 5)
                local max_coin = (tier * 50)
                return cashRandom(min_coin, max_coin)
            end
        },
        {
            type_ = "loot",
            name = "~* loot *~",
            symbol = "fri itens plx!",
            itemid = function(n)
                local t = {
                    [1] = {
                        {6433, 1},
                        {2503, 1},
                        {2504, 1},
                        {2641, 1},
                        {2542, 1},
                        {6301, 1},
                        {2184, 1},
                        {2406, 1},
                        {2423, 1},
                        {2393, 1},
                        {2415, 1},
                        {5907, 1}
                    },
                    [2] = {
                        {2457, 1},
                        {2463, 1},
                        {2647, 1},
                        {2645, 1},
                        {2532, 1},
                        {2213, 1},
                        {8910, 1},
                        {2403, 1},
                        {7432, 1},
                        {7449, 1},
                        {2387, 1},
                        {2414, 1}
                    },
                    [3] = {
                        {2496, 1},
                        {2505, 1},
                        {2469, 1},
                        {3982, 1},
                        {2517, 1},
                        {2121, 1},
                        {2181, 1},
                        {8209, 1},
                        {8927, 1},
                        {2419, 1},
                        {3962, 1},
                        {8856, 1}
                    }
                }
                n = n > 3 and 3 or n
                return t[n][math.random(#t[n])]
            end,
        },
        {
            type_ = "xp",
            name = "~* exp *~",
            symbol = "Free XP!",
            itemid = function(n)
                return exp - xp
            end,
        }
    }
    local effects = {2, 5, 6, 7, 11, 12, 16, 18, 19, 20,27,37, 38}
    local loot = orbs[math.random(#orbs)]
    local msg = ''
    local p = player:getPosition()
    for i = 1, ORB_TIME do
        p.x = p.x + sendRandom(1)
        p.y = p.y + sendRandom(1)
        addEvent(function(x, n, cid, t)
            local player = Player(cid)
            if player then
                x:sendMagicEffect(effects[math.random(#effects)])
                if player:getPosition() == x then
                    if version == 860 then
                        -- uncomment to use in otx3 8.6
                        --Game.sendAnimatedText(loot.symbol, x, colors[math.random(#colors)])
                    else
                        player:say(loot.symbol, TALKTYPE_MONSTER_SAY, false, nil, x)
                    end
                    player:getPosition():sendMagicEffect(40)
                    local items = loot.itemid(t)
                    if loot.type_ == "loot" then
                        local id = items[1]
                        local name = ItemType(id):getName()
                        local amount = 1
                        if #items > 2 then
                            amount = math.random(items[2], items[3])
                        else
                            amount = items[2]
                        end
                        player:addItem(id, amount)
                        msg = "You've siphoned "..((amount == 1 and loot.type_ == "loot") and "" or amount).." "..name.." from the orb!"
                    elseif loot.type_ == "cash" then
                            local c, amount = giveMoney(items)
                            for k, v in pairs(c) do
                                player:addItem(v[1], v[2])
                            end
                            msg = "You've siphoned $"..comma_value(amount).. " gold from the orb!"
                    else
                        local comma = comma_value(items)
                        player:addExperience(items, false)
                        msg = "You siphoned "..comma.." experience from the orb!"
                    end
                    player:sendTextMessage(MESSAGE_INFO_DESCR, msg)
                else
                    if version == 860 then
                        -- uncomment to use in otx3 8.6
                        --Game.sendAnimatedText(loot.name, x, colors[math.random(#colors)])
                    else
                        player:say(loot.name, TALKTYPE_MONSTER_SAY, false, nil, x)
                    end
                end
            end
        end, i * ORB_INCREMENTS, p, 31, cid, tier
        )
    end
end
function onDeath(creature, corpse, killer, mostDamageKiller, lastHitUnjustified, mostDamageUnjustified)
    if killer:isPlayer() then
        local chance = 90
        local roll = math.random(100)
        killer:sendTextMessage(MESSAGE_INFO_DESCR, "you rolled a "..roll)
        if  chance > roll then
            local times = math.random(1, 3)
            for h = 1, times do
                sendOrbEffect(killer:getId(), 3)
            end
        end
    end
    return true
end
 
Back
Top