25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

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