Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 

611 righe
12 KiB

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