| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- local Players = class()
- Players.max = 15
- function Players:init()
- self.players = {}
- self.active = {}
- for i = 1, self.max do
- self.players[i] = ctx.tag == 'server' and app.player.server() or app.player.dummy()
- self.players[i].id = i
- end
- ctx.event:on(app.net.events.leave, function(data)
- self:deactivate(data.id)
- end)
- ctx.event:on(app.net.events.class, function(data)
- self:setClass(data.id, data.class, data.team)
- end)
- ctx.event:on(app.net.events.fire, function(data)
- if ctx.id and data.id ~= ctx.id then
- local p = self:get(data.id)
- local slot = p.slots[data.slot]
- slot:fire(p, data.mx, data.my)
- end
- end)
- ctx.event:on(app.net.events.damage, function(data)
- local to, from = self:get(data.id), self:get(data.from)
- to.lastHurt = tick
- if data.id ~= data.from then
- from.lastDamageDealt = tick
- end
- data.amount = data.amount * to.damageInMultiplier * from.damageOutMultiplier
- to:hurt(data)
- local oldAmt = data.amount
- data.amount = data.amount * from.lifesteal
- if data.id ~= data.from then
- from:heal(data)
- end
- data.amount = oldAmt
- ctx.event:emit('particle.create', {
- kind = 'arcadetext',
- vars = {
- x = to.x,
- y = to.y,
- str = tostring(math.round(tonumber(data.amount)))
- }
- })
- end)
- ctx.event:on(app.net.events.dead, function(data)
- local killer, victim = self:get(data.kill), self:get(data.id)
- if data.kill ~= data.id then
- killer.kills = killer.kills + 1
- end
- victim.deaths = victim.deaths + 1
- victim.killer = killer
- victim:die()
- end)
- ctx.event:on(app.net.events.spawn, function(data)
- local p = self:get(data.id)
- p.ded = false
- p:spawn()
- end)
- ctx.event:on('game.restart', function(data)
- self:each(function(p)
- ctx.net:emit(app.net.events.spawn, {id = p.id})
- end)
- end)
- end
- function Players:activate(id)
- if ctx.view then ctx.view:register(self.players[id]) end
- ctx.event:emit('collision.attach', {object = self.players[id]})
- table.insert(self.active, id)
- end
- function Players:deactivate(id)
- if ctx.view then ctx.view:unregister(self.players[id]) end
- ctx.event:emit('collision.detach', {object = self.players[id]})
- self.players[id]:deactivate()
- for i = 1, self.max do
- if self.active[i] == id then table.remove(self.active, i) break end
- end
- end
- function Players:get(id, t)
- return self.players[id]:get(t or tick)
- end
- function Players:each(fn)
- for i = 1, #self.active do
- fn(self:get(self.active[i]))
- end
- end
- function Players:update()
- self:each(f.ego('update'))
- end
- function Players:setClass(id, class, team)
- local p = self.players[id]
- if not table.has(self.active, id) then self:activate(id) end
- p.class = data.class[data.class.list[class]]
- p.team = team
- p:activate()
- end
- return Players
|