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.
 
 
 

236 lines
5.2 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('onGetConnectedPlayer', this.onGetConnectedPlayer.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. onGetConnectedPlayer: function (msg) {
  36. let party = this.party;
  37. if (!party)
  38. return;
  39. if (!(msg instanceof Array))
  40. msg = [msg];
  41. msg.forEach(m => {
  42. if (party.indexOf(m.id) === -1)
  43. return;
  44. let zone = m.zone;
  45. if (m.id === window.player.serverId) {
  46. party.forEach(p => {
  47. let player = globals.onlineList.find(o => o.id === p);
  48. let el = this.find('.member[memberId="' + p + '"]');
  49. el.removeClass('differentZone');
  50. if (player.zone !== zone)
  51. el.addClass('differentZone');
  52. });
  53. } else {
  54. let el = this.find('.member[memberId="' + m.id + '"]');
  55. el.removeClass('differentZone');
  56. if (m.zone !== window.player.zone)
  57. el.addClass('differentZone');
  58. el.find('.txtLevel').html('level: ' + m.level);
  59. }
  60. });
  61. },
  62. onGetPartyStats: function (id, stats) {
  63. let party = this.party;
  64. if (!party)
  65. return;
  66. let el = this.find('.member[memberId="' + id + '"]');
  67. if (el.length === 0)
  68. return;
  69. if ((stats.hp !== null) && (stats.hpMax !== null)) {
  70. let hpPercentage = Math.min(100, (stats.hp / stats.hpMax) * 100);
  71. el.find('.statHp').css('width', hpPercentage + '%');
  72. }
  73. if ((stats.mana !== null) && (stats.manaMax !== null)) {
  74. let manaPercentage = Math.min((stats.mana / stats.manaMax) * 100, 100);
  75. el.find('.statMana').css('width', manaPercentage + '%');
  76. }
  77. if (stats.level !== null)
  78. el.find('.txtLevel').html('level: ' + stats.level);
  79. },
  80. onPartyDisband: function () {
  81. this.find('.party .list')
  82. .empty();
  83. },
  84. onGetParty: function (party) {
  85. // Destroy invite frame if you join a party
  86. if (this.invite)
  87. this.destroyInvite();
  88. let container = this.find('.party .list')
  89. .empty();
  90. this.party = party;
  91. if (!party)
  92. return;
  93. party.forEach(p => {
  94. if (p === window.player.serverId)
  95. return;
  96. let player = globals.onlineList.find(o => o.id === p);
  97. let playerName = player ? player.name : 'unknown';
  98. let level = 'level: ' + (player ? player.level : '?');
  99. let html = templatePartyMember
  100. .replace('$NAME$', playerName)
  101. .replace('$LEVEL$', level);
  102. let el = $(html)
  103. .appendTo(container)
  104. .attr('memberId', p)
  105. .on('contextmenu', this.showContext.bind(this, playerName, p));
  106. if (player.zone !== window.player.zone)
  107. el.addClass('differentZone');
  108. //Find stats
  109. let memberObj = objects.objects.find(o => o.serverId === p);
  110. if ((memberObj) && (memberObj.stats))
  111. this.onGetPartyStats(p, memberObj.stats.values);
  112. });
  113. },
  114. showContext: function (charName, id, e) {
  115. events.emit('onContextMenu', [{
  116. text: 'whisper',
  117. callback: events.emit.bind(events, 'onDoWhisper', charName)
  118. }, {
  119. text: 'remove from party',
  120. callback: this.removeFromParty.bind(this, id)
  121. }, {
  122. text: 'leave party',
  123. callback: this.leaveParty.bind(this)
  124. }], e);
  125. e.preventDefault();
  126. return false;
  127. },
  128. onGetInvite: function (sourceId) {
  129. if (this.invite)
  130. this.destroyInvite();
  131. let sourcePlayer = globals.onlineList.find(o => o.id === sourceId);
  132. let html = templateInvite
  133. .replace('$NAME$', sourcePlayer.name);
  134. let el = $(html)
  135. .appendTo(this.el);
  136. el
  137. .find('.btn')
  138. .on('click', this.destroyInvite.bind(this));
  139. this.invite = {
  140. fromId: sourcePlayer.id,
  141. fromName: sourcePlayer.name,
  142. el: el
  143. };
  144. },
  145. destroyInvite: function (e) {
  146. if (e) {
  147. if ($(e.target).hasClass('btnAccept'))
  148. this.acceptInvite();
  149. else
  150. this.declineInvite();
  151. }
  152. this.invite.el.remove();
  153. this.invite = null;
  154. events.emit('onUiHover', false);
  155. },
  156. acceptInvite: function () {
  157. client.request({
  158. cpn: 'social',
  159. method: 'acceptInvite',
  160. data: {
  161. targetId: this.invite.fromId
  162. }
  163. });
  164. },
  165. declineInvite: function () {
  166. client.request({
  167. cpn: 'social',
  168. method: 'declineInvite',
  169. data: {
  170. targetId: this.invite.fromId
  171. }
  172. });
  173. },
  174. removeFromParty: function (id) {
  175. client.request({
  176. cpn: 'social',
  177. method: 'removeFromParty',
  178. data: id
  179. });
  180. },
  181. leaveParty: function () {
  182. client.request({
  183. cpn: 'social',
  184. method: 'leaveParty'
  185. });
  186. },
  187. onTogglePartyView: function (state) {
  188. this.el.removeClass('full compact minimal');
  189. this.el.addClass(state);
  190. }
  191. };
  192. });