controller.lua 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. local Players = class()
  2. Players.max = 15
  3. function Players:init()
  4. self.players = {}
  5. self.active = {}
  6. for i = 1, self.max do
  7. self.players[i] = ctx.tag == 'server' and app.player.server() or app.player.dummy()
  8. self.players[i].id = i
  9. end
  10. ctx.event:on(app.net.events.leave, function(data)
  11. self:deactivate(data.id)
  12. end)
  13. ctx.event:on(app.net.events.class, function(data)
  14. self:setClass(data.id, data.class, data.team)
  15. end)
  16. ctx.event:on(app.net.events.fire, function(data)
  17. if ctx.id and data.id ~= ctx.id then
  18. local p = self:get(data.id)
  19. local slot = p.slots[data.slot]
  20. slot:fire(p, data.mx, data.my)
  21. end
  22. end)
  23. ctx.event:on(app.net.events.damage, function(data)
  24. local to, from = self:get(data.id), self:get(data.from)
  25. to.lastHurt = tick
  26. if data.id ~= data.from then
  27. from.lastDamageDealt = tick
  28. end
  29. data.amount = data.amount * to.damageInMultiplier * from.damageOutMultiplier
  30. to:hurt(data)
  31. local oldAmt = data.amount
  32. data.amount = data.amount * from.lifesteal
  33. if data.id ~= data.from then
  34. from:heal(data)
  35. end
  36. data.amount = oldAmt
  37. ctx.event:emit('particle.create', {
  38. kind = 'arcadetext',
  39. vars = {
  40. x = to.x,
  41. y = to.y,
  42. str = tostring(math.round(tonumber(data.amount)))
  43. }
  44. })
  45. end)
  46. ctx.event:on(app.net.events.dead, function(data)
  47. local killer, victim = self:get(data.kill), self:get(data.id)
  48. if data.kill ~= data.id then
  49. killer.kills = killer.kills + 1
  50. end
  51. victim.deaths = victim.deaths + 1
  52. victim.killer = killer
  53. victim:die()
  54. end)
  55. ctx.event:on(app.net.events.spawn, function(data)
  56. local p = self:get(data.id)
  57. p.ded = false
  58. p:spawn()
  59. end)
  60. ctx.event:on('game.restart', function(data)
  61. self:each(function(p)
  62. ctx.net:emit(app.net.events.spawn, {id = p.id})
  63. end)
  64. end)
  65. end
  66. function Players:activate(id)
  67. if ctx.view then ctx.view:register(self.players[id]) end
  68. ctx.event:emit('collision.attach', {object = self.players[id]})
  69. table.insert(self.active, id)
  70. end
  71. function Players:deactivate(id)
  72. if ctx.view then ctx.view:unregister(self.players[id]) end
  73. ctx.event:emit('collision.detach', {object = self.players[id]})
  74. self.players[id]:deactivate()
  75. for i = 1, self.max do
  76. if self.active[i] == id then table.remove(self.active, i) break end
  77. end
  78. end
  79. function Players:get(id, t)
  80. return self.players[id]:get(t or tick)
  81. end
  82. function Players:each(fn)
  83. for i = 1, #self.active do
  84. fn(self:get(self.active[i]))
  85. end
  86. end
  87. function Players:update()
  88. self:each(f.ego('update'))
  89. end
  90. function Players:setClass(id, class, team)
  91. local p = self.players[id]
  92. if not table.has(self.active, id) then self:activate(id) end
  93. p.class = data.class[data.class.list[class]]
  94. p.team = team
  95. p:activate()
  96. end
  97. return Players