No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 

214 líneas
4.2 KiB

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