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.
 
 
 

156 lines
3.2 KiB

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