25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 

299 satır
5.7 KiB

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