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.
 
 
 

267 Zeilen
5.1 KiB

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