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

Advanced arena system

Master-m

Need help? Just ask!
Senator
Joined
May 28, 2007
Messages
4,338
Reaction score
16
Location
The Netherlands
Not made by me.

HTML:
KickPosition = {x=2422, y=2866, z=7} --if the player leave the arena or time is over, where he go.
RewardsRoom = {x=2418, y=2851, 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

--PLAYERS STORAGES
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.

--ACTIONS IDS
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 MESSAGES
--fuck polish, i didn´t understand any shit of your cancel messages.
Cancel = {
--message when use door and have not paid to the npc.
[1] = "You will pay for npc first!.",
--message when leave arena.
[2] = "You has been kicked from arena.!",
--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 CONFIG.
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
}
}

--REWARDS CONFIG.
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}
},
--blessed sceptre.
[42382] = {
Stor = RewardsStor[3],
Cont = nil,
item = 7429
},
--royal axe.
[42383] = {
Stor = RewardsStor[3],
Cont = nil,
item = 7434
},
--justice seeker
[42384] = {
Stor = RewardsStor[3],
Cont = nil,
item = 7390
},
--backpack with items.
[42385] = {
Stor = RewardsStor[3],
Cont = 7342,
items = {2273, 2268, 7443, 7440, 7529},
count = {50, 50, 1, 1, 100}
}
}

--ARENA MONSTERS CONFIG.
arena_monsters = {
--greenshore -scrapper --warlord
[45300] = "frostfur", [45310] = "Avalanche", [45320] = "Webster",
[45301] = "Bloodpaw", [45311] = "Keebosh 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"}

--FROM HERE DO NO EDIT ANYTHING IF YOU DONT KNOW WHAT IT DOES.
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_CONS OLE_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 0
end

Go to data\actions\scripts\QUESTS creat new text file with name "ArenaAction" and write it:
HTML:
dofile("./arena.lua")
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
Go to data\actions, open the actions.xml and write it:
HTML:
<!--ARENA-->
<action actionid="42366" script="quests/ArenaActions.lua"/>
<action actionid="42376" script="quests/ArenaActions.lua"/>
<action actionid="42386" script="quests/ArenaActions.lua"/>
<action actionid="42357" script="quests/ArenaActions.lua"/>
<action actionid="42361" script="quests/ArenaActions.lua"/>
<action actionid="42362" script="quests/ArenaActions.lua"/>
<action actionid="42363" script="quests/ArenaActions.lua"/>
<action actionid="42364" script="quests/ArenaActions.lua"/>
<action actionid="42365" script="quests/ArenaActions.lua"/>
<action actionid="42371" script="quests/ArenaActions.lua"/>
<action actionid="42372" script="quests/ArenaActions.lua"/>
<action actionid="42373" script="quests/ArenaActions.lua"/>
<action actionid="42374" script="quests/ArenaActions.lua"/>
<action actionid="42375" script="quests/ArenaActions.lua"/>
<action actionid="42381" script="quests/ArenaActions.lua"/>
<action actionid="42382" script="quests/ArenaActions.lua"/>
<action actionid="42383" script="quests/ArenaActions.lua"/>
<action actionid="42384" script="quests/ArenaActions.lua"/>
<action actionid="42385" script="quests/ArenaActions.lua"/>

Go to data\movements, open movements.xml and write it:
HTML:
<!--ARENA-->
<movevent event="StepIn" actionid="42321" script="ArenaMovements.lua"/>
<movevent event="StepIn" actionid="42360" script="ArenaMovements.lua"/>
<movevent event="StepIn" actionid="42370" script="ArenaMovements.lua"/>
<movevent event="StepIn" actionid="42380" script="ArenaMovements.lua"/>
<movevent event="StepIn" actionid="42300" script="ArenaMovements.lua"/>
<movevent event="StepIn" actionid="42301" script="ArenaMovements.lua"/>
<movevent event="StepIn" actionid="42302" script="ArenaMovements.lua"/>
<movevent event="StepIn" actionid="42303" script="ArenaMovements.lua"/>
<movevent event="StepIn" actionid="42304" script="ArenaMovements.lua"/>
<movevent event="StepIn" actionid="42305" script="ArenaMovements.lua"/>
<movevent event="StepIn" actionid="42306" script="ArenaMovements.lua"/>
<movevent event="StepIn" actionid="42307" script="ArenaMovements.lua"/>
<movevent event="StepIn" actionid="42308" script="ArenaMovements.lua"/>
<movevent event="StepIn" actionid="42309" script="ArenaMovements.lua"/>
<movevent event="StepIn" actionid="42310" script="ArenaMovements.lua"/>
<movevent event="StepOut" actionid="42366" script="ArenaMovements.lua"/>
<movevent event="StepOut" actionid="42376" script="ArenaMovements.lua"/>
<movevent event="StepOut" actionid="42386" script="ArenaMovements.lua"/>
<movevent event="StepOut" actionid="42357" script="ArenaMovements.lua"/>
<movevent event="StepOut" actionid="42360" script="ArenaMovements.lua"/>
<movevent event="StepOut" actionid="42370" script="ArenaMovements.lua"/>
<movevent event="StepOut" actionid="42380" script="ArenaMovements.lua"/>
Now open data\movements\scripts creat new file.txt name: ArenaMovements and write it:
HTML:
dofile("./arena.lua")
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)
doSetItemSpecialDescription(Goblet, ""..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

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

Now go to data\npc creat file with name: Arener.xml, and write it:
HTML:
<npc name="Halvar" script="data/npc/scripts/arena.lua" walkinterval="2000" floorchange="0">
<health now="150" max="150"/>
<look type="143" head="3" body="77" legs="97" feet="116" addons="1" corpse="2212"/>
<parameters>
</parameters>
</npc>
Now go to data\npc\scripts creat a file with name : Arena, and write it:
HTML:
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, 42355) < 1 then
cost = 1000
levelname = 'greenhorn'
levelneeded = 30
elseif getPlayerStorageValue(cid, 42355) == 1 then
cost = 5000
levelname = 'scrapper'
levelneeded = 50
elseif getPlayerStorageValue(cid, 42355) == 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(doPlayerRemoveMoney(cid, cost) == TRUE) then
npcHandler:say('Now you can go to test.', cid)
setPlayerStorageValue(cid, 42351, 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, 42355) < 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())
 
All posts were deleted because they were offtopic if you want to speak about this please take it in private messages.

Regards, please no more offtopic posts.

Edit
Black xS here is a quote from your thread.
Black xS said:
DELETED, CAUSE I DONT KNOW IF THIS IS FROM OTHER MEMBER, SORRY FOR ALL, CAN ANYONE DELETE ALL TUTOS?

I DONT LIKE TO HELP MORE THIS FORUM, CAUSE I ALREADY HELPED AND ALL MEMBERS SO HATE ME? INVEJOUS?
So he deleted your thread on request from you, stop blaming my staff mate, thank you.
 
All posts were deleted because they were offtopic if you want to speak about this please take it in private messages.

Regards, please no more offtopic posts.

Edit
Black xS here is a quote from your thread.

So he deleted your thread on request from you, stop blaming my staff mate, thank you.

Your staff? -.^

Edit by Dieski: what does it look like? Just use your brain.


@Looks like your considering yourself above them, since it is your staff.
Edit again by Dieski; Damn, you need to learn some english... MY STAFF MATE=He and me are staff and friends. maybe you understand in this language better...

@I know what you mean, I just like to bother you 0j0j00j0j0j

@Down;
Its Nahrutos script Ive heard, the one which he was selling.
 
Last edited:
omg, master m why you always posting my scripts =l
this is not even complete you miss two scripts
and this system just will work with the map i sent to the buyers
 
omg, master m why you always posting my scripts =l
this is not even complete you miss two scripts
and this system just will work with the map i sent to the buyers

Sorry but Someone didnt want to share. Didn't knew it was from u...
 
Last edited by a moderator:
Back
Top