You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

180 lines
3.5 KiB

  1. //External Modules
  2. const objects = require('../objects/objects');
  3. //Helpers
  4. const { route, routeGlobal } = require('./connections/route');
  5. //Module
  6. module.exports = {
  7. players: [],
  8. sockets: null,
  9. playing: 0,
  10. onHandshake: function (socket) {
  11. const p = objects.build();
  12. p.socket = socket;
  13. p.addComponent('auth');
  14. p.addComponent('player');
  15. objects.pushObjectToList(p);
  16. this.players.push(p);
  17. },
  18. onDisconnect: function (socket) {
  19. let player = this.players.find(p => p.socket.id === socket.id);
  20. if (!player)
  21. return;
  22. let sessionDuration = 0;
  23. if (player.has('id')) {
  24. if (player.social)
  25. player.social.dc();
  26. sessionDuration = ~~(((+new Date()) - player.player.sessionStart) / 1000);
  27. atlas.updateObject(player, {
  28. components: [{
  29. type: 'stats',
  30. sessionDuration: sessionDuration
  31. }]
  32. });
  33. atlas.removeObject(player);
  34. }
  35. if (player.name) {
  36. this.emit('events', {
  37. onGetMessages: [{
  38. messages: [{
  39. class: 'color-blueB',
  40. message: player.name + ' has gone offline'
  41. }]
  42. }],
  43. onGetDisconnectedPlayer: [player.name]
  44. });
  45. if (player.has('id'))
  46. this.modifyPlayerCount(-1);
  47. }
  48. this.players.spliceWhere(p => p.socket.id === socket.id);
  49. },
  50. route: function (socket, msg) {
  51. route.call(this, socket, msg);
  52. },
  53. routeGlobal: function (msg) {
  54. routeGlobal.call(this, msg);
  55. },
  56. routeGlobal: function (msg) {
  57. global[msg.module][msg.method](msg);
  58. },
  59. unzone: function (msg) {
  60. let socket = msg.socket;
  61. let player = this.players.find(p => p.socket.id === socket.id);
  62. if (!player)
  63. return;
  64. if (player.social)
  65. player.social.dc();
  66. atlas.removeObject(player, true, this.onUnzone.bind(this, player, msg));
  67. let keys = Object.keys(player);
  68. keys.forEach(function (k) {
  69. let val = player[k];
  70. if (val && val.type) {
  71. if (['player', 'auth', 'syncer'].indexOf(val.type) === -1)
  72. delete player[k];
  73. }
  74. });
  75. this.emit('events', {
  76. onGetMessages: [{
  77. messages: [{
  78. class: 'color-blueB',
  79. message: player.name + ' has gone offline'
  80. }]
  81. }],
  82. onGetDisconnectedPlayer: [player.name]
  83. });
  84. //If we don't do this, the atlas will try to remove it from the thread
  85. player.zoneName = null;
  86. player.name = null;
  87. //A hack to allow us to actually call methods again (like retrieve the player list)
  88. player.dead = false;
  89. player.permadead = false;
  90. this.modifyPlayerCount(-1);
  91. },
  92. onUnzone: async function (player, msg) {
  93. msg.callback();
  94. },
  95. logOut: async function (exclude) {
  96. let players = this.players;
  97. let pLen = players.length;
  98. for (let i = 0; i < pLen; i++) {
  99. let p = players[i];
  100. if ((!p) || (p === exclude) || (!p.auth))
  101. continue;
  102. if (p.auth.username === exclude.auth.username) {
  103. if (p.name && p.zoneName)
  104. await atlas.forceSavePlayer(p.name, p.zoneName);
  105. p.socket.emit('dc', {});
  106. }
  107. }
  108. },
  109. emit: function (event, msg) {
  110. this.sockets.emit(event, msg);
  111. },
  112. getCharacterList: function () {
  113. let result = [];
  114. let players = this.players;
  115. let pLen = players.length;
  116. for (let i = 0; i < pLen; i++) {
  117. let p = players[i];
  118. if (!p.name)
  119. continue;
  120. result.push({
  121. zone: p.zone,
  122. name: p.name,
  123. level: p.level,
  124. class: p.class,
  125. id: p.id
  126. });
  127. }
  128. return result;
  129. },
  130. forceSaveAll: function () {
  131. this.players
  132. .filter(p => p.zone)
  133. .forEach(p => {
  134. atlas.performAction(p, {
  135. cpn: 'auth',
  136. method: 'doSave'
  137. });
  138. });
  139. },
  140. modifyPlayerCount: function (delta) {
  141. this.playing += delta;
  142. }
  143. };