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

229 lines
5.0 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.destroyInvite();
  87. var container = this.find('.party .list')
  88. .empty();
  89. this.party = party;
  90. if (!party)
  91. return;
  92. party.forEach(function(p) {
  93. if (p == window.player.serverId)
  94. return;
  95. var player = globals.onlineList.find(function(o) {
  96. return (o.id == p)
  97. });
  98. var name = player ? player.name : 'unknown';
  99. var level = 'level: ' + (player ? player.level : '?');
  100. var html = templatePartyMember
  101. .replace('$NAME$', name)
  102. .replace('$LEVEL$', level);
  103. var el = $(html)
  104. .appendTo(container)
  105. .attr('memberId', p)
  106. .on('contextmenu', this.showContext.bind(this, name, p));
  107. if (player.zone != window.player.zone)
  108. el.addClass('differentZone');
  109. //Find stats
  110. var memberObj = objects.objects.find(function(o) {
  111. return (o.serverId == p);
  112. });
  113. if ((memberObj) && (memberObj.stats))
  114. this.onGetPartyStats(p, memberObj.stats.values);
  115. }, this);
  116. },
  117. showContext: function(charName, id, e) {
  118. events.emit('onContextMenu', [{
  119. text: 'whisper',
  120. callback: events.emit.bind(events, 'onDoWhisper', charName)
  121. }, {
  122. text: 'remove from party',
  123. callback: this.removeFromParty.bind(this, id)
  124. }, {
  125. text: 'leave party',
  126. callback: this.leaveParty.bind(this)
  127. }], e);
  128. e.preventDefault;
  129. return false;
  130. },
  131. onGetInvite: function(sourceId) {
  132. if (this.invite)
  133. this.destroyInvite();
  134. var sourcePlayer = globals.onlineList.find(function(o) {
  135. return (o.id == sourceId)
  136. });
  137. var html = templateInvite
  138. .replace('$NAME$', sourcePlayer.name);
  139. var el = $(html)
  140. .appendTo(this.el);
  141. el
  142. .find('[class^="btn"]')
  143. .on('click', this.destroyInvite.bind(this));
  144. this.invite = {
  145. fromId: sourcePlayer.id,
  146. fromName: sourcePlayer.name,
  147. el: el
  148. };
  149. },
  150. destroyInvite: function(e) {
  151. if (e) {
  152. if ($(e.target).hasClass('btnAccept'))
  153. this.acceptInvite();
  154. else
  155. this.declineInvite();
  156. }
  157. this.invite.el.remove();
  158. this.invite = null;
  159. },
  160. acceptInvite: function() {
  161. client.request({
  162. cpn: 'social',
  163. method: 'acceptInvite',
  164. id: this.invite.fromId
  165. });
  166. },
  167. declineInvite: function() {
  168. client.request({
  169. cpn: 'social',
  170. method: 'declineInvite',
  171. id: this.invite.fromId,
  172. data: {
  173. targetId: window.player.serverId
  174. }
  175. });
  176. },
  177. removeFromParty: function(id) {
  178. client.request({
  179. cpn: 'social',
  180. method: 'removeFromParty',
  181. data: id
  182. });
  183. },
  184. leaveParty: function() {
  185. client.request({
  186. cpn: 'social',
  187. method: 'leaveParty'
  188. });
  189. }
  190. }
  191. });