The West - Item Set Manager

Manage your sets like a boss!

目前为 2015-03-15 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @namespace https://greasyfork.org/users/8637
  3. // @name The West - Item Set Manager
  4. // @author neversleep1911
  5. // @description Manage your sets like a boss!
  6. // @include http://*.the-west.*/game.php*
  7. // @include https://*.the-west.*/game.php*
  8. // @grant none
  9. // @version 1.0
  10. // @copyright Copyright (c) 2015 neversleep1911
  11. // @license MIT (http://opensource.org/licenses/MIT)
  12. // ==/UserScript==
  13.  
  14. (function(func) {
  15. var script;
  16. script = document.createElement("script");
  17. script.setAttribute("type", "text/javascript");
  18. script.textContent = "(" + func.toString() + ")();";
  19. document.body.appendChild(script);
  20. document.body.removeChild(script);
  21. })(function() {
  22. var Gui, I18n, ItemSetManager, ItemSetWindow, Recent;
  23. I18n = function() {
  24. var DEFAULT_LANGUAGE, STRINGS, language;
  25. function I18n() {}
  26. DEFAULT_LANGUAGE = "en_US";
  27. STRINGS = {
  28. en_US: {
  29. item_set_window: {
  30. title: "Items"
  31. },
  32. messages: {
  33. bag_is_not_loaded: "Bag is not loaded!"
  34. }
  35. },
  36. ru_RU: {
  37. item_set_window: {
  38. title: "Предметы"
  39. },
  40. messages: {
  41. bag_is_not_loaded: "Инвентарь не загружен!"
  42. }
  43. }
  44. };
  45. language = DEFAULT_LANGUAGE;
  46. I18n.language = function() {
  47. return language;
  48. };
  49. I18n.setLanguage = function(lang) {
  50. return language = STRINGS[lang] ? lang : DEFAULT_LANGUAGE;
  51. };
  52. I18n.tr = function(id) {
  53. var prop, properties, string, _i, _len;
  54. string = STRINGS[language];
  55. properties = id.split(".");
  56. for (_i = 0, _len = properties.length; _i < _len; _i++) {
  57. prop = properties[_i];
  58. if ((string = string[prop]) === void 0) {
  59. break;
  60. }
  61. }
  62. return string || id;
  63. };
  64. return I18n;
  65. }();
  66. Gui = function() {
  67. function Gui() {}
  68. Gui.createMenuButton = function(options) {
  69. var button;
  70. if (options == null) {
  71. options = {};
  72. }
  73. button = $("<div class='menulink' title='" + options.title + "' />");
  74. if (options.image) {
  75. button.css("background-image", "url(" + options.image + ")");
  76. }
  77. button.hover(function() {
  78. $(this).css("background-position", "-25px 0px");
  79. return true;
  80. }, function() {
  81. $(this).css("background-position", "0px 0px");
  82. return true;
  83. }).on("click", options.onclick);
  84. $("div#ui_menubar").append($('<div class="ui_menucontainer" />').append(button).append('<div class="menucontainer_bottom" />'));
  85. return button;
  86. };
  87. Gui.createSelectbox = function(options) {
  88. var menu;
  89. if (options == null) {
  90. options = {};
  91. }
  92. menu = new west.gui.Selectbox();
  93. if (options.header) {
  94. menu.setHeader(options.header);
  95. }
  96. menu.setWidth(options.width || 175);
  97. if (options.height) {
  98. menu.setHeight(options.height);
  99. }
  100. if (options.onclick) {
  101. menu.addListener(options.onclick);
  102. }
  103. menu.elContent.css("overflow-y", "scroll");
  104. return menu;
  105. };
  106. return Gui;
  107. }();
  108. Recent = function() {
  109. function Recent() {}
  110. Recent.LSK_RECENT = "7d04d85e-cbc4-4d6f-acdc-7ccadcb24534";
  111. Recent.MAX_SIZE = 10;
  112. Recent.load = function() {
  113. return this.list = (localStorage.getItem(this.LSK_RECENT) || "").split(",");
  114. };
  115. Recent.push = function(value) {
  116. var i;
  117. i = this.list.indexOf(value);
  118. if (i !== -1) {
  119. this.list.splice(i, 1);
  120. }
  121. if (this.list.push(value) > this.MAX_SIZE) {
  122. this.list.shift();
  123. }
  124. localStorage.setItem(this.LSK_RECENT, this.list.join(","));
  125. return this.list.length;
  126. };
  127. return Recent;
  128. }();
  129. ItemSetManager = function() {
  130. ItemSetManager.prototype.ID = "tw_item_set_manager";
  131. ItemSetManager.prototype.NAME = "Item Set Manager";
  132. ItemSetManager.prototype.MENU_BUTTON_IMAGE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAZCAYAAABzVH1EAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QMfCxs7OcZVFwAADBZJREFUWMOd1cmP5sdZwPFvVf325d36fXud7pmensXjzObIjhMvMnHCGQ4gAQekiDM3BCdELkj5B+CCZIIESIgICRGyOAmOA5Zx7Iy3mfEsTM/0vr39vv2uv72KwzjmgBDjlFSHeh6pPqrSU0+JP/39a2Zvt0tr9hnubD3AjCbEfkTuTQmrGL+WkpSCRtRklGX0Byf4VcnQ1jSxoDTUwwaHJxM2Dnp08xQsRTuqUSUZCw2fq5da7O2mtOcXeLi1Sz6dUGu0GI81UVNj+aBTj0YcMJ1qxicDtJNSFgLtVUSFhROEHHcHHJyMOJ4WSFcSKRfLVHRqLuLPfusZc/ELz/DH3/o2e5VGlIAlKbVBGRtjbLRIsUxFhcRIg6MVuZC4JiBXJ0gURldoI/Etj6JMWKzBn/zRH3B442coL+D0ua/wwe2bHGZjjICqzHFFDAxJUwvb9am8MWUmsYygtDLcrIn2KqjGCCPRWlJRYds2SuQ03JgvXv4CD2+8hVpbqH3zBz96l/V+hhc5hIGPLyRBYGi4AZ6T0Ky71DCEnkU7dgktie0J/KDEd2zqUYAQFZawURIsDJPUUOY5v/nqZd69ucG//PQdJjJH+RbGFThG4yiLTORYtqbmOOTVhFhJWjUPI8CTIF2N74VgoMgSpPDA2ORZRZqWHB2M+doLZ7FA0J0MqRxFZMCXBcayiGox7fkW7dZTnFpt8ZOfrXPx4hquazOZJHRaEscyjHoJJ/0eG/snFCeCbtLDtQVVZfPerZvcefUaqtliLCc8PVPn+PgYS3goXyJr0AkazC8u4gUur33nBhcvnGYibJIy5enzEfXIQWmHg52HDByHOPQ5Pu5yIXI4Go+5s7fD/ewS6vkXnv/mD99dZ6EZkeRTFhoRM/M1WjMB5y+u0B9O2NovuH79MlEc8eyz11k7v4bWNv/4nR8zzQqeuX6W04st4hgi16Ze2YRCMh4YVtfqLM0v8eHtdWZqHtKxqKqMEoFyDK35Dvc3jvjF7R7Xrl8m/NQ4e36N4cTwV3/9XfaOejz7/CXiekR/cEKaFfRGOdMEwihEl1PkzCkP29LYdsZsGDIqJXlVcWr1DK+/eYe33rnH17/+ClevPc3P33mPy1cuMRoMef2Hb6Asyd5Bn3/+wQdMCghadaJajUbLkJkJs7NtvONd+nvbeFqAFthG4bsB58+f4cqVy/zT9z7m+z/+iK/9X4YSrG8c8ZevvcFRf8z5c6dZXlogjiMi5aOq+8zGPeTw1l3ajs18FFCPKs4vz/HMxXM04wClbIIwIElSWq0my8unOD7uMRqNOTw8ZDSeYjs2Sine/s+7zLVqnF1sYAcl7ZkKyyr56vNXEekUaWUkvT3GR4eEuiI/6XPSPUYb8USGlJIf/eQ2VVpSDx1aUUaYHsI44MLyF5GBKYiVQpU5c2FFqx4QxiHjSUpRlHiex/b2LufWVtnc3GJxcZ6/+fbfo5Qi8H0whjwvGU5TsrRgdT5mtTNPqCN8r8FhtkujGTJOFWEYcmppkc7SPKdWlimRFEX1xEZ/nJKVFY16ncBzmWn5zMRNjvYPkPHcHIUsiEMP6dWwq5S5mRglFUVRIiXs7x+R5Rl5VvCv330dx7GYTBJ836WqDFqXVKUhyyrs0KEqBK12i7l4SG//LCemidAJXjUmkimkfXxSsqz8nIYmSxN8F2LPwm4HYBsKNLIKWhjbRsiU0A9RVkmvu89Hn2xQliVaG7pHXfb3DqnXa7z55lsIofB9D2MMZVmS5yW2Y1EWU1y/ztxiB8dRZNOM/uRDWrNghxXx/Bq5CqjsiEHl8/7t3c9tDMclWlpo2URXMTorIM+RlU6JbEXo2Ejl05pv0llosLHdxxhNVVUMTgZsbG6jLMXuzj5JkuI4FnlekKY5tmPjOjb7hyM8t6LZCEimU3onQ1bOXGFwdEw+FYhxF0+nNBxDM5Q82Dz+3MbWbg9R5rgOFPmE7sEBjlBY5ajLODWMhoJ2w4CSjJIKIQVCKLIsJxcF3//ev7G1tU2RF3ieQ56XZFmBEDyOuQ573QlG2NhxwPLqKqV2CWUTWTbo9w07BxPacx6WthkfDH8l4+F2n+39AYGyEL7iqatXWDqzgmyGMcNpRi+v2NvrYcmQW/91hG0/vo2yrBBCcO/uPfK8wLKsT2v28awqQ1lWSCHY6465u36I5QW0Wx3SAhzZ52LDQUtFbwB7RzmDKXyy2f+VjIOTKYe9nEp4KLvJ3jCjlxTIaW9EUUl8PyLuLJCUDvceHqONQQpQSn5Wp0pKADAaKQSWpVBKgIA0y7EtxY1bWwxGKfd393jv7kMebhzz0d1PMKZChzVqi4uErSUe7g7RxqCkeDKD/zHu75xQuT7D0uWNt+/yyaM95MOdIxJT4tR94ihknKaMpxmTccKzV1dRlsSyLKSUOI6DbVvYjo1lW59BLz13kbIs8VyXR9s9tg+GaKkoteD9m9tMkpRRXtFYcrDCku5kn8FowmSc8MqLl57IePXlpz8zNnaOyE2CcDRpYbF/NEKevrJCaTRlWhD68IubD7GUwlYwN9fEaBACpJSAwRgwxmB+mUAQejbKkiAMaZaR5Dkra2tUAi481+LCq89SYSjH0KzP8N4Hm1hKYSmoR7UnMgLXwbIUCEOWFZhc02nXqdc9lhdWkUHYoO3WmG/FLJ1uUVQwTVKeu7aCEhVVpYHH+2ltAAMCQKC1RgqIQpfAdR7nEJRpTmCVLAQxK3Mu052ETsPh+uU5luc8KiOYJikvP3cOz9FPZLRqPoHn8MthjKYzExIpycJcE7lxa4Ozix7zizGyUGR5SaPmsbbY4cLqKYwxwGMgCPzHayMwxiAEGASj5PGDNUbguTYL8y380GE8HPLB+hGPHq1zdrlDzY+phEuaFbSbIWunF7l2ceWJjCTTFGWFMeB5Dq7j41uK3Bpxc/19ZFCz2e0O2RqUbHeHKCmJIw/bd+gn2aenByEEWZYhpQL0Z/GyLJkkGQZBVVbYlsDzLfKsojUTczIoWDlzlp9/fMitBz3Wt/sopYijANsN6E/NExkn4wRjoCorLAUlklQ7zDVmGHUHWGvzDZzCELguF8/N4UUxSZazvNSmNArbUmitMeZxKxTCABKtq8fli8BUGsuyKCtNZ6aGFBrHcrh86Spta0A7NqyGirllycpKh9mFgH4/YelUgO+52Pb/b5Rl9pkx26kzM2MjnJIvP32RKJLIncwjqEc4lWQyhZYLV8+0MVWJr+Abv/0SKwsNosDBGE1RVJRliTEaJSUXVjtEnsSyJLXIZrYZkSQFD+7vsbW/jes7POzbWIFCGMHeziGzjYCnzrYxVY7WBd/4nRdZOdUkjtz/bSjJxXOzgEEpSRQo5ucanPT63Lr9gLuPPuagv4l44fKauXFnnWYj5vRSG1UW1Js1KqNpNmvU6wG1Zp3j3pCyMnS7fUotEAIC3yEKfOo1j8k0p6oMzbpPKwh46+33eHBvk9NLLso0+Om9A86f6aDLklo9wvMcHM8h8B1a7Tq+65IVJWlRMR2ljJMUYcD3HSxLsjDfotsbo40hDlyenp3lk1u3+I93PmRlZQbrN14+w6B/xG4vYzzoEzqG4+4YW1nobESVxBRlSqMe4gceZ5YbSGkwlcFIAxqMEdRjizwvkSj2D0fs7/dpz7usnprllUvXyc37/PudLRpRjeNRHyMMugLXs+m0mywttanVQhzXYXYhpK012jxuvcZoslLj+x5ZXnDQHXKm1uHm+iMurJ7D8QziH/7wK+bI1PnW375Od2pzdiZgpHPqvo9JNFbdRgiPVqwIAhelbJTjYKQNaUJWlFiuw7RMybOE3W6C7E+ZnVO8+GvXGN+6wZe/dAntXeUvXvs7NjND3fFw/SG+iZCmIqh1sMSEoXJYmYmpjMKqNwiKilKknBzliMgjjiw2NrvYZcaHWwPWrszwe0+12NnZQPz5737J1KTk7sEBe+OSpfk5eqOMvf6E8WQC+YRmp40vNDUgssFxFbXAJWgqPAcmqcFvzTHt9ugOR2hzzK+/tIZTnfDBoybF2KJuwaOTgs2jfRYXl5jkhp3DHoOiJBv2aHk+djOiNRbM1S0mKmEh9LFCRa2hEJ/+UtI6xUl3A/twwOqLNapoho3Nbf4b5k7HDMnw+8AAAAAASUVORK5CYII=";
  133. function ItemSetManager() {
  134. var self;
  135. self = this;
  136. TheWestApi.register(this.ID, this.NAME, "2.2", Game.version.toString(), "neversleep1911", "https://greasyfork.org/scripts/8596").setGui("Copyrights, changelog and other details see <a href='https://greasyfork.org/scripts/8596' target='_blank'>here</a>.");
  137. I18n.setLanguage(Game.locale);
  138. Recent.load();
  139. Gui.createMenuButton({
  140. title: this.NAME,
  141. image: this.MENU_BUTTON_IMAGE,
  142. onclick: function(e) {
  143. self.onMenuButtonClick(e);
  144. e.preventDefault();
  145. return false;
  146. }
  147. });
  148. this.menu = Gui.createSelectbox({
  149. height: 500,
  150. onclick: function(value) {
  151. self.onMenuItemClick(value);
  152. return true;
  153. }
  154. });
  155. this.buildMenu();
  156. }
  157. ItemSetManager.prototype.onMenuButtonClick = function(e) {
  158. var offset;
  159. offset = $(e.target).offset();
  160. offset.left -= $(e.target).width();
  161. this.menu.show();
  162. this.menu.setPosition(offset.left, offset.top);
  163. return this;
  164. };
  165. ItemSetManager.prototype.onMenuItemClick = function(setId) {
  166. var bagItem, bagItems, css, invWasClosed, invWnd, itemId, self, set, wearWndDiv, _i, _len, _ref;
  167. self = this;
  168. set = west.storage.ItemSetManager.get(setId);
  169. bagItems = [];
  170. _ref = set.items;
  171. for (_i = 0, _len = _ref.length; _i < _len; _i++) {
  172. itemId = _ref[_i];
  173. bagItem = Bag.getItemByItemId(itemId);
  174. if (bagItem) {
  175. bagItems.push(bagItem);
  176. }
  177. }
  178. if (Bag.loaded) {
  179. invWasClosed = wman.getById(Inventory.uid) ? false : true;
  180. if (wman.getById(Wear.uid)) {
  181. if (wman.isMinimized(Wear.uid)) {
  182. wman.reopen(Wear.uid);
  183. }
  184. } else {
  185. Wear.open();
  186. }
  187. if (invWasClosed) {
  188. invWnd = wman.getById(Inventory.uid);
  189. if (invWnd) {
  190. invWnd.fireEvent(TWE("WINDOW_CLOSE"), invWnd);
  191. }
  192. }
  193. if (ItemSetWindow.wnd) {
  194. if (wman.isMinimized(ItemSetWindow.uid)) {
  195. wman.reopen(ItemSetWindow.uid);
  196. }
  197. ItemSetWindow.wnd.bringToTop();
  198. } else {
  199. wearWndDiv = $(wman.getById(Wear.uid).getMainDiv());
  200. css = wearWndDiv.offset();
  201. css.left += wearWndDiv.width();
  202. css.width = 304;
  203. css.height = wearWndDiv.height();
  204. ItemSetWindow.open({
  205. css: css
  206. });
  207. }
  208. ItemSetWindow.setItemSet(set);
  209. setTimeout(function() {
  210. Recent.push(setId);
  211. self.buildMenu();
  212. }, 200);
  213. } else {
  214. new UserMessage(I18n.tr("messages.bag_is_not_loaded"), UserMessage.TYPE_ERROR).show();
  215. }
  216. return this;
  217. };
  218. ItemSetManager.prototype.buildMenu = function() {
  219. var i, img, item, menuItem, set, setId, sets, text, _i, _j, _k, _len, _len1, _len2, _ref;
  220. sets = west.storage.ItemSetManager.getAll().slice(0).reverse();
  221. if (Recent.list.length > 0) {
  222. _ref = Recent.list;
  223. for (_i = 0, _len = _ref.length; _i < _len; _i++) {
  224. setId = _ref[_i];
  225. for (i = _j = 0, _len1 = sets.length; _j < _len1; i = ++_j) {
  226. set = sets[i];
  227. if (setId === set.key) {
  228. sets.splice(i, 1);
  229. sets.unshift(set);
  230. break;
  231. }
  232. }
  233. }
  234. }
  235. this.menu.removeAll();
  236. for (_k = 0, _len2 = sets.length; _k < _len2; _k++) {
  237. set = sets[_k];
  238. item = ItemManager.get(set.items[0]);
  239. img = $("<img />");
  240. img.attr("src", item.image);
  241. img.css({
  242. position: "absolute",
  243. width: 18,
  244. height: 18,
  245. left: 4
  246. });
  247. text = $("<span>" + set.name + "</span>");
  248. text.css("padding-left", 16);
  249. menuItem = $("<div />");
  250. menuItem.css({
  251. overflow: "hidden",
  252. "text-overflow": "ellipsis",
  253. "white-space": "nowrap"
  254. });
  255. menuItem.append(img);
  256. menuItem.append(text);
  257. this.menu.addItem(set.key, menuItem, set.name);
  258. }
  259. return this;
  260. };
  261. return ItemSetManager;
  262. }();
  263. ItemSetWindow = function() {
  264. function ItemSetWindow() {}
  265. ItemSetWindow.uid = "item-set-window";
  266. ItemSetWindow.open = function(options) {
  267. if (options == null) {
  268. options = {};
  269. }
  270. if (!this.wnd) {
  271. this.wnd = wman.open(this.uid, null, "noreload");
  272. this.wnd.setTitle(I18n.tr("item_set_window.title"));
  273. this.wnd.addEventListener("WINDOW_DESTROY", function() {
  274. delete ItemSetWindow.wnd;
  275. });
  276. if (options.css) {
  277. $(this.wnd.getMainDiv()).css(options.css);
  278. }
  279. this.listenWearChagned();
  280. }
  281. return this;
  282. };
  283. ItemSetWindow.setItemSet = function(set) {
  284. var bagItem, invItem, invItemDiv, item, itemCount, itemId, timer, _i, _len, _ref;
  285. if (!ItemSetWindow.wnd) {
  286. return false;
  287. }
  288. this.set = set;
  289. timer = 0;
  290. ItemSetWindow.wnd.setMiniTitle(set.name);
  291. $(ItemSetWindow.wnd.getContentPane()).empty();
  292. _ref = set.items;
  293. for (_i = 0, _len = _ref.length; _i < _len; _i++) {
  294. itemId = _ref[_i];
  295. item = ItemManager.get(itemId);
  296. invItem = new tw2widget.InventoryItem(item);
  297. invItemDiv = $(invItem.getMainDiv());
  298. bagItem = Bag.getItemByItemId(itemId);
  299. itemCount = bagItem ? bagItem.getCount() : 0;
  300. invItemDiv.css({
  301. border: "1px solid transparent",
  302. "border-radius": 4
  303. });
  304. if (Wear.carries(itemId)) {
  305. ++itemCount;
  306. invItemDiv.css("border-color", "black");
  307. } else {
  308. if (bagItem) {
  309. (function(bagItem, invItemDiv) {
  310. invItemDiv.on("click", function(e) {
  311. if (!e.shiftKey) {
  312. if (timer) {
  313. clearTimeout(timer);
  314. }
  315. invItemDiv.off("click");
  316. invItemDiv.css("opacity", .5);
  317. ItemSetWindow.unlistenWearChagned();
  318. Wear.carry(bagItem);
  319. timer = setTimeout(function() {
  320. ItemSetWindow.setItemSet(set);
  321. ItemSetWindow.listenWearChagned();
  322. timer = 0;
  323. }, 1e3);
  324. }
  325. return true;
  326. });
  327. })(bagItem, invItemDiv);
  328. } else {
  329. invItemDiv.css("opacity", .5);
  330. }
  331. }
  332. invItem.setCount(itemCount);
  333. ItemSetWindow.wnd.appendToContentPane(invItem.getMainDiv());
  334. }
  335. return this;
  336. };
  337. ItemSetWindow.listenWearChagned = function() {
  338. if (!this.listening) {
  339. EventHandler.listen("wear_changed", this.wearChangedHandler, this);
  340. this.listening = true;
  341. }
  342. return this.listening;
  343. };
  344. ItemSetWindow.unlistenWearChagned = function() {
  345. if (this.listening) {
  346. EventHandler.unlisten("wear_changed", this.wearChangedHandler, this);
  347. this.listening = false;
  348. }
  349. return this.listening;
  350. };
  351. ItemSetWindow.wearChangedHandler = function() {
  352. if (ItemSetWindow.set) {
  353. ItemSetWindow.setItemSet(ItemSetWindow.set);
  354. }
  355. };
  356. return ItemSetWindow;
  357. }();
  358. $(document).ready(function() {
  359. EventHandler.listen("itemmanager_loaded", function() {
  360. new ItemSetManager();
  361. return EventHandler.ONE_TIME_EVENT;
  362. });
  363. return true;
  364. });
  365. });