cartserver.lua 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. local Cart = require 'data/prop/cart'
  2. local CartServer = extend(Cart)
  3. CartServer.code = 'cartServer'
  4. function CartServer:activate(map)
  5. Cart.activate(self, map)
  6. self.points = {}
  7. for i = 1, #self.curves do
  8. local t = self.curves[i]:render(3)
  9. local a, b = 3, #t - 2
  10. if i == 1 then a = 1 end
  11. if i == #self.curves then b = #t end
  12. for j = a, b do
  13. table.insert(self.points, t[j])
  14. end
  15. end
  16. for i = 1, #self.points, 2 do
  17. if self.points[i] == self.x and self.points[i + 1] == self.y then
  18. self.index = i
  19. break
  20. end
  21. end
  22. self.speed = 0
  23. end
  24. function CartServer:update()
  25. Cart.update(self)
  26. local players = {[purple] = 0, [orange] = 0}
  27. ctx.players:each(function(player)
  28. if math.distance(self.x, self.y, player.x, player.y) < self.range then
  29. players[player.team] = players[player.team] + 1
  30. end
  31. end)
  32. if (players[purple] == 0 and players[orange] == 0) or (players[purple] > 0 and players[orange] > 0) then
  33. self.speed = math.lerp(self.speed, 0, 4 * tickRate)
  34. elseif players[purple] > 0 then
  35. self.speed = math.lerp(self.speed, Cart.speed * players[purple], 4 * tickRate)
  36. else
  37. self.speed = math.lerp(self.speed, -Cart.speed * players[orange], 4 * tickRate)
  38. end
  39. if self.speed ~= 0 then
  40. local dis = math.abs(self.speed * tickRate)
  41. local sign = math.sign(self.speed)
  42. while dis > 0 and self.index + sign > 1 and self.index + sign < #self.points do
  43. local nx, ny = self.points[self.index + (2 * sign)], self.points[self.index + (2 * sign) + 1]
  44. local d = math.distance(self.x, self.y, nx, ny)
  45. if d < dis then
  46. self.index = self.index + (2 * sign)
  47. self.x = nx
  48. self.y = ny
  49. dis = dis - d
  50. else
  51. local dir = math.direction(self.x, self.y, nx, ny)
  52. self.x = self.x + math.dx(dis, dir)
  53. self.y = self.y + math.dy(dis, dir)
  54. dis = 0
  55. break
  56. end
  57. end
  58. if self.index + sign <= 1 or self.index + sign >= #self.points then self.speed = 0 end
  59. if self.index == 1 then
  60. ctx.map:modExec('scoring', 'win', orange)
  61. elseif self.index == #self.points - 1 then
  62. ctx.map:modExec('scoring', 'win', purple)
  63. end
  64. ctx.net:emit(app.net.events.prop, {id = self.id, x = math.round(self.x * 10), y = math.round(self.y * 10)})
  65. end
  66. end
  67. return CartServer