• 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!
  • New resources must be posted under Resources tab. A discussion thread will be created automatically, you can't open threads manually anymore.

MOD perfect Svargrond Arena System!

TomCrusher

Jeg er ingenting
Joined
Dec 31, 2008
Messages
663
Reaction score
19
Location
Norway
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(cid, type, msg)			npcHandler:onCreatureSay(cid, type, msg)		end
function onThink()					npcHandler:onThink()					end
local focus = 0

local talk_start = 0

local TS = 0



function onCreatureDisappear(cid, pos)

	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(txt, str)

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

end



function onCreatureSay(cid, type, msg)



	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 ~= cid) then

  		selfSay('Im Bussy')

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

		if getPlayerStorageValue(cid, myArenaLevel) < 3 then

			local enterArena = myArenaLevelIs(cid)

			if getPlayerLevel(cid) >= enterArena.RLV then

				if getPlayerMoney(cid) >= enterArena.RC then

					setPlayerStorageValue(cid, talkNPC, 1)

					doPlayerRemoveMoney(cid, enterArena.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 == 1 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_DEFAULT, creatureSayCallback)
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:
As old release mark center of room with this actionid's to each room from first to last:
PHP:
RoomsACT = {42301, 42302, 42303, 42304, 42305, 42306, 42307, 42308, 42309}
all informations you can find into script..
 
Last edited:
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
 
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

post it shorter plax!!!
 
Well, it would take some time. Let's give TomCrusher a chance to extend his scripting abilities :)
 
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(cid, 5, TEXTCOLOR_LIGHTBLUE)
this is function to reputation system if somebody will know:p
 
Last edited:
What about the NPC?
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(cid, pos)
	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(txt, str)
  	return (string.find(txt, str) and not string.find(txt, '(%w+)' .. str) and not string.find(txt, str .. '(%w+)'))
end

function onCreatureSay(cid, type, msg)

	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 ~= cid) then
  		selfSay('Im Bussy')
	elseif TS == 1 and msgcontains(msg, 'yes') or msgcontains(msg, 'fight') or msgcontains(msg, 'arena') then
		if getPlayerStorageValue(cid, myArenaLevel) < 3 then
			local enterArena = myArenaLevelIs(cid)
			if getPlayerLevel(cid) >= enterArena.RLV then
				if getPlayerMoney(cid) >= enterArena.RC then
					setPlayerStorageValue(cid, talkNPC, 1)
					doPlayerRemoveMoney(cid, enterArena.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 == 1 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:$
 
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:
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 ?
 
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 ?

Having the same bug, trying to solve it atm ;P
 
Back
Top