The West Script Suite [ES]

Una colección de mejoras para el juego de navegador The West

  1. // ==UserScript==
  2. // @name The West Script Suite [ES]
  3. // @description Una colección de mejoras para el juego de navegador The West
  4. // @namespace https://gf.qytechs.cn/users/4051
  5. // @author KaZaC
  6. // @include http://*.the-west.*/game.php*
  7. // @version 1.4
  8. // @grant none
  9. // @icon http://i.imgur.com/8qJTYUy.png
  10. // @license http://creativecommons.org/licenses/by-nc-sa/3.0/
  11. // ==/UserScript==
  12.  
  13. function runScript(source) {
  14. if ('function' == typeof source) {
  15. source = '(' + source + ')();';
  16. }
  17. var script = document.createElement('script');
  18. script.setAttribute("type", "application/javascript");
  19. script.textContent = source;
  20. document.body.appendChild(script);
  21. document.body.removeChild(script);
  22. }
  23.  
  24. runScript(function() {
  25.  
  26. SlySuite = {
  27. preferences: {
  28. KOTimer: true,
  29. RiverColours: "default",
  30. Experience: false,
  31. Achievements: true,
  32. CraftingWindow: false
  33. },
  34. possibleRiverColours: {
  35. default: 'Por defecto',
  36. halloween: 'Rojo',
  37. paddy: 'Verde',
  38. valentine: 'Rosado',
  39. blue: 'Azul',
  40. norivers: 'Ocultar ríos'
  41. },
  42. getPreference: function(pref) {
  43. return this.preferences[pref];
  44. },
  45. setPreference: function(pref, val) {
  46. if (pref == 'RiverColours')
  47. SlySuite.RiverColours.changeColour();
  48.  
  49. this.preferences[pref] = val;
  50. localStorage.setObject('SlySuite', this.preferences);
  51.  
  52.  
  53. },
  54. images: {
  55. achievements: 'http://i300.photobucket.com/albums/nn22/qwexrty/achievs_zps4c5d9ee3.jpg',
  56. settings: 'http://i300.photobucket.com/albums/nn22/qwexrty/settings_zpsa8c2f112.jpg',
  57. achievement_icon: 'http://i300.photobucket.com/albums/nn22/qwexrty/questbook2_zpsf9bfe431.png'
  58. },
  59. init: function() {
  60. Storage.prototype.setObject = function(key, value) {
  61. this.setItem(key, JSON.stringify(value));
  62. };
  63.  
  64. Storage.prototype.getObject = function(key) {
  65. var value = this.getItem(key);
  66. return value && JSON.parse(value);
  67. };
  68.  
  69. localStorage.getObject('SlySuite') == null ? localStorage.setObject('SlySuite', this.preferences) : $.extend(this.preferences, localStorage.getObject('SlySuite'));
  70. SlySuite.createSettingsButton();
  71.  
  72. if (SlySuite.getPreference('KOTimer'))
  73. SlySuite.KOTimer.firstrun();
  74.  
  75. $(setTimeout(function() {
  76. SlySuite.RiverColours.init();
  77. if (SlySuite.getPreference('RiverColours') != 'default')
  78. SlySuite.RiverColours.changeColour();
  79. }, 5000));
  80.  
  81. if (SlySuite.getPreference('Achievements'))
  82. SlySuite.Achievements.init();
  83.  
  84. if (SlySuite.getPreference('CraftingWindow'))
  85. SlySuite.CraftingWindow.init();
  86.  
  87. },
  88. createSettingsButton: function() {
  89.  
  90. var bottom = $('<div></div>').attr({
  91. 'class': 'menucontainer_bottom'
  92. });
  93.  
  94. var icon = $('<div></div>').attr({
  95. 'class': 'menulink',
  96. 'title': "Opciones de la Suite"
  97. }).css({
  98. 'background-image': 'url(' + this.images.settings + ')',
  99. 'background-position': '0px 0px'
  100. }).mouseleave(function() {
  101. $(this).css("background-position", "0px 0px");
  102. }).mouseenter(function(e) {
  103. $(this).css("background-position", "-25px 0px");
  104. }).click(function() {
  105. SlySuite.openSettings();
  106. });
  107.  
  108. $('#ui_menubar .ui_menucontainer :last').after($('<div></div>').attr({
  109. 'class': 'ui_menucontainer',
  110. 'id': 'SlySuite_settings_icon'
  111. }).append(icon).append(bottom));
  112. },
  113. createAchievementsButton: function() {
  114.  
  115. },
  116. openSettings: function() {
  117. content = this.generateWindowContent();
  118. var win = wman.open("SlySuite", "Opciones de la Suite").setResizeable(true).setMinSize(450, 400).setSize(450, 400);
  119. win.appendToContentPane(content);
  120. },
  121. generateWindowContent: function() {
  122. content = "";
  123. content += "<div style=\"margin-left:5px;\">";
  124. this.getPreference('KOTimer') == true ? check = " checked='checked'" : check = "";
  125. content += "<input type='checkbox' id='KOtimer_checkbox'" + check + " onchange=\"SlySuite.setPreference('KOTimer',this.checked)\"><label for='KOtimer_checkbox'>Temporizador de desmayo</label><br />";
  126. content += "Color de los ríos ";
  127. content += "<select onchange=\"SlySuite.setPreference('RiverColours',this.value);\">";
  128. colours = SlySuite.possibleRiverColours;
  129. for (var c in colours) {
  130. if (SlySuite.getPreference('RiverColours') == c)
  131. content += "<option selected='selected' value=\"" + c + "\">" + colours[c] + "</option>";
  132. else
  133. content += "<option value=\"" + c + "\">" + colours[c] + "</option>";
  134.  
  135. }
  136. content += "</select><br />";
  137. this.getPreference('Achievements') == true ? check = " checked='checked'" : check = "";
  138. content += "<input type='checkbox' id='Achievements_checkbox'" + check + " onchange=\"SlySuite.setPreference('Achievements',this.checked)\"><label for='Achievements_checkbox'>Seguimiento de logros</label><br />";
  139. this.getPreference('CraftingWindow') == true ? check = " checked='checked'" : check = "";
  140. content += "<input type='checkbox' id='CraftingWindow_checkbox'" + check + " onchange=\"SlySuite.setPreference('CraftingWindow',this.checked)\"><label for='CraftingWindow_checkbox'>Mejora de la ventana de artesanía</label><br />";
  141. content += "<br /><br />";
  142. content += "Algunos ajustes pueden requerir actualizar la ventana del juego para aplicarse";
  143. content += "</div>";
  144. return content;
  145. }
  146.  
  147. };
  148.  
  149. SlySuite.KOTimer = {
  150. timeleft: 0,
  151. aliveAgain: 0,
  152. image: "<div style='position:relative;display:block;width:59px;height:59px;cursor:pointer;' id='knockouttimer'><div id='timer'></div></div>",
  153. lastDied: Character.lastDied
  154. };
  155.  
  156. SlySuite.KOTimer.firstrun = function() {
  157.  
  158. if ($('.game_notification_area').length > 0) {
  159. $('.game_notification_area').append(this.image);
  160. } else {
  161. setTimeout(SlySuite.KOTimer.firstrun, 3000);
  162. console.log('Couldn\'t find the notification area, trying again soon...');
  163. return;
  164. }
  165. $('#knockouttimer').css('background-image', 'url("http://i300.photobucket.com/albums/nn22/qwexrty/knockout_sprite_zps97503234.png")');
  166.  
  167. $('#knockouttimer #timer').css({
  168. 'position': 'absolute',
  169. 'bottom': '0px',
  170. 'left': '0px',
  171. 'right': '0px',
  172. 'color': 'white',
  173. 'text-align': 'center',
  174. 'font-size': '11px',
  175. 'height': '30px',
  176. 'line-height': '30px'
  177. });
  178.  
  179. SlySuite.KOTimer.retrieveTimeleft(true);
  180. SlySuite.KOTimer.update();
  181. };
  182.  
  183. SlySuite.KOTimer.retrieveTimeleft = function(forced) {
  184. forced = forced || false;
  185.  
  186. if (forced || Character.lastDied != SlySuite.KOTimer.lastDied) {
  187. SlySuite.KOTimer.lastDied = Character.lastDied;
  188. } else {
  189. setTimeout(SlySuite.KOTimer.retrieveTimeleft, 10000);
  190. return;
  191. }
  192.  
  193. if (Character.homeTown.town_id != 0) // Can only request the info when you're in a town
  194. {
  195. $.post("game.php?window=building_sheriff&mode=index", {
  196. town_id: Character.homeTown.town_id
  197. }, function(data) {
  198. SlySuite.KOTimer.timeleft = data.timeleft;
  199. SlySuite.KOTimer.aliveAgain = Math.round(new Date().getTime() / 1000) + data.timeleft;
  200. });
  201. } else // We'll hide the image when you're not in a town
  202. {
  203. SlySuite.KOTimer.aliveAgain = 0;
  204. $('#knockouttimer').hide();
  205.  
  206. }
  207. setTimeout(SlySuite.KOTimer.retrieveTimeleft, 10000); // And we'll do it again in 10 seconds
  208. };
  209.  
  210. SlySuite.KOTimer.update = function() {
  211. var unix = Math.round(new Date().getTime() / 1000);
  212. aliveAgain = SlySuite.KOTimer.aliveAgain;
  213. if (aliveAgain < unix) {
  214. $('#knockouttimer').hide();
  215. setTimeout(SlySuite.KOTimer.update, 10000);
  216. return;
  217. } else
  218. $('#knockouttimer').show();
  219.  
  220. difference = aliveAgain - unix;
  221. hours = Math.floor(difference / 60 / 60);
  222. difference -= hours * 60 * 60;
  223. minutes = Math.floor(difference / 60);
  224. difference -= minutes * 60;
  225.  
  226. if (hours == 0 && minutes == 0)
  227. $('#knockouttimer #timer').html(Math.round(difference) + 's');
  228. else if (hours == 0)
  229. $('#knockouttimer #timer').html(minutes + 'm');
  230. else
  231. $('#knockouttimer #timer').html(hours + 'h:' + minutes + 'm');
  232.  
  233. setTimeout(SlySuite.KOTimer.update, 1000);
  234.  
  235. };
  236. SlySuite.RiverColours = {
  237. initialized: false
  238. };
  239.  
  240. SlySuite.RiverColours.init = function() {
  241. if (typeof(Map.Helper) == 'undefined')
  242. return;
  243. SlySuite.RiverColours.initialized = true;
  244. SlySuite.RiverColours.oldScript = Map.Helper.imgPath.lookForModification.bind({});
  245. Map.Helper.imgPath.lookForModification = function(path, d) {
  246. $('#river_hide_css').remove();
  247. if (/river|deco_egg_05|quests_fluss/.test(path) && SlySuite.getPreference('RiverColours') != 'default' && SlySuite.getPreference('RiverColours') != 'norivers') {
  248. if (SlySuite.getPreference('RiverColours') == 'blue')
  249. return '/' + path;
  250. else
  251. return SlySuite.getPreference('RiverColours') + '/' + path;
  252. } else if (SlySuite.getPreference('RiverColours') == 'norivers') {
  253. var hidingrivers = document.createElement('style');
  254. hidingrivers.setAttribute("id", "river_hide_css");
  255. hidingrivers.textContent = ".image[style*='river']{display:none;}";
  256. document.body.appendChild(hidingrivers);
  257. return SlySuite.RiverColours.oldScript(path, d);
  258. } else
  259. return SlySuite.RiverColours.oldScript(path, d);
  260.  
  261. };
  262. SlySuite.RiverColours.changeColour = function() {
  263. Map.Helper.imgPath.clearCache();
  264. Map.refresh(true);
  265. };
  266. };
  267.  
  268. SlySuite.Achievements = {
  269. achievementsList: {},
  270. allFolders: [],
  271. lastUpdate: new Date(0),
  272. nextFolderCheck: false,
  273. init: function() {
  274. localStorage.getObject('SlySuite_Achievements') == null ? localStorage.setObject('SlySuite_Achievements', SlySuite.Achievements.achievementsList) : $.extend(this.achievementsList, localStorage.getObject('SlySuite_Achievements'));
  275. $(function() {
  276. Ajax.remoteCall('achievement', '', {
  277. playerid: Character.playerId
  278. }, function(r) {
  279. if (r.error) return new MessageError(r.msg).show();
  280. for (var f in r.menu) {
  281. if (!('id' in r.menu[f])) continue;
  282. if (r.menu[f].id == 'overall' || r.menu[f].id == 'heroics')
  283. continue;
  284. SlySuite.Achievements.allFolders.push(r.menu[f].id);
  285. for (var sub in r.menu[f].sub)
  286. if ('id' in r.menu[f].sub[sub]) SlySuite.Achievements.allFolders.push(r.menu[f].sub[sub].id);
  287. }
  288. });
  289. setTimeout(function() {
  290. SlySuite.Achievements.createWindow();
  291. SlySuite.Achievements.editTracker();
  292. SlySuite.Achievements.updateAchievements();
  293.  
  294.  
  295. }, 5000);
  296. });
  297.  
  298. this.createButton();
  299. },
  300. createWindow: function() {
  301. if (typeof(Map.width) == 'undefined' || Map.width == 0) {
  302. setTimeout(SlySuite.Achievements.createWindow, 3000);
  303. return;
  304. }
  305. this.scrolling = new west.gui.Scrollpane(null).appendContent(
  306. "<div class='achievement_tracker_container' />"
  307. );
  308. this.window = wman.open('achievementtracker', null, 'chat questtracker noclose nofocus nocloseall dontminimize')
  309. .setMiniTitle('Seguimiento de logros')
  310. .setSize(350, 170)
  311. .setMinSize(320, 140)
  312. .addEventListener(TWE('WINDOW_MINIMIZE'), this.minimize, this)
  313. .addEventListener(TWE('WINDOW_DESTROY'), this.minimize, this)
  314. .addEventListener(TWE('WINDOW_RELOAD'), this.manualUpdate, this)
  315. .setResizeable(true)
  316. .appendToContentPane($("<div id='ui_achievementtracker'/>").append(this.scrolling.getMainDiv()));
  317.  
  318. this.window.addTab('<div class="questbook" title="Seguimiente de logros"></div> Seguimiento de logros', 'achievementtracker', function() {});
  319.  
  320. this.window.dontCloseAll = true;
  321. this.addCss();
  322.  
  323. $(this.window.getMainDiv()).css({
  324. left: Map.width - 425,
  325. top: 400
  326. });
  327. $('._tab_id_achievementtracker .tw2gui_window_tab_text .questbook').css({
  328. 'background-image': 'url(' + SlySuite.images.achievement_icon + ')'
  329. });
  330. $('#windows .tw2gui_window.questtracker .tw2gui_window_tabbar_tabs').attr({
  331. 'style': 'left:2px !important;'
  332. });
  333. },
  334. createButton: function() {
  335. var bottom = $('<div></div>').attr({
  336. 'class': 'menucontainer_bottom'
  337. });
  338.  
  339. var icon = $('<div></div>').attr({
  340. 'class': 'menulink',
  341. 'title': "Abrir seguimiento de logros"
  342. }).css({
  343. 'background-image': 'url(' + SlySuite.images.achievements + ')',
  344. 'background-position': '0px 0px'
  345. }).mouseleave(function() {
  346. $(this).css("background-position", "0px 0px");
  347. }).mouseenter(function(e) {
  348. $(this).css("background-position", "-25px 0px");
  349. }).click(function() {
  350. SlySuite.Achievements.openWindow();
  351. });
  352.  
  353. $('#ui_menubar .ui_menucontainer :last').after($('<div></div>').attr({
  354. 'class': 'ui_menucontainer',
  355. 'id': 'Achievementtracker_button'
  356. }).css({
  357. display: 'none'
  358. }).append(icon).append(bottom));
  359. },
  360. minimize: function() {
  361. $(this.window.divMain).hide();
  362. $('#Achievementtracker_button').show();
  363. wman.minimizedIds[this.window.id] = this.window;
  364. },
  365. openWindow: function() {
  366. $(this.window.divMain).show();
  367. $('#Achievementtracker_button').hide();
  368. },
  369. editTracker: function() {
  370. SlySuite.Achievements.oldTracker = Character.trackAchievement;
  371. Character.trackAchievement = function(a, b) {
  372. SlySuite.Achievements.trackAchievement(a, b);
  373. };
  374. },
  375. trackAchievement: function(progress, update) {
  376. if (!SlySuite.preferences.Achievements) {
  377. SlySuite.Achievements.oldTracker(progress, update);
  378. return;
  379. }
  380. var params = progress.split('-');
  381. // achievement done, track next one in group
  382. if (!update || params[2]) {
  383. var achvId = (params[2]) ? params[2] : params[0];
  384. this.setAchievement(achvId);
  385. } else {
  386. this.setAchievement(params[1]);
  387. }
  388.  
  389. },
  390. setAchievement: function(achi) {
  391. if (achi in this.achievementsList) {
  392. delete this.achievementsList[achi];
  393. this.removeFromTracker(achi);
  394. localStorage.setObject('SlySuite_Achievements', SlySuite.Achievements.achievementsList);
  395. } else {
  396. this.achievementsList[achi] = new Object();
  397. this.getAchievementData(achi);
  398. SlySuite.Achievements.descriptionNeeded.push(parseInt(achi));
  399. if (!SlySuite.Achievements.nextFolderCheck)
  400. SlySuite.Achievements.getFolderInfo(SlySuite.Achievements.allFolders.slice());
  401. }
  402. },
  403. manualUpdate: function() {
  404. if (this.lastUpdate.getTime() < new Date().getTime() - 60000) {
  405. this.window.showLoader();
  406. clearTimeout(this.nextUpdate);
  407. this.updateAchievements();
  408. this.lastUpdate = new Date();
  409. this.window.hideLoader();
  410. } else {
  411. secleft = 60 - Math.floor((new Date().getTime() - this.lastUpdate.getTime()) / 1000);
  412. new MessageError("Actualizado hace muy poco, inténtelo de nuevo en " + secleft + "s").show();
  413. }
  414.  
  415. },
  416. updateTracker: function(achi) {
  417. if (this.achievementsList[achi].current >= this.achievementsList[achi].required) {
  418. this.setAchievement(achi);
  419. return;
  420. }
  421.  
  422. if (!('isTime' in this.achievementsList[achi]))
  423. this.achievementsList[achi].isTime = false;
  424.  
  425. if ($('#ui_achievementtracker #achievementtracker_' + achi).length > 0) {
  426. $('#ui_achievementtracker #achievementtracker_' + achi + ' .achievement_current').html(this.achievementsList[achi].isTime ? this.tcalc(this.achievementsList[achi].current) : this.achievementsList[achi].current);
  427. $('#ui_achievementtracker #achievementtracker_' + achi + ' .achievement_required').html(this.achievementsList[achi].isTime ? this.tcalc(this.achievementsList[achi].required) : this.achievementsList[achi].required);
  428. $('#ui_achievementtracker #achievementtracker_' + achi + ' .achievement_percentage').html(Math.floor(this.achievementsList[achi].current / this.achievementsList[achi].required * 100));
  429. $('#ui_achievementtracker #achievementtracker_' + achi + ' .quest_requirement').attr('title', ('description' in this.achievementsList[achi] ? this.achievementsList[achi].description : ''));
  430. } else {
  431. $('#ui_achievementtracker .achievement_tracker_container').append('<div class="selectable" id="achievementtracker_' + achi + '">' +
  432. '<div class="quest-list title">' + this.achievementsList[achi].title +
  433. '<span class="quest-list remove" title="Eliminar logro del seguimiento"></span></div>' +
  434. '<ul class="requirement_container"><li class="quest_requirement" ' + ('description' in this.achievementsList[achi] ? 'title="' + this.achievementsList[achi].description + '"=' : '') + '>- <span class="achievement_current">' + (this.achievementsList[achi].isTime ? this.tcalc(this.achievementsList[achi].current) : this.achievementsList[achi].current) +
  435. '</span> / <span class="achievement_required">' + (this.achievementsList[achi].isTime ? this.tcalc(this.achievementsList[achi].required) : this.achievementsList[achi].required) + '</span> (<span class="achievement_percentage">' +
  436. (Math.floor(this.achievementsList[achi].current / this.achievementsList[achi].required * 100)) + '</span>%)</li></ul></div>');
  437. $('#ui_achievementtracker #achievementtracker_' + achi + ' .quest-list.remove').click(function() {
  438. SlySuite.Achievements.setAchievement(achi);
  439. });
  440. }
  441. },
  442. getAchievementData: function(achi) {
  443. Ajax.remoteCall('achievement', 'track', {
  444. achvid: achi
  445. }, function(resp) {
  446. if (resp.error) return new MessageError(resp.msg).show();
  447. $.extend(SlySuite.Achievements.achievementsList[achi], {
  448. title: resp.title,
  449. current: resp.current,
  450. required: resp.required
  451. });
  452. SlySuite.Achievements.updateTracker(achi);
  453. Ajax.remoteCall('achievement', 'untrack');
  454. localStorage.setObject('SlySuite_Achievements', SlySuite.Achievements.achievementsList);
  455. });
  456. },
  457. removeFromTracker: function(achi) {
  458. $('#ui_achievementtracker #achievementtracker_' + achi).remove();
  459. },
  460. updateAchievements: function() {
  461. SlySuite.Achievements.descriptionNeeded = [];
  462.  
  463. for (var a in SlySuite.Achievements.achievementsList) {
  464. SlySuite.Achievements.getAchievementData(a);
  465. if (!('folder' in SlySuite.Achievements.achievementsList[a]))
  466. SlySuite.Achievements.descriptionNeeded.push(parseInt(a));
  467. }
  468. SlySuite.Achievements.nextUpdate = setTimeout(SlySuite.Achievements.updateAchievements, 10 * 60 * 1000);
  469.  
  470. if (SlySuite.Achievements.descriptionNeeded.length > 0)
  471. SlySuite.Achievements.getFolderInfo(SlySuite.Achievements.allFolders.slice());
  472.  
  473.  
  474. },
  475. getFolderInfo: function(arr) {
  476. if (arr.length == 0 || SlySuite.Achievements.descriptionNeeded.length == 0) {
  477. SlySuite.Achievements.nextFolderCheck = false;
  478. return;
  479. }
  480. Ajax.remoteCall('achievement', 'get_list', {
  481. folder: arr[0],
  482. playerid: Character.playerId
  483. }, function(json) {
  484. for (var achieve in json.achievements.progress) {
  485. currentId = json.achievements.progress[achieve].id;
  486. if ($.inArray(currentId, SlySuite.Achievements.descriptionNeeded) != -1) {
  487. SlySuite.Achievements.descriptionNeeded.splice(SlySuite.Achievements.descriptionNeeded.indexOf(currentId), 1);
  488. SlySuite.Achievements.achievementsList[currentId].description = json.achievements.progress[achieve].desc;
  489. SlySuite.Achievements.achievementsList[currentId].folder = arr[0];
  490. if (json.achievements.progress[achieve].meta[0].match('^js:')) {
  491. var parts = json.achievements.progress[achieve].meta[0].split(":");
  492. var func = eval(parts[1]);
  493. if (func instanceof west.gui.Progressbar) {
  494. parts[4] ? SlySuite.Achievements.achievementsList[currentId].isTime = true : SlySuite.Achievements.achievementsList[currentId].isTime = false;
  495. }
  496. }
  497. SlySuite.Achievements.updateTracker(currentId);
  498. localStorage.setObject('SlySuite_Achievements', SlySuite.Achievements.achievementsList);
  499. }
  500. }
  501.  
  502. arr.splice(0, 1);
  503. SlySuite.Achievements.nextFolderCheck = setTimeout(SlySuite.Achievements.getFolderInfo, 2000, arr);
  504. });
  505. },
  506. addCss: function() {
  507. achievementCss = '';
  508. achievementCss += "#ui_achievementtracker .quest-list.title {margin-left:5px;color: #DBA901;font-weight: bold;display:inline-block;zoom:1;}\n";
  509. achievementCss += "#ui_achievementtracker .selectable:hover .quest-list.remove {display:inline-block;zoom:1;cursor:pointer;}\n";
  510. achievementCss += "#ui_achievementtracker .quest-list.remove {background: url('/images/chat/windowicons.png') no-repeat -120px 0px;width: 12px; height: 12px; margin-left:5px;margin-bottom:-2px;}\n";
  511. achievementCss += "div#ui_achievementtracker { width: 100%; height: 100%; display:block;}";
  512.  
  513. var style = document.createElement('style');
  514. style.textContent = achievementCss;
  515. document.body.appendChild(style);
  516. },
  517. tcalc: function(val) {
  518. var h, m, s;
  519. m = s = "00";
  520. h = Math.floor(val / 3600);
  521. if (0 != (val % 3600)) {
  522. var c = val - (h * 3600);
  523. minute = Math.floor(c / 60);
  524. if (0 != (c % 60)) s = c % 60;
  525. }
  526. return (h <= 0 ? "" : h + ":") + m + ":" + s;
  527. }
  528.  
  529. };
  530.  
  531. SlySuite.CraftingWindow = {
  532.  
  533. old: $.extend({}, Crafting),
  534. currentlySelected: false,
  535. knownRecipes: [],
  536. init: function() {
  537. Crafting.addRecipe = SlySuite.CraftingWindow.addRecipe;
  538. Crafting.updateResources = SlySuite.CraftingWindow.updateResources;
  539. /*Bag.updateChanges = function(changes, from) {
  540. Bag.handleChanges(changes, from);
  541. Crafting.updateResources();
  542. SlySuite.CraftingWindow.updateAllCount();
  543. };*/
  544.  
  545. SlySuite.CraftingWindow.addCss();
  546. },
  547. selectRecipe: function(id) {
  548. $('#recipe' + SlySuite.CraftingWindow.currentlySelected + '.selected').removeClass('selected');
  549. $('.recipe_content').hide();
  550. $('#recipe' + id).addClass('selected');
  551. $('#recipe_content_' + id).show();
  552. SlySuite.CraftingWindow.currentlySelected = id;
  553. if (SlySuite.CraftingWindow.craftCount(id) > 0) {
  554. $('#crafting_requirements_display .tw2gui_button').show();
  555. } else {
  556. $('#crafting_requirements_display .tw2gui_button').hide();
  557. }
  558.  
  559. },
  560. craftCount: function(id) {
  561. var canCraft = 10000;
  562. for (var i in Crafting.recipes[id].resources) {
  563. if (!Crafting.recipes[id].resources.hasOwnProperty((i))) continue;
  564.  
  565. resourceItem = ItemManager.get(Crafting.recipes[id].resources[i].item);
  566. amountRequired = Crafting.recipes[id].resources[i].count;
  567. var bag_count = Bag.getItemCount(resourceItem.item_id);
  568. canCraft = Math.min(Math.floor(bag_count / amountRequired), canCraft);
  569. }
  570. return canCraft;
  571. },
  572. updateResources: function() {
  573. for (var k in Crafting.recipes) {
  574. var mats_available = true,
  575. resourceItem, amountRequired;
  576. for (var i in Crafting.recipes[k].resources) {
  577. if (!Crafting.recipes[k].resources.hasOwnProperty((i))) continue;
  578.  
  579. resourceItem = ItemManager.get(Crafting.recipes[k].resources[i].item);
  580. amountRequired = Crafting.recipes[k].resources[i].count;
  581.  
  582. var bag_count = Bag.getItemCount(resourceItem.item_id);
  583.  
  584. SlySuite.CraftingWindow.updateCount(k);
  585.  
  586. if (bag_count < amountRequired) mats_available = false;
  587.  
  588. window.CharacterWindow.window.$('#resources_' + k + '_' + resourceItem.item_id).html(
  589. new tw2widget.CraftingItem(resourceItem)
  590. .setRequired(bag_count, amountRequired)
  591. .getMainDiv()
  592. );
  593. }
  594. window.CharacterWindow.window.$('#recipe_craft_' + Crafting.recipes[k].item_id).empty();
  595.  
  596. if (Crafting.recipes[k].last_craft) {
  597. $('#recipe_craft_' + Crafting.recipes[k].item_id).append("<span cursor:default;'>" + Crafting.recipes[k].last_craft.formatDurationBuffWay() + "</span>");
  598. console.log('test');
  599. }
  600.  
  601. if (mats_available)
  602. CharacterWindow.window.$('#recipe' + Crafting.recipes[k].item_id).removeClass("not_available");
  603. else
  604. CharacterWindow.window.$('#recipe' + Crafting.recipes[k].item_id).addClass("not_available");
  605. }
  606.  
  607. if (SlySuite.CraftingWindow.craftCount(SlySuite.CraftingWindow.currentlySelected) > 0) {
  608. $('#crafting_requirements_display .tw2gui_button').show();
  609. } else {
  610. $('#crafting_requirements_display .tw2gui_button').hide();
  611. }
  612. },
  613. updateCount: function(id) {
  614. $('#recipe_count_' + id).html('[' + SlySuite.CraftingWindow.craftCount(id) + ']');
  615. console.log(id);
  616. },
  617. addRecipe: function(recipe) {
  618. if ($('#crafting_requirements_display').length < 1) {
  619. $('.character-crafting.crafting').append($("<div id='crafting_requirements_display' />"));
  620. $('#crafting_requirements_display').append(new west.gui.Button(_("Fabricar"), function() {
  621. SlySuite.CraftingWindow.craftItem(SlySuite.CraftingWindow.currentlySelected);
  622. }).setMinWidth(150).getMainDiv());
  623. /*EventHandler.listen('inventory_changed',function(){
  624. });*/
  625. }
  626. var time_last_craft = recipe.last_craft;
  627. var recipe = ItemManager.get(recipe.item_id);
  628. Crafting.recipes[recipe.item_id] = recipe;
  629. Crafting.recipes[recipe.item_id]['last_craft'] = time_last_craft;
  630. if (window.CharacterWindow.window != undefined && window.CharacterWindow.window.$('#crafting_recipe_list').length > 0) {
  631. var recipe_div = $("<div class='" + Crafting.getRecipeColor(recipe) + "' id='recipe" + recipe.item_id + "' onclick='SlySuite.CraftingWindow.selectRecipe(" + recipe.item_id + ");'></div>");
  632. var recipe_title_inner_div = $("<div class='recipe_title_inner' />");
  633. var recipe_title_div = $("<div id='recipe_title_" + recipe.item_id + "' class='recipe_title'></div>");
  634. var recipe_collapse_div = $("<div id='recipe_count_" + recipe.item_id + "' class='recipe_collapse'></div>");
  635. var recipe_difficult_div = $("<div id='recipe_difficult_" + recipe.item_id + "' class='recipe_difficult " + Crafting.getRecipeColor(recipe) + "' title='" + Crafting.description.escapeHTML() + "'></div>");
  636. var recipe_name_div = $("<div id='recipe_name" + recipe.item_id + "' class='recipe_name'>" + recipe.name + "</div>");
  637. var recipe_craft_div = $("<div id='recipe_craft_" + recipe.item_id + "' class='recipe_craft'></div>");
  638. var recipe_content_div = $("<div id='recipe_content_" + recipe.item_id + "' class='recipe_content'></div>").hide();
  639. var recipe_craftitem_div = $("<div id='recipe_craftitem_" + recipe.item_id + "' class='recipe_craftitem'></div>");
  640. var recipe_resources_content_div = $("<div id='recipe_resources_content_" + recipe.item_id + "' class='recipe_resources'></div>");
  641.  
  642. SlySuite.CraftingWindow.knownRecipes[recipe.item_id] = recipe;
  643.  
  644. recipe_title_inner_div.append(recipe_collapse_div, recipe_name_div);
  645. recipe_title_div.append(recipe_title_inner_div, recipe_craft_div).appendTo(recipe_div);
  646.  
  647. var craftitem = $("<div id='craftitem_" + recipe.item_id + "' style='float:none;'/>")
  648. .append((new tw2widget.CraftingItem(ItemManager.get(recipe.craftitem))).getMainDiv());
  649.  
  650. craftitem.appendTo(recipe_craftitem_div);
  651.  
  652. var available = true,
  653. resourceItem, canCraft = 1000000;
  654. for (var i in recipe.resources) {
  655. if (!recipe.resources.hasOwnProperty(i)) continue;
  656.  
  657. resourceItem = ItemManager.get(recipe.resources[i].item);
  658.  
  659. var resource = $("<div id='resources_" + recipe.item_id + "_" + resourceItem.item_id + "'></div>");
  660. var bag_count = Bag.getItemCount(resourceItem.item_id);
  661.  
  662. canCraft = Math.min(Math.floor(bag_count / recipe.resources[i].count), canCraft);
  663.  
  664. recipe_resources_content_div.append(resource.append(
  665. new tw2widget.CraftingItem(resourceItem)
  666. .setRequired(bag_count, recipe.resources[i].count)
  667. .getMainDiv()
  668. ));
  669.  
  670. var hasItem = Bag.getItemByItemId(resourceItem.item_id);
  671. if (!hasItem || hasItem.getCount() < recipe.resources[i].count)
  672. available = false;
  673. }
  674. recipe_collapse_div.html('[' + canCraft + ']');
  675.  
  676. if (!available) {
  677. recipe_div.addClass("not_available");
  678. } else if (time_last_craft) {
  679. recipe_craft_div.append("<span style='cursor:default;'>" + time_last_craft.formatDurationBuffWay() + "</span>");
  680. }
  681. recipe_content_div.append(recipe_craftitem_div, recipe_resources_content_div, $("<br />"));
  682. recipe_content_div.appendTo($('#crafting_requirements_display'));
  683. $('#crafting_recipe_list .tw2gui_scrollpane_clipper_contentpane').prepend(recipe_div);
  684. SlySuite.CraftingWindow.selectRecipe(recipe.item_id);
  685. }
  686. },
  687. craftItem: function(recipe_id) {
  688. Ajax.remoteCall('crafting', 'start_craft', {
  689. recipe_id: recipe_id
  690. }, function(resp) {
  691. if (resp.error) return new MessageError(resp.msg).show();
  692. var data = resp.msg;
  693.  
  694. CharacterWindow.progressCrafting.setValue(data.profession_skill);
  695. Character.setProfessionSkill(data.profession_skill);
  696. CharacterWindow.window.$('#recipe' + recipe_id)
  697. .removeClass('middle hard easy')
  698. .addClass(Crafting.getRecipeColor(ItemManager.get(recipe_id)));
  699.  
  700. EventHandler.signal("inventory_changed");
  701. Character.updateDailyTask('crafts', data.count);
  702. return new MessageSuccess(data.msg).show();
  703. });
  704. },
  705. addCss: function() {
  706. var css = '';
  707. css += '#crafting_recipe_list { height:250px; top:43px;position:relative}';
  708. css += '.recipe_title { background:none; cursor:pointer}';
  709. css += '.recipe_title_inner { margin-top:2px;}';
  710.  
  711. css += '.easy { background:none; color:rgb(40,40,40);}';
  712. css += '.easy .recipe_title:hover { background:rgba(55, 55, 55, 0.75); color:white;}';
  713. css += '.easy.selected .recipe_title { background:rgba(55, 55, 55, 0.75); color:white;}';
  714.  
  715. css += '.middle { background:none; color:rgb(0, 179, 3);}';
  716. css += '.middle .recipe_title:hover { background:rgba(0, 118, 6, 0.75); color:white;}';
  717. css += '.middle.selected .recipe_title { background:rgba(0, 118, 6, 0.75); color:white;}';
  718.  
  719. css += '.hard { background:none; color:rgb(255, 88, 0);}';
  720. css += '.hard .recipe_title:hover { background:rgba(221, 92, 0, 0.75); color:white;}';
  721. css += '.hard.selected .recipe_title { background:rgba(221, 92, 0, 0.75); color:white;}';
  722.  
  723. css += '.recipe_name {color:inherit;margin-top:0px;}';
  724. css += '.recipe_collapse {color:inherit;font-size:inherit;}';
  725. css += '.not_available .recipe_collapse {visibility:hidden;}';
  726. css += '.recipe_craft {color:rgb(236, 25, 25);}';
  727. css += '#crafting_requirements_display { position: relative; top: 43px; left: 61px;}';
  728. css += '#crafting_requirements_display .tw2gui_button {position:absolute; left:2px; bottom:-19px;}';
  729.  
  730. $('body').append('<style>' + css + '</style>');
  731. }
  732.  
  733.  
  734.  
  735. };
  736.  
  737.  
  738.  
  739.  
  740.  
  741.  
  742.  
  743.  
  744. SlySuite.init();
  745. });

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址