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.
 
 
 

216 regels
4.5 KiB

  1. let map = require('./map');
  2. let syncer = require('./syncer');
  3. let objects = require('../objects/objects');
  4. let spawners = require('./spawners');
  5. let physics = require('./physics');
  6. let resourceSpawner = require('./resourceSpawner');
  7. let spellCallbacks = require('../config/spells/spellCallbacks');
  8. let questBuilder = require('../config/quests/questBuilder');
  9. let randomMap = require('./randomMap');
  10. let events = require('../events/events');
  11. let scheduler = require('../misc/scheduler');
  12. let mail = require('../mail/mail');
  13. let herbs = require('../config/herbs');
  14. let eventEmitter = require('../misc/events');
  15. module.exports = {
  16. instances: [],
  17. zoneId: -1,
  18. speed: consts.tickTime,
  19. lastTime: 0,
  20. init: function (args) {
  21. this.zoneId = args.zoneId;
  22. spellCallbacks.init();
  23. herbs.init();
  24. map.init(args);
  25. let fakeInstance = {
  26. objects: objects,
  27. syncer: syncer,
  28. physics: physics,
  29. zoneId: this.zoneId,
  30. spawners: spawners,
  31. questBuilder: questBuilder,
  32. events: events,
  33. zone: map.zone,
  34. mail: mail,
  35. map: map,
  36. scheduler: scheduler,
  37. eventEmitter: eventEmitter
  38. };
  39. this.instances.push(fakeInstance);
  40. spawners.init(fakeInstance);
  41. scheduler.init();
  42. map.create();
  43. if (map.mapFile.properties.isRandom) {
  44. if (!map.oldCollisionMap)
  45. map.oldCollisionMap = map.collisionMap;
  46. randomMap.generate({
  47. map: map,
  48. physics: physics,
  49. spawners: spawners
  50. });
  51. map.seed = _.getGuid();
  52. }
  53. map.clientMap.zoneId = this.zoneId;
  54. [resourceSpawner, syncer, objects, questBuilder, events, mail].forEach(i => i.init(fakeInstance));
  55. this.tick();
  56. },
  57. tick: function () {
  58. events.update();
  59. objects.update();
  60. resourceSpawner.update();
  61. spawners.update();
  62. syncer.update();
  63. scheduler.update();
  64. setTimeout(this.tick.bind(this), this.speed);
  65. },
  66. addObject: function (msg) {
  67. let obj = msg.obj;
  68. obj.serverId = obj.id;
  69. delete obj.id;
  70. let spawnPos = map.getSpawnPos(obj);
  71. let spawnEvent = {
  72. spawnPos: extend({}, spawnPos),
  73. changed: false
  74. };
  75. eventEmitter.emitNoSticky('onBeforePlayerSpawn', { name: obj.name, instance: { physics } }, spawnEvent);
  76. if (spawnEvent.changed)
  77. msg.keepPos = false;
  78. if (msg.keepPos && (!physics.isValid(obj.x, obj.y) || !map.canPathFromPos(obj)))
  79. msg.keepPos = false;
  80. if (!msg.keepPos || !obj.has('x') || (map.mapFile.properties.isRandom && obj.instanceId !== map.seed)) {
  81. obj.x = spawnPos.x;
  82. obj.y = spawnPos.y;
  83. }
  84. obj.instanceId = map.seed || null;
  85. obj.spawn = map.spawn;
  86. syncer.queue('onGetMap', map.clientMap, [obj.serverId]);
  87. if (!msg.transfer)
  88. objects.addObject(obj, this.onAddObject.bind(this));
  89. else {
  90. let o = objects.transferObject(obj);
  91. questBuilder.obtain(o);
  92. }
  93. },
  94. onAddObject: function (obj) {
  95. if (obj.player)
  96. obj.stats.onLogin();
  97. questBuilder.obtain(obj);
  98. obj.fireEvent('afterMove');
  99. if (obj.dead) {
  100. obj.instance.syncer.queue('onDeath', {
  101. x: obj.x,
  102. y: obj.y
  103. }, [obj.serverId]);
  104. }
  105. },
  106. updateObject: function (msg) {
  107. let obj = objects.find(o => o.serverId === msg.id);
  108. if (!obj)
  109. return;
  110. let msgObj = msg.obj;
  111. let components = msgObj.components || [];
  112. delete msgObj.components;
  113. for (let p in msgObj)
  114. obj[p] = msgObj[p];
  115. let cLen = components.length;
  116. for (let i = 0; i < cLen; i++) {
  117. let c = components[i];
  118. let component = obj[c.type];
  119. for (let p in c)
  120. component[p] = c[p];
  121. }
  122. },
  123. queueAction: function (msg) {
  124. let obj = objects.find(o => o.serverId === msg.id);
  125. if (!obj)
  126. return;
  127. else if (msg.action.action === 'move') {
  128. let moveEntries = obj.actionQueue.filter(q => (q.action === 'move')).length;
  129. if (moveEntries >= 50)
  130. return;
  131. }
  132. obj.queue(msg.action);
  133. },
  134. performAction: function (msg) {
  135. let obj = null;
  136. let targetId = msg.action.targetId;
  137. if (!targetId)
  138. obj = objects.find(o => o.serverId === msg.id);
  139. else {
  140. obj = objects.find(o => o.id === targetId);
  141. if (obj) {
  142. let action = msg.action;
  143. if (!action.data)
  144. action.data = {};
  145. action.data.sourceId = msg.id;
  146. }
  147. }
  148. if (!obj)
  149. return;
  150. obj.performAction(msg.action);
  151. },
  152. removeObject: async function (msg) {
  153. let obj = msg.obj;
  154. obj = objects.find(o => o.serverId === obj.id);
  155. if (!obj) {
  156. //We should probably never reach this
  157. return;
  158. }
  159. if (obj.auth)
  160. await obj.auth.doSave();
  161. if (obj.player)
  162. obj.fireEvent('beforeRezone');
  163. obj.destroyed = true;
  164. if (msg.callbackId) {
  165. process.send({
  166. module: 'atlas',
  167. method: 'resolveCallback',
  168. msg: {
  169. id: msg.callbackId
  170. }
  171. });
  172. }
  173. }
  174. };