Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 

225 Zeilen
4.9 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. var container = this.find('.party .list')
  85. .empty();
  86. this.party = party;
  87. if (!party)
  88. return;
  89. party.forEach(function(p) {
  90. if (p == window.player.serverId)
  91. return;
  92. var player = globals.onlineList.find(function(o) {
  93. return (o.id == p)
  94. });
  95. var name = player ? player.name : 'unknown';
  96. var level = 'level: ' + (player ? player.level : '?');
  97. var html = templatePartyMember
  98. .replace('$NAME$', name)
  99. .replace('$LEVEL$', level);
  100. var el = $(html)
  101. .appendTo(container)
  102. .attr('memberId', p)
  103. .on('contextmenu', this.showContext.bind(this, name, p));
  104. if (player.zone != window.player.zone)
  105. el.addClass('differentZone');
  106. //Find stats
  107. var memberObj = objects.objects.find(function(o) {
  108. return (o.serverId == p);
  109. });
  110. if ((memberObj) && (memberObj.stats))
  111. this.onGetPartyStats(p, memberObj.stats.values);
  112. }, this);
  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. var sourcePlayer = globals.onlineList.find(function(o) {
  132. return (o.id == sourceId)
  133. });
  134. var html = templateInvite
  135. .replace('$NAME$', sourcePlayer.name);
  136. var el = $(html)
  137. .appendTo(this.el);
  138. el
  139. .find('[class^="btn"]')
  140. .on('click', this.destroyInvite.bind(this));
  141. this.invite = {
  142. fromId: sourcePlayer.id,
  143. fromName: sourcePlayer.name,
  144. el: el
  145. };
  146. },
  147. destroyInvite: function(e) {
  148. if (e) {
  149. if ($(e.target).hasClass('btnAccept'))
  150. this.acceptInvite();
  151. else
  152. this.declineInvite();
  153. }
  154. this.invite.el.remove();
  155. this.invite = null;
  156. },
  157. acceptInvite: function() {
  158. client.request({
  159. cpn: 'social',
  160. method: 'acceptInvite',
  161. id: this.invite.fromId
  162. });
  163. },
  164. declineInvite: function() {
  165. client.request({
  166. cpn: 'social',
  167. method: 'declineInvite',
  168. id: this.invite.fromId,
  169. data: {
  170. targetId: window.player.serverId
  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. }
  188. });