選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 

338 行
7.7 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.implicitStats || []).forEach(function (s) {
  118. this.obj.stats.addStat(s.stat, s.value);
  119. }, this);
  120. item.eq = true;
  121. this.eq[slot] = itemId;
  122. item.equipSlot = slot;
  123. this.obj.spellbook.calcDps();
  124. if ((!this.obj.mob) || (item.ability)) {
  125. if (item.spell)
  126. this.obj.inventory.learnAbility(itemId, item.runeSlot);
  127. else {
  128. var result = item;
  129. if (item.effects) {
  130. result = extend(true, {}, item);
  131. result.effects = result.effects.map(e => ({
  132. factionId: e.factionId,
  133. text: e.text,
  134. properties: e.properties
  135. }));
  136. var reputation = this.obj.reputation;
  137. if (result.factions) {
  138. result.factions = result.factions.map(function (f) {
  139. var faction = reputation.getBlueprint(f.id);
  140. var factionTier = reputation.getTier(f.id);
  141. var noEquip = null;
  142. if (factionTier < f.tier)
  143. noEquip = true;
  144. return {
  145. name: faction.name,
  146. tier: f.tier,
  147. tierName: ['Hated', 'Hostile', 'Unfriendly', 'Neutral', 'Friendly', 'Honored', 'Revered', 'Exalted'][f.tier],
  148. noEquip: noEquip
  149. };
  150. }, this);
  151. }
  152. }
  153. this.obj.syncer.setArray(true, 'inventory', 'getItems', result);
  154. }
  155. }
  156. this.obj.fireEvent('afterEquipItem', item);
  157. },
  158. unequip: function (itemId) {
  159. var item = itemId;
  160. var slot = null;
  161. if (typeof (itemId) == 'object') {
  162. slot = itemId.slot;
  163. itemId = itemId.itemId;
  164. }
  165. if (item.id == null)
  166. item = this.obj.inventory.findItem(itemId);
  167. if (!item)
  168. return;
  169. var stats = item.stats;
  170. if (this.obj.player) {
  171. var maxLevel = this.obj.instance.zone.level[1];
  172. if (maxLevel < item.level)
  173. stats = generatorStats.rescale(item, maxLevel);
  174. }
  175. for (var s in stats) {
  176. var val = stats[s];
  177. this.obj.stats.addStat(s, -val);
  178. }
  179. (item.implicitStats || []).forEach(function (s) {
  180. this.obj.stats.addStat(s.stat, -s.value);
  181. }, this);
  182. delete item.eq;
  183. delete this.eq[item.equipSlot];
  184. delete item.equipSlot;
  185. this.obj.inventory.setItemPosition(itemId);
  186. if (item.spell) {
  187. item.eq = true;
  188. this.obj.inventory.unlearnAbility(itemId, item.runeSlot);
  189. } else {
  190. if (!item.effects)
  191. this.obj.syncer.setArray(true, 'inventory', 'getItems', item);
  192. else {
  193. var result = extend(true, {}, item);
  194. result.effects = result.effects.map(e => ({
  195. factionId: e.factionId,
  196. text: e.text,
  197. properties: e.properties
  198. }));
  199. var reputation = this.obj.reputation;
  200. if (result.factions) {
  201. result.factions = result.factions.map(function (f) {
  202. var faction = reputation.getBlueprint(f.id);
  203. var factionTier = reputation.getTier(f.id);
  204. var noEquip = null;
  205. if (factionTier < f.tier)
  206. noEquip = true;
  207. return {
  208. name: faction.name,
  209. tier: f.tier,
  210. tierName: ['Hated', 'Hostile', 'Unfriendly', 'Neutral', 'Friendly', 'Honored', 'Revered', 'Exalted'][f.tier],
  211. noEquip: noEquip
  212. };
  213. }, this);
  214. }
  215. this.obj.syncer.setArray(true, 'inventory', 'getItems', result);
  216. }
  217. }
  218. this.obj.spellbook.calcDps();
  219. this.obj.fireEvent('afterUnequipItem', item);
  220. },
  221. unequipAll: function () {
  222. var eq = this.eq;
  223. Object.keys(this.eq).forEach(function (slot) {
  224. this.unequip(eq[slot]);
  225. }, this);
  226. },
  227. unequipFactionGear: function (factionId, tier) {
  228. var inventory = this.obj.inventory;
  229. var eq = this.eq;
  230. Object.keys(this.eq).forEach(function (slot) {
  231. var itemId = eq[slot];
  232. var item = inventory.findItem(itemId);
  233. var factions = item.factions;
  234. if (!factions)
  235. return;
  236. var findFaction = factions.find(f => f.id == factionId);
  237. if (!findFaction)
  238. return;
  239. if (findFaction.tier > tier) {
  240. this.unequip(itemId);
  241. this.obj.instance.syncer.queue('onGetMessages', {
  242. id: this.obj.id,
  243. messages: [{
  244. class: 'color-redA',
  245. message: 'you unequip your ' + item.name + ' as it zaps you',
  246. type: 'rep'
  247. }]
  248. }, [this.obj.serverId]);
  249. }
  250. }, this);
  251. },
  252. rescale: function (level) {
  253. var items = this.obj.inventory.items;
  254. var stats = {};
  255. var eq = this.eq;
  256. for (var p in eq) {
  257. var item = items.find(i => (i.id == eq[p]));
  258. if ((!item.slot) || (item.slot == 'tool')) {
  259. continue;
  260. }
  261. var item = items.find(i => (i.id == eq[p]));
  262. var nItemStats = item.stats;
  263. if (item.level > level)
  264. nItemStats = generatorStats.rescale(item, level);
  265. var tempItem = extend(true, {}, item);
  266. tempItem.stats = extend(true, {}, nItemStats);
  267. this.obj.fireEvent('afterRescaleItemStats', tempItem);
  268. for (var s in tempItem.stats) {
  269. if (!stats[s])
  270. stats[s] = 0;
  271. stats[s] += tempItem.stats[s];
  272. }
  273. }
  274. return stats;
  275. }
  276. };
  277. });