Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 

177 rader
3.4 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. unzone: function (msg) {
  57. let socket = msg.socket;
  58. let player = this.players.find(p => p.socket.id === socket.id);
  59. if (!player)
  60. return;
  61. if (player.social)
  62. player.social.dc();
  63. atlas.removeObject(player, true, this.onUnzone.bind(this, player, msg));
  64. let keys = Object.keys(player);
  65. keys.forEach(function (k) {
  66. let val = player[k];
  67. if (val && val.type) {
  68. if (['player', 'auth', 'syncer'].indexOf(val.type) === -1)
  69. delete player[k];
  70. }
  71. });
  72. this.emit('events', {
  73. onGetMessages: [{
  74. messages: [{
  75. class: 'color-blueB',
  76. message: player.name + ' has gone offline'
  77. }]
  78. }],
  79. onGetDisconnectedPlayer: [player.name]
  80. });
  81. //If we don't do this, the atlas will try to remove it from the thread
  82. player.zoneName = null;
  83. player.name = null;
  84. //A hack to allow us to actually call methods again (like retrieve the player list)
  85. player.dead = false;
  86. player.permadead = false;
  87. this.modifyPlayerCount(-1);
  88. },
  89. onUnzone: async function (player, msg) {
  90. msg.callback();
  91. },
  92. logOut: async function (exclude) {
  93. let players = this.players;
  94. let pLen = players.length;
  95. for (let i = 0; i < pLen; i++) {
  96. let p = players[i];
  97. if ((!p) || (p === exclude) || (!p.auth))
  98. continue;
  99. if (p.auth.username === exclude.auth.username) {
  100. if (p.name && p.zoneName)
  101. await atlas.forceSavePlayer(p.name, p.zoneName);
  102. p.socket.emit('dc', {});
  103. }
  104. }
  105. },
  106. emit: function (event, msg) {
  107. this.sockets.emit(event, msg);
  108. },
  109. getCharacterList: function () {
  110. let result = [];
  111. let players = this.players;
  112. let pLen = players.length;
  113. for (let i = 0; i < pLen; i++) {
  114. let p = players[i];
  115. if (!p.name)
  116. continue;
  117. result.push({
  118. zone: p.zone,
  119. name: p.name,
  120. level: p.level,
  121. class: p.class,
  122. id: p.id
  123. });
  124. }
  125. return result;
  126. },
  127. forceSaveAll: function () {
  128. this.players
  129. .filter(p => p.zone)
  130. .forEach(p => {
  131. atlas.performAction(p, {
  132. cpn: 'auth',
  133. method: 'doSave',
  134. data: {}
  135. });
  136. });
  137. },
  138. modifyPlayerCount: function (delta) {
  139. this.playing += delta;
  140. }
  141. };