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.
 
 
 

330 satır
7.5 KiB

  1. define([
  2. 'items/generators/stats'
  3. ], function (
  4. generatorStats
  5. ) {
  6. return {
  7. type: 'equipment',
  8. eq: {},
  9. doAutoEq: true,
  10. init: function (blueprint) {
  11. },
  12. transfer: function () {
  13. if (this.eqTransfer) {
  14. this.eq = this.eqTransfer;
  15. delete this.eqTransfer;
  16. }
  17. },
  18. simplify: function (self) {
  19. return {
  20. type: 'equipment',
  21. eq: {},
  22. eqTransfer: this.eq
  23. };
  24. },
  25. autoEquip: function (itemId) {
  26. if (!this.doAutoEq)
  27. return;
  28. var stats = this.obj.stats.values;
  29. var item = this.obj.inventory.findItem(itemId);
  30. if (!item)
  31. return;
  32. else if ((!item.slot) || (item.material) || (item.quest) || (item.ability) || (!this.obj.inventory.canEquipItem(item))) {
  33. item.eq = false;
  34. return;
  35. }
  36. var currentEqId = this.eq[item.slot];
  37. if (currentEqId == null) {
  38. this.equip(itemId);
  39. return true;
  40. }
  41. },
  42. equip: function (itemId) {
  43. var slot = null;
  44. if (typeof (itemId) == 'object') {
  45. slot = itemId.slot;
  46. itemId = itemId.itemId;
  47. }
  48. var item = this.obj.inventory.findItem(itemId);
  49. if (!item)
  50. return;
  51. else if ((!item.slot) || (item.material) || (item.quest) || (item.ability) || (!this.obj.inventory.canEquipItem(item))) {
  52. item.eq = false;
  53. return;
  54. }
  55. if (!slot)
  56. slot = item.equipSlot || item.slot;
  57. if (slot == 'twoHanded') {
  58. var currentEqId = this.eq.offHand;
  59. if (currentEqId != null)
  60. this.unequip(currentEqId);
  61. slot = 'oneHanded';
  62. } else if (slot == 'offHand') {
  63. var currentEqId = this.eq.oneHanded;
  64. if (currentEqId != null) {
  65. var currentEq = this.obj.inventory.findItem(currentEqId);
  66. if ((currentEq != null) && (currentEq.slot == 'twoHanded'))
  67. this.unequip(currentEqId);
  68. }
  69. }
  70. var equipMsg = {
  71. success: true,
  72. item: item
  73. };
  74. this.obj.fireEvent('beforeEquipItem', equipMsg);
  75. if (!equipMsg.success) {
  76. this.obj.instance.syncer.queue('onGetMessages', {
  77. id: this.obj.id,
  78. messages: [{
  79. class: 'color-redA',
  80. message: equipMsg.msg || 'you cannot equip that item',
  81. type: 'info'
  82. }]
  83. }, [this.obj.serverId]);
  84. return;
  85. }
  86. delete item.pos;
  87. this.obj.syncer.setArray(true, 'inventory', 'getItems', item);
  88. if (slot == 'finger') {
  89. var f1 = (this.eq['finger-1'] != null);
  90. var f2 = (this.eq['finger-2'] != null);
  91. if ((f1) && (f2))
  92. slot = 'finger-1';
  93. else if (!f1)
  94. slot = 'finger-1';
  95. else if (!f2)
  96. slot = 'finger-2';
  97. }
  98. var spellId = null;
  99. var currentEqId = this.eq[slot];
  100. var currentEq = this.obj.inventory.findItem(currentEqId);
  101. if (currentEq == item)
  102. return;
  103. if (currentEqId != null) {
  104. spellId = currentEq.spellId;
  105. this.unequip(currentEqId);
  106. }
  107. var stats = item.stats;
  108. if (this.obj.player) {
  109. var maxLevel = this.obj.instance.zone.level[1];
  110. if (maxLevel < item.level)
  111. stats = generatorStats.rescale(item, maxLevel);
  112. }
  113. for (var s in stats) {
  114. var val = stats[s];
  115. this.obj.stats.addStat(s, val);
  116. }
  117. item.eq = true;
  118. this.eq[slot] = itemId;
  119. item.equipSlot = slot;
  120. this.obj.spellbook.calcDps();
  121. if ((!this.obj.mob) || (item.ability)) {
  122. if (item.spell)
  123. this.obj.inventory.learnAbility(itemId, item.runeSlot);
  124. else {
  125. var result = item;
  126. if (item.effects) {
  127. result = extend(true, {}, item);
  128. result.effects = result.effects.map(e => ({
  129. factionId: e.factionId,
  130. text: e.text,
  131. properties: e.properties
  132. }));
  133. var reputation = this.obj.reputation;
  134. if (result.factions) {
  135. result.factions = result.factions.map(function (f) {
  136. var faction = reputation.getBlueprint(f.id);
  137. var factionTier = reputation.getTier(f.id);
  138. var noEquip = null;
  139. if (factionTier < f.tier)
  140. noEquip = true;
  141. return {
  142. name: faction.name,
  143. tier: f.tier,
  144. tierName: ['Hated', 'Hostile', 'Unfriendly', 'Neutral', 'Friendly', 'Honored', 'Revered', 'Exalted'][f.tier],
  145. noEquip: noEquip
  146. };
  147. }, this);
  148. }
  149. }
  150. this.obj.syncer.setArray(true, 'inventory', 'getItems', result);
  151. }
  152. }
  153. this.obj.fireEvent('afterEquipItem', item);
  154. },
  155. unequip: function (itemId) {
  156. var item = itemId;
  157. var slot = null;
  158. if (typeof (itemId) == 'object') {
  159. slot = itemId.slot;
  160. itemId = itemId.itemId;
  161. }
  162. if (item.id == null)
  163. item = this.obj.inventory.findItem(itemId);
  164. if (!item)
  165. return;
  166. var stats = item.stats;
  167. if (this.obj.player) {
  168. var maxLevel = this.obj.instance.zone.level[1];
  169. if (maxLevel < item.level)
  170. stats = generatorStats.rescale(item, maxLevel);
  171. }
  172. for (var s in stats) {
  173. var val = stats[s];
  174. this.obj.stats.addStat(s, -val);
  175. }
  176. delete item.eq;
  177. delete this.eq[item.equipSlot];
  178. delete item.equipSlot;
  179. this.obj.inventory.setItemPosition(itemId);
  180. if (item.spell) {
  181. item.eq = true;
  182. this.obj.inventory.unlearnAbility(itemId, item.runeSlot);
  183. } else {
  184. if (!item.effects)
  185. this.obj.syncer.setArray(true, 'inventory', 'getItems', item);
  186. else {
  187. var result = extend(true, {}, item);
  188. result.effects = result.effects.map(e => ({
  189. factionId: e.factionId,
  190. text: e.text,
  191. properties: e.properties
  192. }));
  193. var reputation = this.obj.reputation;
  194. if (result.factions) {
  195. result.factions = result.factions.map(function (f) {
  196. var faction = reputation.getBlueprint(f.id);
  197. var factionTier = reputation.getTier(f.id);
  198. var noEquip = null;
  199. if (factionTier < f.tier)
  200. noEquip = true;
  201. return {
  202. name: faction.name,
  203. tier: f.tier,
  204. tierName: ['Hated', 'Hostile', 'Unfriendly', 'Neutral', 'Friendly', 'Honored', 'Revered', 'Exalted'][f.tier],
  205. noEquip: noEquip
  206. };
  207. }, this);
  208. }
  209. this.obj.syncer.setArray(true, 'inventory', 'getItems', result);
  210. }
  211. }
  212. this.obj.spellbook.calcDps();
  213. this.obj.fireEvent('afterUnequipItem', item);
  214. },
  215. unequipAll: function () {
  216. var eq = this.eq;
  217. Object.keys(this.eq).forEach(function (slot) {
  218. this.unequip(eq[slot]);
  219. }, this);
  220. },
  221. unequipFactionGear: function (factionId, tier) {
  222. var inventory = this.obj.inventory;
  223. var eq = this.eq;
  224. Object.keys(this.eq).forEach(function (slot) {
  225. var itemId = eq[slot];
  226. var item = inventory.findItem(itemId);
  227. var factions = item.factions;
  228. if (!factions)
  229. return;
  230. var findFaction = factions.find(f => f.id == factionId);
  231. if (!findFaction)
  232. return;
  233. if (findFaction.tier > tier) {
  234. this.unequip(itemId);
  235. this.obj.instance.syncer.queue('onGetMessages', {
  236. id: this.obj.id,
  237. messages: [{
  238. class: 'color-redA',
  239. message: 'you unequip your ' + item.name + ' as it zaps you',
  240. type: 'rep'
  241. }]
  242. }, [this.obj.serverId]);
  243. }
  244. }, this);
  245. },
  246. rescale: function (level) {
  247. var items = this.obj.inventory.items;
  248. var stats = {};
  249. var eq = this.eq;
  250. for (var p in eq) {
  251. var item = items.find(i => (i.id == eq[p]));
  252. if ((!item.slot) || (item.slot == 'tool')) {
  253. continue;
  254. }
  255. var item = items.find(i => (i.id == eq[p]));
  256. var nItemStats = item.stats;
  257. if (item.level > level)
  258. nItemStats = generatorStats.rescale(item, level);
  259. var tempItem = extend(true, {}, item);
  260. tempItem.stats = extend(true, {}, nItemStats);
  261. this.obj.fireEvent('afterRescaleItemStats', tempItem);
  262. for (var s in tempItem.stats) {
  263. if (!stats[s])
  264. stats[s] = 0;
  265. stats[s] += tempItem.stats[s];
  266. }
  267. }
  268. return stats;
  269. }
  270. };
  271. });