Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 

347 wiersze
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. 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(function (id) {
  158. return id === sourceId;
  159. })
  160. ) {
  161. this.party.push(sourceId);
  162. }
  163. this.updatePartyOnThread();
  164. this.party.forEach(function(p) {
  165. var player = cons.players.find(c => c.id == p);
  166. player.social.party = this.party;
  167. player.social.updatePartyOnThread();
  168. var msg = source.name + ' has joined the party';
  169. if (p == sourceId)
  170. msg = 'you have joined a party';
  171. player.social.sendMessage(msg);
  172. player
  173. .socket.emit('event', {
  174. event: 'onGetParty',
  175. data: this.party
  176. });
  177. }, this);
  178. },
  179. declineInvite: function(msg) {
  180. var targetId = msg.data.targetId;
  181. var target = cons.players.find(c => c.id == targetId);
  182. if (!target)
  183. return;
  184. this.sendMessage(target.name + ' declined your party invitation');
  185. },
  186. //Gets called on the player that requested to leave
  187. leaveParty: function(msg) {
  188. var name = this.obj.name;
  189. this.party.spliceWhere(p => p == this.obj.id);
  190. this.party.forEach(function(p) {
  191. var player = cons.players.find(c => c.id == p);
  192. var messages = [{
  193. class: 'q0',
  194. message: name + ' has left the party'
  195. }];
  196. var party = this.party;
  197. if (this.party.length == 1) {
  198. messages.push({
  199. class: 'q0',
  200. message: 'your group has been disbanded'
  201. });
  202. player.social.isPartyLeader = false;
  203. player.social.party = null;
  204. player.social.updatePartyOnThread();
  205. party = null;
  206. }
  207. player.socket.emit('events', {
  208. onGetParty: [party],
  209. onGetMessages: [{
  210. messages: messages
  211. }]
  212. });
  213. }, this);
  214. this.obj.socket.emit('events', {
  215. onGetParty: [
  216. []
  217. ],
  218. onGetMessages: [{
  219. messages: {
  220. class: 'q0',
  221. message: 'you have left the party'
  222. }
  223. }]
  224. });
  225. if ((this.isPartyLeader) && (this.party.length >= 2)) {
  226. var newLeader = cons.players.find(c => c.id == this.party[0]).social;
  227. newLeader.isPartyLeader = true;
  228. this.party.forEach(function(p) {
  229. var msg = newLeader.obj.name + ' is now the party leader';
  230. if (p == newLeader.obj.id)
  231. msg = 'you are now the party leader';
  232. cons.players.find(c => c.id == p).socket.emit('events', {
  233. onGetMessages: [{
  234. messages: [{
  235. class: 'q0',
  236. message: msg
  237. }]
  238. }]
  239. });
  240. }, this);
  241. }
  242. this.party = null;
  243. this.updatePartyOnThread();
  244. },
  245. //Gets called on the player that requested the removal
  246. removeFromParty: function(msg) {
  247. if (!this.isPartyLeader) {
  248. this.sendMessage('you are not the party leader');
  249. return;
  250. }
  251. var target = cons.players.find(c => c.id == msg.data);
  252. if (!target)
  253. return;
  254. this.party.spliceWhere(p => p == target.id);
  255. this.party.forEach(function(p) {
  256. cons.players.find(c => c.id == p)
  257. .socket.emit('events', {
  258. onGetParty: [this.party],
  259. onGetMessages: [{
  260. messages: [{
  261. class: 'q0',
  262. message: target.name + ' has been removed from the party'
  263. }]
  264. }]
  265. });
  266. }, this);
  267. target.socket.emit('events', {
  268. onGetMessages: [{
  269. messages: [{
  270. class: 'q0',
  271. message: 'you have been removed from the party'
  272. }]
  273. }],
  274. onPartyDisband: [{}]
  275. });
  276. target.social.party = null;
  277. target.social.isPartyLeader = false;
  278. target.social.updatePartyOnThread();
  279. if (this.party.length == 1) {
  280. this.party = null
  281. this.isPartyLeader = null;
  282. this.updatePartyOnThread();
  283. this.sendMessage('your party has been disbanded');
  284. }
  285. },
  286. updatePartyOnThread: function() {
  287. atlas.updateObject(this.obj, {
  288. components: [{
  289. type: 'social',
  290. party: this.party
  291. }]
  292. });
  293. }
  294. };
  295. });