client.lua 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. local NetClient = extend(app.net.core)
  2. NetClient.signatures = app.net.signatures.client
  3. NetClient.receive = {}
  4. NetClient.receive['default'] = function(self, event) ctx.event:emit(event.msg, event.data) end
  5. NetClient.receive[app.net.messages.join] = function(self, event)
  6. ctx.id = event.data.id
  7. setmetatable(ctx.players:get(ctx.id), {__index = app.player.main})
  8. end
  9. NetClient.receive[app.net.messages.snapshot] = function(self, event)
  10. ctx.tick = event.data.tick + math.floor(((event.peer:round_trip_time() / 2) / 1000) / tickRate)
  11. if env ~= 'release' then ctx.tick = event.data.tick end
  12. --ctx.map:load(event.data.map)
  13. for i = 1, #event.data.players do
  14. local p = event.data.players[i]
  15. ctx.players:get(p.id).username = p.username
  16. if p.class > 0 then
  17. ctx.players:activate(p.id)
  18. ctx.players:setClass(p.id, p.class, p.team)
  19. end
  20. end
  21. end
  22. function NetClient:init()
  23. self.other = app.net.server
  24. self:connectTo(serverIp, 6061)
  25. self.messageBuffer = {}
  26. ctx.event:on(app.net.events.join, function(data)
  27. ctx.players:get(data.id).username = data.username
  28. end)
  29. ctx.event:on(app.net.events.sync, function(data)
  30. local p = ctx.players:get(data.id)
  31. if p and p.active then
  32. p:trace(data)
  33. end
  34. end)
  35. ctx.event:on('game.quit', function(data)
  36. self:quit()
  37. end)
  38. app.net.core.init(self)
  39. end
  40. function NetClient:quit()
  41. self:send(app.net.messages.leave)
  42. self.host:flush()
  43. self.server:disconnect()
  44. end
  45. function NetClient:connect(event)
  46. self.server = event.peer
  47. self:send(app.net.messages.join, {username = username})
  48. event.peer:ping_interval(100)
  49. event.peer:ping()
  50. end
  51. function NetClient:disconnect(event)
  52. ctx.event:emit('game.quit')
  53. end
  54. function NetClient:send(msg, data)
  55. if not self.server then return end
  56. self.outStream:clear()
  57. self:pack(msg, data)
  58. local important = self.signatures[msg].important
  59. local channel = important and 0 or 1
  60. local reliability = important and 'reliable' or 'unreliable'
  61. self.server:send(tostring(self.outStream), channel, reliability)
  62. end
  63. NetClient.emit = f.empty
  64. return NetClient