• 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!

MOD perfect Svargrond Arena System!

Been trying to figure this one out.. I removed all the old scripts and changed locations etc. However the doors worked at first but they stopped working after i removed the old script. I changed the ids of the doors in config but the teleportal is still not working. It says you have been kicked. The portals have action id 42300. I'm using the real map released by frankFarmer. Help would be strongly appreciated!
 
Great script, thank you!!

PS: NPC could be as good as the mod, ehn? :]
 
tfs 0.4

[13/01/2011 13:00:07] [error - npc interface]
[13/01/2011 13:00:07] data/npc/scripts/arena.lua:eek:ncreaturesay
[13/01/2011 13:00:07] description:
[13/01/2011 13:00:07] data/npc/scripts/arena.lua:79: Attempt to call global 'myarenalevelis' (a nil value)
[13/01/2011 13:00:07] stack traceback:
[13/01/2011 13:00:07] data/npc/scripts/arena.lua:79: In function <data/npc/scripts/arena.lua:55>
 
hello, I got the following error, I pay the npc it says it already can do just that when the arena will open the door the following message appears It is locked. and the doors have the following script ID 42357, thanks.
 
hello, I got the following error, I pay the npc it says it already can do just that when the arena will open the door the following message appears It is locked. and the doors have the following script ID 42357, thanks.

to everyone who have this same problem like this.

Edit NPC Arener not Halvar or make new npc in map Editor
 
When i killing monster Frostfur , my server its crashed don't know with what i have problem.



bdmod.jpg


PHP:
<?xml version="1.0" encoding="UTF-8"?>
<mod name="Arena Svargrond"

version="1.0" author="Tommy" contact="[email protected]" enabled="yes">

<config name="arenaFunctions"><![CDATA[
KickPosition = {x=32310, y=31149, z=7} --if the player leave the arena or time is over, where he go.
RewardsRoom = {x=32312, y=31134, z=6} --rewards room position.
arenaRoomMaxTime = 240 --max time for each room 240 = 4 min.
OpenDoorsID = 5127 --if you change doors item ids, change me =D


TimeStor = 42350 --here will be saved the time.
myArenaLevel = 45450 --here will be saved the arena level.
talkNPC = 45451 --Storage to check if the player have paid to the npc and can enter to the arena.
RewardsStor = {42361, 42371, 42381} --Storage for greenshore, scrapper, warlord.
isIN = 42352 --to check if the player is in the arena.
myRoom = 46000 --here will be saved the current room.
MonStor = 47000 --here will be saved the monster uid.


DoorsActID = 42357 --Doors near the npc.
LeavePortals = 42321 --The action id of the portal to leave the rooms (south portals).
GobletTiles = {42360, 42370, 42380} --Action ids of the tiles for Bronze, Silver and Gold Goblets.

Cancel = {
    --message when use door and have not paid to the npc.
    [1] = "You have not paid NPC yet.",
    --message when leave arena.
    [2] = "You have been kicked.!",
    --message when the player can't get the reward.
    [3] = "You can\'t get this item",
    --message when already got any reward.
    [4] = "It is empty.",
    --when try to open a reward door and haven't completed the level.
    [5] = "You have not finished this arena level.",
    --NPC answer if the player completed all arena levels.
    [6] = "You already did all the arena levels.",
    --message when time is over
    [7] = "The time is over.",
    --message when you can go to the next room, LoL >_> this is not a cancel btw.
    [8] = "You can go to the next room.",
    --when try to go to the next room and not killed the monster yet.
    [9] = "Kill the monster first",
    --when try to go to the next room but there is a player yet...this text will be PLAYERNAME + this text
    [10] = "is in the room yet."
    }

Completed = {
    [1] = "Congatulations! you have completed the arena in",
    --HERE WILL BE THE ARENA NAME.
    [2] = "difficulty!, now go and take your reward."}
    --then the message will be "Congatulations! you have completed the arena in greenshore/scrapper/warlord difficulty!, now go and take your reward."
    

Arena = {
    --greenshore
    [0] = {
        Cost = 10000, 
        LevelName = 'greenshore', 
        LevelNeeded = 30,
        Goblet = 5807
        },
    --scrapper
    [1] = {
        Cost = 50000,
        LevelName = 'scrapper',
        LevelNeeded = 50,
        Goblet = 5806
        },
    --warlord
    [2] = {
        Cost = 100000, 
        LevelName = 'warlord',    
        LevelNeeded = 80,
        Goblet = 5805
        }
    }


Rewards = {
    --greenshore
    --present with items.
    [42361] = {
        Stor = RewardsStor[1], 
        Cont = 1990,
        items = {7372, 6569, 6574, 2114},
        count = {1, 10, 1, 1}
        },
    --blacksteel sword.
    [42362] = {
        Stor = RewardsStor[1], 
        Cont = nil,
        item = 7406
        },
    --headchopper.
    [42363] = {
        Stor = RewardsStor[1], 
        Cont = nil,
        item = 7380
        },
    --orcish maul.
    [42364] = {
        Stor = RewardsStor[1], 
        Cont = nil,
        item = 7392
        },
    --backpack with items.
    [42365] = {
        Stor = RewardsStor[1], 
        Cont = 7342,
        items = {7365, 7364},
        count = {100, 100}
        },
    --scrapper
    --present with items.
    [42371] = {
        Stor = RewardsStor[2], 
        Cont = 1990,
        items = {7372, 6569, 6574, 7183},
        count = {1, 10, 1, 1}
        },
    --mystic blade.
    [42372] = {
        Stor = RewardsStor[2], 
        Cont = nil,
        item = 7384
        },
    --heroic axe.
    [42373] = {
        Stor = RewardsStor[2], 
        Cont = nil,
        item = 7389
        },
    --cranial basher
    [42374] = {
        Stor = RewardsStor[2], 
        Cont = nil,
        item = 7415
        },
    --backpack with items.
    [42375] = {
        Stor = RewardsStor[2], 
        Cont = 7342,
        items = {7365, 2547, 2547, 2311, 2304},
        count = {100, 100, 100, 50, 50}
        },
    --warlord
    --present with items.
    [42381] = {
        Stor = RewardsStor[3], 
        Cont = 1990,
        items = {7372, 6569, 6574, 6568},
        count = {1, 10, 1, 1}
        },
    --justice seeker
    [42382] = {
        Stor = RewardsStor[3], 
        Cont = nil,
        item = 7390
        },
    --royal axe.
    [42383] = {
        Stor = RewardsStor[3], 
        Cont = nil,
        item = 7434
        },
    --blessed sceptre.
    [42384] = {
        Stor = RewardsStor[3], 
        Cont = nil,
        item = 7429
        },
    --backpack with items.
    [42385] = {
        Stor = RewardsStor[3], 
        Cont = 7342,
        items = {2273, 2268, 7443, 7440, 7529},
        count = {50, 50, 1, 1, 100}
        }
    }

arena_monsters = {
    --greenshore                            -scrapper                            --warlord
    [45300] = "Frostfur",                [45310] = "Avalanche",            [45320] = "Webster",
    [45301] = "Bloodpaw",                [45311] = "Kreebosh the Exile",    [45321] = "Darakan the Executioner",
    [45302] = "Bovinus",                [45312] = "The Dark Dancer",    [45322] = "Norgle Glacierbeard",
    [45303] = "Achad",                    [45313] = "The Hag",            [45323] = "The Pit Lord",
    [45304] = "Colerian The Barbarian",    [45314] = "Slim",                [45324] = "Svoren the Mad",
    [45305] = "The Hairy One",            [45315] = "Grimgor Guteater",    [45325] = "The Masked Marauder",
    [45306] = "Axeitus Headbanger",        [45316] = "Drasilla",            [45326] = "Gnorre Chyllson",
    [45307] = "Rocky",                    [45317] = "Spirit of Earth",    [45327] = "Fallen Mooh'tah Master Ghar",
    [45308] = "Cursed Gladiator",        [45318] = "Spirit of Water",    [45328] = "Deathbringer",
    [45309] = "Orcus the Cruel",        [45319] = "Spirit of Fire",        [45329] = "The Obliverator"}

Checking = false

RoomsACT = {42301, 42302, 42303, 42304, 42305, 42306, 42307, 42308, 42309}

Goblets = {
    [42360] = {Id=Arena[0].Goblet, txt="It is given to the courageous victor of the barbarian arena "..Arena[0].LevelName.." difficulty."},
    [42370] = {Id=Arena[1].Goblet, txt="It is given to the courageous victor of the barbarian arena "..Arena[1].LevelName.." difficulty."},
    [42380] = {Id=Arena[2].Goblet, txt="It is given to the courageous victor of the barbarian arena "..Arena[2].LevelName.." difficulty."}}

RewardsDoors = {[42366] = 1, [42376] = 2, [42386] = 3}

ArenaAdding = {[0] = 3000, [1] = 3010, [2] = 3020}

function myArenaLevelIs(cid)
    Stor = getPlayerStorageValue(cid, myArenaLevel)
    if Stor == -1 then
        setPlayerStorageValue(cid, myArenaLevel, 0)
        Stor = 0
    elseif Stor == 3 then Stor = 2
    end
    return {
        RC = Arena[Stor].Cost, 
        LN = Arena[Stor].LevelName, 
        RLV = Arena[Stor].LevelNeeded,
        LV = getPlayerStorageValue(cid, myArenaLevel)
    }
end

function getDirectionMove(cid, itempos)
    --function by Nahruto
    p = getCreaturePosition(cid)
    i = itempos
    if p.x > i.x then
        if p.y > i.y then
            ret = NORTHWEST
        elseif p.y < i.y then
            ret = SOUTHWEST
        else
            ret = WEST
        end
    elseif p.x < i.x then
        if p.y > i.y then
            ret = NORTHEAST
        elseif p.y < i.y then
            ret = SOUTHEAST
        else
            ret = EAST
        end
    else
        if p.y > i.y then
            ret = NORTH
        elseif p.y < i.y then
            ret = SOUTH
        else
            ret = nil
        end
    end
    return ret
end

function LeaveArena(cid)
    for i = 45300, 45329 do
        setPlayerStorageValue(cid, i, 0)
    end
    if isCreature(getPlayerStorageValue(cid, MonStor)) == TRUE then
        doRemoveCreature(getPlayerStorageValue(cid, MonStor))
    end
    setGlobalStorageValue(getPlayerStorageValue(cid, myRoom), 0)
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, Cancel[2])
    doTeleportThing(cid, KickPosition, FALSE)
    setPlayerStorageValue(cid, TimeStor, 0)
    setPlayerStorageValue(cid, isIN, 0)
end

function CheckRooms()
    addEvent(CheckRooms, 1000)
    for i = 42300, 42309 do
        local Player = getGlobalStorageValue(i)
        if isPlayer(Player) == TRUE then
            local PlayerTime = getPlayerStorageValue(Player, TimeStor)
            if PlayerTime <= os.time() then
                doTeleportThing(Player, KickPosition, FALSE)
                setPlayerStorageValue(Player, TimeStor, 0)
                setGlobalStorageValue(i, 0)
                doPlayerSendTextMessage(Player,MESSAGE_STATUS_CONSOLE_ORANGE, Cancel[7])
                if isCreature(getPlayerStorageValue(Player, MonStor)) == TRUE then
                    doRemoveCreature(getPlayerStorageValue(Player, MonStor))
                end
            elseif PlayerTime - 10 <= os.time() then
                doPlayerSendTextMessage(Player, MESSAGE_EVENT_DEFAULT, "you have "..PlayerTime - os.time().." seconds left.!")
            end
        else
            setGlobalStorageValue(i, 0)
        end
    end
end

function getArenaMonsterIdByName(name)
    for i = 45300, 45329 do
        if tostring(arena_monsters[i]) == string.lower(tostring(name)) then
            return i
        end
    end
    return false
end]]></config>
        <event type="login" name="arenaRegister" event="script"><![CDATA[
        domodlib('arenaFunctions')
        function onLogin(cid)
    registerCreatureEvent(cid, "PlayerArena")
    registerCreatureEvent(cid, "ArenaKill")
        return true
end]]></event>

<event type="death" name="PlayerArena" event="script"><![CDATA[
    domodlib('arenaFunctions')
    function onDeath(cid, corpse, deathList)
        if getPlayerStorageValue(cid, isIN) == 1 then
            I = 0        
            for i = 45300, 45329 do
                if getPlayerStorageValue(cid, i) == 1 then
                    I = i
                end
            end
            GlobalStor = I - ArenaAdding[myArenaLevelIs(cid).LV]
            setGlobalStorageValue(GlobalStor, 0)
            setPlayerStorageValue(cid, isIN, 0)
            if isCreature(getPlayerStorageValue(cid, MonStor)) then
                doRemoveCreature(getPlayerStorageValue(cid, MonStor))
            end
        end
        return true
    end
]]></event> 

        <event type="kill" name="ArenaKill" event="script"><![CDATA[
        domodlib('arenaFunctions')
function onKill(cid, target, lastHit)
    if getPlayerStorageValue(cid, isIN) == 1 then
        local Room = getArenaMonsterIdByName(getCreatureName(target))
        if Room ~= 0 then
            setPlayerStorageValue(cid, Room, 1)
            doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, Cancel[8])
        end
       end
        return true
end]]></event>

        <action fromaid="42357" toaid="42386" event="script"><![CDATA[
        domodlib('arenaFunctions')
function onUse(cid, item, fromPosition, itemEx, toPosition)
    local myMove = getDirectionMove(cid, fromPosition)

    if myMove == nil then

        return FALSE

    end

    local Reward = Rewards[item.actionid]

    if Reward then

        if getPlayerStorageValue(cid, Reward.Stor) ~= 1 then

            local reward = nil

            if Reward.Cont ~= nil then

                reward = doCreateItemEx(Reward.Cont, 1)

                for i = 1, #Reward.items do

                    doAddContainerItem(reward, Reward.items[i], Reward.count[i])

                end

            else

                reward = doCreateItemEx(Reward.item, 1)

            end

            if reward ~= nil then

                if doPlayerAddItemEx(cid, reward, FALSE) == RETURNVALUE_NOERROR then

                    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR,'You have found a '..getItemNameById(getThing(reward).itemid)..'.')

                    setPlayerStorageValue(cid, Reward.Stor, 1)

                                addPlayerRep(cid, 5, TEXTCOLOR_LIGHTBLUE)

                else

                    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, Cancel[3])

                end

            end

        else

            doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, Cancel[4])

        end

    elseif RewardsDoors[item.actionid] then

        if myArenaLevelIs(cid).LV >= RewardsDoors[item.actionid] then

            doTransformItem(item.uid, OpenDoorsID)

            doMoveCreature(cid, myMove)

        else

            doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, Cancel[5])

        end

    elseif item.actionid == DoorsActID and getPlayerStorageValue(cid, talkNPC) == 1 then

        doTransformItem(item.uid, OpenDoorsID)

        doMoveCreature(cid, myMove)

    else

        doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, Cancel[1])
end

    return TRUE

end]]></action>

    <movevent type="StepIn" fromaid="42300" toaid="42380" event="script"><![CDATA[
        domodlib('arenaFunctions')
function onStepIn(cid, item, position, fromPosition)
    local ArenaRoom = item.actionid

    if item.actionid == LeavePortals then

        LeaveArena(cid)

    elseif isInArray(GobletTiles, item.actionid) == TRUE then

        local gobletPos = getThingPos(item.uid)

        if getPlayerStorageValue(cid, item.actionid) ~= 1 then

            setPlayerStorageValue(cid, item.actionid, 1)

            local Goblet = doCreateItemEx(Goblets[item.actionid].Id, 1)

            doItemSetAttribute(Goblet, "description", ""..Goblets[item.actionid].txt.."\nAwarded to "..getCreatureName(cid)..".")

            gobletPos.y = gobletPos.y - 1

            doTileAddItemEx(gobletPos, Goblet)

        end

        doTransformItem(item.uid, item.itemid - 1)

    elseif isInArray(RoomsACT, ArenaRoom) == TRUE or ArenaRoom == 42300 then

        if Checking == FALSE then Checking = TRUE CheckRooms() end

        local myLevelArena = myArenaLevelIs(cid).LV

        if ArenaAdding[myLevelArena] then

            Mons = ArenaRoom + ArenaAdding[myLevelArena]

        end

        if getGlobalStorageValue(ArenaRoom) == 0 then

            if isCreature(getPlayerStorageValue(cid, MonStor)) == FALSE then

                if ArenaRoom == 42300 and getPlayerStorageValue(cid, talkNPC) == 1 then

                    setPlayerStorageValue(cid, talkNPC, 0)

                    setPlayerStorageValue(cid, isIN, 1)

                    P = 1

                elseif ArenaRoom ~= 42300 and getPlayerStorageValue(cid, isIN) == 1 then

                    P = 1

                else 

                    P = nil

                end        

                if P ~= nil then

                    local SpawnPos = getThingPos(ArenaRoom)

                    doTeleportThing(cid, SpawnPos, FALSE)

                    SpawnPos.x = SpawnPos.x - 1

                    SpawnPos.y = SpawnPos.y - 1

                    local Monster = doSummonCreature(arena_monsters[Mons], SpawnPos)

                    setGlobalStorageValue(ArenaRoom, cid)

                    setGlobalStorageValue(ArenaRoom - 1, 0)

                    setPlayerStorageValue(cid, TimeStor, os.time()+arenaRoomMaxTime)

                    setPlayerStorageValue(cid, MonStor, Monster)

                    setPlayerStorageValue(cid, myRoom, ArenaRoom)

                else

                    LeaveArena(cid)

                end

            else

                doTeleportThing(cid, fromPosition, TRUE)

                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, Cancel[9])

            end

        else

            doTeleportThing(cid, fromPosition, TRUE)

            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, ""..getCreatureName(getGlobalStorageValue(cid, ArenaRoom)).." "..Cancel[10].."")

        end

    elseif ArenaRoom == 42310 then

        if isCreature(getPlayerStorageValue(cid, MonStor)) == FALSE then

            doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_BLUE,""..Completed[1].." "..myArenaLevelIs(cid).LN.." "..Completed[2].."")

            setPlayerStorageValue(cid, myArenaLevel, getPlayerStorageValue(cid, myArenaLevel) + 1)

            setGlobalStorageValue(ArenaRoom - 1, 0)

            setPlayerStorageValue(cid, TimeStor, 0)

            setPlayerStorageValue(cid, isIN, 0)

            doTeleportThing(cid, RewardsRoom, TRUE)

        else

            doTeleportThing(cid, fromPosition, TRUE)

            doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_ORANGE,'Najpierw zabij potwora!')

        end

    end

    return TRUE

end]]></movevent>

    <movevent type="StepOut" fromaid="42357" toaid="42387" event="script"><![CDATA[
        domodlib('arenaFunctions')
function onStepOut(cid, item, position, fromPosition)

    if item.actionid == DoorsActID or RewardsDoors[item.actionid] then

        doTransformItem(item.uid, item.itemid - 2)

    elseif isInArray(GobletTiles, item.actionid) == TRUE then

        doTransformItem(item.uid, item.itemid + 1)
        end

    return TRUE

end]]></movevent>

</mod>
 
Code:
[20:22:08.078] [Error - Action Interface]
[20:22:08.078] domodlib('arenaFunctions')
[20:22:08.078] function onUse(cid, item, fromPosition, itemEx, toPosition)
[20:22:08.078]     local myMove = getDirectionMove(cid, fromPosition)

[20:22:08.078]     if myMove == nil then

[20:22:08.078]         return FALSE

[20:22:08.078]     end

[20:22:08.078]     local Reward = Rewards[item.actionid]

[20:22:08.078]     if Reward then

[20:22:08.078]         if getPlayerStorageValue(cid, Reward.Stor) ~= 1 then

[20:22:08.078]             local reward = nil

[20:22:08.078]             if Reward.Cont ~= nil then

[20:22:08.078]                 reward = doCreateItemEx(Reward.Cont, 1)

[20:22:08.078]                 for i = 1, #Reward.items do

[20:22:08.078]                     doAddContainerItem(reward, Reward.items[i], R
eward.count[i])

[20:22:08.078]                 end

[20:22:08.078]             else

[20:22:08.078]                 reward = doCreateItemEx(Reward.item, 1)

[20:22:08.078]             end

[20:22:08.093]             if reward ~= nil then

[20:22:08.093]                 if doPlayerAddItemEx(cid, reward, FALSE) == RETUR
NVALUE_NOERROR then

[20:22:08.093]                     doPlayerSendTextMessage(cid, MESSAGE_INFO_DES
CR,'You have found a '..getItemNameById(getThing(reward).itemid)..'.')

[20:22:08.093]                     setPlayerStorageValue(cid, Reward.Stor, 1)

[20:22:08.093]                                 addPlayerRep(cid, 5, TEXTCOLOR_LI
GHTBLUE)

[20:22:08.093]                 else

[20:22:08.093]                     doPlayerSendTextMessage(cid, MESSAGE_INFO_DES
CR, Cancel[3])

[20:22:08.093]                 end

[20:22:08.093]             end

[20:22:08.093]         else

[20:22:08.093]             doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, Canc
el[4])

[20:22:08.093]         end

[20:22:08.093]     elseif RewardsDoors[item.actionid] then

[20:22:08.093]         if myArenaLevelIs(cid).LV >= RewardsDoors[item.actionid]
then

[20:22:08.093]             doTransformItem(item.uid, OpenDoorsID)

[20:22:08.093]             doMoveCreature(cid, myMove)

[20:22:08.093]         else

[20:22:08.093]             doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, Canc
el[5])

[20:22:08.093]         end

[20:22:08.093]     elseif item.actionid == DoorsActID and getPlayerStorageValue(
cid, talkNPC) == 1 then

[20:22:08.093]         doTransformItem(item.uid, OpenDoorsID)

[20:22:08.093]         doMoveCreature(cid, myMove)

[20:22:08.093]     else

[20:22:08.093]         doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, Cancel[1
])
[20:22:08.093] end

[20:22:08.093]     return TRUE

[20:22:08.093] end:onUse
[20:22:08.093] Description:
[20:22:08.093] [string "LuaInterface::loadBuffer"]:43: attempt to call global 'a
ddPlayerRep' (a nil value)
[20:22:08.093] stack traceback:
[20:22:08.093]  [string "LuaInterface::loadBuffer"]:43: in function <[string "Lu
aInterface::loadBuffer"]:2>

and

Code:
[20:34:53.468] [Error - Action Interface]
[20:34:53.468] data/actions/scripts/other/doors.lua:onUse
[20:34:53.468] Description:
[20:34:53.468] (luaDoTransformItem) Item not found

[20:34:58.109] [Error - Action Interface]
[20:34:58.109] data/actions/scripts/other/doors.lua:onUse
[20:34:58.109] Description:
[20:34:58.109] (luaDoTransformItem) Item not found
 
Yeah, this is ridiculous, I just fuc*** can't make an arena quest log work <_<

Here's my quests.xml arena part:

Lua:
			<quest name="The Arena" startstorageid="45450" startstoragevalue="0" endvalue="1">
        <mission name="Arena Combatant" storageid="45450" startvalue="-1" endvalue="10">
            <missionstate id="0" description="You've entered the arena as combatant."/>
        </mission>
		       <mission name="Greenshore difficulty" storageid="51345" startvalue="0" endvalue="1">
            <missionstate id="0" description="You've completed the arena in the Greenshore difficulty"/>
        </mission>
			<mission name="Scrapper difficulty" storageid="51346" startvalue="0" endvalue="1">
            <missionstate id="0" description="You've completed the arena in the Scrapper difficulty"/>
        </mission>
			<mission name="Warlord difficulty" storageid="51347" startvalue="0" endvalue="1">
            <missionstate id="0" description="You've completed the arena in the Warlord difficulty"/>
        </mission>
		<mission name="Arena Master" storageid="51348" startvalue="0" endvalue="1">
            <missionstate id="0" description="You've mastered all difficulty levels in the arena, congratulations!"/>
        </mission>
		    </quest>

And my little bit modified arena mod:

Lua:
<?xml version="1.0" encoding="UTF-8"?>
<mod name="Arena Svargrond"

version="1.0" author="Tommy" contact="[email protected]" enabled="yes">

<config name="arenaFunctions"><![CDATA[
KickPosition = {x=32222, y=31080, z=6} --if the player leave the arena or time is over, where he go.
RewardsRoom = {x=32222, y=31080, z=6} --rewards room position.
arenaRoomMaxTime = 240 --max time for each room 240 = 4 min.
OpenDoorsID = 5133 --if you change doors item ids, change me =D


TimeStor = 42350 --here will be saved the time.
myArenaLevel = 45450 --here will be saved the arena level.
talkNPC = 45451 --Storage to check if the player have paid to the npc and can enter to the arena.
RewardsStor = {42361, 42371, 42381} --Storage for greenshore, scrapper, warlord.
isIN = 42352 --to check if the player is in the arena.
myRoom = 46000 --here will be saved the current room.
MonStor = 47000 --here will be saved the monster uid.


DoorsActID = 42357 --Doors near the npc.
LeavePortals = 42321 --The action id of the portal to leave the rooms (south portals).
GobletTiles = {42360, 42370, 42380} --Action ids of the tiles for Bronze, Silver and Gold Goblets.

Cancel = {
    --message when use door and have not paid to the npc.
    [1] = "You have not paid NPC yet.",
    --message when leave arena.
    [2] = "You have been kicked.!",
    --message when the player can't get the reward.
    [3] = "You can\'t get this item",
    --message when already got any reward.
    [4] = "It is empty.",
    --when try to open a reward door and haven't completed the level.
    [5] = "You have not finished this arena level.",
    --NPC answer if the player completed all arena levels.
    [6] = "You already did all the arena levels.",
    --message when time is over
    [7] = "The time is over.",
    --message when you can go to the next room, LoL >_> this is not a cancel btw.
    [8] = "You can go to the next room.",
    --when try to go to the next room and not killed the monster yet.
    [9] = "Kill the monster first",
    --when try to go to the next room but there is a player yet...this text will be PLAYERNAME + this text
    [10] = "is in the room yet."
    }

Completed = {
    [1] = "Congatulations! you have completed the arena in",
    --HERE WILL BE THE ARENA NAME.
    [2] = "difficulty!, now go and take your reward."}
    --then the message will be "Congatulations! you have completed the arena in greenshore/scrapper/warlord difficulty!, now go and take your reward."
    

Arena = {
    --greenshore
    [0] = {
        Cost = 1000, 
        LevelName = 'greenshore', 
        LevelNeeded = 30,
        Goblet = 5807
        },
    --scrapper
    [1] = {
        Cost = 5000,
        LevelName = 'scrapper',
        LevelNeeded = 50,
        Goblet = 5806
        },
    --warlord
    [2] = {
        Cost = 10000, 
        LevelName = 'warlord',    
        LevelNeeded = 80,
        Goblet = 5805
        }
    }
	
greenshore_storage = 51345
scrapper_storage = 51346
warlord_storage = 51347
final_storage = 51348


Rewards = {
    --greenshore
    --present with items.
    [42361] = {
        Stor = RewardsStor[1], 
        Cont = 1990,
        items = {7372, 6569, 6574, 2114},
        count = {1, 10, 1, 1}
        },
    --blacksteel sword.
    [42362] = {
        Stor = RewardsStor[1], 
        Cont = nil,
        item = 7406
        },
    --headchopper.
    [42363] = {
        Stor = RewardsStor[1], 
        Cont = nil,
        item = 7380
        },
    --orcish maul.
    [42364] = {
        Stor = RewardsStor[1], 
        Cont = nil,
        item = 7392
        },
    --backpack with items.
    [42365] = {
        Stor = RewardsStor[1], 
        Cont = 7342,
        items = {7365, 7364},
        count = {100, 100}
        },
    --scrapper
    --present with items.
    [42371] = {
        Stor = RewardsStor[2], 
        Cont = 1990,
        items = {7372, 6569, 6574, 7183},
        count = {1, 10, 1, 1}
        },
    --mystic blade.
    [42372] = {
        Stor = RewardsStor[2], 
        Cont = nil,
        item = 7384
        },
    --heroic axe.
    [42373] = {
        Stor = RewardsStor[2], 
        Cont = nil,
        item = 7389
        },
    --cranial basher
    [42374] = {
        Stor = RewardsStor[2], 
        Cont = nil,
        item = 7415
        },
    --backpack with items.
    [42375] = {
        Stor = RewardsStor[2], 
        Cont = 7342,
        items = {7365, 2547, 2547, 2311, 2304},
        count = {100, 100, 100, 50, 50}
        },
    --warlord
    --present with items.
    [42381] = {
        Stor = RewardsStor[3], 
        Cont = 1990,
        items = {7372, 6569, 6574, 6568},
        count = {1, 10, 1, 1}
        },
    --justice seeker
    [42382] = {
        Stor = RewardsStor[3], 
        Cont = nil,
        item = 7390
        },
    --royal axe.
    [42383] = {
        Stor = RewardsStor[3], 
        Cont = nil,
        item = 7434
        },
    --blessed sceptre.
    [42384] = {
        Stor = RewardsStor[3], 
        Cont = nil,
        item = 7429
        },
    --backpack with items.
    [42385] = {
        Stor = RewardsStor[3], 
        Cont = 7342,
        items = {2273, 2268, 7443, 7440, 7529},
        count = {50, 50, 1, 1, 100}
        }
    }

arena_monsters = {
    --greenshore                            -scrapper                            --warlord
    [45300] = "Frostfur",                [45310] = "Avalanche",            [45320] = "Webster",
    [45301] = "Bloodpaw",                [45311] = "Kreebosh the Exile",    [45321] = "Darakan the Executioner",
    [45302] = "Bovinus",                [45312] = "The Dark Dancer",    [45322] = "Norgle Glacierbeard",
    [45303] = "Achad",                    [45313] = "The Hag",            [45323] = "The Pit Lord",
    [45304] = "Colerian The Barbarian",    [45314] = "Slim",                [45324] = "Svoren the Mad",
    [45305] = "The Hairy One",            [45315] = "Grimgor Guteater",    [45325] = "The Masked Marauder",
    [45306] = "Axeitus Headbanger",        [45316] = "Drasilla",            [45326] = "Gnorre Chyllson",
    [45307] = "Rocky",                    [45317] = "Spirit of Earth",    [45327] = "Fallen Mooh'tah Master Ghar",
    [45308] = "Cursed Gladiator",        [45318] = "Spirit of Water",    [45328] = "Deathbringer",
    [45309] = "Orcus the Cruel",        [45319] = "Spirit of Fire",        [45329] = "The Obliverator"}

Checking = false

RoomsACT = {42301, 42302, 42303, 42304, 42305, 42306, 42307, 42308, 42309}

Goblets = {
    [42360] = {Id=Arena[0].Goblet, txt="It is given to the courageous victor of the barbarian arena "..Arena[0].LevelName.." difficulty."},
    [42370] = {Id=Arena[1].Goblet, txt="It is given to the courageous victor of the barbarian arena "..Arena[1].LevelName.." difficulty."},
    [42380] = {Id=Arena[2].Goblet, txt="It is given to the courageous victor of the barbarian arena "..Arena[2].LevelName.." difficulty."}}

RewardsDoors = {[42366] = 1, [42376] = 2, [42386] = 3}

ArenaAdding = {[0] = 3000, [1] = 3010, [2] = 3020}

function myArenaLevelIs(cid)
    Stor = getPlayerStorageValue(cid, myArenaLevel)
    if Stor == -1 then
        setPlayerStorageValue(cid, myArenaLevel, 0)
        Stor = 0
    elseif Stor == 3 then Stor = 2
    end
    return {
        RC = Arena[Stor].Cost, 
        LN = Arena[Stor].LevelName, 
        RLV = Arena[Stor].LevelNeeded,
        LV = getPlayerStorageValue(cid, myArenaLevel)
    }
end

function getDirectionMove(cid, itempos)
    --function by Nahruto
    p = getCreaturePosition(cid)
    i = itempos
    if p.x > i.x then
        if p.y > i.y then
            ret = NORTHWEST
        elseif p.y < i.y then
            ret = SOUTHWEST
        else
            ret = WEST
        end
    elseif p.x < i.x then
        if p.y > i.y then
            ret = NORTHEAST
        elseif p.y < i.y then
            ret = SOUTHEAST
        else
            ret = EAST
        end
    else
        if p.y > i.y then
            ret = NORTH
        elseif p.y < i.y then
            ret = SOUTH
        else
            ret = nil
        end
    end
    return ret
end

function LeaveArena(cid)
    for i = 45300, 45329 do
        setPlayerStorageValue(cid, i, 0)
    end
    if isCreature(getPlayerStorageValue(cid, MonStor)) == TRUE then
        doRemoveCreature(getPlayerStorageValue(cid, MonStor))
    end
    setGlobalStorageValue(getPlayerStorageValue(cid, myRoom), 0)
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, Cancel[2])
    doTeleportThing(cid, KickPosition, FALSE)
    setPlayerStorageValue(cid, TimeStor, 0)
    setPlayerStorageValue(cid, isIN, 0)
end

function CheckRooms()
    addEvent(CheckRooms, 1000)
    for i = 42300, 42309 do
        local Player = getGlobalStorageValue(i)
        if isPlayer(Player) == TRUE then
            local PlayerTime = getPlayerStorageValue(Player, TimeStor)
            if PlayerTime <= os.time() then
                doTeleportThing(Player, KickPosition, FALSE)
                setPlayerStorageValue(Player, TimeStor, 0)
                setGlobalStorageValue(i, 0)
                doPlayerSendTextMessage(Player,MESSAGE_STATUS_CONSOLE_ORANGE, Cancel[7])
                if isCreature(getPlayerStorageValue(Player, MonStor)) == TRUE then
                    doRemoveCreature(getPlayerStorageValue(Player, MonStor))
                end
            elseif PlayerTime - 10 <= os.time() then
                doPlayerSendTextMessage(Player, MESSAGE_EVENT_DEFAULT, "you have "..PlayerTime - os.time().." seconds left.!")
            end
        else
            setGlobalStorageValue(i, 0)
        end
    end
end

function getArenaMonsterIdByName(name)
    for i = 45300, 45329 do
        if tostring(arena_monsters[i]) == string.lower(tostring(name)) then
            return i
        end
    end
    return false
end]]></config>
        <event type="login" name="arenaRegister" event="script"><![CDATA[
        domodlib('arenaFunctions')
        function onLogin(cid)
    registerCreatureEvent(cid, "PlayerArena")
    registerCreatureEvent(cid, "ArenaKill")
        return true
end]]></event>

<event type="death" name="PlayerArena" event="script"><![CDATA[
    domodlib('arenaFunctions')
    function onDeath(cid, corpse, deathList)
        if getPlayerStorageValue(cid, isIN) == 1 then
            I = 0        
            for i = 45300, 45329 do
                if getPlayerStorageValue(cid, i) == 1 then
                    I = i
                end
            end
            GlobalStor = I - ArenaAdding[myArenaLevelIs(cid).LV]
            setGlobalStorageValue(GlobalStor, 0)
            setPlayerStorageValue(cid, isIN, 0)
            if isCreature(getPlayerStorageValue(cid, MonStor)) then
                doRemoveCreature(getPlayerStorageValue(cid, MonStor))
            end
        end
        return true
    end
]]></event> 

        <event type="kill" name="ArenaKill" event="script"><![CDATA[
        domodlib('arenaFunctions')
function onKill(cid, target, lastHit)
    if getPlayerStorageValue(cid, isIN) == 1 then
        local Room = getArenaMonsterIdByName(getCreatureName(target))
        if Room ~= 0 then
            setPlayerStorageValue(cid, Room, 1)
            doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, Cancel[8])
        end
       end
        return true
end]]></event>

        <action fromaid="42357" toaid="42386" event="script"><![CDATA[
        domodlib('arenaFunctions')
function onUse(cid, item, fromPosition, itemEx, toPosition)
    local myMove = getDirectionMove(cid, fromPosition)

    if myMove == nil then

        return FALSE

    end

    local Reward = Rewards[item.actionid]

    if Reward then

        if getPlayerStorageValue(cid, Reward.Stor) ~= 1 then

            local reward = nil

            if Reward.Cont ~= nil then

                reward = doCreateItemEx(Reward.Cont, 1)

                for i = 1, #Reward.items do

                    doAddContainerItem(reward, Reward.items[i], Reward.count[i])

                end

            else

                reward = doCreateItemEx(Reward.item, 1)

            end

            if reward ~= nil then

                if doPlayerAddItemEx(cid, reward, FALSE) == RETURNVALUE_NOERROR then

                    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR,'You have found a '..getItemNameById(getThing(reward).itemid)..'.')

                    setPlayerStorageValue(cid, Reward.Stor, 1)

                else

                    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, Cancel[3])

                end

            end

        else

            doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, Cancel[4])

        end

    elseif RewardsDoors[item.actionid] then

        if myArenaLevelIs(cid).LV >= RewardsDoors[item.actionid] then

            doTransformItem(item.uid, OpenDoorsID)

            doMoveCreature(cid, myMove)

        else

            doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, Cancel[5])

        end

    elseif item.actionid == DoorsActID and getPlayerStorageValue(cid, talkNPC) == 1 then

        doTransformItem(item.uid, OpenDoorsID)

        doMoveCreature(cid, myMove)

    else

        doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, Cancel[1])
end

    return TRUE

end]]></action>

    <movevent type="StepIn" fromaid="42300" toaid="42380" event="script"><![CDATA[
        domodlib('arenaFunctions')
function onStepIn(cid, item, position, fromPosition)
    local ArenaRoom = item.actionid

    if item.actionid == LeavePortals then

        LeaveArena(cid)

    elseif isInArray(GobletTiles, item.actionid) == TRUE then

        local gobletPos = getThingPos(item.uid)

        if getPlayerStorageValue(cid, item.actionid) ~= 1 then

            setPlayerStorageValue(cid, item.actionid, 1)

            local Goblet = doCreateItemEx(Goblets[item.actionid].Id, 1)

            doItemSetAttribute(Goblet, "description", ""..Goblets[item.actionid].txt.."\nAwarded to "..getCreatureName(cid)..".")

            gobletPos.y = gobletPos.y - 1

            doTileAddItemEx(gobletPos, Goblet)

        end

        doTransformItem(item.uid, item.itemid - 1)

    elseif isInArray(RoomsACT, ArenaRoom) == TRUE or ArenaRoom == 42300 then

        if Checking == FALSE then Checking = TRUE CheckRooms() end

        local myLevelArena = myArenaLevelIs(cid).LV

        if ArenaAdding[myLevelArena] then

            Mons = ArenaRoom + ArenaAdding[myLevelArena]

        end

        if getGlobalStorageValue(ArenaRoom) == 0 then

            if isCreature(getPlayerStorageValue(cid, MonStor)) == FALSE then

                if ArenaRoom == 42300 and getPlayerStorageValue(cid, talkNPC) == 1 then

                    setPlayerStorageValue(cid, talkNPC, 0)

                    setPlayerStorageValue(cid, isIN, 1)

                    P = 1

                elseif ArenaRoom ~= 42300 and getPlayerStorageValue(cid, isIN) == 1 then

                    P = 1

                else 

                    P = nil

                end        

                if P ~= nil then

                    local SpawnPos = getThingPos(ArenaRoom)

                    doTeleportThing(cid, SpawnPos, FALSE)

                    SpawnPos.x = SpawnPos.x - 1

                    SpawnPos.y = SpawnPos.y - 1

                    local Monster = doSummonCreature(arena_monsters[Mons], SpawnPos)

                    setGlobalStorageValue(ArenaRoom, cid)

                    setGlobalStorageValue(ArenaRoom - 1, 0)

                    setPlayerStorageValue(cid, TimeStor, os.time()+arenaRoomMaxTime)

                    setPlayerStorageValue(cid, MonStor, Monster)

                    setPlayerStorageValue(cid, myRoom, ArenaRoom)

                else

                    LeaveArena(cid)

                end

            else

                doTeleportThing(cid, fromPosition, TRUE)

                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, Cancel[9])

            end

        else

            doTeleportThing(cid, fromPosition, TRUE)

            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, ""..getCreatureName(getGlobalStorageValue(cid, ArenaRoom)).." "..Cancel[10].."")

        end

    elseif ArenaRoom == 42310 then

        if isCreature(getPlayerStorageValue(cid, MonStor)) == FALSE then

            doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_BLUE,""..Completed[1].." "..myArenaLevelIs(cid).LN.." "..Completed[2].."")

            setPlayerStorageValue(cid, myArenaLevel, getPlayerStorageValue(cid, myArenaLevel) + 1)
			
			if getPlayerStorageValue(cid, myArenaLevel == 0) then
			setPlayerStorageValue(cid, greenshore_storage,1)
			end
			if getPlayerStorageValue(cid, myArenaLevel == 1) then
			setPlayerStorageValue(cid, scrapper_storage,1)
			end
			if getPlayerStorageValue(cid, myArenaLevel == 2) then
			setPlayerStorageValue(cid, warlord_storage,1)
			end
			if getPlayerStorageValue(cid, myArenaLevel == 3) then
			setPlayerStorageValue(cid, final_storage,1)
			end

            setGlobalStorageValue(ArenaRoom - 1, 0)

            setPlayerStorageValue(cid, TimeStor, 0)

            setPlayerStorageValue(cid, isIN, 0)

            doTeleportThing(cid, RewardsRoom, TRUE)

        else

            doTeleportThing(cid, fromPosition, TRUE)

            doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_ORANGE,'Najpierw zabij potwora!')

        end

    end

    return TRUE

end]]></movevent>

    <movevent type="StepOut" fromaid="42357" toaid="42387" event="script"><![CDATA[
        domodlib('arenaFunctions')
function onStepOut(cid, item, position, fromPosition)

    if item.actionid == DoorsActID or RewardsDoors[item.actionid] then

        doTransformItem(item.uid, item.itemid - 1)

    elseif isInArray(GobletTiles, item.actionid) == TRUE then

        doTransformItem(item.uid, item.itemid + 1)
        end

    return TRUE

end]]></movevent>

</mod>

I've added this to try to make the quest log:

Lua:
greenshore_storage = 51345
scrapper_storage = 51346
warlord_storage = 51347
final_storage = 51348

			if getPlayerStorageValue(cid, myArenaLevel == 0) then
			setPlayerStorageValue(cid, greenshore_storage,1)
			end
			if getPlayerStorageValue(cid, myArenaLevel == 1) then
			setPlayerStorageValue(cid, scrapper_storage,1)
			end
			if getPlayerStorageValue(cid, myArenaLevel == 2) then
			setPlayerStorageValue(cid, warlord_storage,1)
			end
			if getPlayerStorageValue(cid, myArenaLevel == 3) then
			setPlayerStorageValue(cid, final_storage,1)
			end

And here's an part of the NPC script that might be useful:

Lua:
if getPlayerStorageValue(cid, myArenaLevel) < 3 and getPlayerLevel(cid) >= enterArena.RLV and getPlayerMoney(cid) >= enterArena.RC then

getPlayerStorageValue(cid, myArenaLevel) < 3

:3

Greenshore level works like a charm, but when I complete Scrapper it completes all storages! Like this:

2d78whx.jpg


Any ideas to modify the quests.xml, or arena.lua mod?
 
Back
Top