| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- local Cart = require 'data/prop/cart'
- local CartServer = extend(Cart)
- CartServer.code = 'cartServer'
- function CartServer:activate(map)
- Cart.activate(self, map)
- self.points = {}
- for i = 1, #self.curves do
- local t = self.curves[i]:render(3)
- local a, b = 3, #t - 2
- if i == 1 then a = 1 end
- if i == #self.curves then b = #t end
- for j = a, b do
- table.insert(self.points, t[j])
- end
- end
- for i = 1, #self.points, 2 do
- if self.points[i] == self.x and self.points[i + 1] == self.y then
- self.index = i
- break
- end
- end
- self.speed = 0
- end
- function CartServer:update()
- Cart.update(self)
- local players = {[purple] = 0, [orange] = 0}
- ctx.players:each(function(player)
- if math.distance(self.x, self.y, player.x, player.y) < self.range then
- players[player.team] = players[player.team] + 1
- end
- end)
- if (players[purple] == 0 and players[orange] == 0) or (players[purple] > 0 and players[orange] > 0) then
- self.speed = math.lerp(self.speed, 0, 4 * tickRate)
- elseif players[purple] > 0 then
- self.speed = math.lerp(self.speed, Cart.speed * players[purple], 4 * tickRate)
- else
- self.speed = math.lerp(self.speed, -Cart.speed * players[orange], 4 * tickRate)
- end
- if self.speed ~= 0 then
- local dis = math.abs(self.speed * tickRate)
- local sign = math.sign(self.speed)
- while dis > 0 and self.index + sign > 1 and self.index + sign < #self.points do
- local nx, ny = self.points[self.index + (2 * sign)], self.points[self.index + (2 * sign) + 1]
- local d = math.distance(self.x, self.y, nx, ny)
- if d < dis then
- self.index = self.index + (2 * sign)
- self.x = nx
- self.y = ny
- dis = dis - d
- else
- local dir = math.direction(self.x, self.y, nx, ny)
- self.x = self.x + math.dx(dis, dir)
- self.y = self.y + math.dy(dis, dir)
- dis = 0
- break
- end
- end
- if self.index + sign <= 1 or self.index + sign >= #self.points then self.speed = 0 end
- if self.index == 1 then
- ctx.map:modExec('scoring', 'win', orange)
- elseif self.index == #self.points - 1 then
- ctx.map:modExec('scoring', 'win', purple)
- end
- ctx.net:emit(app.net.events.prop, {id = self.id, x = math.round(self.x * 10), y = math.round(self.y * 10)})
- end
- end
- return CartServer
|