You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

524 rivejä
9.8 KiB

  1. let roles = require('../../config/roles');
  2. let generator = require('../../items/generator');
  3. let configSlots = require('../../items/config/slots');
  4. let factions = require('../../config/factions');
  5. let connections = require('../../security/connections');
  6. let commandRoles = {
  7. //Regular players
  8. join: 0,
  9. leave: 0,
  10. unEq: 0,
  11. roll: 0,
  12. //Mods
  13. mute: 5,
  14. unmute: 5,
  15. //Admin
  16. getItem: 10,
  17. getGold: 10,
  18. setLevel: 10,
  19. godMode: 10,
  20. clearInventory: 10,
  21. completeQuests: 10,
  22. getReputation: 10,
  23. loseReputation: 10,
  24. setStat: 10,
  25. die: 10,
  26. getXp: 10,
  27. setPassword: 10
  28. };
  29. let localCommands = [
  30. 'join',
  31. 'leave',
  32. 'mute',
  33. 'unmute',
  34. 'setPassword',
  35. 'roll'
  36. ];
  37. module.exports = {
  38. customChannels: [],
  39. roleLevel: null,
  40. init: function (blueprint) {
  41. if (this.customChannels) {
  42. this.customChannels = this.customChannels
  43. .filter((c, i) => (this.customChannels.indexOf(c) === i));
  44. }
  45. this.roleLevel = roles.getRoleLevel(this.obj);
  46. },
  47. onBeforeChat: function (msg) {
  48. let messageText = msg.message;
  49. if (messageText[0] !== '/')
  50. return;
  51. messageText = messageText.substr(1).split(' ');
  52. let actionName = messageText.splice(0, 1)[0].toLowerCase();
  53. actionName = Object.keys(commandRoles).find(a => (a.toLowerCase() === actionName));
  54. if (!actionName)
  55. return;
  56. else if (this.roleLevel < commandRoles[actionName])
  57. return;
  58. msg.ignore = true;
  59. let config = {};
  60. if ((messageText.length === 1) && (messageText[0].indexOf('=') === -1))
  61. config = messageText[0];
  62. else {
  63. messageText.forEach(function (m) {
  64. m = m.split('=');
  65. config[m[0]] = m[1];
  66. });
  67. }
  68. if (localCommands.indexOf(actionName) > -1)
  69. this[actionName](config);
  70. else {
  71. atlas.performAction(this.obj, {
  72. cpn: 'social',
  73. method: actionName,
  74. data: config
  75. });
  76. }
  77. },
  78. //actions
  79. join: function (value) {
  80. if (typeof (value) !== 'string')
  81. return;
  82. value = value
  83. .trim()
  84. .split(' ').join('');
  85. let obj = this.obj;
  86. if (value.length === 0)
  87. return;
  88. else if (value.length > 15) {
  89. obj.socket.emit('events', {
  90. onGetMessages: [{
  91. messages: [{
  92. class: 'color-redA',
  93. message: 'Channel names can not be longer than 15 characters.',
  94. type: 'info'
  95. }]
  96. }]
  97. });
  98. return;
  99. }
  100. let channels = obj.auth.customChannels;
  101. if (!channels.some(c => (c === value)))
  102. channels.push(value);
  103. else
  104. return;
  105. channels.push(value);
  106. let charname = obj.auth.charname;
  107. io.set({
  108. ent: charname,
  109. field: 'customChannels',
  110. value: JSON.stringify(channels)
  111. });
  112. obj.socket.emit('events', {
  113. onGetMessages: [{
  114. messages: [{
  115. class: 'color-yellowB',
  116. message: 'joined channel: ' + value,
  117. type: 'info'
  118. }]
  119. }]
  120. });
  121. obj.socket.emit('event', {
  122. event: 'onJoinChannel',
  123. data: value
  124. });
  125. },
  126. leave: function (value) {
  127. if (typeof (value) !== 'string')
  128. return;
  129. let obj = this.obj;
  130. let channels = obj.auth.customChannels;
  131. if (!channels.some(c => (c === value))) {
  132. obj.socket.emit('events', {
  133. onGetMessages: [{
  134. messages: [{
  135. class: 'color-redA',
  136. message: 'you are not currently in that channel',
  137. type: 'info'
  138. }]
  139. }]
  140. });
  141. return;
  142. }
  143. channels.spliceWhere(c => (c === value));
  144. let charname = obj.auth.charname;
  145. io.set({
  146. ent: charname,
  147. field: 'customChannels',
  148. value: JSON.stringify(channels)
  149. });
  150. obj.socket.emit('event', {
  151. event: 'onLeaveChannel',
  152. data: value
  153. });
  154. this.obj.socket.emit('events', {
  155. onGetMessages: [{
  156. messages: [{
  157. class: 'color-yellowB',
  158. message: 'left channel: ' + value,
  159. type: 'info'
  160. }]
  161. }]
  162. });
  163. },
  164. isInChannel: function (character, channel) {
  165. return character.auth.customChannels.some(c => (c === channel));
  166. },
  167. roll: function () {
  168. let roll = 1 + ~~(Math.random() * 100);
  169. cons.emit('event', {
  170. event: 'onGetMessages',
  171. data: {
  172. messages: [{
  173. class: 'color-grayB',
  174. message: this.obj.name + ' rolled ' + roll,
  175. type: 'chat'
  176. }]
  177. }
  178. });
  179. },
  180. unEq: function () {
  181. let eq = this.obj.equipment;
  182. Object.keys(eq.eq).forEach(function (slot) {
  183. eq.unequip(eq.eq[slot]);
  184. });
  185. },
  186. mute: function (target, reason) {
  187. if (typeof (target) === 'object') {
  188. let keys = Object.keys(target);
  189. target = keys[0];
  190. reason = keys[1];
  191. }
  192. if (target === this.obj.name)
  193. return;
  194. let o = connections.players.find(f => (f.name === target));
  195. if (!o)
  196. return;
  197. let role = roles.getRoleLevel(o);
  198. if (role >= this.roleLevel)
  199. return;
  200. let social = o.social;
  201. if (social.muted) {
  202. this.sendMessage('That player has already been muted', 'color-redA');
  203. return;
  204. }
  205. let reasonMsg = '';
  206. if (reason)
  207. reasonMsg = ' (' + reason + ')';
  208. social.muted = true;
  209. this.sendMessage('Successfully muted ' + target, 'color-yellowB');
  210. this.sendMessage('You have been muted' + reasonMsg, 'color-yellowB', o);
  211. atlas.updateObject(o, {
  212. components: [{
  213. type: 'social',
  214. muted: true
  215. }]
  216. });
  217. io.set({
  218. ent: new Date(),
  219. field: 'modLog',
  220. value: JSON.stringify({
  221. source: this.obj.name,
  222. command: 'mute',
  223. target: target,
  224. reason: reason
  225. })
  226. });
  227. },
  228. unmute: function (target, reason) {
  229. if (typeof (target) === 'object') {
  230. let keys = Object.keys(target);
  231. target = keys[0];
  232. reason = keys[1];
  233. }
  234. if (target === this.obj.name)
  235. return;
  236. let o = connections.players.find(f => (f.name === target));
  237. if (!o)
  238. return;
  239. let role = roles.getRoleLevel(o);
  240. if (role >= this.roleLevel)
  241. return;
  242. let social = o.social;
  243. if (!social.muted) {
  244. this.sendMessage('That player is not muted', 'color-redA');
  245. return;
  246. }
  247. let reasonMsg = '';
  248. if (reason)
  249. reasonMsg = ' (' + reason + ')';
  250. delete social.muted;
  251. this.sendMessage('Successfully unmuted ' + target, 'color-yellowB');
  252. this.sendMessage('You have been unmuted' + reasonMsg, 'color-yellowB', o);
  253. atlas.updateObject(o, {
  254. components: [{
  255. type: 'social',
  256. muted: null
  257. }]
  258. });
  259. io.set({
  260. ent: new Date(),
  261. field: 'modLog',
  262. value: JSON.stringify({
  263. source: this.obj.name,
  264. command: 'unmute',
  265. target: target,
  266. reason: reason
  267. })
  268. });
  269. },
  270. clearInventory: function () {
  271. let inventory = this.obj.inventory;
  272. inventory.items
  273. .filter(i => !i.eq)
  274. .map(i => i.id)
  275. .forEach(i => inventory.destroyItem(i, null, true));
  276. },
  277. getItem: function (config) {
  278. if (config.slot === 'set') {
  279. configSlots.slots.forEach(function (s) {
  280. if (s === 'tool')
  281. return;
  282. let newConfig = extend({}, config, {
  283. slot: s
  284. });
  285. this.getItem(newConfig);
  286. }, this);
  287. return;
  288. }
  289. if (config.stats)
  290. config.stats = config.stats.split(',');
  291. if (config.name)
  292. config.name = config.name.split('_').join(' ');
  293. if (config.spellName)
  294. config.spellName = config.spellName.split('_').join(' ');
  295. if (config.type)
  296. config.type = config.type.split('_').join(' ');
  297. if (config.sprite)
  298. config.sprite = config.sprite.split('_');
  299. let spritesheet = config.spritesheet;
  300. delete config.spritesheet;
  301. let factionList = (config.factions || '').split(',');
  302. delete config.factions;
  303. let safe = config.safe;
  304. delete config.safe;
  305. let eq = config.eq;
  306. delete config.eq;
  307. let item = generator.generate(config);
  308. if (safe) {
  309. item.noDrop = true;
  310. item.noDestroy = true;
  311. item.noSalvage = true;
  312. }
  313. factionList.forEach(function (f) {
  314. if (f === '')
  315. return;
  316. let faction = factions.getFaction(f);
  317. faction.uniqueStat.generate(item);
  318. item.factions = [];
  319. item.factions.push({
  320. id: f,
  321. tier: 3
  322. });
  323. });
  324. if (spritesheet)
  325. item.spritesheet = spritesheet;
  326. let newItem = this.obj.inventory.getItem(item);
  327. if (eq)
  328. this.obj.equipment.equip(newItem.id);
  329. },
  330. getGold: function (amount) {
  331. let newGold = this.obj.trade.gold + ~~amount;
  332. newGold = Math.max(-1000000000, Math.min(1000000000, newGold));
  333. this.obj.trade.gold = newGold;
  334. this.obj.syncer.set(true, 'trade', 'gold', newGold);
  335. },
  336. setLevel: function (level) {
  337. let obj = this.obj;
  338. let syncer = obj.syncer;
  339. level = Math.max(1, ~~level);
  340. let stats = obj.stats;
  341. let values = stats.values;
  342. let oldLevel = values.level;
  343. values.level = level;
  344. let delta = level - oldLevel;
  345. values.hpMax += (40 * delta);
  346. syncer.setObject(true, 'stats', 'values', 'level', level);
  347. syncer.setObject(true, 'stats', 'values', 'hpMax', values.hpMax);
  348. process.send({
  349. method: 'object',
  350. serverId: obj.serverId,
  351. obj: {
  352. level: level
  353. }
  354. });
  355. stats.calcXpMax();
  356. },
  357. godMode: function () {
  358. let obj = this.obj;
  359. let statValues = obj.stats.values;
  360. let newValues = {
  361. int: 10000000,
  362. str: 10000000,
  363. dex: 10000000,
  364. hpMax: 10000000,
  365. hp: 10000000,
  366. manaMax: 10000000,
  367. mana: 10000000,
  368. sprintChance: 100,
  369. vit: 10000000
  370. };
  371. let syncer = obj.syncer;
  372. for (let s in newValues) {
  373. let newValue = newValues[s];
  374. statValues[s] = newValue;
  375. syncer.setObject(true, 'stats', 'values', s, newValue);
  376. }
  377. obj.spellbook.calcDps();
  378. },
  379. completeQuests: function () {
  380. let obj = this.obj;
  381. let quests = obj.quests;
  382. quests.quests.forEach(function (q) {
  383. q.isReady = true;
  384. q.complete();
  385. }, this);
  386. quests.quests = [];
  387. obj.instance.questBuilder.obtain(obj);
  388. },
  389. getReputation: function (faction) {
  390. if (typeof (faction) !== 'string')
  391. return;
  392. this.obj.reputation.getReputation(faction, 50000);
  393. },
  394. loseReputation: function (faction) {
  395. if (typeof (faction) !== 'string')
  396. return;
  397. this.obj.reputation.getReputation(faction, -50000);
  398. },
  399. setStat: function (config) {
  400. this.obj.stats.values[config.stat] = ~~config.value;
  401. },
  402. getXp: function (amount) {
  403. this.obj.stats.getXp(amount, this.obj, this.obj);
  404. },
  405. die: function () {
  406. this.obj.stats.takeDamage({
  407. amount: 99999
  408. }, 1, this.obj);
  409. },
  410. setPassword: function (config) {
  411. let keys = Object.keys(config);
  412. let username = keys[0];
  413. let hashedPassword = keys[1];
  414. io.set({
  415. ent: username,
  416. field: 'login',
  417. value: hashedPassword
  418. });
  419. }
  420. };