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.
 
 
 

295 lines
5.5 KiB

  1. module.exports = {
  2. type: 'effects',
  3. effects: [],
  4. nextId: 0,
  5. ccResistances: {
  6. stunned: 0,
  7. slowed: 0
  8. },
  9. init: function (blueprint) {
  10. let effects = blueprint.effects || [];
  11. let eLen = effects.length;
  12. for (let i = 0; i < eLen; i++) {
  13. let e = effects[i];
  14. if (!e.type)
  15. continue;
  16. this.addEffect(e);
  17. }
  18. delete blueprint.effects;
  19. },
  20. transfer: function () {
  21. let transferEffects = this.effects;
  22. this.effects = [];
  23. this.init({
  24. effects: transferEffects
  25. });
  26. },
  27. save: function () {
  28. let e = {
  29. type: 'effects',
  30. effects: this.effects
  31. .map(e => e.save())
  32. .filter(e => e !== null)
  33. };
  34. return e;
  35. },
  36. simplify: function (self) {
  37. let e = {
  38. type: 'effects'
  39. };
  40. let effects = this.effects;
  41. if ((effects.length > 0) && (effects[0].obj)) {
  42. effects = effects
  43. .map(e => e.simplify())
  44. .filter(e => e !== null);
  45. }
  46. e.effects = effects;
  47. return e;
  48. },
  49. destroy: function () {
  50. if (this.obj.instance)
  51. this.events.beforeRezone.call(this);
  52. },
  53. die: function () {
  54. this.events.beforeRezone.call(this, true);
  55. },
  56. reset: function () {
  57. let effects = this.effects;
  58. let eLen = effects.length;
  59. for (let i = 0; i < eLen; i++) {
  60. let effect = effects[i];
  61. if (effect.reset)
  62. effect.reset();
  63. }
  64. },
  65. reapply: function () {
  66. let effects = this.effects;
  67. let eLen = effects.length;
  68. for (let i = 0; i < eLen; i++) {
  69. let effect = effects[i];
  70. if (effect.reapply)
  71. effect.reapply();
  72. }
  73. },
  74. events: {
  75. beforeRezone: function (forceDestroy) {
  76. let effects = this.effects;
  77. let eLen = effects.length;
  78. for (let i = 0; i < eLen; i++) {
  79. let effect = effects[i];
  80. if (!forceDestroy) {
  81. if (effect.persist) {
  82. this.syncRemove(effect.id, effect.type);
  83. continue;
  84. }
  85. }
  86. if (effect.destroy)
  87. effect.destroy();
  88. this.syncRemove(effect.id, effect.type);
  89. effects.splice(i, 1);
  90. eLen--;
  91. i--;
  92. }
  93. }
  94. },
  95. canApplyEffect: function (type) {
  96. if (this.ccResistances[type] === null)
  97. return true;
  98. let ccResistances = this.ccResistances;
  99. if ((100 - ccResistances[type]) >= 50) {
  100. ccResistances[type] += 50;
  101. return true;
  102. } return false;
  103. },
  104. addEffect: function (options) {
  105. if (!this.canApplyEffect(options.type))
  106. return;
  107. if (!options.new) {
  108. let exists = this.effects.find(e => e.type === options.type);
  109. if (exists) {
  110. exists.ttl += options.ttl;
  111. for (let p in options) {
  112. if (p === 'ttl')
  113. continue;
  114. exists[p] = options[p];
  115. }
  116. return exists;
  117. }
  118. }
  119. let typeTemplate = null;
  120. if (options.type) {
  121. let type = options.type[0].toUpperCase() + options.type.substr(1);
  122. let result = {
  123. type: type,
  124. url: 'config/effects/effect' + type + '.js'
  125. };
  126. this.obj.instance.eventEmitter.emit('onBeforeGetEffect', result);
  127. typeTemplate = require('../' + result.url);
  128. }
  129. let builtEffect = extend(true, {}, typeTemplate);
  130. for (let p in options)
  131. builtEffect[p] = options[p];
  132. builtEffect.obj = this.obj;
  133. builtEffect.id = this.nextId++;
  134. builtEffect.noMsg = options.noMsg;
  135. if (builtEffect.init)
  136. builtEffect.init(options.source);
  137. this.effects.push(builtEffect);
  138. if (!options.noMsg) {
  139. this.obj.instance.syncer.queue('onGetBuff', {
  140. type: options.type,
  141. id: builtEffect.id
  142. }, [this.obj.serverId]);
  143. this.obj.instance.syncer.queue('onGetDamage', {
  144. id: this.obj.id,
  145. event: true,
  146. text: '+' + options.type
  147. }, -1);
  148. this.obj.syncer.setArray(false, 'effects', 'addEffects', options.type);
  149. }
  150. return builtEffect;
  151. },
  152. syncRemove: function (id, type, noMsg) {
  153. if ((noMsg) || (!type))
  154. return;
  155. this.obj.instance.syncer.queue('onRemoveBuff', {
  156. id: id
  157. }, [this.obj.serverId]);
  158. this.obj.instance.syncer.queue('onGetDamage', {
  159. id: this.obj.id,
  160. event: true,
  161. text: '-' + type
  162. }, -1);
  163. this.obj.syncer.setArray(false, 'effects', 'removeEffects', type);
  164. },
  165. removeEffect: function (checkEffect, noMsg) {
  166. let effects = this.effects;
  167. let eLen = effects.length;
  168. for (let i = 0; i < eLen; i++) {
  169. let effect = effects[i];
  170. if (effect === checkEffect) {
  171. if (effect.destroy)
  172. effect.destroy();
  173. this.syncRemove(effect.id, effect.type, noMsg || effect.noMsg);
  174. effects.splice(i, 1);
  175. return;
  176. }
  177. }
  178. },
  179. removeEffectByName: function (effectName, noMsg) {
  180. let effects = this.effects;
  181. let eLen = effects.length;
  182. for (let i = 0; i < eLen; i++) {
  183. let effect = effects[i];
  184. if (effect.type === effectName) {
  185. this.syncRemove(effect.id, effect.type, noMsg || effects.noMsg);
  186. effects.splice(i, 1);
  187. return;
  188. }
  189. }
  190. },
  191. fireEvent: function (event, args) {
  192. let effects = this.effects;
  193. let eLen = effects.length;
  194. for (let i = 0; i < eLen; i++) {
  195. let e = effects[i];
  196. //Maybe the effect killed us?
  197. if (!e) {
  198. i--;
  199. eLen--;
  200. continue;
  201. }
  202. if (e.ttl <= 0)
  203. continue;
  204. let events = e.events;
  205. if (!events)
  206. continue;
  207. let callback = events[event];
  208. if (!callback)
  209. continue;
  210. callback.apply(e, args);
  211. }
  212. },
  213. update: function () {
  214. let effects = this.effects;
  215. let eLen = effects.length;
  216. for (let i = 0; i < eLen; i++) {
  217. let e = effects[i];
  218. if (e.ttl > 0) {
  219. e.ttl--;
  220. if (e.ttl === 0)
  221. e.destroyed = true;
  222. }
  223. if (e.update)
  224. e.update();
  225. if (e.destroyed) {
  226. effects.splice(i, 1);
  227. eLen--;
  228. i--;
  229. if (e.destroy)
  230. e.destroy();
  231. this.syncRemove(e.id, e.type, e.noMsg);
  232. }
  233. }
  234. for (let p in this.ccResistances) {
  235. if (this.ccResistances[p] > 0)
  236. this.ccResistances[p]--;
  237. }
  238. }
  239. };