You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

234 lines
5.1 KiB

  1. define([
  2. 'js/system/events',
  3. 'js/system/client',
  4. 'js/system/globals',
  5. 'js/objects/objects',
  6. 'html!ui/templates/party/template',
  7. 'css!ui/templates/party/styles',
  8. 'html!ui/templates/party/templateInvite',
  9. 'html!ui/templates/party/templatePartyMember',
  10. 'js/config'
  11. ], function (
  12. events,
  13. client,
  14. globals,
  15. objects,
  16. template,
  17. styles,
  18. templateInvite,
  19. templatePartyMember,
  20. config
  21. ) {
  22. return {
  23. tpl: template,
  24. invite: null,
  25. party: null,
  26. postRender: function () {
  27. this.onEvent('onGetInvite', this.onGetInvite.bind(this));
  28. this.onEvent('onGetParty', this.onGetParty.bind(this));
  29. this.onEvent('onPartyDisband', this.onPartyDisband.bind(this));
  30. this.onEvent('globalObjectListUpdated', this.globalObjectListUpdated.bind(this));
  31. this.onEvent('onGetPartyStats', this.onGetPartyStats.bind(this));
  32. this.onEvent('onTogglePartyView', this.onTogglePartyView.bind(this));
  33. this.onTogglePartyView(config.partyView);
  34. },
  35. globalObjectListUpdated: function ({ list }) {
  36. if (!window.player)
  37. return;
  38. const { party } = this;
  39. const { player: { serverId: playerId } } = window;
  40. const player = list.find(l => l.id === playerId);
  41. const { zoneId: playerZone } = player;
  42. if (!party)
  43. return;
  44. list.forEach(l => {
  45. const { id: mId, zoneId: mZone, level: mLevel } = l;
  46. if (!party.includes(mId))
  47. return;
  48. if (mId !== playerId) {
  49. const el = this.find('.member[memberId="' + mId + '"]');
  50. el.removeClass('differentZone');
  51. if (mZone !== playerZone)
  52. el.addClass('differentZone');
  53. el.find('.txtLevel').html('level: ' + mLevel);
  54. }
  55. });
  56. },
  57. onGetPartyStats: function (id, stats) {
  58. let party = this.party;
  59. if (!party)
  60. return;
  61. let el = this.find('.member[memberId="' + id + '"]');
  62. if (el.length === 0)
  63. return;
  64. if ((stats.hp !== null) && (stats.hpMax !== null)) {
  65. let hpPercentage = Math.min(100, (stats.hp / stats.hpMax) * 100);
  66. el.find('.statHp').css('width', hpPercentage + '%');
  67. }
  68. if ((stats.mana !== null) && (stats.manaMax !== null)) {
  69. let manaPercentage = Math.min((stats.mana / stats.manaMax) * 100, 100);
  70. el.find('.statMana').css('width', manaPercentage + '%');
  71. }
  72. if (stats.level !== null)
  73. el.find('.txtLevel').html('level: ' + stats.level);
  74. },
  75. onPartyDisband: function () {
  76. this.find('.party .list')
  77. .empty();
  78. },
  79. onGetParty: function (party) {
  80. // Destroy invite frame if you join a party
  81. if (this.invite)
  82. this.destroyInvite();
  83. let container = this.find('.party .list')
  84. .empty();
  85. this.party = party;
  86. if (!party)
  87. return;
  88. party.forEach(p => {
  89. if (p === window.player.serverId)
  90. return;
  91. let player = globals.onlineList.find(o => o.id === p);
  92. let playerName = player ? player.name : 'unknown';
  93. let level = 'level: ' + (player ? player.level : '?');
  94. let html = templatePartyMember
  95. .replace('$NAME$', playerName)
  96. .replace('$LEVEL$', level);
  97. let el = $(html)
  98. .appendTo(container)
  99. .attr('memberId', p)
  100. .on('contextmenu', this.showContext.bind(this, playerName, p));
  101. if (player.zoneId !== window.player.zoneId)
  102. el.addClass('differentZone');
  103. //Find stats
  104. let memberObj = objects.objects.find(o => o.serverId === p);
  105. if ((memberObj) && (memberObj.stats))
  106. this.onGetPartyStats(p, memberObj.stats.values);
  107. });
  108. },
  109. showContext: function (charName, id, e) {
  110. events.emit('onContextMenu', [{
  111. text: 'whisper',
  112. callback: events.emit.bind(events, 'onDoWhisper', charName)
  113. }, {
  114. text: 'remove from party',
  115. callback: this.removeFromParty.bind(this, id)
  116. }, {
  117. text: 'leave party',
  118. callback: this.leaveParty.bind(this)
  119. }], e);
  120. e.preventDefault();
  121. return false;
  122. },
  123. onGetInvite: function (sourceId) {
  124. if (this.invite)
  125. this.destroyInvite();
  126. let sourcePlayer = globals.onlineList.find(o => o.id === sourceId);
  127. let html = templateInvite
  128. .replace('$NAME$', sourcePlayer.name);
  129. let el = $(html)
  130. .appendTo(this.el);
  131. el
  132. .find('.btn')
  133. .on('click', this.destroyInvite.bind(this));
  134. this.invite = {
  135. fromId: sourcePlayer.id,
  136. fromName: sourcePlayer.name,
  137. el: el
  138. };
  139. },
  140. destroyInvite: function (e) {
  141. if (e) {
  142. if ($(e.target).hasClass('btnAccept'))
  143. this.acceptInvite();
  144. else
  145. this.declineInvite();
  146. }
  147. this.invite.el.remove();
  148. this.invite = null;
  149. events.emit('onUiHover', false);
  150. },
  151. acceptInvite: function () {
  152. client.request({
  153. cpn: 'social',
  154. method: 'acceptInvite',
  155. data: {
  156. targetId: this.invite.fromId
  157. }
  158. });
  159. },
  160. declineInvite: function () {
  161. client.request({
  162. cpn: 'social',
  163. method: 'declineInvite',
  164. data: {
  165. targetId: this.invite.fromId
  166. }
  167. });
  168. },
  169. removeFromParty: function (id) {
  170. client.request({
  171. cpn: 'social',
  172. method: 'removeFromParty',
  173. data: {
  174. id
  175. }
  176. });
  177. },
  178. leaveParty: function () {
  179. client.request({
  180. cpn: 'social',
  181. method: 'leaveParty'
  182. });
  183. },
  184. onTogglePartyView: function (state) {
  185. this.el.removeClass('full compact minimal');
  186. this.el.addClass(state);
  187. }
  188. };
  189. });