您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

187 行
4.3 KiB

  1. const tplItem = `
  2. <div class="renderItem item">
  3. <div class="icon"></div>
  4. <div class="quantity"></div>
  5. </div>
  6. `;
  7. define([
  8. 'js/system/events',
  9. 'js/system/globals'
  10. ], function (
  11. events,
  12. globals
  13. ) {
  14. const hideTooltip = (el, item, e) => {
  15. events.emit('onHideItemTooltip', item);
  16. };
  17. const renderItemManager = {
  18. hoverItem: null,
  19. onHover: function (el, item, e) {
  20. if (item)
  21. this.hoverItem = item;
  22. else
  23. item = this.hoverItem;
  24. let ttPos = null;
  25. if (el) {
  26. ttPos = {
  27. x: ~~(e.clientX + 32),
  28. y: ~~(e.clientY)
  29. };
  30. }
  31. events.emit('onShowItemTooltip', item, ttPos, true);
  32. },
  33. onKeyDown: function (key) {
  34. if (key === 'shift' && this.hoverItem)
  35. this.onHover();
  36. },
  37. onKeyUp: function (key) {
  38. if (key === 'shift' && this.hoverItem)
  39. this.onHover();
  40. },
  41. onMouseLeave: function (el, item, e) {
  42. if (this.hoverItem !== item)
  43. return;
  44. hideTooltip(el, item, e);
  45. this.hoverItem = null;
  46. }
  47. };
  48. events.on('onKeyDown', renderItemManager.onKeyDown.bind(renderItemManager));
  49. events.on('onKeyUp', renderItemManager.onKeyUp.bind(renderItemManager));
  50. const addTooltipEvents = (el, item) => {
  51. const leaveHandler = renderItemManager.onMouseLeave.bind(renderItemManager, el, item);
  52. let moveHandler = renderItemManager.onHover.bind(renderItemManager, el, item);
  53. let downHandler = () => {};
  54. if (isMobile) {
  55. moveHandler = () => {};
  56. downHandler = renderItemManager.onHover.bind(renderItemManager, el, item);
  57. }
  58. $.event.special.destroyed = {
  59. remove: function (o) {
  60. if (o.handler)
  61. o.handler();
  62. }
  63. };
  64. el
  65. .on('mousedown', downHandler)
  66. .on('mousemove', moveHandler)
  67. .on('mouseleave', leaveHandler)
  68. .on('destroyed', leaveHandler);
  69. };
  70. const onShowContext = (item, getItemContextConfig, e) => {
  71. if (isMobile)
  72. hideTooltip(null, item);
  73. const contextConfig = getItemContextConfig(item);
  74. if (!contextConfig.length)
  75. return;
  76. events.emit('onContextMenu', contextConfig, e);
  77. e.preventDefault();
  78. return false;
  79. };
  80. const addContextEvents = (el, item, getItemContextConfig) => {
  81. el.on('contextmenu', onShowContext.bind(this, item, getItemContextConfig));
  82. };
  83. return (container, item, useEl, manageTooltip, getItemContextConfig, showNewIndicators = true) => {
  84. const { clientConfig: { spriteSizes } } = globals;
  85. const itemEl = useEl || $(tplItem).appendTo(container);
  86. if (!item) {
  87. itemEl.addClass('empty');
  88. return itemEl;
  89. }
  90. let spritesheet = item.spritesheet || '../../../images/items.png';
  91. if (!item.spritesheet) {
  92. if (item.material)
  93. spritesheet = '../../../images/materials.png';
  94. else if (item.quest)
  95. spritesheet = '../../../images/questItems.png';
  96. else if (item.type === 'consumable')
  97. spritesheet = '../../../images/consumables.png';
  98. else if (item.type === 'skin')
  99. spritesheet = '../../../images/characters.png';
  100. }
  101. let size = 64;
  102. if (item.type === 'skin')
  103. size = 8;
  104. if (item.spriteSize)
  105. size = item.spriteSize;
  106. if (spriteSizes[spritesheet])
  107. size = spriteSizes[spritesheet];
  108. const imgX = (-item.sprite[0] * size);
  109. const imgY = (-item.sprite[1] * size);
  110. const backgroundPosition = `${imgX}px ${imgY}px`;
  111. itemEl
  112. .find('.icon')
  113. .css({
  114. background: `url(${spritesheet}) no-repeat scroll ${backgroundPosition} / auto`,
  115. width: `${size}px`,
  116. height: `${size}px`
  117. });
  118. if (item.quantity > 1 || item.eq || item.active || item.has('quickSlot')) {
  119. let elQuantity = itemEl.find('.quantity');
  120. let txtQuantity = item.quantity;
  121. if (!txtQuantity)
  122. txtQuantity = item.has('quickSlot') ? 'QS' : 'EQ';
  123. elQuantity.html(txtQuantity);
  124. //If the item doesn't have a quantity and we reach this point
  125. //it must mean that it's active, EQd or QSd
  126. if (!item.quantity)
  127. itemEl.addClass('eq');
  128. } else if (item.isNew && showNewIndicators) {
  129. itemEl.addClass('new');
  130. itemEl.find('.quantity').html('NEW');
  131. }
  132. if (item.slot) {
  133. const equipErrors = window.player.inventory.equipItemErrors(item);
  134. if (equipErrors.length)
  135. itemEl.addClass('no-equip');
  136. }
  137. if (item.has('quality'))
  138. itemEl.addClass(`quality-${item.quality}`);
  139. if (manageTooltip)
  140. addTooltipEvents(itemEl, item);
  141. if (getItemContextConfig)
  142. addContextEvents(itemEl, item, getItemContextConfig);
  143. itemEl.addClass(`spriteSize${size}`);
  144. return itemEl;
  145. };
  146. });