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

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