• 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 Error Script

adrenysny

Member
Joined
Feb 17, 2021
Messages
140
Reaction score
14
hello help me with this scripts, it says that there are always people in the area but there is no one

PHOTO.png




Lua:
--[[
Storages:
The Hunger = 14334
The Destruction = 14335
The Rage = 14336
]]--
-- FUNCTIONS
function sparkDevourerSpawn()
    local positions = {
        {x = 32268, y = 31341, z = 14},
        {x = 32275, y = 31342, z = 14},
        {x = 32269, y = 31352, z = 14},
        {x = 32277, y = 31351, z = 14}
    }

    if sparkSpawnCount > 0 then
        for i = 1, sparkSpawnCount do
            Game.createMonster("Spark of Destruction2", positions[i], false, true)
        end
        sparkSpawnCount = 0
    end
    areaDevourer6 = addEvent(sparkDevourerSpawn, 10000)
end

local function doCheckArea()
    local upConer = {x = 32260, y = 31336, z = 14}       -- upLeftCorner
    local downConer = {x = 32283, y = 31360, z = 14}     -- downRightCorner

    for i=upConer.x, downConer.x do
        for j=upConer.y, downConer.y do
            for k = upConer.z, downConer.z do
                local tile = Tile(i, j, k)
                if tile then
                    local creatures = tile:getCreatures()
                    if creatures and #creatures > 0 then
                        for _, c in pairs(creatures) do
                            if isPlayer(c) then
                                return true
                            end
                        end
                    end
                end
            end
        end
    end

    for _, online in ipairs(Game.getPlayers()) do
        if online:isPlayer() then
            if online:getStorageValue(14334) >= 1 or online:getStorageValue(14335) >= 1 or online:getStorageValue(14336) >= 1 then
                return true
            end
        end
    end

    return false
end

local function changeArea()
    local function organizeHunger()
        local upConer = {x = 32233, y = 31360, z = 14}       -- upLeftCorner
        local downConer = {x = 32256, y = 31384, z = 14}     -- downRightCorner
        for i=upConer.x, downConer.x do
            for j=upConer.y, downConer.y do
                for k = upConer.z, downConer.z do
                    local tile = Tile(i, j, k)
                    if tile then
                        local creatures = tile:getCreatures()
                        if creatures and #creatures > 0 then
                            if theHungerKilled == false then
                                for _, c in pairs(creatures) do
                                    if isMonster(c) then
                                        c:teleportTo({x = 32244, y = 31369, z = 14})
                                    end
                                end
                            else
                                devourerBossesKilled = devourerBossesKilled - 1
                                Game.createMonster("The Hunger", {x = 32244, y = 31372, z = 14}, false, true)
                                theHungerKilled = false
                            end
                        end
                    end
                end
            end
        end
    end

    local function organizeDestruction()
        local upConer = {x = 32260, y = 31304, z = 14}       -- upLeftCorner
        local downConer = {x = 32283, y = 31328, z = 14}     -- downRightCorner
        for i=upConer.x, downConer.x do
            for j=upConer.y, downConer.y do
                for k = upConer.z, downConer.z do
                    local tile = Tile(i, j, k)
                    if tile then
                        local creatures = tile:getCreatures()
                        if creatures and #creatures > 0 then
                            if theDestructionKilled == false then
                                for _, c in pairs(creatures) do
                                    if isMonster(c) then
                                        c:teleportTo({x = 32271, y = 31313, z = 14})
                                    end
                                end
                            else
                                devourerBossesKilled = devourerBossesKilled - 1
                                Game.createMonster("The Destruction", {x = 32271, y = 31316, z = 14}, false, true)
                                theDestructionKilled = false
                            end
                        end
                    end
                end
            end
        end
    end

    local function organizeRage()
        local upConer = {x = 32288, y = 31360, z = 14}       -- upLeftCorner
        local downConer = {x = 32311, y = 31384, z = 14}     -- downRightCorner
        for i=upConer.x, downConer.x do
            for j=upConer.y, downConer.y do
                for k = upConer.z, downConer.z do
                    local tile = Tile(i, j, k)
                    if tile then
                        local creatures = tile:getCreatures()
                        if creatures and #creatures > 0 then
                            if theRageKilled == false then
                                for _, c in pairs(creatures) do
                                    if isMonster(c) then
                                        c:teleportTo({x = 32299, y = 31369, z = 14})
                                    end
                                end
                            else
                                devourerBossesKilled = devourerBossesKilled - 1
                                Game.createMonster("The Rage", {x = 32299, y = 31372, z = 14}, false, true)
                                theRageKilled = false
                            end
                        end
                    end
                end
            end
        end
    end

    if devourerBossesKilled < 3 then
        for _, online in ipairs(Game.getPlayers()) do
            if online:isPlayer() then
                -- Teleport players from The Hunger to The Rage
                if online:getStorageValue(14334) >= 1 then
                    online:setStorageValue(14334, -1)
                    online:setStorageValue(14336, 1)
                    online:teleportTo({x = 32299, y = 31372, z = 14})
                    online:say("A polarity shift moves you into another part of the heart of destruction.", TALKTYPE_MONSTER_SAY)
                    Position({x = 32299, y = 31372, z = 14}):sendMagicEffect(11)
                -- Teleport players from The Destruction to The Hunger
                elseif online:getStorageValue(14335) >= 1 then
                    online:setStorageValue(14335, -1)
                    online:setStorageValue(14334, 1)
                    online:teleportTo({x = 32244, y = 31372, z = 14})
                    online:say("A polarity shift moves you into another part of the heart of destruction.", TALKTYPE_MONSTER_SAY)
                    Position({x = 32244, y = 31372, z = 14}):sendMagicEffect(11)
                -- Teleport players from The Rage to The Destruction
                elseif online:getStorageValue(14336) >= 1 then
                    online:setStorageValue(14336, -1)
                    online:setStorageValue(14335, 1)
                    online:teleportTo({x = 32271, y = 31316, z = 14})
                    online:say("A polarity shift moves you into another part of the heart of destruction.", TALKTYPE_MONSTER_SAY)
                    Position({x = 32271, y = 31316, z = 14}):sendMagicEffect(11)
                end
            end
        end
        organizeHunger()
        organizeDestruction()
        organizeRage()
        areaDevourer4 = addEvent(changeArea, 30000)
    else
        stopEvent(areaDevourer1)
        stopEvent(areaDevourer2)
        stopEvent(areaDevourer3)
        stopEvent(areaDevourer4)
        for _, online in ipairs(Game.getPlayers()) do
            if online:isPlayer() then
                if online:getStorageValue(14334) >= 1 then
                    online:setStorageValue(14334, -1)
                    online:unregisterEvent("DevourerStorage")
                    online:teleportTo({x = 32271, y = 31357, z = 14})
                    Position({x = 32271, y = 31357, z = 14}):sendMagicEffect(11)
                elseif online:getStorageValue(14335) >= 1 then
                    online:setStorageValue(14335, -1)
                    online:unregisterEvent("DevourerStorage")
                    online:teleportTo({x = 32272, y = 31357, z = 14})
                    Position({x = 32272, y = 31357, z = 14}):sendMagicEffect(11)
                elseif online:getStorageValue(14336) >= 1 then
                    online:setStorageValue(14336, -1)
                    online:unregisterEvent("DevourerStorage")
                    online:teleportTo({x = 32273, y = 31357, z = 14})
                    Position({x = 32273, y = 31357, z = 14}):sendMagicEffect(11)
                end
            end
        end
        local spectators = Game.getSpectators(Position(32271, 31348, 14), false, true, 10, 10, 10, 10)
        if #spectators > 0 then
            for i = 1, #spectators do
                spectators[i]:say("With the Rage, Hunger and Destruction gone, you're sucked into the heart of destruction!! THE WORLD DEVOURER AWAITS YOU!", TALKTYPE_MONSTER_YELL, false, spectators[i], Position(32271, 31348, 14))
            end
        end

        Game.createMonster("World Devourer", {x = 32271, y = 31347, z = 14}, false, true)
        Game.createMonster("Spark of Destruction2", {x = 32268, y = 31341, z = 14}, false, true)
        Game.createMonster("Spark of Destruction2", {x = 32275, y = 31342, z = 14}, false, true)
        Game.createMonster("Spark of Destruction2", {x = 32269, y = 31352, z = 14}, false, true)
        Game.createMonster("Spark of Destruction2", {x = 32277, y = 31351, z = 14}, false, true)
        sparkSpawnCount = 0
        devourerSummon = 0
        areaDevourer5 = addEvent(clearDevourer, 30 * 60000)
        areaDevourer6 = addEvent(sparkDevourerSpawn, 10000)
    end
end

local function clearHunger()
    local upConer = {x = 32233, y = 31360, z = 14}       -- upLeftCorner
    local downConer = {x = 32256, y = 31384, z = 14}     -- downRightCorner

    for i=upConer.x, downConer.x do
        for j=upConer.y, downConer.y do
            for k = upConer.z, downConer.z do
                local tile = Tile(i, j, k)
                if tile then
                    local creatures = tile:getCreatures()
                    if creatures and #creatures > 0 then
                        for _, c in pairs(creatures) do
                            if isPlayer(c) then
                                c:teleportTo({x = 32208, y = 31372, z = 14})
                            elseif isMonster(c) and c:getName() ~= "Spark of Destruction" then
                                c:remove()
                            end
                        end
                    end
                end
            end
        end
    end
    stopEvent(areaDevourer1)
end

local function clearDestruction()
    local upConer = {x = 32260, y = 31304, z = 14}       -- upLeftCorner
    local downConer = {x = 32283, y = 31328, z = 14}     -- downRightCorner

    for i=upConer.x, downConer.x do
        for j=upConer.y, downConer.y do
            for k = upConer.z, downConer.z do
                local tile = Tile(i, j, k)
                if tile then
                    local creatures = tile:getCreatures()
                    if creatures and #creatures > 0 then
                        for _, c in pairs(creatures) do
                            if isPlayer(c) then
                                c:teleportTo({x = 32208, y = 31372, z = 14})
                            elseif isMonster(c) and c:getName() ~= "Spark of Destruction" then
                                c:remove()
                            end
                        end
                    end
                end
            end
        end
    end
    stopEvent(areaDevourer2)
end

local function clearRage()
    local upConer = {x = 32288, y = 31360, z = 14}       -- upLeftCorner
    local downConer = {x = 32311, y = 31384, z = 14}     -- downRightCorner

    for i=upConer.x, downConer.x do
        for j=upConer.y, downConer.y do
            for k = upConer.z, downConer.z do
                local tile = Tile(i, j, k)
                if tile then
                    local creatures = tile:getCreatures()
                    if creatures and #creatures > 0 then
                        for _, c in pairs(creatures) do
                            if isPlayer(c) then
                                c:teleportTo({x = 32208, y = 31372, z = 14})
                            elseif isMonster(c) and c:getName() ~= "Spark of Destruction" then
                                c:remove()
                            end
                        end
                    end
                end
            end
        end
    end
    stopEvent(areaDevourer3)
end

function clearDevourer()
    local upConer = {x = 32260, y = 31336, z = 14}       -- upLeftCorner
    local downConer = {x = 32283, y = 31360, z = 14}     -- downRightCorner

    for i=upConer.x, downConer.x do
        for j=upConer.y, downConer.y do
            for k = upConer.z, downConer.z do
                local tile = Tile(i, j, k)
                if tile then
                    local creatures = tile:getCreatures()
                    if creatures and #creatures > 0 then
                        for _, c in pairs(creatures) do
                            if isPlayer(c) then
                                c:teleportTo({x = 32208, y = 31372, z = 14})
                            elseif isMonster(c) then
                                c:remove()
                            end
                        end
                    end
                end
            end
        end
    end
    stopEvent(areaDevourer4)
    stopEvent(areaDevourer5)
    stopEvent(areaDevourer6)
end
-- FUNCTIONS END

local heartDestructionFinal = Action()
function heartDestructionFinal.onUse(player, item, fromPosition, itemEx, toPosition)

    local config = {
        hungerPositions = {
            Position(32271, 31374, 14),
            Position(32271, 31375, 14),
            Position(32271, 31376, 14),
            Position(32271, 31377, 14),
            Position(32271, 31378, 14)
        },

        destructionPositions = {
            Position(32272, 31374, 14),
            Position(32272, 31375, 14),
            Position(32272, 31376, 14),
            Position(32272, 31377, 14),
            Position(32272, 31378, 14)
        },

        ragePositions = {
            Position(32273, 31374, 14),
            Position(32273, 31375, 14),
            Position(32273, 31376, 14),
            Position(32273, 31377, 14),
            Position(32273, 31378, 14)
        },

        hungerNewPos = {x = 32244, y = 31381, z = 14},
        destructionNewPos = {x = 32271, y = 31325, z = 14},
        rageNewPos = {x = 32299, y = 31381, z = 14},
    }

    local pushPos = {x = 32272, y = 31374, z = 14}

    if item.actionid == 14332 then
        if item.itemid == 9825 then
            if player:getPosition().x == pushPos.x and player:getPosition().y == pushPos.y and player:getPosition().z == pushPos.z then

                local storeHunger, hungerTile = {}
                local storeDestruction, destructionTile = {}
                local storeRage, rageTile = {}

                for i = 1, #config.hungerPositions do
                    hungerTile = Tile(config.hungerPositions[i]):getTopCreature()
                    if isPlayer(hungerTile) then
                        storeHunger[#storeHunger + 1] = hungerTile
                    end
                end

                for i = 1, #config.destructionPositions do
                    destructionTile = Tile(config.destructionPositions[i]):getTopCreature()
                    if isPlayer(destructionTile) then
                        storeDestruction[#storeDestruction + 1] = destructionTile
                    end
                end

                for i = 1, #config.ragePositions do
                    rageTile = Tile(config.ragePositions[i]):getTopCreature()
                    if isPlayer(rageTile) then
                        storeRage[#storeRage + 1] = rageTile
                    end
                end

                if #storeHunger < 1 or #storeDestruction < 1 or #storeRage < 1 then
                    player:sendTextMessage(19, "You need at least 3 players, each in a column.")
                    return true
                end

                if doCheckArea() == false then
                    clearHunger()
                    clearDestruction()
                    clearRage()
                    clearDevourer()

                    local teamHunger
                    local teamDestruction
                    local teamRage

                    for i = 1, #storeHunger do
                        teamHunger = storeHunger[i]
                        config.hungerPositions[i]:sendMagicEffect(CONST_ME_POFF)
                        teamHunger:teleportTo(config.hungerNewPos)
                        teamHunger:setStorageValue(14333, os.time() + 7*24*60*60)
                        teamHunger:setStorageValue(14334, 1) --storage Hunger
                        teamHunger:registerEvent("DevourerStorage")
                    end

                    for i = 1, #storeDestruction do
                        teamDestruction = storeDestruction[i]
                        config.destructionPositions[i]:sendMagicEffect(CONST_ME_POFF)
                        teamDestruction:teleportTo(config.destructionNewPos)
                        teamDestruction:setStorageValue(14333, os.time() + 7*24*60*60)
                        teamDestruction:setStorageValue(14335, 1) --storage Destruction
                        teamDestruction:registerEvent("DevourerStorage")
                    end

                    for i = 1, #storeRage do
                        teamRage = storeRage[i]
                        config.ragePositions[i]:sendMagicEffect(CONST_ME_POFF)
                        teamRage:teleportTo(config.rageNewPos)
                        teamRage:setStorageValue(14333, os.time() + 7*24*60*60)
                        teamRage:setStorageValue(14336, 1) --storage Rage
                        teamRage:registerEvent("DevourerStorage")
                    end

                    Position(config.hungerNewPos):sendMagicEffect(11)
                    Position(config.destructionNewPos):sendMagicEffect(11)
                    Position(config.rageNewPos):sendMagicEffect(11)

                    areaDevourer1 = addEvent(clearHunger, 30 * 60000)
                    areaDevourer2 = addEvent(clearDestruction, 30 * 60000)
                    areaDevourer3 = addEvent(clearRage, 30 * 60000)
                    areaDevourer4 = addEvent(changeArea, 30000) --mudar

                    --Variables
                    devourerBossesKilled = 0
                    theHungerKilled = false
                    theDestructionKilled = false
                    theRageKilled = false

                    hungerSummon = 0
                    rageSummon = 0
                    destructionSummon = 0
                    devourerSummon = 0

                    Game.createMonster("The Hunger", {x = 32244, y = 31372, z = 14}, false, true)
                    Game.createMonster("The Destruction", {x = 32271, y = 31316, z = 14}, false, true)
                    Game.createMonster("The Rage", {x = 32299, y = 31372, z = 14}, false, true)

                    local vortex = Tile({x = 32281, y = 31348, z = 14}):getItemById(26138)
                    if vortex then
                        vortex:transform(26139)
                        vortex:setActionId(14352)
                    end
                else
                    player:sendTextMessage(19, "Someone is in the area.")
                end
            else
                return true
            end
        end
        item:transform(item.itemid == 9825 and 9826 or 9825)
    end
    return true
end

heartDestructionFinal:aid(14332)
heartDestructionFinal:register()
 
Solution
This smells to me that some online player maintains the storages
sure at the beginning, it worked fine, after a few tests and reloads while the execution of the quest was in progress they were able to break the script
true? XD

If that's the case, you should connect with totally new players or delete the storages 14334, 14335, 14336 from that players.

You can execute this query in your database to eliminate the storages, ensure that your server is offline when you execute the query, so that you will not have any inconvenience.

SQL:
DELETE FROM player_storage WHERE key >= 14334 AND key <= 14336;
This smells to me that some online player maintains the storages
sure at the beginning, it worked fine, after a few tests and reloads while the execution of the quest was in progress they were able to break the script
true? XD

If that's the case, you should connect with totally new players or delete the storages 14334, 14335, 14336 from that players.

You can execute this query in your database to eliminate the storages, ensure that your server is offline when you execute the query, so that you will not have any inconvenience.

SQL:
DELETE FROM player_storage WHERE key >= 14334 AND key <= 14336;
 
Last edited:
Solution
Back
Top