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.
 
 
 

367 líneas
7.0 KiB

  1. let objBase = require('./objBase');
  2. module.exports = {
  3. lastId: 0,
  4. instance: null,
  5. objects: [],
  6. init: function (_instance) {
  7. this.instance = _instance;
  8. this.physics = this.instance.physics;
  9. },
  10. getNextId: function () {
  11. return ++this.lastId;
  12. },
  13. build: function (isClientObj, id) {
  14. let o = extend({}, objBase);
  15. if (isClientObj)
  16. o.update = null;
  17. else {
  18. o.id = id || this.getNextId();
  19. o.addComponent('syncer');
  20. o.instance = this.instance;
  21. }
  22. return o;
  23. },
  24. pushObjectToList: function (obj) {
  25. this.objects.push(obj);
  26. },
  27. transferObject: function (o) {
  28. const obj = this.build();
  29. let components = o.components;
  30. delete o.components;
  31. delete o.id;
  32. for (let p in o)
  33. obj[p] = o[p];
  34. const cLen = components.length;
  35. for (let i = 0; i < cLen; i++) {
  36. let c = components[i];
  37. const cpn = obj.addComponent(c.type, null, true);
  38. for (let p in c)
  39. cpn[p] = c[p];
  40. if (cpn.transfer)
  41. cpn.transfer();
  42. }
  43. this.pushObjectToList(obj);
  44. this.physics.addObject(obj, obj.x, obj.y);
  45. return obj;
  46. },
  47. buildObjects: function (list, skipPush) {
  48. let lLen = list.length;
  49. for (let i = 0; i < lLen; i++) {
  50. let l = list[i];
  51. let obj = this.build(l.clientObj, l.id);
  52. obj.sheetName = l.sheetName;
  53. obj.cell = l.cell;
  54. obj.name = l.name;
  55. obj.x = l.x;
  56. obj.y = l.y;
  57. if (l.ttl)
  58. obj.ttl = l.ttl;
  59. if (l.width) {
  60. obj.width = l.width;
  61. obj.height = l.height;
  62. }
  63. if (l.area)
  64. obj.area = l.area;
  65. //Add components (certain ones need to happen first)
  66. //TODO: Clean this part up
  67. let properties = extend({}, l.properties);
  68. ['cpnMob'].forEach(function (c) {
  69. let blueprint = properties[c] || null;
  70. if ((blueprint) && (typeof (blueprint) === 'string'))
  71. blueprint = JSON.parse(blueprint);
  72. if (!blueprint)
  73. return;
  74. delete properties[c];
  75. let type = c.replace('cpn', '').toLowerCase();
  76. obj.addComponent(type, blueprint);
  77. }, this);
  78. for (let p in properties) {
  79. if (p.indexOf('cpn') === -1) {
  80. obj[p] = properties[p];
  81. continue;
  82. }
  83. let type = p.replace('cpn', '');
  84. type = type[0].toLowerCase() + type.substr(1);
  85. let blueprint = properties[p] || null;
  86. if ((blueprint) && (typeof (blueprint) === 'string'))
  87. blueprint = JSON.parse(blueprint);
  88. obj.addComponent(type, blueprint);
  89. }
  90. let extraProperties = l.extraProperties || {};
  91. for (let p in extraProperties) {
  92. let cpn = obj[p];
  93. let e = extraProperties[p];
  94. for (let pp in e)
  95. cpn[pp] = e[pp];
  96. if (cpn.init)
  97. cpn.init();
  98. }
  99. if ((this.physics) && (!obj.dead)) {
  100. if (!obj.width)
  101. this.physics.addObject(obj, obj.x, obj.y);
  102. else
  103. this.physics.addRegion(obj);
  104. }
  105. if (obj.aggro)
  106. obj.aggro.move();
  107. if (!skipPush)
  108. this.pushObjectToList(obj);
  109. if (lLen === 1)
  110. return obj;
  111. }
  112. },
  113. find: function (callback) {
  114. return this.objects.find(callback);
  115. },
  116. filter: function (callback) {
  117. return this.objects.filter(callback);
  118. },
  119. removeObject: function (obj, callback, useServerId) {
  120. let found = this.objects.spliceFirstWhere(o => obj.id === (useServerId ? o.serverId : o.id));
  121. if (!found)
  122. return;
  123. let physics = this.physics;
  124. if (physics) {
  125. if (!found.width)
  126. physics.removeObject(found, found.x, found.y);
  127. else
  128. physics.removeRegion(found);
  129. }
  130. found.destroy();
  131. if (callback)
  132. callback(found);
  133. },
  134. addObject: function (o, callback) {
  135. const newO = this.build();
  136. const components = o.components;
  137. delete o.components;
  138. for (let p in o)
  139. newO[p] = o[p];
  140. const len = components.length;
  141. for (let i = 0; i < len; i++) {
  142. const c = components[i];
  143. const newC = newO.addComponent(c.type, c);
  144. extend(newC, c);
  145. }
  146. this.pushObjectToList(newO);
  147. if (!newO.dead)
  148. this.physics.addObject(newO, newO.x, newO.y);
  149. callback(newO);
  150. return newO;
  151. },
  152. sendEvent: function (msg, { name: sourceZone }) {
  153. const { id, data } = msg;
  154. const player = this.objects.find(p => p.id === id);
  155. if (!player || player.zoneName !== sourceZone)
  156. return;
  157. player.socket.emit('event', {
  158. event: data.event,
  159. data: data.data
  160. });
  161. },
  162. sendEvents: function ({ data }, { name: sourceZone }) {
  163. const { objects } = this;
  164. //Store will contain all events to be sent to players
  165. const store = {};
  166. for (let e in data) {
  167. const event = data[e];
  168. const eLen = event.length;
  169. for (let j = 0; j < eLen; j++) {
  170. const eventEntry = event[j];
  171. const { obj: eventObj, to } = eventEntry;
  172. if (e === 'serverModule') {
  173. const { method, msg } = eventObj;
  174. if (Array.isArray(msg))
  175. global[eventObj.module][method](...msg);
  176. else
  177. global[eventObj.module][method](msg);
  178. continue;
  179. }
  180. const toLen = to.length;
  181. for (let i = 0; i < toLen; i++) {
  182. const toId = to[i];
  183. let storeEntry = store[toId];
  184. if (!storeEntry) {
  185. const playerObj = objects.find(o => o.id === toId);
  186. if (!playerObj || playerObj.zoneName !== sourceZone) {
  187. io.setAsync({
  188. key: new Date(),
  189. table: 'error',
  190. value: `ignoring ${e}`
  191. });
  192. continue;
  193. }
  194. store[toId] = {
  195. obj: playerObj,
  196. events: { [e]: [eventObj] }
  197. };
  198. continue;
  199. }
  200. if (!storeEntry.events[e])
  201. storeEntry.events[e] = [];
  202. storeEntry.events[e].push(eventObj);
  203. }
  204. }
  205. }
  206. for (let p in store) {
  207. const { obj: { socket }, events } = store[p];
  208. socket.emit('events', events);
  209. }
  210. },
  211. updateObject: async function (msg) {
  212. let player = this.objects.find(p => p.id === msg.serverId);
  213. if (!player)
  214. return;
  215. let obj = msg.obj;
  216. for (let p in obj)
  217. player[p] = obj[p];
  218. if (obj.permadead)
  219. await leaderboard.killCharacter(player.name);
  220. if (obj.level) {
  221. await leaderboard.setLevel(player.name, obj.level);
  222. cons.emit('events', {
  223. onGetMessages: [{
  224. messages: [{
  225. class: 'color-blueB',
  226. message: player.name + ' has reached level ' + obj.level
  227. }]
  228. }],
  229. onGetConnectedPlayer: [cons.getCharacterList()]
  230. });
  231. }
  232. },
  233. notifyCollisionChange: function (x, y, collides) {
  234. this.objects
  235. .filter(o => o.player)
  236. .forEach(function (o) {
  237. o.syncer.setArray(true, 'player', 'collisionChanges', {
  238. x,
  239. y,
  240. collides
  241. });
  242. });
  243. },
  244. notifyMapChange: function (x, y, mapCellString) {
  245. this.objects
  246. .filter(o => o.player)
  247. .forEach(function (o) {
  248. o.syncer.setArray(true, 'player', 'mapChanges', {
  249. x,
  250. y,
  251. mapCellString
  252. });
  253. });
  254. },
  255. update: function () {
  256. let objects = this.objects;
  257. let len = objects.length;
  258. for (let i = 0; i < len; i++) {
  259. let o = objects[i];
  260. //Don't remove it from the list if it's destroyed, but don't update it either
  261. //That's syncer's job
  262. if ((o.update) && (!o.destroyed))
  263. o.update();
  264. //When objects are sent to other zones, we destroy them immediately (thhrough sendObjToZone)
  265. if (o.forceDestroy) {
  266. i--;
  267. len--;
  268. continue;
  269. }
  270. if (o.ttl) {
  271. o.ttl--;
  272. if (!o.ttl)
  273. o.destroyed = true;
  274. }
  275. o.fireEvent('afterTick');
  276. }
  277. }
  278. };