No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 

343 líneas
7.3 KiB

  1. define([
  2. 'world/atlas',
  3. 'config/roles'
  4. ], function(
  5. atlas,
  6. roles
  7. ) {
  8. return {
  9. type: 'social',
  10. isPartyLeader: null,
  11. partyLeaderId: null,
  12. party: null,
  13. init: function() {},
  14. simplify: function() {
  15. return {
  16. type: 'social',
  17. party: this.party
  18. };
  19. },
  20. sendMessage: function(msg) {
  21. this.obj.socket.emit('event', {
  22. event: 'onGetMessages',
  23. data: {
  24. messages: [{
  25. class: 'q0',
  26. message: msg,
  27. type: 'chat'
  28. }]
  29. }
  30. });
  31. },
  32. sendPartyMessage: function(msg) {
  33. if (!this.party) {
  34. this.obj.socket.emit('events', {
  35. onGetMessages: [{
  36. messages: [{
  37. class: 'q0',
  38. message: 'you are not in a party',
  39. type: 'info'
  40. }]
  41. }]
  42. });
  43. return;
  44. }
  45. var charname = this.obj.auth.charname;
  46. var message = msg.data.message.substr(1);
  47. this.party.forEach(function(p) {
  48. var player = cons.players.find(c => c.id == p);
  49. player.socket.emit('events', {
  50. onGetMessages: [{
  51. messages: [{
  52. class: 'q0',
  53. message: '(party: ' + charname + '): ' + message,
  54. type: 'chat'
  55. }]
  56. }]
  57. });
  58. }, this);
  59. },
  60. chat: function(msg) {
  61. var charname = this.obj.auth.charname;
  62. var level = this.obj.stats.values.level;
  63. if (level >= 10)
  64. level = 4;
  65. else if (level >= 6)
  66. level = 2;
  67. else
  68. level = 0;
  69. var msgStyle = roles.getRoleMessageStyle(this.obj) || ('q' + level);
  70. var messageString = msg.data.message;
  71. if (messageString[0] == '@') {
  72. var playerName = '';
  73. //Check if there's a space in the name
  74. if (messageString[1] == "'") {
  75. playerName = messageString.substring(2, messageString.indexOf("'", 2));
  76. messageString = messageString.replace("@'" + playerName + "' ", '');
  77. } else {
  78. playerName = messageString.substring(1, messageString.indexOf(' '));
  79. messageString = messageString.replace('@' + playerName + ' ', '');
  80. }
  81. if (playerName == this.obj.name)
  82. return;
  83. var target = cons.players.find(p => p.name == playerName);
  84. if (!target)
  85. return;
  86. this.obj.socket.emit('event', {
  87. event: 'onGetMessages',
  88. data: {
  89. messages: [{
  90. class: msgStyle,
  91. message: '(you to ' + playerName + '): ' + messageString,
  92. type: 'chat'
  93. }]
  94. }
  95. });
  96. target.socket.emit('event', {
  97. event: 'onGetMessages',
  98. data: {
  99. messages: [{
  100. class: msgStyle,
  101. message: '(' + this.obj.name + ' to you): ' + messageString,
  102. type: 'chat'
  103. }]
  104. }
  105. });
  106. } else if (messageString[0] == '%') {
  107. this.sendPartyMessage(msg);
  108. } else {
  109. var prefix = roles.getRoleMessagePrefix(this.obj) || '';
  110. io.sockets.emit('event', {
  111. event: 'onGetMessages',
  112. data: {
  113. messages: [{
  114. class: msgStyle,
  115. message: prefix + charname + ': ' + msg.data.message,
  116. type: 'chat'
  117. }]
  118. }
  119. });
  120. }
  121. },
  122. dc: function() {
  123. if (!this.party)
  124. return;
  125. this.leaveParty();
  126. },
  127. //This gets called on the target player
  128. getInvite: function(msg) {
  129. if (this.party)
  130. return;
  131. var obj = this.obj;
  132. var sourceId = msg.data.sourceId;
  133. if (sourceId == obj.id)
  134. return;
  135. var source = cons.players.find(c => c.id == sourceId);
  136. if (!source)
  137. return;
  138. source.social.sendMessage('invite sent');
  139. this.sendMessage(source.name + ' has invited you to join a party');
  140. this.obj.socket.emit('event', {
  141. event: 'onGetInvite',
  142. data: sourceId
  143. });
  144. },
  145. //This gets called on the player that initiated the invite
  146. acceptInvite: function(msg) {
  147. var sourceId = msg.data.sourceId;
  148. var source = cons.players.find(c => c.id == sourceId);
  149. if (!source)
  150. return;
  151. if (!this.party) {
  152. this.isPartyLeader = true;
  153. this.party = [this.obj.id];
  154. this.updatePartyOnThread();
  155. }
  156. // Only add if not yet in party
  157. if (!this.party.find(f => (id === sourceId)))
  158. this.party.push(sourceId);
  159. this.updatePartyOnThread();
  160. this.party.forEach(function(p) {
  161. var player = cons.players.find(c => c.id == p);
  162. player.social.party = this.party;
  163. player.social.updatePartyOnThread();
  164. var msg = source.name + ' has joined the party';
  165. if (p == sourceId)
  166. msg = 'you have joined a party';
  167. player.social.sendMessage(msg);
  168. player
  169. .socket.emit('event', {
  170. event: 'onGetParty',
  171. data: this.party
  172. });
  173. }, this);
  174. },
  175. declineInvite: function(msg) {
  176. var targetId = msg.data.targetId;
  177. var target = cons.players.find(c => c.id == targetId);
  178. if (!target)
  179. return;
  180. this.sendMessage(target.name + ' declined your party invitation');
  181. },
  182. //Gets called on the player that requested to leave
  183. leaveParty: function(msg) {
  184. var name = this.obj.name;
  185. this.party.spliceWhere(p => p == this.obj.id);
  186. this.party.forEach(function(p) {
  187. var player = cons.players.find(c => c.id == p);
  188. var messages = [{
  189. class: 'q0',
  190. message: name + ' has left the party'
  191. }];
  192. var party = this.party;
  193. if (this.party.length == 1) {
  194. messages.push({
  195. class: 'q0',
  196. message: 'your group has been disbanded'
  197. });
  198. player.social.isPartyLeader = false;
  199. player.social.party = null;
  200. player.social.updatePartyOnThread();
  201. party = null;
  202. }
  203. player.socket.emit('events', {
  204. onGetParty: [party],
  205. onGetMessages: [{
  206. messages: messages
  207. }]
  208. });
  209. }, this);
  210. this.obj.socket.emit('events', {
  211. onGetParty: [
  212. []
  213. ],
  214. onGetMessages: [{
  215. messages: {
  216. class: 'q0',
  217. message: 'you have left the party'
  218. }
  219. }]
  220. });
  221. if ((this.isPartyLeader) && (this.party.length >= 2)) {
  222. var newLeader = cons.players.find(c => c.id == this.party[0]).social;
  223. newLeader.isPartyLeader = true;
  224. this.party.forEach(function(p) {
  225. var msg = newLeader.obj.name + ' is now the party leader';
  226. if (p == newLeader.obj.id)
  227. msg = 'you are now the party leader';
  228. cons.players.find(c => c.id == p).socket.emit('events', {
  229. onGetMessages: [{
  230. messages: [{
  231. class: 'q0',
  232. message: msg
  233. }]
  234. }]
  235. });
  236. }, this);
  237. }
  238. this.party = null;
  239. this.updatePartyOnThread();
  240. },
  241. //Gets called on the player that requested the removal
  242. removeFromParty: function(msg) {
  243. if (!this.isPartyLeader) {
  244. this.sendMessage('you are not the party leader');
  245. return;
  246. }
  247. var target = cons.players.find(c => c.id == msg.data);
  248. if (!target)
  249. return;
  250. this.party.spliceWhere(p => p == target.id);
  251. this.party.forEach(function(p) {
  252. cons.players.find(c => c.id == p)
  253. .socket.emit('events', {
  254. onGetParty: [this.party],
  255. onGetMessages: [{
  256. messages: [{
  257. class: 'q0',
  258. message: target.name + ' has been removed from the party'
  259. }]
  260. }]
  261. });
  262. }, this);
  263. target.socket.emit('events', {
  264. onGetMessages: [{
  265. messages: [{
  266. class: 'q0',
  267. message: 'you have been removed from the party'
  268. }]
  269. }],
  270. onPartyDisband: [{}]
  271. });
  272. target.social.party = null;
  273. target.social.isPartyLeader = false;
  274. target.social.updatePartyOnThread();
  275. if (this.party.length == 1) {
  276. this.party = null
  277. this.isPartyLeader = null;
  278. this.updatePartyOnThread();
  279. this.sendMessage('your party has been disbanded');
  280. }
  281. },
  282. updatePartyOnThread: function() {
  283. atlas.updateObject(this.obj, {
  284. components: [{
  285. type: 'social',
  286. party: this.party
  287. }]
  288. });
  289. }
  290. };
  291. });