MOD perfect Svargrond Arena System!

Discussion in 'Mods & Lua Functions' started by TomCrusher, Jan 20, 2010.

  1. TomCrusher

    TomCrusher Jeg er ingenting

    Joined:
    Dec 31, 2008
    Messages:
    655
    Being tired about all of complaining not acting arena Svargrond script's I was created MOD for running on the TFS 0.3.5pl1, TFS above it should work! So installing:
    Create into MOD folder file called arena.xml and set into this script:
    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=1273, y=881, z=6} --if the player leave the arena or time is over, where he go.
    RewardsRoom = {x=1255, y=831, 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>
    do reload MOD's and of course change your positions on the map into "arenaFunctions"!!!
    If not work do restart a server, please and remove all old arena script's. :p

    Do you need NPC? Than:
    PHP:
    <npc name="Halvar" script="data/npc/scripts/arena.lua" floorchange="0" access="5" level="1" maglevel="1">
        <
    health now="150" max="150"/>
        <
    look type="129" head="114" body="119" legs="114" feet="114" corpse="2212"/>
    <
    parameters>
    <
    parameter key="message_greet" value="Hello |PLAYERNAME|. Im leader of the Svargrond Arena." />
    </
    parameters>
    </
    npc>
    and arena.lua :
    PHP:
            domodlib('arenaFunctions')
    local keywordHandler KeywordHandler:new()
    local npcHandler NpcHandler:new(keywordHandler)
    NpcSystem.parseParameters(npcHandler)
    local talkState = {}

    function 
    onCreatureAppear(cid)                npcHandler:onCreatureAppear(cid)            end
    function onCreatureDisappear(cid)             npcHandler:onCreatureDisappear(cid)            end
    function onCreatureSay(cidtypemsg)            npcHandler:onCreatureSay(cidtypemsg)        end
    function onThink()                    npcHandler:onThink()                    end
    local focus 
    0

    local talk_start 
    0

    local TS 
    0



    function onCreatureDisappear(cidpos)

        if 
    focus == cid then

            selfSay
    ('Good bye then.')

            
    focus 0

            talk_start 
    0

        end

    end



    local 
    function BYE()

        
    focus 0

        talk_start 
    0

        TS 
    0

    end



    function msgcontains(txtstr)

          return (
    string.find(txtstr) and not string.find(txt'(%w+)' .. str) and not string.find(txtstr .. '(%w+)'))

    end



    function onCreatureSay(cidtypemsg)



        
    msg string.lower(msg)

        if (
    msgcontains(msg'hi') and (focus == 0)) then

            selfSay
    ('Hello ' .. getCreatureName(cid) .. ', Do you want to make arena?.')

              
    focus cid

              talk_start 
    os.clock()

            
    TS 1

        
    elseif msgcontains(msg'hi') and (focus ~= cidthen

              selfSay
    ('Im Bussy')

        elseif 
    TS == and msgcontains(msg'yes') or msgcontains(msg'fight') or msgcontains(msg'arena'then

            
    if getPlayerStorageValue(cidmyArenaLevel) < 3 then

                local enterArena 
    myArenaLevelIs(cid)

                if 
    getPlayerLevel(cid) >= enterArena.RLV then

                    
    if getPlayerMoney(cid) >= enterArena.RC then

                        setPlayerStorageValue
    (cidtalkNPC1)

                        
    doPlayerRemoveMoney(cidenterArena.RC)

                        
    selfSay("Now you can go to test... ".. enterArena.LN .."")

                        
    BYE()

                    else

                        
    selfSay("You don\'t have "..enterArena.RC.." gp! Come back when you will be ready!")

                        
    BYE()

                    
    end

                
    else

                    
    selfSay("You don\'t have "..enterArena.RLV.." level! Come back when you will be ready!")

                    
    BYE()

                
    end

            
    else

                
    selfSay(Cancel[6])

                
    BYE()

            
    end

        
    elseif TS == and msgcontains(msg'no'then

            selfSay
    ("Bye!.")

            
    BYE()

        elseif 
    msgcontains(msg'bye'then

            selfSay
    ("Bye!.")

            
    BYE()

        
    end

        
    return true

    end



    function onThink()

        
    doNpcSetCreatureFocus(focus)

        if (
    os.clock() - talk_start) > 60 then

              
    if focus 0 then

                  selfSay
    ('Good bye then.')

              
    end

              focus 
    0

          end

    end
    npcHandler
    :setCallback(CALLBACK_MESSAGE_DEFAULTcreatureSayCallback)
    npcHandler:addModule(FocusModule:new())
    Searching map than go to link:Svargrond Arena

    Special thanks to Nahruto for a idea and functions!

    I hope you will like and appreciate my work REP + acceptable!
     
    Last edited: Mar 14, 2010
    BeniS and Dankoo like this.
  2. barker

    barker HHHHH

    Joined:
    Nov 23, 2007
    Messages:
    1,299
    Really good mate =) I like it
     
  3. zkum

    zkum corruption

    Joined:
    May 9, 2009
    Messages:
    2,300
    looks sexy.. nice release!
     
  4. Khanio

    Khanio [XHTML/CSS]

    Joined:
    May 4, 2009
    Messages:
    523
    Nice release. Where should i config the monsters spawn positions
     
  5. TomCrusher

    TomCrusher Jeg er ingenting

    Joined:
    Dec 31, 2008
    Messages:
    655
    As old release mark center of room with this actionid's to each room from first to last:
    PHP:
    RoomsACT = {423014230242303423044230542306423074230842309}
    all informations you can find into script..
     
    Last edited: Jan 21, 2010
  6. Hermes

    Hermes dziwki kola gramy w lola

    Joined:
    Nov 17, 2007
    Messages:
    1,867
    Script could be 3 times shorter. For example, why you are using:
    Code:
    Cont = nil,
    when you can check if it's there, and if so, use it (if cont then)

    etc. You can make it in this way (little example with operations on array):
    Code:
    local t = {
    	[storage1] = {items = {2160, 10}},
    	[storage2] = {items = {2160, 10, 2640, 1}, container = 1988}
    }
    local g = t[getPlayerStorageValue(cid, storage)]
    if t then
    	if t[getPlayerStorageValue(cid, storage)].container then
    		local c, y = doPlayerAddItem(cid, 1988, 1), 1
    		while y < #g.items do
    			--don't remember exact name of the function
    			doPlayerAddContainerItem(c, g.items[i], g.items[i+1])
    			i = i + 2
    		end
    	else
    		doPlayerAddItem(cid, g.items[1], g.items[2])
    	end
    end
    It makes difference :p
     
  7. Snow

    Snow Member

    Joined:
    Jan 16, 2008
    Messages:
    381
    post it shorter plax!!!
     
  8. Hermes

    Hermes dziwki kola gramy w lola

    Joined:
    Nov 17, 2007
    Messages:
    1,867
    Well, it would take some time. Let's give TomCrusher a chance to extend his scripting abilities :)
     
  9. TomCrusher

    TomCrusher Jeg er ingenting

    Joined:
    Dec 31, 2008
    Messages:
    655
    I have no free time just now to rewrite scripts made six months ago, but I will take your comments Hermes to my education...
    About included
    PHP:
    addPlayerRep(cid5TEXTCOLOR_LIGHTBLUE)
    this is function to reputation system if somebody will know:p
     
    Last edited: Jan 21, 2010
    Kudzu likes this.
  10. Grehy

    Grehy Killroy

    Joined:
    Nov 21, 2008
    Messages:
    2,626
    What about the NPC?
     
    Snakie likes this.
  11. Kiman

    Kiman Reality OT Staff

    Joined:
    Aug 18, 2009
    Messages:
    518
    Thanks for this :)
     
  12. TomCrusher

    TomCrusher Jeg er ingenting

    Joined:
    Dec 31, 2008
    Messages:
    655
    As you wish, you welcome:
    PHP:
    <npc name="Halvar" script="data/npc/scripts/arena.lua" floorchange="0" access="5" level="1" maglevel="1">
        <
    health now="150" max="150"/>
        <
    look type="129" head="114" body="119" legs="114" feet="114" corpse="2212"/>
    <
    parameters>
    <
    parameter key="message_greet" value="Hello |PLAYERNAME|. Im leader of the Svargrond Arena." />
    </
    parameters>
    </
    npc>
    and arena.lua :
    PHP:
    local focus 0
    local talk_start 
    0
    local TS 
    0

    function onCreatureDisappear(cidpos)
        if 
    focus == cid then
            selfSay
    ('Good bye then.')
            
    focus 0
            talk_start 
    0
        end
    end

    local 
    function BYE()
        
    focus 0
        talk_start 
    0
        TS 
    0
    end

    function msgcontains(txtstr)
          return (
    string.find(txtstr) and not string.find(txt'(%w+)' .. str) and not string.find(txtstr .. '(%w+)'))
    end

    function onCreatureSay(cidtypemsg)

        
    msg string.lower(msg)
        if (
    msgcontains(msg'hi') and (focus == 0)) then
            selfSay
    ('Hello ' .. getCreatureName(cid) .. ', Do you want to make arena?.')
              
    focus cid
              talk_start 
    os.clock()
            
    TS 1
        
    elseif msgcontains(msg'hi') and (focus ~= cidthen
              selfSay
    ('Im Bussy')
        elseif 
    TS == and msgcontains(msg'yes') or msgcontains(msg'fight') or msgcontains(msg'arena'then
            
    if getPlayerStorageValue(cidmyArenaLevel) < 3 then
                local enterArena 
    myArenaLevelIs(cid)
                if 
    getPlayerLevel(cid) >= enterArena.RLV then
                    
    if getPlayerMoney(cid) >= enterArena.RC then
                        setPlayerStorageValue
    (cidtalkNPC1)
                        
    doPlayerRemoveMoney(cidenterArena.RC)
                        
    selfSay("Now you can go to test... ".. enterArena.LN .."")
                        
    BYE()
                    else
                        
    selfSay("You don\'t have "..enterArena.RC.." gp! Come back when you will be ready!")
                        
    BYE()
                    
    end
                
    else
                    
    selfSay("You don\'t have "..enterArena.RLV.." level! Come back when you will be ready!")
                    
    BYE()
                
    end
            
    else
                
    selfSay(Cancel[6])
                
    BYE()
            
    end
        
    elseif TS == and msgcontains(msg'no'then
            selfSay
    ("Bye!.")
            
    BYE()
        elseif 
    msgcontains(msg'bye'then
            selfSay
    ("Bye!.")
            
    BYE()
        
    end
        
    return true
    end

    function onThink()
        
    doNpcSetCreatureFocus(focus)
        if (
    os.clock() - talk_start) > 60 then
              
    if focus 0 then
                  selfSay
    ('Good bye then.')
              
    end
              focus 
    0
          end
    end 
    I'm only forget it:$
     
  13. Grehy

    Grehy Killroy

    Joined:
    Nov 21, 2008
    Messages:
    2,626
    Thanks, thats all that was missing. Great job, rep++
     
  14. Xal

    Xal New Member

    Joined:
    Jul 28, 2009
    Messages:
    42
    It work on TFS 0.3.6 ?
     
  15. TomCrusher

    TomCrusher Jeg er ingenting

    Joined:
    Dec 31, 2008
    Messages:
    655
    Should work I have TFS above it and work... take test it!
     
  16. Meferot

    Meferot New Member

    Joined:
    Jan 28, 2008
    Messages:
    57
    NPC don't working.
     
  17. Helga

    Helga GZH

    Joined:
    Feb 19, 2009
    Messages:
    623
    thanks :) working fine, but you need to fix this bug:
    Code:
    <movement type="StepIn" fromaid="42300" toaid="42370" event ="script">
    it should be toaid="42380", else the golden goblet tile wont work ;P

    And the NPC-script arena.lua doesn't work, use this instead:
    Code:
    local keywordHandler = KeywordHandler:new()
    local npcHandler = NpcHandler:new(keywordHandler)
    NpcSystem.parseParameters(npcHandler)
    
    function onCreatureAppear(cid)				npcHandler:onCreatureAppear(cid)			end
    function onCreatureDisappear(cid) 			npcHandler:onCreatureDisappear(cid)			end
    function onCreatureSay(cid, type, msg) 		npcHandler:onCreatureSay(cid, type, msg)	end
    function onThink() 							npcHandler:onThink()						end
    
    function enterArena(cid, message, keywords, parameters, node)
    	if(not npcHandler:isFocused(cid)) then
    		return false
    	end
    	local cost = 0
    	local levelname = ''
    	if getPlayerStorageValue(cid, 45450) < 1 then
    		cost = 1000
    		levelname = 'greenshore'
    		levelneeded = 30
    	elseif getPlayerStorageValue(cid, 45450) == 1 then
    		cost = 5000
    		levelname = 'scrapper'
    		levelneeded = 50
    	elseif getPlayerStorageValue(cid, 45450) == 2 then
    		cost = 10000
    		levelname = 'warlord'
    		levelneeded = 80
    	end
    	if string.lower(keywords[1]) == 'yes' and parameters.prepare ~= 1 then
    		if(getPlayerLevel(cid) >= levelneeded) then
    			if(getPlayerMoney(cid) >= cost) then
    				doPlayerRemoveMoney(cid, cost)
    				npcHandler:say('Now you can go to test.', cid)
    				setPlayerStorageValue(cid, 45451, 1)
    			else
    				npcHandler:say('You don\'t have ' .. cost .. ' gp! Come back when you will be ready!', cid)
    		    end
    		else
    			npcHandler:say('You don\'t have ' .. levelneeded .. ' level! Come back when you will be ready!', cid)
    		end
    		npcHandler:resetNpc()
    	elseif string.lower(keywords[1]) == 'no' then
    		npcHandler:say('Come back later then!', cid)
    		npcHandler:resetNpc()
    	else
    		if getPlayerStorageValue(cid, 45450) < 3 then
    			npcHandler:say('You test will be ' .. levelname .. ' level. If you want enter you must pay ' .. cost .. ' gp and have ' .. levelneeded .. ' level. Wanna try?', cid)
    		else
    			npcHandler:say('You did all arena levels.',cid)
    		end
    	end
    	return true
    end
    
    npcHandler:setMessage(MESSAGE_GREET, 'Hello |PLAYERNAME|! Do you want to make arena?')
    
    local yesNode = KeywordNode:new({'yes'}, enterArena, {})
    local noNode = KeywordNode:new({'no'}, enterArena, {})
    
    local node1 = keywordHandler:addKeyword({'arena'}, enterArena, {prepare=1})
    	node1:addChildKeywordNode(yesNode)
    	node1:addChildKeywordNode(noNode)
    	
    local node1 = keywordHandler:addKeyword({'fight'}, enterArena, {prepare=1})
    	node1:addChildKeywordNode(yesNode)
    	node1:addChildKeywordNode(noNode)
    local node1 = keywordHandler:addKeyword({'yes'}, enterArena, {prepare=1})
    	node1:addChildKeywordNode(yesNode)
    	node1:addChildKeywordNode(noNode)
    npcHandler:addModule(FocusModule:new())
     
    Last edited: Jan 24, 2010
  18. Kiman

    Kiman Reality OT Staff

    Joined:
    Aug 18, 2009
    Messages:
    518
    I got a problem with this script. When someone dies in a room with a monster inside, the monster is still there, So If someone else enters. He'll face two monsters.

    Is it just me, or is someone else having this bug ?
     
  19. Helga

    Helga GZH

    Joined:
    Feb 19, 2009
    Messages:
    623
    Having the same bug, trying to solve it atm ;P
     
  20. Kiman

    Kiman Reality OT Staff

    Joined:
    Aug 18, 2009
    Messages:
    518
    Be sure to post the solution :)
     

Share This Page