Advertisement
Guest User

Untitled

a guest
Apr 4th, 2016
964
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.19 KB | None | 0 0
  1. CreatureArena = {}
  2. PLAYER_LASTARENA = {}
  3.  
  4. Arena = {}
  5. setmetatable(Arena, {__call =
  6.     function(_, name, position, exit, radius, rewardpos)
  7.         return setmetatable({name = name, position = position, exit = exit, currentwave = 1, rewardpos = rewardpos or exit, radius = radius, waves = {}, playertable = {}}, {__index = Arena})
  8.     end})
  9.  
  10. Wave = {}
  11. setmetatable(Wave, {__call =
  12.     function(_, monsters)
  13.         return setmetatable({monsters = monsters}, {__index = Wave})
  14.     end})
  15.  
  16.  
  17.  
  18. local function getBaseVocation(vocation)
  19.     while vocation:getDemotion() do
  20.         vocation = vocation:getDemotion()
  21.     end
  22.     return vocation
  23. end
  24.  
  25. function Arena:addPlayerPosition(position, level, vocation)
  26.     table.insert(self.playertable, {position, level, vocation})
  27.     return true
  28. end
  29.  
  30. function Arena:setRewardCallback(callback)
  31.     self.rewardcallback = callback
  32. end
  33.  
  34. function Arena:setCheckCallback(callback)
  35.     self.checkcallback = callback
  36. end
  37.  
  38. function Arena:setSpawnCallback(callback)
  39.     self.spawncallback = callback
  40. end
  41.  
  42. function Arena:setWaveclearCallback(callback)
  43.     self.waveclearcallback = callback
  44. end
  45.  
  46. function Arena:setJokerdeathCallback(callback)
  47.     self.jokerdeathcallback = callback
  48. end
  49.  
  50. function Arena:setStartCallback(callback)
  51.     self.startcallback = callback
  52. end
  53.  
  54. function Arena:setThinkCallback(callback, interval)
  55.     if type(callback) == "function" then
  56.         self.think = callback
  57.         self.thinkinterval = interval or 2000
  58.     end
  59. end
  60.  
  61. function Arena:onThink()
  62.     if self.think and self.thinking then
  63.         self.think(self, self.thinkinterval)
  64.         self.thinkevent = addEvent(Arena.onThink, self.thinkinterval, self)
  65.     end
  66. end
  67.  
  68. function Arena:addWaves(x, ...)
  69.     if x then
  70.         table.insert(self.waves, x)
  71.         return self:addWaves(...)
  72.     end
  73. end
  74.  
  75. function Arena:getPlayersInside()
  76.     local specs = Game.getSpectators(self.position, false, true, self.radius, self.radius, self.radius, self.radius)
  77.     return specs
  78. end
  79.  
  80. function Arena:removeCreatures()
  81.     local specs = Game.getSpectators(self.position, false, false, self.radius, self.radius, self.radius, self.radius)
  82.     for i = 1, #specs do
  83.         if specs[i]:isMonster() then
  84.             specs[i]:remove()
  85.         elseif specs[i]:isPlayer() then
  86.             specs[i]:teleportTo(self.exit)
  87.         end
  88.     end
  89. end
  90.  
  91. function Arena:getMonstersInside()
  92.     local ret = {}
  93.     local specs = Game.getSpectators(self.position, false, false, self.radius, self.radius, self.radius, self.radius)
  94.     for i = 1, #specs do
  95.         if specs[i]:isMonster() and not specs[i]:getMaster() then
  96.             table.insert(ret, specs[i])
  97.         end
  98.     end
  99.  
  100.     return ret
  101. end
  102.  
  103. function Arena:setJokerCreature(name)
  104.     self.joker = name
  105. end
  106.  
  107. function Arena:jokerDeath()
  108.     if self.jokerdeathcallback then
  109.         local players = self:getPlayersInside()
  110.         for i = 1, #players do
  111.             self.jokerdeathcallback(players[i], self.currentwave, self)
  112.         end
  113.     end
  114.     addEvent(Arena.spawnWave, self.delay or 1000, self)
  115. end
  116.  
  117. function Arena:setDelayWaves(t)
  118.     self.delay = t
  119. end
  120.  
  121. function Arena:setDelayEnd(t)
  122.     self.endtime = t
  123. end
  124.  
  125. function Arena:reset()
  126.     self.currentwave = 1
  127.     self.started = false
  128.     self.thinking = false
  129.     stopEvent(self.thinkevent)
  130.     self:removeCreatures()
  131. end
  132.  
  133. function Arena:isActive()
  134.     local players = self:getPlayersInside()
  135.     if self.started and #players > 0 then
  136.         return true
  137.     else
  138.         self:reset()
  139.     end
  140.  
  141.     return false
  142. end
  143.  
  144. function Arena:spawnJoker()
  145.     local pos = self.position
  146.     local radius = self.radius
  147.  
  148.     local creature = Game.createMonster(self.joker, Position(math.random(pos.x-radius, pos.x+radius), math.random(pos.y-radius, pos.y+radius), pos.z), false, false)
  149.     if creature then
  150.         CreatureArena[creature:getId()] = self
  151.         creature:registerEvent("JokerDeath")
  152.     else
  153.         self:spawnJoker()
  154.     end
  155. end
  156.  
  157. function Arena:finish()
  158.     local players = self:getPlayersInside()
  159.     for i = 1, #players do
  160.         players[i]:teleportTo(self.rewardpos)
  161.         if self.rewardcallback then
  162.             self.rewardcallback(players[i], self)
  163.         end
  164.     end
  165.  
  166.     self:reset()
  167. end
  168.  
  169. function Arena:spawnWave()
  170.     local wave = self.waves[self.currentwave]
  171.     if wave then
  172.         if self.spawncallback then
  173.             local players = self:getPlayersInside()
  174.             for i = 1, #players do
  175.                 self.spawncallback(players[i], self.currentwave, self)
  176.             end
  177.         end
  178.  
  179.         wave:spawn(self)
  180.     end
  181. end
  182.  
  183. function Arena:startWave()
  184.     local wave = self.waves[self.currentwave]
  185.  
  186.     if not wave then
  187.         return self:finish()
  188.     end
  189.  
  190.     if self.joker then
  191.         self:spawnJoker()
  192.     else
  193.         addEvent(Arena.spawnWave, self.delay or 1000, self)
  194.     end
  195. end
  196.  
  197. function Arena:start(aplayer)
  198.     if #self.playertable > 0 then
  199.         local group = {}
  200.         for i = 1, #self.playertable do
  201.             local tile = Tile(self.playertable[i][1])
  202.             if tile then
  203.                 local player = tile:getTopCreature()
  204.                 if player and player:isPlayer() then
  205.                     local minlevel = self.playertable[i][2] or 0
  206.                     local vocation = self.playertable[i][3]
  207.                     if player:getLevel() >= minlevel then
  208.                         if not vocation or getBaseVocation(player:getVocation()) == vocation then
  209.                             if self.checkcallback and not self.checkcallback(player) then
  210.                                 return false
  211.                             end
  212.  
  213.                             table.insert(group, player)
  214.                         else
  215.                             aplayer:sendCancelMessage(player:getName() .. " needs to be " .. vocation:getName() .. ".")
  216.                             return false
  217.                         end
  218.                     else
  219.                         aplayer:sendCancelMessage(player:getName() .. " needs to be level " .. minlevel)
  220.                         return false
  221.                     end
  222.                 else
  223.                     aplayer:sendCancelMessage("No players in the required positions.")
  224.                     return false
  225.                 end
  226.             end
  227.         end
  228.  
  229.         if #group == #self.playertable then
  230.             self.started = true
  231.             for i = 1, #group do
  232.                 group[i]:teleportTo(self.position)
  233.                 PLAYER_LASTARENA[group[i]:getGuid()] = self
  234.  
  235.                 if self.startcallback then
  236.                     self.startcallback(group[i], self)
  237.                 end
  238.             end
  239.  
  240.             if self.think then
  241.                 self.thinking = true
  242.                 self:onThink()
  243.             end
  244.  
  245.             self:startWave()
  246.             return true
  247.         else
  248.             aplayer:sendCancelMessage("No players in the required positions.")
  249.             return false
  250.         end
  251.     else
  252.         print("Arena with no player position.")
  253.     end
  254.  
  255.     return false
  256. end
  257.  
  258. function Arena:useLever(player)
  259.     if self:isActive() then
  260.         player:sendCancelMessage("Someone is already inside the arena, please wait.")
  261.         return false
  262.     else
  263.         return self:start(player)
  264.     end
  265. end
  266.  
  267. function Arena:monsterDeath()
  268.     local monsters = self:getMonstersInside()
  269.     if #monsters == 1 then
  270.         if self.waveclearcallback then
  271.             local players = self:getPlayersInside()
  272.             for i = 1, #players do
  273.                 self.waveclearcallback(players[i], self.currentwave, self)
  274.             end
  275.         end
  276.  
  277.         self.currentwave = self.currentwave+1
  278.         self:startWave()
  279.     end
  280. end
  281.  
  282. function Wave:spawn(arena)
  283.     local pos = arena.position
  284.     local radius = arena.radius
  285.  
  286.     for name, amount in pairs(self.monsters) do
  287.         for i = 1, amount do
  288.             local creature = Game.createMonster(name, Position(math.random(pos.x-radius, pos.x+radius), math.random(pos.y-radius, pos.y+radius), pos.z), false, false)
  289.             if creature then
  290.                 CreatureArena[creature:getId()] = arena
  291.                 creature:registerEvent("ArenaEvent")
  292.             end
  293.         end
  294.     end
  295. end
  296.  
  297. function Player:isInsideArena(arena)
  298.     local players = arena:getPlayersInside()
  299.     return isInArray(players, self)
  300. end
  301.  
  302. function Player:getLastArena()
  303.     return PLAYER_LASTARENA[self:getGuid()]
  304. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement