Advertisement
Guest User

Untitled

a guest
Aug 24th, 2019
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.54 KB | None | 0 0
  1. /**
  2. * @filename MuleLogger.js
  3. * @author kolton
  4. * @desc Log items and perm configurable accounts/characters
  5. */
  6.  
  7. var MuleLogger = {
  8. LogAccounts: {
  9. /* Format:
  10. "account1/password1/realm": ["charname1", "charname2 etc"],
  11. "account2/password2/realm": ["charnameX", "charnameY etc"],
  12. "account3/password3/realm": ["all"]
  13.  
  14. To log a full account, put "account/password/realm": ["all"]
  15.  
  16. realm = useast, uswest, europe or asia
  17.  
  18. Individual entries are separated with a comma.
  19. */
  20.  
  21. "cun-1/95048013/useast": ["all"],
  22. "cun-2/95048013/useast": ["all"],
  23. "cun-3/95048013/useast": ["all"],
  24. "cun-4/95048013/useast": ["all"],
  25. "cun-5/95048013/useast": ["all"],
  26. "cun-6/95048013/useast": ["all"],
  27. "cun-7/95048013/useast": ["all"],
  28. "cun-8/95048013/useast": ["all"],
  29. "cun-9/95048013/useast": ["all"],
  30. "cun-10/95048013/useast": ["all"],
  31. "cun-11/95048013/useast": ["all"],
  32. "cun-12/95048013/useast": ["all"],
  33. "cun-13/95048013/useast": ["all"],
  34. "cun-14/95048013/useast": ["all"],
  35. "cun-15/95048013/useast": ["all"],
  36. "cun-16/95048013/useast": ["all"],
  37. "cun-17/95048013/useast": ["all"],
  38. "cun-18/95048013/useast": ["all"],
  39. "cun-19/95048013/useast": ["all"],
  40. "cun-20/95048013/useast": ["all"],
  41. "cun-21/95048013/useast": ["all"],
  42. "cun-22/95048013/useast": ["all"],
  43. "cun-23/95048013/useast": ["all"],
  44. "cun-24/95048013/useast": ["all"],
  45. "cun-25/95048013/useast": ["all"]
  46. },
  47.  
  48. LogGame: ["cun-", "123"], // ["gamename", "password"]
  49. LogNames: true, // Put account/character name on the picture
  50. LogItemLevel: true, // Add item level to the picture
  51. LogEquipped: false, // include equipped items
  52. LogMerc: false, // include items merc has equipped (if alive)
  53. SaveScreenShot: false, // Save pictures in jpg format (saved in 'Images' folder)
  54. IngameTime: rand(180, 210), // (180, 210) to avoid RD, increase it to (7230, 7290) for mule perming
  55.  
  56. // don't edit
  57. getItemDesc: function (unit, logIlvl) {
  58. var i, desc, index,
  59. stringColor = "";
  60.  
  61. if (logIlvl === undefined) {
  62. logIlvl = this.LogItemLevel;
  63. }
  64.  
  65. desc = unit.description.split("\n");
  66.  
  67. // Lines are normally in reverse. Add color tags if needed and reverse order.
  68. for (i = 0; i < desc.length; i += 1) {
  69. if (desc[i].indexOf(getLocaleString(3331)) > -1) { // Remove sell value
  70. desc.splice(i, 1);
  71.  
  72. i -= 1;
  73. } else {
  74. // Add color info
  75. if (!desc[i].match(/^(y|ÿ)c/)) {
  76. desc[i] = stringColor + desc[i];
  77. }
  78.  
  79. // Find and store new color info
  80. index = desc[i].lastIndexOf("ÿc");
  81.  
  82. if (index > -1) {
  83. stringColor = desc[i].substring(index, index + "ÿ".length + 2);
  84. }
  85. }
  86.  
  87. desc[i] = desc[i].replace(/(y|ÿ)c([0-9!"+<:;.*])/g, "\\xffc$2").replace("ÿ", "\\xff", "g");
  88. }
  89.  
  90. if (logIlvl && desc[desc.length - 1]) {
  91. desc[desc.length - 1] = desc[desc.length - 1].trim() + " (" + unit.ilvl + ")";
  92. }
  93.  
  94. desc = desc.reverse().join("\\n");
  95.  
  96. return desc;
  97. },
  98.  
  99. inGameCheck: function () {
  100. var tick;
  101.  
  102. if (getScript("D2BotMuleLog.dbj") && this.LogGame[0] && me.gamename.match(this.LogGame[0], "i")) {
  103. print("ÿc4MuleLoggerÿc0: Logging items on " + me.account + " - " + me.name + ".");
  104. D2Bot.printToConsole("MuleLogger: Logging items on " + me.account + " - " + me.name + ".", 7);
  105. this.logChar();
  106. tick = getTickCount() + rand(1500, 1750) * 1000; // trigger anti-idle every ~30 minutes
  107.  
  108. while ((getTickCount() - me.gamestarttime) < this.IngameTime * 1000) {
  109. me.overhead("ÿc2Log items done. ÿc4Stay in " + "ÿc4game more:ÿc0 " + Math.floor(this.IngameTime - (getTickCount() - me.gamestarttime) / 1000) + " sec");
  110.  
  111. delay(1000);
  112.  
  113. if ((getTickCount() - tick) > 0) {
  114. sendPacket(1, 0x40); // quest status refresh, working as anti-idle
  115. tick += rand(1500, 1750) * 1000;
  116. }
  117. }
  118.  
  119. quit();
  120.  
  121. return true;
  122. }
  123.  
  124. return false;
  125. },
  126.  
  127. load: function (hash) {
  128. var filename = "data/secure/" + hash + ".txt";
  129.  
  130. if (!FileTools.exists(filename)) {
  131. throw new Error("File " + filename + " does not exist!");
  132. }
  133.  
  134. return FileTools.readText(filename);
  135. },
  136.  
  137. save: function (hash, data) {
  138. var filename = "data/secure/" + hash + ".txt";
  139. FileTools.writeText(filename, data);
  140. },
  141.  
  142. // Log kept item stats in the manager.
  143. logItem: function (unit, logIlvl) {
  144. if (!isIncluded("common/misc.js")) {
  145. include("common/misc.js");
  146. }
  147.  
  148. if (logIlvl === undefined) {
  149. logIlvl = this.LogItemLevel;
  150. }
  151.  
  152. var i, code, desc, sock,
  153. header = "",
  154. color = -1,
  155. name = unit.itemType + "_" + unit.fname.split("\n").reverse().join(" ").replace(/(y|ÿ)c[0-9!"+<:;.*]|\/|\\/g, "").trim();
  156.  
  157. desc = this.getItemDesc(unit, logIlvl) + "$" + unit.gid + ":" + unit.classid + ":" + unit.location + ":" + unit.x + ":" + unit.y + (unit.getFlag(0x400000) ? ":eth" : "");
  158. color = unit.getColor();
  159.  
  160. switch (unit.quality) {
  161. case 5: // Set
  162. switch (unit.classid) {
  163. case 27: // Angelic sabre
  164. code = "inv9sbu";
  165.  
  166. break;
  167. case 74: // Arctic short war bow
  168. code = "invswbu";
  169.  
  170. break;
  171. case 308: // Berserker's helm
  172. code = "invhlmu";
  173.  
  174. break;
  175. case 330: // Civerb's large shield
  176. code = "invlrgu";
  177.  
  178. break;
  179. case 31: // Cleglaw's long sword
  180. case 227: // Szabi's cryptic sword
  181. code = "invlsdu";
  182.  
  183. break;
  184. case 329: // Cleglaw's small shield
  185. code = "invsmlu";
  186.  
  187. break;
  188. case 328: // Hsaru's buckler
  189. code = "invbucu";
  190.  
  191. break;
  192. case 306: // Infernal cap / Sander's cap
  193. code = "invcapu";
  194.  
  195. break;
  196. case 30: // Isenhart's broad sword
  197. code = "invbsdu";
  198.  
  199. break;
  200. case 309: // Isenhart's full helm
  201. code = "invfhlu";
  202.  
  203. break;
  204. case 333: // Isenhart's gothic shield
  205. code = "invgtsu";
  206.  
  207. break;
  208. case 326: // Milabrega's ancient armor
  209. case 442: // Immortal King's sacred armor
  210. code = "invaaru";
  211.  
  212. break;
  213. case 331: // Milabrega's kite shield
  214. code = "invkitu";
  215.  
  216. break;
  217. case 332: // Sigon's tower shield
  218. code = "invtowu";
  219.  
  220. break;
  221. case 325: // Tancred's full plate mail
  222. code = "invfulu";
  223.  
  224. break;
  225. case 3: // Tancred's military pick
  226. code = "invmpiu";
  227.  
  228. break;
  229. case 113: // Aldur's jagged star
  230. code = "invmstu";
  231.  
  232. break;
  233. case 234: // Bul-Kathos' colossus blade
  234. code = "invgsdu";
  235.  
  236. break;
  237. case 372: // Grizwold's ornate plate
  238. code = "invxaru";
  239.  
  240. break;
  241. case 366: // Heaven's cuirass
  242. case 215: // Heaven's reinforced mace
  243. case 449: // Heaven's ward
  244. case 426: // Heaven's spired helm
  245. code = "inv" + unit.code + "s";
  246.  
  247. break;
  248. case 357: // Hwanin's grand crown
  249. code = "invxrnu";
  250.  
  251. break;
  252. case 195: // Nalya's scissors suwayyah
  253. code = "invskru";
  254.  
  255. break;
  256. case 395: // Nalya's grim helm
  257. case 465: // Trang-Oul's bone visage
  258. code = "invbhmu";
  259.  
  260. break;
  261. case 261: // Naj's elder staff
  262. code = "invcstu";
  263.  
  264. break;
  265. case 375: // Orphan's round shield
  266. code = "invxmlu";
  267.  
  268. break;
  269. case 12: // Sander's bone wand
  270. code = "invbwnu";
  271.  
  272. break;
  273. }
  274.  
  275. break;
  276. case 7: // Unique
  277. for (i = 0; i < 401; i += 1) {
  278. if (unit.code === getBaseStat(17, i, 4).trim() && unit.fname.split("\n").reverse()[0].indexOf(getLocaleString(getBaseStat(17, i, 2))) > -1) {
  279. code = getBaseStat(17, i, "invfile");
  280.  
  281. break;
  282. }
  283. }
  284.  
  285. break;
  286. }
  287.  
  288. if (!code) {
  289. if (["ci2", "ci3"].indexOf(unit.code) > -1) { // Tiara/Diadem
  290. code = unit.code;
  291. } else {
  292. code = getBaseStat(0, unit.classid, 'normcode') || unit.code;
  293. }
  294.  
  295. code = code.replace(" ", "");
  296.  
  297. if ([10, 12, 58, 82, 83, 84].indexOf(unit.itemType) > -1) {
  298. code += (unit.gfx + 1);
  299. }
  300. }
  301.  
  302. sock = unit.getItems();
  303.  
  304. if (sock) {
  305. for (i = 0; i < sock.length; i += 1) {
  306. if (sock[i].itemType === 58) {
  307. desc += "\n\n";
  308. desc += this.getItemDesc(sock[i]);
  309. }
  310. }
  311. }
  312.  
  313. return {
  314. itemColor: color,
  315. image: code,
  316. title: name,
  317. description: desc,
  318. header: header,
  319. sockets: Misc.getItemSockets(unit)
  320. };
  321. },
  322.  
  323. logChar: function (logIlvl, logName, saveImg) {
  324. while (!me.gameReady) {
  325. delay(100);
  326. }
  327.  
  328. if (logIlvl === undefined) {
  329. logIlvl = this.LogItemLevel;
  330. }
  331.  
  332. if (logName === undefined) {
  333. logName = this.LogNames;
  334. }
  335.  
  336. if (saveImg === undefined) {
  337. saveImg = this.SaveScreenShot;
  338. }
  339.  
  340. var i, folder, string, parsedItem,
  341. items = me.getItems(),
  342. realm = me.realm || "Single Player",
  343. merc,
  344. finalString = "";
  345.  
  346. if (!FileTools.exists("mules/" + realm)) {
  347. folder = dopen("mules");
  348.  
  349. folder.create(realm);
  350. }
  351.  
  352. if (!FileTools.exists("mules/" + realm + "/" + me.account)) {
  353. folder = dopen("mules/" + realm);
  354.  
  355. folder.create(me.account);
  356. }
  357.  
  358. if (!items || !items.length) {
  359. return;
  360. }
  361.  
  362. function itemSort(a, b) {
  363. return b.itemType - a.itemType;
  364. }
  365.  
  366. items.sort(itemSort);
  367.  
  368. for (i = 0; i < items.length; i += 1) {
  369. if ((this.LogEquipped || items[i].mode === 0) && (items[i].quality !== 2 || !Misc.skipItem(items[i].classid))) {
  370. parsedItem = this.logItem(items[i], logIlvl);
  371.  
  372. // Log names to saved image
  373. if (logName) {
  374. parsedItem.header = (me.account || "Single Player") + " / " + me.name;
  375. }
  376.  
  377. if (saveImg) {
  378. D2Bot.saveItem(parsedItem);
  379. }
  380.  
  381. // Always put name on Char Viewer items
  382. if (!parsedItem.header) {
  383. parsedItem.header = (me.account || "Single Player") + " / " + me.name;
  384. }
  385.  
  386. // Remove itemtype_ prefix from the name
  387. parsedItem.title = parsedItem.title.substr(parsedItem.title.indexOf("_") + 1);
  388.  
  389. if (items[i].mode === 1) {
  390. parsedItem.title += " (equipped)";
  391. }
  392.  
  393. string = JSON.stringify(parsedItem);
  394. finalString += (string + "\n");
  395. }
  396. }
  397.  
  398. if (this.LogMerc) {
  399. for (i = 0; i < 3; i += 1) {
  400. merc = me.getMerc();
  401.  
  402. if (merc) {
  403. break;
  404. }
  405.  
  406. delay(50);
  407. }
  408.  
  409. if (merc) {
  410. items = merc.getItems();
  411.  
  412. for (i = 0; i < items.length; i += 1) {
  413. parsedItem = this.logItem(items[i]);
  414. parsedItem.title += " (merc)";
  415. string = JSON.stringify(parsedItem);
  416. finalString += (string + "\n");
  417.  
  418. if (this.SaveScreenShot) {
  419. D2Bot.saveItem(parsedItem);
  420. }
  421. }
  422. }
  423. }
  424.  
  425. // hcl = hardcore class ladder
  426. // sen = softcore expan nonladder
  427. FileTools.writeText("mules/" + realm + "/" + me.account + "/" + me.name + "." + ( me.playertype ? "h" : "s" ) + (me.gametype ? "e" : "c" ) + ( me.ladder > 0 ? "l" : "n" ) + ".txt", finalString);
  428. print("Item logging done.");
  429. }
  430. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement