Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

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