Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

344 строки
7.4 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. item: msg.data.item,
  117. type: 'chat'
  118. }]
  119. }
  120. });
  121. }
  122. },
  123. dc: function() {
  124. if (!this.party)
  125. return;
  126. this.leaveParty();
  127. },
  128. //This gets called on the target player
  129. getInvite: function(msg) {
  130. if (this.party)
  131. return;
  132. var obj = this.obj;
  133. var sourceId = msg.data.sourceId;
  134. if (sourceId == obj.id)
  135. return;
  136. var source = cons.players.find(c => c.id == sourceId);
  137. if (!source)
  138. return;
  139. source.social.sendMessage('invite sent');
  140. this.sendMessage(source.name + ' has invited you to join a party');
  141. this.obj.socket.emit('event', {
  142. event: 'onGetInvite',
  143. data: sourceId
  144. });
  145. },
  146. //This gets called on the player that initiated the invite
  147. acceptInvite: function(msg) {
  148. var sourceId = msg.data.sourceId;
  149. var source = cons.players.find(c => c.id == sourceId);
  150. if (!source)
  151. return;
  152. if (!this.party) {
  153. this.isPartyLeader = true;
  154. this.party = [this.obj.id];
  155. this.updatePartyOnThread();
  156. }
  157. // Only add if not yet in party
  158. if (!this.party.find(id => (id === sourceId)))
  159. this.party.push(sourceId);
  160. this.updatePartyOnThread();
  161. this.party.forEach(function(p) {
  162. var player = cons.players.find(c => c.id == p);
  163. player.social.party = this.party;
  164. player.social.updatePartyOnThread();
  165. var msg = source.name + ' has joined the party';
  166. if (p == sourceId)
  167. msg = 'you have joined a party';
  168. player.social.sendMessage(msg);
  169. player
  170. .socket.emit('event', {
  171. event: 'onGetParty',
  172. data: this.party
  173. });
  174. }, this);
  175. },
  176. declineInvite: function(msg) {
  177. var targetId = msg.data.targetId;
  178. var target = cons.players.find(c => c.id == targetId);
  179. if (!target)
  180. return;
  181. this.sendMessage(target.name + ' declined your party invitation');
  182. },
  183. //Gets called on the player that requested to leave
  184. leaveParty: function(msg) {
  185. var name = this.obj.name;
  186. this.party.spliceWhere(p => p == this.obj.id);
  187. this.party.forEach(function(p) {
  188. var player = cons.players.find(c => c.id == p);
  189. var messages = [{
  190. class: 'q0',
  191. message: name + ' has left the party'
  192. }];
  193. var party = this.party;
  194. if (this.party.length == 1) {
  195. messages.push({
  196. class: 'q0',
  197. message: 'your group has been disbanded'
  198. });
  199. player.social.isPartyLeader = false;
  200. player.social.party = null;
  201. player.social.updatePartyOnThread();
  202. party = null;
  203. }
  204. player.socket.emit('events', {
  205. onGetParty: [party],
  206. onGetMessages: [{
  207. messages: messages
  208. }]
  209. });
  210. }, this);
  211. this.obj.socket.emit('events', {
  212. onGetParty: [
  213. []
  214. ],
  215. onGetMessages: [{
  216. messages: {
  217. class: 'q0',
  218. message: 'you have left the party'
  219. }
  220. }]
  221. });
  222. if ((this.isPartyLeader) && (this.party.length >= 2)) {
  223. var newLeader = cons.players.find(c => c.id == this.party[0]).social;
  224. newLeader.isPartyLeader = true;
  225. this.party.forEach(function(p) {
  226. var msg = newLeader.obj.name + ' is now the party leader';
  227. if (p == newLeader.obj.id)
  228. msg = 'you are now the party leader';
  229. cons.players.find(c => c.id == p).socket.emit('events', {
  230. onGetMessages: [{
  231. messages: [{
  232. class: 'q0',
  233. message: msg
  234. }]
  235. }]
  236. });
  237. }, this);
  238. }
  239. this.party = null;
  240. this.updatePartyOnThread();
  241. },
  242. //Gets called on the player that requested the removal
  243. removeFromParty: function(msg) {
  244. if (!this.isPartyLeader) {
  245. this.sendMessage('you are not the party leader');
  246. return;
  247. }
  248. var target = cons.players.find(c => c.id == msg.data);
  249. if (!target)
  250. return;
  251. this.party.spliceWhere(p => p == target.id);
  252. this.party.forEach(function(p) {
  253. cons.players.find(c => c.id == p)
  254. .socket.emit('events', {
  255. onGetParty: [this.party],
  256. onGetMessages: [{
  257. messages: [{
  258. class: 'q0',
  259. message: target.name + ' has been removed from the party'
  260. }]
  261. }]
  262. });
  263. }, this);
  264. target.socket.emit('events', {
  265. onGetMessages: [{
  266. messages: [{
  267. class: 'q0',
  268. message: 'you have been removed from the party'
  269. }]
  270. }],
  271. onPartyDisband: [{}]
  272. });
  273. target.social.party = null;
  274. target.social.isPartyLeader = false;
  275. target.social.updatePartyOnThread();
  276. if (this.party.length == 1) {
  277. this.party = null
  278. this.isPartyLeader = null;
  279. this.updatePartyOnThread();
  280. this.sendMessage('your party has been disbanded');
  281. }
  282. },
  283. updatePartyOnThread: function() {
  284. atlas.updateObject(this.obj, {
  285. components: [{
  286. type: 'social',
  287. party: this.party
  288. }]
  289. });
  290. }
  291. };
  292. });