Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 

322 Zeilen
6.1 KiB

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