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.
 
 
 

324 lines
6.2 KiB

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