• 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 1.X+ Possible infinite loop at actions/lib/actions.lua

ralke

(҂ ͠❛ ෴ ͡❛)ᕤ
Joined
Dec 17, 2011
Messages
1,532
Solutions
27
Reaction score
872
Location
Santiago - Chile
GitHub
ralke23
Twitch
ralke23
Hi! I used this script to check if I could probably have an infinite loop. It throws me that I have one at actions/lib/actions.lua. Anyone can help me finding where it is? Or what can be making this warning. Here goes my actions.lua!

1713715920580.png

Lua:
local wildGrowth = {1499, 11099} -- wild growth destroyable by machete
local jungleGrass = { -- grass destroyable by machete
    [2782] = 2781,
    [3985] = 3984
}
local groundIds = {354, 355} -- pick usable ground
local sandIds = {231, 9059} -- desert sand
local holeId = { -- usable rope holes, for rope spots see global.lua
    294, 369, 370, 383, 392, 408, 409, 410, 427, 428, 429, 430, 462, 469, 470, 482,
    484, 485, 489, 924, 1369, 3135, 3136, 4835, 4837, 7933, 7938, 8170, 8249, 8250,
    8251, 8252, 8254, 8255, 8256, 8276, 8277, 8279, 8281, 8284, 8285, 8286, 8323,
    8567, 8585, 8595, 8596, 8972, 9606, 9625
}
local holes = {468, 481, 483, 7932} -- holes opened by shovel
local fruits = {2673, 2674, 2675, 2676, 2677, 2678, 2679, 2680, 2681, 2682, 2684, 2685, 5097, 8839, 8840, 8841} -- fruits to make decorated cake with knife

function destroyItem(player, target, toPosition)
    if type(target) ~= "userdata" or not target:isItem() then
        return false
    end

    if target:hasAttribute(ITEM_ATTRIBUTE_UNIQUEID) or target:hasAttribute(ITEM_ATTRIBUTE_ACTIONID) then
        return false
    end

    if toPosition.x == CONTAINER_POSITION then
        player:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE)
        return true
    end

    local destroyId = ItemType(target.itemid):getDestroyId()
    if destroyId == 0 then
        return false
    end

    if math.random(7) == 1 then
        local item = Game.createItem(destroyId, 1, toPosition)
        if item then
            item:decay()
        end

        -- Move items outside the container
        if target:isContainer() then
            for i = target:getSize() - 1, 0, -1 do
                local containerItem = target:getItem(i)
                if containerItem then
                    containerItem:moveTo(toPosition)
                end
            end
        end

        target:remove(1)
    end

    toPosition:sendMagicEffect(CONST_ME_POFF)
    return true
end

function onUseMachete(player, item, fromPosition, target, toPosition, isHotkey)
    local targetId = target.itemid
    if not targetId then
        return true
    end

    if table.contains(wildGrowth, targetId) then
        toPosition:sendMagicEffect(CONST_ME_POFF)
        target:remove()
        return true
    end

    local grass = jungleGrass[targetId]
    if grass then
        target:transform(grass)
        target:decay()
        player:addAchievementProgress("Nothing Can Stop Me", 100)
        return true
    end

    return destroyItem(player, target, toPosition)
end

function onUsePick(player, item, fromPosition, target, toPosition, isHotkey)
    if target.itemid == 11227 then -- shiny stone refining
        local chance = math.random(1, 100)
        if chance == 1 then
            player:addItem(ITEM_CRYSTAL_COIN) -- 1% chance of getting crystal coin
        elseif chance <= 6 then
            player:addItem(ITEM_GOLD_COIN) -- 5% chance of getting gold coin
        elseif chance <= 51 then
            player:addItem(ITEM_PLATINUM_COIN) -- 45% chance of getting platinum coin
        else
            player:addItem(2145) -- 49% chance of getting small diamond
        end
        player:addAchievementProgress("Petrologist", 100)
        target:getPosition():sendMagicEffect(CONST_ME_BLOCKHIT)
        target:remove(1)
        return true
    end

    local tile = Tile(toPosition)
    if not tile then
        return false
    end

    local ground = tile:getGround()
    if not ground then
        return false
    end

    if table.contains(groundIds, ground.itemid) and ground.actionid == actionIds.pickHole then
        ground:transform(392)
        ground:decay()
        toPosition:sendMagicEffect(CONST_ME_POFF)

        toPosition.z = toPosition.z + 1
        tile:relocateTo(toPosition)
        return true
    end
   
-- Naginata Quest (use pick on large stone)
local function revert(stonePos)
    ground:transform(385)
    local stone = Game.createItem(1304, 1, stonePos)
    if stone then
        stone:setActionId(30051)
    end
    ground:transform(383)
end

if target.actionid == 30051 then
    if math.random(100) >= 70 then
        target:remove()
        addEvent(revert, 60 * 60 * 1000, toPosition)
    else
        doTargetCombatHealth(0, player, COMBAT_PHYSICALDAMAGE, -131, -139, CONST_ME_NONE)
        player:say("You hurt yourself trying to break the stone.", TALKTYPE_MONSTER_SAY)
    end

    toPosition:sendMagicEffect(CONST_ME_POFF)
    return true
end

    -- Pythius The Rotten (Firewalker Boots)
    if target.actionid == 50127 then
        if player:getStorageValue(PlayerStorageKeys.FirewalkerBoots) == 1 then
            return false
        end
        target:remove()

        local stoneItem = Tile(toPosition):getItemById(1304)
        if stoneItem then
            stoneItem:remove()
        end

        Game.iterateArea(
            function(position)
                local groundItem = Tile(position):getGround()
                if groundItem and groundItem.itemid == 598 then
                    groundItem:transform(5815)
                end
            end,
            Position(921, 968, 14),
            Position(922, 974, 14)
        )
        Game.iterateArea(
            function(position)
                position:sendMagicEffect(CONST_ME_POFF)
            end,
            Position(922, 969, 14),
            Position(922, 974, 14)
        )

        local portal = Game.createItem(1387, 1, Position(922, 971, 14))
        if portal then
            portal:setActionId(50126)
        end
        return true
    end

    -- Ice fishing hole
    if ground.itemid == 7200 then
        ground:transform(7236)
        ground:decay()
        toPosition:sendMagicEffect(CONST_ME_HITAREA)
        return true
    end

    return false
end

function onUseRope(player, item, fromPosition, target, toPosition, isHotkey)
    local tile = Tile(toPosition)
    if not tile then
        return false
    end

    local ground = tile:getGround()

    if ground and table.contains(ropeSpots, ground:getId()) then
        tile = Tile(toPosition:moveUpstairs())
        if not tile then
            return false
        end

        if tile:hasFlag(TILESTATE_PROTECTIONZONE) and player:isPzLocked() then
            player:sendCancelMessage(RETURNVALUE_PLAYERISPZLOCKED)
            return true
        end

        player:teleportTo(toPosition, false)
        return true
    end

    if table.contains(holeId, target.itemid) then
        toPosition.z = toPosition.z + 1
        tile = Tile(toPosition)
        if not tile then
            return false
        end

        local thing = tile:getTopVisibleThing()
        if not thing then
            return true
        end

        if thing:isPlayer() then
            if Tile(toPosition:moveUpstairs()):queryAdd(thing) ~= RETURNVALUE_NOERROR then
                return false
            end

            return thing:teleportTo(toPosition, false)
        elseif thing:isItem() and thing:getType():isMovable() then
            return thing:moveTo(toPosition:moveUpstairs())
        end

        return true
    end

    return false
end

function onUseShovel(player, item, fromPosition, target, toPosition, isHotkey)
    local tile = Tile(toPosition)
    if not tile then
        return false
    end

    local ground = tile:getGround()
    if not ground then
        return false
    end

    local groundId = ground:getId()
    if table.contains(holes, groundId) then
        ground:transform(groundId + 1)
        ground:decay()

        toPosition.z = toPosition.z + 1
        tile:relocateTo(toPosition)
        player:addAchievementProgress("The Undertaker", 500)
    elseif table.contains(sandIds, groundId) then
        local randomValue = math.random(1, 100)
        if target.actionid == actionIds.sandHole and randomValue <= 20 then
            ground:transform(489)
            ground:decay()
        elseif randomValue == 1 then
            Game.createItem(2159, 1, toPosition)
            player:addAchievementProgress("Gold Digger", 100)
        elseif randomValue > 95 then
            Game.createMonster("Scarab", toPosition)
        end
        toPosition:sendMagicEffect(CONST_ME_POFF)
    else
        return false
    end

    return true
end

function onUseScythe(player, item, fromPosition, target, toPosition, isHotkey)
    if not table.contains({2550, 10513}, item.itemid) then
        return false
    end

    if target.itemid == 2739 then -- wheat
        target:transform(2737)
        target:decay()
        Game.createItem(2694, 1, toPosition) -- bunch of wheat
        player:addAchievementProgress("Happy Farmer", 200)
        return true
    end
    if target.itemid == 5465 then -- burning sugar cane
        target:transform(5464)
        target:decay()
        Game.createItem(5467, 1, toPosition) -- bunch of sugar cane
        player:addAchievementProgress("Natural Sweetener", 50)
        return true
    end
    return destroyItem(player, target, toPosition)
end

function onUseCrowbar(player, item, fromPosition, target, toPosition, isHotkey)
    if not table.contains({2416, 10515}, item.itemid) then
        return false
    end

    return destroyItem(player, target, toPosition)
end

function onUseKitchenKnife(player, item, fromPosition, target, toPosition, isHotkey)
    if not table.contains({2566, 10511, 10515}, item.itemid) then
        return false
    end

    if table.contains(fruits, target.itemid) and player:removeItem(6278, 1) then
        target:remove(1)
        player:addItem(6279, 1)
        player:getPosition():sendMagicEffect(CONST_ME_MAGIC_GREEN)
        return true
    end

    return false
end

Thanks in advance!
 

Attachments

what script did you use to find the infinite loop? can you sahre pls? thank in advance
It was linked on the post. But here is direct link. [ANY TFS] Catch scripts that freeze server (https://otland.net/threads/any-tfs-catch-scripts-that-freeze-server.261466/)
Anyways I just saw I can't really trust it, becasue it is throwing me different prints of infinite loops (when I start the server, throw a different print on different locations each time, it's really weird (sometimes a moveevent, an actions, it randomly selects files to print on console)). If someone further see this, is there any other more accurate code there?
Post automatically merged:

what script did you use to find the infinite loop? can you sahre pls? thank in advance
Ok I think I replied too fast. Do the following...
Use this: [ANY TFS] Catch scripts that freeze server (https://otland.net/threads/any-tfs-catch-scripts-that-freeze-server.261466/#post-2702555)

And run the server (just for check ms, then just comment it out). Add it to global.lua. I just catched this one (9349.000 ms) -.-

1713716742014.png
 
Last edited:
its normal on startup, look on lib core. lua what is doing, it's loading many files (dofile) summary there is a loot of code to execute
after startup it chack lua call if they execute to long, this is important
 
It was linked on the post. But here is direct link. [ANY TFS] Catch scripts that freeze server (https://otland.net/threads/any-tfs-catch-scripts-that-freeze-server.261466/)
Anyways I just saw I can't really trust it, becasue it is throwing me different prints of infinite loops (when I start the server, throw a different print on different locations each time, it's really weird (sometimes a moveevent, an actions, it randomly selects files to print on console)). If someone further see this, is there any other more accurate code there?
Post automatically merged:


Ok I think I replied too fast. Do the following...
Use this: [ANY TFS] Catch scripts that freeze server (https://otland.net/threads/any-tfs-catch-scripts-that-freeze-server.261466/#post-2702555)

And run the server (just for check ms, then just comment it out). Add it to global.lua. I just catched this one (9349.000 ms) -.-

View attachment 83993
thank you!
 
Back
Top