• 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!
  • If you're using Gesior 2012 or MyAAC, please review this thread for information about a serious security vulnerability and a fix.

TFS 1.X+ Svargrond Arena error

rdz92

Member
Joined
Apr 19, 2022
Messages
26
Reaction score
7
Hi guys,
So I'm getting this error in distro after I enter final TP from last boss to reward room. The funny thing is that the quest and rewards everything works fine I'm just baffled by the error in distro. So it's not really an issue as everything works fine I would just like there to be no errors :p
I appriciate any help I can get.

Lua Script Error: [MoveEvents Interface]
data/movements/scripts/quests/svargrond arena/arenaPit.lua:eek:nStepIn
data/lib/quests/svargrond_arena.lua:290: attempt to index a nil value
stack traceback:
[C]: in function '__index'
data/lib/quests/svargrond_arena.lua:290: in function 'startTimer'
data/lib/quests/svargrond_arena.lua:284: in function 'scheduleKickPlayer'
data/movements/scripts/quests/svargrond arena/arenaPit.lua:58: in function <data/movements/scripts/quests/svargrond arena/arenaPit.lua:5>
lib/quests/svargrond_arena.lua
Lua:
--[[
    TODO
        - Include PITS and ARENA table in SvargrondArena -> SvargrondArena.arenas / SvargrondArena.pits
        - Restructure PITS and ARENA table (reward.storage does not seem to be used)
]]

SvargrondArena = {
    -- kick time in seconds (10 minutes)
    kickTime = 600,
    kickPosition = Position(32251, 31098, 6),
    rewardPosition = Position(32222, 31080, 6),

    -- used to store event ids
    kickEvents = {},
    timerEvents = {},
    effectPositionCache = {},

    -- item ids used by the script
    itemTimer = 10288,
    itemPillar = 1354,
    itemTeleport = 5023,
    itemsNotErasable = {10288, 1354, 1543, 1544, 1545},
}

-- Script automatically derives other pit positions from this one
local firstPit = {
    fromPos = {x = 32205, y = 31094, z = 7},
    toPos = {x = 32214, y = 31103, z = 7},
    center = {x = 32210, y = 31098, z = 7},
    pillar = {x = 32204, y = 31098, z = 7},
    tp = {x = 32204, y = 31098, z = 7},
    summon = {x = 32210, y = 31100, z = 7}
}

PITS = {
    [1] = {
        fromPos = firstPit.fromPos,
        toPos = firstPit.toPos,
        center = firstPit.center,
        pillar = firstPit.pillar,
        tp = firstPit.tp,
        summon = firstPit.summon
    },
    [2] = {
        fromPos = {x = firstPit.fromPos.x - 14, y = firstPit.fromPos.y, z = firstPit.fromPos.z},
        toPos = {x = firstPit.toPos.x - 14, y = firstPit.toPos.y, z = firstPit.toPos.z},
        center = {x = firstPit.center.x - 14, y = firstPit.center.y, z = firstPit.center.z},
        pillar = {x = firstPit.pillar.x - 14, y = firstPit.pillar.y, z = firstPit.pillar.z},
        tp = {x = firstPit.tp.x - 14, y = firstPit.tp.y, z = firstPit.tp.z},
        summon = {x = firstPit.summon.x - 14, y = firstPit.summon.y, z = firstPit.summon.z}
    },
    [3] = {
        fromPos = {x = firstPit.fromPos.x - 28, y = firstPit.fromPos.y, z = firstPit.fromPos.z},
        toPos = {x = firstPit.toPos.x - 28, y = firstPit.toPos.y, z = firstPit.toPos.z},
        center = {x = firstPit.center.x - 28, y = firstPit.center.y, z = firstPit.center.z},
        pillar = {x = firstPit.pillar.x - 28, y = firstPit.pillar.y, z = firstPit.pillar.z},
        tp = {x = firstPit.tp.x - 28, y = firstPit.tp.y, z = firstPit.tp.z},
        summon = {x = firstPit.summon.x - 28, y = firstPit.summon.y, z = firstPit.summon.z}
    },
    [4] = {
        fromPos = {x = firstPit.fromPos.x - 42, y = firstPit.fromPos.y, z = firstPit.fromPos.z},
        toPos = {x = firstPit.toPos.x - 42, y = firstPit.toPos.y, z = firstPit.toPos.z},
        center = {x = firstPit.center.x - 42, y = firstPit.center.y, z = firstPit.center.z},
        pillar = {x = firstPit.pillar.x - 42, y = firstPit.pillar.y, z = firstPit.pillar.z},
        tp = {x = firstPit.tp.x - 42, y = firstPit.tp.y, z = firstPit.tp.z},
        summon = {x = firstPit.summon.x - 42, y = firstPit.summon.y, z = firstPit.summon.z}
    },
    [5] = {
        fromPos = {x = firstPit.fromPos.x - 35, y = firstPit.fromPos.y - 14, z = firstPit.fromPos.z},
        toPos = {x = firstPit.toPos.x - 35, y = firstPit.toPos.y - 14, z = firstPit.toPos.z},
        center = {x = firstPit.center.x - 35, y = firstPit.center.y - 14, z = firstPit.center.z},
        pillar = {x = firstPit.pillar.x - 35, y = firstPit.pillar.y - 14, z = firstPit.pillar.z},
        tp = {x = firstPit.tp.x - 35, y = firstPit.tp.y - 14, z = firstPit.tp.z},
        summon = {x = firstPit.summon.x - 35, y = firstPit.summon.y - 14, z = firstPit.summon.z}
    },
    [6] = {
        fromPos = {x = firstPit.fromPos.x - 21, y = firstPit.fromPos.y - 14, z = firstPit.fromPos.z},
        toPos = {x = firstPit.toPos.x - 21, y = firstPit.toPos.y - 14, z = firstPit.toPos.z},
        center = {x = firstPit.center.x - 21, y = firstPit.center.y - 14, z = firstPit.center.z},
        pillar = {x = firstPit.pillar.x - 21, y = firstPit.pillar.y - 14, z = firstPit.pillar.z},
        tp = {x = firstPit.tp.x - 21, y = firstPit.tp.y - 14, z = firstPit.tp.z},
        summon = {x = firstPit.summon.x - 21, y = firstPit.summon.y - 14, z = firstPit.summon.z}
    },
    [7] = {
        fromPos = {x = firstPit.fromPos.x - 7, y = firstPit.fromPos.y - 14, z = firstPit.fromPos.z},
        toPos = {x = firstPit.toPos.x - 7, y = firstPit.toPos.y - 14, z = firstPit.toPos.z},
        center = {x = firstPit.center.x - 7, y = firstPit.center.y - 14, z = firstPit.center.z},
        pillar = {x = firstPit.pillar.x - 7, y = firstPit.pillar.y - 14, z = firstPit.pillar.z},
        tp = {x = firstPit.tp.x - 7, y = firstPit.tp.y - 14, z = firstPit.tp.z},
        summon = {x = firstPit.summon.x - 7, y = firstPit.summon.y - 14, z = firstPit.summon.z}
    },
    [8] = {
        fromPos = {x = firstPit.fromPos.x - 14, y = firstPit.fromPos.y - 28, z = firstPit.fromPos.z},
        toPos = {x = firstPit.toPos.x - 14, y = firstPit.toPos.y - 28, z = firstPit.toPos.z},
        center = {x = firstPit.center.x - 14, y = firstPit.center.y - 28, z = firstPit.center.z},
        pillar = {x = firstPit.pillar.x - 14, y = firstPit.pillar.y - 28, z = firstPit.pillar.z},
        tp = {x = firstPit.tp.x - 14, y = firstPit.tp.y - 28, z = firstPit.tp.z},
        summon = {x = firstPit.summon.x - 14, y = firstPit.summon.y - 28, z = firstPit.summon.z}
    },
    [9] = {
        fromPos = {x = firstPit.fromPos.x - 28, y = firstPit.fromPos.y - 28, z = firstPit.fromPos.z},
        toPos = {x = firstPit.toPos.x - 28, y = firstPit.toPos.y - 28, z = firstPit.toPos.z},
        center = {x = firstPit.center.x - 28, y = firstPit.center.y - 28, z = firstPit.center.z},
        pillar = {x = firstPit.pillar.x - 28, y = firstPit.pillar.y - 28, z = firstPit.pillar.z},
        tp = {x = firstPit.tp.x - 28, y = firstPit.tp.y - 28, z = firstPit.tp.z},
        summon = {x = firstPit.summon.x - 28, y = firstPit.summon.y - 28, z = firstPit.summon.z}
    },
    [10] = {
        fromPos = {x = firstPit.fromPos.x - 21, y = firstPit.fromPos.y - 42, z = firstPit.fromPos.z},
        toPos = {x = firstPit.toPos.x - 21, y = firstPit.toPos.y - 42, z = firstPit.toPos.z},
        center = {x = firstPit.center.x - 21, y = firstPit.center.y - 41, z = firstPit.center.z},
        pillar = {x = firstPit.pillar.x - 21, y = firstPit.pillar.y - 41, z = firstPit.pillar.z},
        tp = {x = firstPit.tp.x - 21, y = firstPit.tp.y - 41, z = firstPit.tp.z},
        summon = {x = firstPit.summon.x - 21, y = firstPit.summon.y - 41, z = firstPit.summon.z}
    }
}

ARENA = {
    [1] = {
        name = 'Greenhorn',
        price = 1000,
        questLog = Storage.SvargrondArena.QuestLogGreenhorn,
        achievement = 'Greenhorn',
        creatures = {
            [1] = 'frostfur',
            [2] = 'bloodpaw',
            [3] = 'bovinus',
            [4] = 'achad',
            [5] = 'colerian the barbarian',
            [6] = 'the hairy one',
            [7] = 'axeitus headbanger',
            [8] = 'rocky',
            [9] = 'cursed gladiator',
            [10] = 'orcus the cruel'
        },
        reward = {
            trophy = 5807,
            trophyStorage = Storage.SvargrondArena.TrophyGreenhorn,
            desc = 'It is given to the courageous victor of the barbarian arena in greenhorn difficulty. Awarded to %s',
        }
    },
    [2] = {
        name = 'Scrapper',
        price = 5000,
        questLog = Storage.SvargrondArena.QuestLogScrapper,
        achievement = 'Scrapper',
        creatures = {
            [1] = 'avalanche',
            [2] = 'kreebosh the exile',
            [3] = 'the dark dancer',
            [4] = 'the hag',
            [5] = 'slim',
            [6] = 'grimgor guteater',
            [7] = 'drasilla',
            [8] = 'spirit of earth',
            [9] = 'spirit of water',
            [10] = 'spirit of fire'
        },
        reward = {
            trophy = 5806,
            trophyStorage = Storage.SvargrondArena.TrophyScrapper,
            desc = 'It is given to the courageous victor of the barbarian arena in scrapper difficulty. Awarded to %s.',
        }
    },
    [3] = {
        name = 'Warlord',
        price = 10000,
        questLog = Storage.SvargrondArena.QuestLogWarlord,
        achievement = 'Warlord of Svargrond',
        creatures = {
            [1] = 'webster',
            [2] = 'darakan the executioner',
            [3] = 'norgle glacierbeard',
            [4] = 'the pit lord',
            [5] = 'svoren the mad',
            [6] = 'the masked marauder',
            [7] = 'gnorre chyllson',
            [8] = 'fallen mooh\'tah master ghar',
            [9] = 'deathbringer',
            [10] = 'the obliverator'
        },
        reward = {
            trophy = 5805,
            trophyStorage = Storage.SvargrondArena.TrophyWarlord,
            desc = 'It is given to the courageous victor of the barbarian arena in warlord difficulty. Awarded to %s.',
        }
    }
}

function SvargrondArena.getPitCreatures(pitId)
    if not PITS[pitId] then
        return {}
    end

    local ret = {}
    local specs = Game.getSpectators(PITS[pitId].center, false, false, 5, 5, 5, 5)
    for i = 1, #specs do
        ret[#ret+1] = specs[i]
    end

    return ret
end

function SvargrondArena.resetPit(pitId)
    if not PITS[pitId] then
        return
    end

    for x = PITS[pitId].fromPos.x, PITS[pitId].toPos.x do
        for y = PITS[pitId].fromPos.y, PITS[pitId].toPos.y do
            for z = PITS[pitId].fromPos.z, PITS[pitId].toPos.z do
                local tile = Tile({x=x, y=y, z=z})
                if tile then
                    local movableItem = tile:getThing(255)
                    if movableItem and movableItem:isItem() then
                        local itemType = ItemType(movableItem:getId())
                        if itemType and itemType:isMovable() and not isInArray(SvargrondArena.itemsNotErasable, movableItem:getId()) then
                            moveableItem:remove()
                        end
                    end

                    local creature = tile:getTopCreature()
                    if creature and creature:isMonster() then
                        creature:remove()
                    end
                end
            end
        end
    end

    local pillarTile = Tile(PITS[pitId].pillar)
    if pillarTile then
        local teleportItem = pillarTile:getItemById(SvargrondArena.itemTeleport)
        if teleportItem then
            teleportItem:remove()
        end

        local pillarItem = pillarTile:getItemById(SvargrondArena.itemPillar)
        if not pillarItem then
            Game.createItem(SvargrondArena.itemPillar, 1, PITS[pitId].pillar)
        end
    end
end

function SvargrondArena.getPitOccupant(pitId, ignorePlayer)
    local creatures = SvargrondArena.getPitCreatures(pitId)
    for i = 1, #creatures do
        if creatures[i]:isPlayer() and creatures[i]:getId() ~= ignorePlayer:getId() then
            return creatures[i]
        end
    end

    return nil
end

function SvargrondArena.kickPlayer(cid, hideMessage)
    SvargrondArena.cancelEvents(cid)
    local player = Player(cid)
    if not player then
        return
    end

    if player:getStorageValue(Storage.SvargrondArena.Pit) > 0 then
        player:teleportTo(SvargrondArena.kickPosition)
        SvargrondArena.kickPosition:sendMagicEffect(CONST_ME_TELEPORT)
        player:setStorageValue(Storage.SvargrondArena.Pit, 0)
        if not hideMessage then
            player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'Your time ran out!')
        end
    end
end

function SvargrondArena.cancelEvents(cid)
    local kickEvent = SvargrondArena.kickEvents[cid]
    if kickEvent then
        SvargrondArena.removeTimer(kickEvent.pitId)
        stopEvent(kickEvent.eventId)
    end
    SvargrondArena.kickEvents[cid] = nil
end

function SvargrondArena.scheduleKickPlayer(cid, pitId)
    SvargrondArena.cancelEvents(cid)
    SvargrondArena.startTimer(pitId)
    local eventId = addEvent(SvargrondArena.kickPlayer, SvargrondArena.kickTime * 1000, cid)
    SvargrondArena.kickEvents[cid] = {eventId = eventId, pitId = pitId}
end

function SvargrondArena.startTimer(pitId)
    local tile = Tile(PITS[pitId].fromPos)
    if not tile then
        return
    end

    local timerItem = tile:getItemById(SvargrondArena.itemTimer)
    if timerItem then
        timerItem:remove()
    end

    timerItem = Game.createItem(SvargrondArena.itemTimer, 1, PITS[pitId].fromPos)
    if timerItem then
        timerItem:decay()
    end

    if SvargrondArena.timerEvents[pitId] then
        stopEvent(SvargrondArena.timerEvents[pitId])
    end
    SvargrondArena.timerEvents[pitId] = addEvent(SvargrondArena.removeTimer, SvargrondArena.kickTime * 1000, pitId)
end

function SvargrondArena.removeTimer(pitId)
    local tile = Tile(PITS[pitId].fromPos)
    if not tile then
        return
    end

    local timerItem = tile:getItemById(SvargrondArena.itemTimer)
    if timerItem then
        timerItem:remove()
    end
    SvargrondArena.timerEvents[pitId] = nil
end

function SvargrondArena.sendPillarEffect(pitId)
    local positions = SvargrondArena.effectPositionCache[pitId]
    if not positions then
        local position = PITS[pitId].pillar
        local effectPositions = {
                Position(position.x - 1, position.y,     position.z),
                Position(position.x + 1, position.y,     position.z),
                Position(position.x + 1, position.y - 1, position.z),
                Position(position.x + 1, position.y + 1, position.z),
                Position(position.x,     position.y,     position.z)
        }
        SvargrondArena.effectPositionCache[pitId] = effectPositions
        positions = effectPositions
    end

    for i = 1, #positions do
        positions[i]:sendMagicEffect(CONST_ME_MAGIC_BLUE)
    end
end

movements/arenapit.lua

Lua:
local condition = Condition(CONDITION_OUTFIT)
condition:setTicks(120000)
condition:setOutfit({lookType = 111})

function onStepIn(creature, item, position, fromPosition)
    local player = creature:getPlayer()
    if not player then
        return true
    end

    local playerId = player.uid
    if item.actionid == 25300 then
        player:addCondition(condition)

        player:setStorageValue(Storage.SvargrondArena.Pit, 0)
        player:teleportTo(SvargrondArena.kickPosition)
        player:say('Coward!', TALKTYPE_MONSTER_SAY)
        SvargrondArena.cancelEvents(playerId)
        return true
    end

    local pitId = player:getStorageValue(Storage.SvargrondArena.Pit)
    local arenaId = player:getStorageValue(Storage.SvargrondArena.Arena)
    if pitId > 10 then
        player:teleportTo(SvargrondArena.rewardPosition)
        player:setStorageValue(Storage.SvargrondArena.Pit, 0)

        if arenaId == 1 then
            SvargrondArena.rewardPosition:sendMagicEffect(CONST_ME_FIREWORK_BLUE)
            player:setStorageValue(Storage.SvargrondArena.Greenhorn, 1)
            player:say('Welcome back, little hero!', TALKTYPE_MONSTER_SAY)
        elseif arenaId == 2 then
            SvargrondArena.rewardPosition:sendMagicEffect(CONST_ME_FIREWORK_YELLOW)
            player:setStorageValue(Storage.SvargrondArena.Scrapper, 1)
            player:say('Congratulations, brave warrior!', TALKTYPE_MONSTER_SAY)
        elseif arenaId == 3 then
            SvargrondArena.rewardPosition:sendMagicEffect(CONST_ME_FIREWORK_RED)
            player:setStorageValue(Storage.SvargrondArena.Warlord, 1)
            player:say('Respect and honour to you, champion!', TALKTYPE_MONSTER_SAY)
        end

        player:setStorageValue(Storage.SvargrondArena.Arena, player:getStorageValue(Storage.SvargrondArena.Arena) + 1)
        player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, 'Congratulations! You completed ' .. ARENA[arenaId].name .. ' arena, you should take your reward now.')
        player:setStorageValue(ARENA[arenaId].questLog, 2)
        SvargrondArena.cancelEvents(playerId)
        return true
    end

    local occupant = SvargrondArena.getPitOccupant(pitId, player)
    if occupant then
        player:sendTextMessage(MESSAGE_EVENT_ADVANCE, occupant:getName() .. ' is currently in the next arena pit. Please wait until ' .. (occupant:getSex() == PLAYERSEX_FEMALE and 's' or '') .. 'he is done fighting.')
        player:teleportTo(fromPosition, true)
        return true
    end

    SvargrondArena.cancelEvents(playerId)
    SvargrondArena.resetPit(pitId)
    SvargrondArena.scheduleKickPlayer(playerId, pitId)
    Game.createMonster(ARENA[arenaId].creatures[pitId], PITS[pitId].summon, false, true)

    player:teleportTo(PITS[pitId].center)
    player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED)
    player:say('Fight!', TALKTYPE_MONSTER_SAY)
    return true
end
 
Last edited:

Dakos

Well-Known Member
Joined
Jan 1, 2010
Messages
151
Solutions
22
Reaction score
79
Looks like "pitID" return -1 (storage value), and there is no -1 index for table, so somewhere storage for player its wrong set or not set.
to make sure, replace this function:
Lua:
function SvargrondArena.startTimer(pitId)
    local tile = Tile(PITS[pitId].fromPos)
    if not tile then
        return
    end

    local timerItem = tile:getItemById(SvargrondArena.itemTimer)
    if timerItem then
        timerItem:remove()
    end

    timerItem = Game.createItem(SvargrondArena.itemTimer, 1, PITS[pitId].fromPos)
    if timerItem then
        timerItem:decay()
    end

    if SvargrondArena.timerEvents[pitId] then
        stopEvent(SvargrondArena.timerEvents[pitId])
    end
    SvargrondArena.timerEvents[pitId] = addEvent(SvargrondArena.removeTimer, SvargrondArena.kickTime * 1000, pitId)
end
to:
Lua:
function SvargrondArena.startTimer(pitId)
    print("pitID Value: " .. pitId)
    local tile = Tile(PITS[pitId].fromPos)
    if not tile then
        return
    end

    local timerItem = tile:getItemById(SvargrondArena.itemTimer)
    if timerItem then
        timerItem:remove()
    end

    timerItem = Game.createItem(SvargrondArena.itemTimer, 1, PITS[pitId].fromPos)
    if timerItem then
        timerItem:decay()
    end

    if SvargrondArena.timerEvents[pitId] then
        stopEvent(SvargrondArena.timerEvents[pitId])
    end
    SvargrondArena.timerEvents[pitId] = addEvent(SvargrondArena.removeTimer, SvargrondArena.kickTime * 1000, pitId)
end
and check the console server log what pitId return.

in my opinion just after analise this system there is missing setting pitId properly,

Lua:
player:setStorageValue(Storage.SvargrondArena.Pit, 0)
this is ALL for setting the correct arena from 1-10, so script return probably always index 0. while that Storage.SvargrondArena.Pit should increase after finish x arena. but maybe i am wrong? idk just few minutes analise after being drunk


anyway u can also avoid this error by checking if table exsist:
Lua:
function SvargrondArena.startTimer(pitId)

    local t = PITS[pitId]
    if not t then
       return
    end

    local tile = Tile(t.fromPos)
    if not tile then
        return
    end

    local timerItem = tile:getItemById(SvargrondArena.itemTimer)
    if timerItem then
        timerItem:remove()
    end

    timerItem = Game.createItem(SvargrondArena.itemTimer, 1, PITS[pitId].fromPos)
    if timerItem then
        timerItem:decay()
    end

    if SvargrondArena.timerEvents[pitId] then
        stopEvent(SvargrondArena.timerEvents[pitId])
    end

    SvargrondArena.timerEvents[pitId] = addEvent(SvargrondArena.removeTimer, SvargrondArena.kickTime * 1000, pitId)
end
 
Last edited:
OP
OP
R

rdz92

Member
Joined
Apr 19, 2022
Messages
26
Reaction score
7
Looks like "pitID" return -1 (storage value), and there is no -1 index for table, so somewhere storage for player its wrong set or not set.
to make sure, replace this function:
Lua:
function SvargrondArena.startTimer(pitId)
    local tile = Tile(PITS[pitId].fromPos)
    if not tile then
        return
    end

    local timerItem = tile:getItemById(SvargrondArena.itemTimer)
    if timerItem then
        timerItem:remove()
    end

    timerItem = Game.createItem(SvargrondArena.itemTimer, 1, PITS[pitId].fromPos)
    if timerItem then
        timerItem:decay()
    end

    if SvargrondArena.timerEvents[pitId] then
        stopEvent(SvargrondArena.timerEvents[pitId])
    end
    SvargrondArena.timerEvents[pitId] = addEvent(SvargrondArena.removeTimer, SvargrondArena.kickTime * 1000, pitId)
end
to:
Lua:
function SvargrondArena.startTimer(pitId)
    print("pitID Value: " .. pitId)
    local tile = Tile(PITS[pitId].fromPos)
    if not tile then
        return
    end

    local timerItem = tile:getItemById(SvargrondArena.itemTimer)
    if timerItem then
        timerItem:remove()
    end

    timerItem = Game.createItem(SvargrondArena.itemTimer, 1, PITS[pitId].fromPos)
    if timerItem then
        timerItem:decay()
    end

    if SvargrondArena.timerEvents[pitId] then
        stopEvent(SvargrondArena.timerEvents[pitId])
    end
    SvargrondArena.timerEvents[pitId] = addEvent(SvargrondArena.removeTimer, SvargrondArena.kickTime * 1000, pitId)
end
and check the console server log what pitId return.

in my opinion just after analise this system there is missing setting pitId properly,

Lua:
player:setStorageValue(Storage.SvargrondArena.Pit, 0)
this is ALL for setting the correct arena from 1-10, so script return probably always index 0. while that Storage.SvargrondArena.Pit should increase after finish x arena. but maybe i am wrong? idk just few minutes analise after being drunk


anyway u can also avoid this error by checking if table exsist:
Lua:
function SvargrondArena.startTimer(pitId)

    local t = PITS[pitId]
    if not t then
       return
    end

    local tile = Tile(t.fromPos)
    if not tile then
        return
    end

    local timerItem = tile:getItemById(SvargrondArena.itemTimer)
    if timerItem then
        timerItem:remove()
    end

    timerItem = Game.createItem(SvargrondArena.itemTimer, 1, PITS[pitId].fromPos)
    if timerItem then
        timerItem:decay()
    end

    if SvargrondArena.timerEvents[pitId] then
        stopEvent(SvargrondArena.timerEvents[pitId])
    end

    SvargrondArena.timerEvents[pitId] = addEvent(SvargrondArena.removeTimer, SvargrondArena.kickTime * 1000, pitId)
end
Thank you for taking your time to help me.

So I did check pitid, its 1,2,3,4,5,6,7,8,9,10 from arena 1-10 and then after entering last portal it goes pitid 0 and thats when the error happens.

I did change that part of the table and the error didnt not come up when entering last tp after editing it, however now it's broken as the quest doesn't reset itself, so when I try to do next challenge stage after getting mission from Halvar the tp to get into the arena does not work.

Thanks for taking your time brother, I appreciate it.
 

Dakos

Well-Known Member
Joined
Jan 1, 2010
Messages
151
Solutions
22
Reaction score
79
arenapit.lua
replace to:
Lua:
local condition = Condition(CONDITION_OUTFIT)
condition:setTicks(120000)
condition:setOutfit({lookType = 111})

function onStepIn(creature, item, position, fromPosition)
    local player = creature:getPlayer()
    if not player then
        return true
    end

    local playerId = player.uid
    if item.actionid == 25300 then
        player:addCondition(condition)

        player:setStorageValue(Storage.SvargrondArena.Pit, 0)
        player:teleportTo(SvargrondArena.kickPosition)
        player:say('Coward!', TALKTYPE_MONSTER_SAY)
        SvargrondArena.cancelEvents(playerId)
        return true
    end

    local pitId = player:getStorageValue(Storage.SvargrondArena.Pit)
    local arenaId = player:getStorageValue(Storage.SvargrondArena.Arena)
    if pitId > 10 then
        player:teleportTo(SvargrondArena.rewardPosition)
        player:setStorageValue(Storage.SvargrondArena.Pit, 10)
        pitId = player:getStorageValue(Storage.SvargrondArena.Pit)
        if arenaId == 1 then
            SvargrondArena.rewardPosition:sendMagicEffect(CONST_ME_FIREWORK_BLUE)
            player:setStorageValue(Storage.SvargrondArena.Greenhorn, 1)
            player:say('Welcome back, little hero!', TALKTYPE_MONSTER_SAY)
        elseif arenaId == 2 then
            SvargrondArena.rewardPosition:sendMagicEffect(CONST_ME_FIREWORK_YELLOW)
            player:setStorageValue(Storage.SvargrondArena.Scrapper, 1)
            player:say('Congratulations, brave warrior!', TALKTYPE_MONSTER_SAY)
        elseif arenaId == 3 then
            SvargrondArena.rewardPosition:sendMagicEffect(CONST_ME_FIREWORK_RED)
            player:setStorageValue(Storage.SvargrondArena.Warlord, 1)
            player:say('Respect and honour to you, champion!', TALKTYPE_MONSTER_SAY)
        end

        player:setStorageValue(Storage.SvargrondArena.Arena, player:getStorageValue(Storage.SvargrondArena.Arena) + 1)
        player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, 'Congratulations! You completed ' .. ARENA[arenaId].name .. ' arena, you should take your reward now.')
        player:setStorageValue(ARENA[arenaId].questLog, 2)
        SvargrondArena.cancelEvents(playerId)
        player:setStorageValue(Storage.SvargrondArena.Pit, 0)
        return true
    end

    local occupant = SvargrondArena.getPitOccupant(pitId, player)
    if occupant then
        player:sendTextMessage(MESSAGE_EVENT_ADVANCE, occupant:getName() .. ' is currently in the next arena pit. Please wait until ' .. (occupant:getSex() == PLAYERSEX_FEMALE and 's' or '') .. 'he is done fighting.')
        player:teleportTo(fromPosition, true)
        return true
    end

    SvargrondArena.cancelEvents(playerId)
    SvargrondArena.resetPit(pitId)
    SvargrondArena.scheduleKickPlayer(playerId, pitId)
    Game.createMonster(ARENA[arenaId].creatures[pitId], PITS[pitId].summon, false, true)

    player:teleportTo(PITS[pitId].center)
    player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED)
    player:say('Fight!', TALKTYPE_MONSTER_SAY)
    return true
end
 
OP
OP
R

rdz92

Member
Joined
Apr 19, 2022
Messages
26
Reaction score
7
arenapit.lua
replace to:
Lua:
local condition = Condition(CONDITION_OUTFIT)
condition:setTicks(120000)
condition:setOutfit({lookType = 111})

function onStepIn(creature, item, position, fromPosition)
    local player = creature:getPlayer()
    if not player then
        return true
    end

    local playerId = player.uid
    if item.actionid == 25300 then
        player:addCondition(condition)

        player:setStorageValue(Storage.SvargrondArena.Pit, 0)
        player:teleportTo(SvargrondArena.kickPosition)
        player:say('Coward!', TALKTYPE_MONSTER_SAY)
        SvargrondArena.cancelEvents(playerId)
        return true
    end

    local pitId = player:getStorageValue(Storage.SvargrondArena.Pit)
    local arenaId = player:getStorageValue(Storage.SvargrondArena.Arena)
    if pitId > 10 then
        player:teleportTo(SvargrondArena.rewardPosition)
        player:setStorageValue(Storage.SvargrondArena.Pit, 10)
        pitId = player:getStorageValue(Storage.SvargrondArena.Pit)
        if arenaId == 1 then
            SvargrondArena.rewardPosition:sendMagicEffect(CONST_ME_FIREWORK_BLUE)
            player:setStorageValue(Storage.SvargrondArena.Greenhorn, 1)
            player:say('Welcome back, little hero!', TALKTYPE_MONSTER_SAY)
        elseif arenaId == 2 then
            SvargrondArena.rewardPosition:sendMagicEffect(CONST_ME_FIREWORK_YELLOW)
            player:setStorageValue(Storage.SvargrondArena.Scrapper, 1)
            player:say('Congratulations, brave warrior!', TALKTYPE_MONSTER_SAY)
        elseif arenaId == 3 then
            SvargrondArena.rewardPosition:sendMagicEffect(CONST_ME_FIREWORK_RED)
            player:setStorageValue(Storage.SvargrondArena.Warlord, 1)
            player:say('Respect and honour to you, champion!', TALKTYPE_MONSTER_SAY)
        end

        player:setStorageValue(Storage.SvargrondArena.Arena, player:getStorageValue(Storage.SvargrondArena.Arena) + 1)
        player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, 'Congratulations! You completed ' .. ARENA[arenaId].name .. ' arena, you should take your reward now.')
        player:setStorageValue(ARENA[arenaId].questLog, 2)
        SvargrondArena.cancelEvents(playerId)
        player:setStorageValue(Storage.SvargrondArena.Pit, 0)
        return true
    end

    local occupant = SvargrondArena.getPitOccupant(pitId, player)
    if occupant then
        player:sendTextMessage(MESSAGE_EVENT_ADVANCE, occupant:getName() .. ' is currently in the next arena pit. Please wait until ' .. (occupant:getSex() == PLAYERSEX_FEMALE and 's' or '') .. 'he is done fighting.')
        player:teleportTo(fromPosition, true)
        return true
    end

    SvargrondArena.cancelEvents(playerId)
    SvargrondArena.resetPit(pitId)
    SvargrondArena.scheduleKickPlayer(playerId, pitId)
    Game.createMonster(ARENA[arenaId].creatures[pitId], PITS[pitId].summon, false, true)

    player:teleportTo(PITS[pitId].center)
    player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED)
    player:say('Fight!', TALKTYPE_MONSTER_SAY)
    return true
end

After entering final tp I get this error:
Lua Script Error: [MoveEvents Interface]
data/movements/scripts/quests/svargrond arena/arenaPit.lua:eek:nStepIn
data/movements/scripts/quests/svargrond arena/arenaPit.lua:60: attempt to index a nil value
stack traceback:
[C]: in function '__index'
data/movements/scripts/quests/svargrond arena/arenaPit.lua:60: in function <data/movements/scripts/quests/svargrond arena/arenaPit.lua:5>

and it still does not reset arena :/ gives following error when trying to enter tp after accepting 2nd arena mission from Halvar:
Lua Script Error: [MoveEvents Interface]
data/movements/scripts/quests/svargrond arena/arenaEnter.lua:eek:nStepIn
data/lib/quests/svargrond_arena.lua:319: attempt to index a nil value
stack traceback:
[C]: in function '__index'
data/lib/quests/svargrond_arena.lua:319: in function 'removeTimer'
data/lib/quests/svargrond_arena.lua:276: in function 'cancelEvents'
data/lib/quests/svargrond_arena.lua:283: in function 'scheduleKickPlayer'
.../movements/scripts/quests/svargrond arena/arenaEnter.lua:28: in function <.../movements/scripts/quests/svargrond arena/arenaEnter.lua:1>

Here is my arenaEnter.lua:
Lua:
function onStepIn(creature, item, position, fromPosition)
    local player = creature:getPlayer()
    if not player then
        return true
    end

    local pitId = player:getStorageValue(Storage.SvargrondArena.Pit)
    if pitId < 1 or pitId > 10 then
        player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'You cannot enter without Halvar\'s permission.')
        player:teleportTo(fromPosition)
        return true
    end

    local arenaId = player:getStorageValue(Storage.SvargrondArena.Arena)
    if not(PITS[pitId] and ARENA[arenaId]) then
        player:teleportTo(fromPosition)
        return true
    end

    local occupant = SvargrondArena.getPitOccupant(pitId, player)
    if occupant then
        player:sendTextMessage(MESSAGE_EVENT_ADVANCE, occupant:getName() .. ' is currently in the next arena pit. Please wait until ' .. (occupant:getSex() == PLAYERSEX_FEMALE and 's' or '') .. 'he is done fighting.')
        player:teleportTo(fromPosition)
        return true
    end

    SvargrondArena.resetPit(pitId)
    SvargrondArena.scheduleKickPlayer(player.uid, pitId)
    Game.createMonster(ARENA[arenaId].creatures[pitId], PITS[pitId].summon, false, true)

    player:teleportTo(PITS[pitId].center)
    player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED)
    player:say('FIGHT!', TALKTYPE_MONSTER_SAY)
    return true
end
 
Last edited:

Similar threads

Top