The West - Player Checker

With this script you can easy check status of players

当前为 2015-06-25 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name The West - Player Checker
  3. // @description With this script you can easy check status of players
  4. // @author neversleep1911
  5. // @namespace https://greasyfork.org/users/8637
  6. // @include http://*.the-west.*/game.php*
  7. // @include https://*.the-west.*/game.php*
  8. // @version 2.0.2
  9. // @grant none
  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. return true;
  22. })(function() {
  23. $(document).ready(function() {
  24. var I18n = function() {
  25. var DEFAULT_LANGUAGE, STRINGS, language;
  26. function I18n() {}
  27. DEFAULT_LANGUAGE = "en_US";
  28. STRINGS = {
  29. de_DE: {
  30. buttons: {
  31. check: "Prüfen",
  32. save: "Speichern",
  33. },
  34. messages: {
  35. empty_players: 'Spielernamen eingeben',
  36. players_saved: 'Liste gespeichert!'
  37. },
  38. status: {
  39. checking: 'Lädt...',
  40. player_not_found: 'Spieler nicht gefunden',
  41. homeless_player: 'Stadtlos',
  42. player_not_sleeping: 'Schäft nicht'
  43. }
  44. },
  45. en_US: {
  46. buttons: {
  47. check: "Check",
  48. save: "Save",
  49. },
  50. messages: {
  51. empty_players: 'Enter a list of players',
  52. players_saved: 'Player list successfully saved!'
  53. },
  54. status: {
  55. checking: 'Checking...',
  56. player_not_found: 'Player not found',
  57. homeless_player: 'Homeless player',
  58. player_not_sleeping: 'Not sleeping'
  59. }
  60. },
  61. ru_RU: {
  62. buttons: {
  63. check: "Проверить",
  64. save: "Сохранить",
  65. },
  66. messages: {
  67. empty_players: 'Введите список игроков с новой строки',
  68. players_saved: 'Список игроков сохранён!'
  69. },
  70. status: {
  71. checking: 'Проверка...',
  72. player_not_found: 'Игрок не найден',
  73. homeless_player: 'Игрок без города',
  74. player_not_sleeping: 'Не спит'
  75. }
  76. },
  77. };
  78. language = DEFAULT_LANGUAGE;
  79. I18n.language = function() {
  80. return language;
  81. };
  82. I18n.setLanguage = function(lang) {
  83. return language = STRINGS[lang] ? lang : DEFAULT_LANGUAGE;
  84. };
  85. I18n.tr = function(id) {
  86. var string;
  87. string = STRINGS[language];
  88. $(id.split(".")).each(function(k, v) {
  89. return (string = string[v]) !== void 0;
  90. });
  91. return string || id;
  92. };
  93. return I18n;
  94. }();
  95. I18n.setLanguage(Game.locale);
  96. var PlayerChecker = {
  97. PlayerState: {
  98. Player_NotFound: -1,
  99. Player_Nomeless: -2
  100. }
  101. };
  102. PlayerChecker.check = function(players, before, after) {
  103. var result = [], ranking = [], currentPlayer = 0, saloonCache = [], nextPlayer, checkPlayer, nextSaloon, checkSaloon;
  104. nextPlayer = function() {
  105. if (++currentPlayer < players.length) checkPlayer(); else {
  106. currentPlayer = 0;
  107. checkSaloon();
  108. }
  109. };
  110. checkPlayer = function() {
  111. var player = players[currentPlayer].trim();
  112. Ajax.remoteCallMode("ranking", "get_data", {
  113. rank: NaN,
  114. search: player,
  115. tab: "experience"
  116. }, function(json) {
  117. var found = false;
  118. for (var j = 0; j < json.ranking.length; j++) {
  119. if (json.ranking[j].name.toLowerCase() == player.toLowerCase()) {
  120. ranking.push(json.ranking[j]);
  121. found = true;
  122. break;
  123. }
  124. }
  125. if (!found) {
  126. ranking.push(PlayerChecker.PlayerState.Player_NotFound);
  127. }
  128. nextPlayer();
  129. });
  130. };
  131. nextSaloon = function() {
  132. if (++currentPlayer < ranking.length) checkSaloon(); else after(result);
  133. };
  134. checkSaloon = function() {
  135. var player = ranking[currentPlayer];
  136. if (player == PlayerChecker.PlayerState.Player_NotFound) {
  137. result.push(PlayerChecker.PlayerState.Player_NotFound);
  138. nextSaloon();
  139. return;
  140. }
  141. if (player.town_id == null) {
  142. result.push(PlayerChecker.PlayerState.Player_Nomeless);
  143. nextSaloon();
  144. return;
  145. }
  146. var findPlayer = function(saloon, id) {
  147. for (var i = 0; i < saloon.players.length; i++) {
  148. if (saloon.players[i].player_id == id) return saloon.players[i];
  149. }
  150. return null;
  151. };
  152. for (var i = 0; i < saloonCache.length; i++) {
  153. if (saloonCache[i].town_id == player.town_id) {
  154. player = findPlayer(saloonCache[i].saloon, player.player_id);
  155. if (player) result.push(player);
  156. nextSaloon();
  157. return;
  158. }
  159. }
  160. Ajax.remoteCallMode("building_saloon", "get_data", {
  161. town_id: player.town_id
  162. }, function(json) {
  163. saloonCache.push({
  164. town_id: player.town_id,
  165. saloon: json
  166. });
  167. player = findPlayer(json, player.player_id);
  168. if (player) result.push(player);
  169. nextSaloon();
  170. });
  171. };
  172. before();
  173. checkPlayer();
  174. };
  175. PlayerChecker.showWindow = function() {
  176. var wnd = wman.open("tw-playerchecker-window", null, "noreload").setTitle("Player Checker").setMiniTitle("Player Checker").addEventListener("WINDOW_DESTROY", function() {});
  177. //var tablePlayers = new west.gui.Table().addColumns(['status', 'duel_level', 'distance']);
  178. //tablePlayers.setHeight(315).setWidth(450);
  179. //$(tablePlayers.getMainDiv()).css({position: 'absolute', width: 470, height: 335, left: 220, top: 0});
  180. var txtPlayers = new west.gui.Textarea(undefined);
  181. txtPlayers.setHeight(315).setWidth(200);
  182. try {
  183. txtPlayers.textarea.val(localStorage.getItem("players") || Character.name);
  184. } catch (e) {
  185. new UserMessage(e, UserMessage.TYPE_ERROR).show();
  186. }
  187. var txtLog = new west.gui.Textarea(undefined);
  188. txtLog.setReadonly().setHeight(315).setWidth(450);
  189. $(txtLog.getMainDiv()).css("position", "absolute").css("left", "220px");
  190. var button = new west.gui.Button(I18n.tr('buttons.check'), function() {
  191. var text = txtPlayers.textarea.val().trim();
  192. if (text == "") {
  193. new UserMessage(I18n.tr('messages.empty_players'), UserMessage.TYPE_HINT).show();
  194. return;
  195. }
  196. txtLog.textarea.val(I18n.tr('status.checking'));
  197. PlayerChecker.check(text.split("\n"), function() { wnd.showLoader(); }, function(players) {
  198. var tmp = SaloonWindow.self;
  199. if (SaloonWindow.self && SaloonWindow.self.confAfterDeath === undefined) {
  200. SaloonWindow.self.confAfterDeath = 48;
  201. }
  202. text = "";
  203. for (var i = 0; i < players.length; i++) {
  204. var player = players[i];
  205. if (player == PlayerChecker.PlayerState.Player_NotFound) {
  206. text += I18n.tr('status.player_not_found') + "\n";
  207. } else if (player == PlayerChecker.PlayerState.Player_Nomeless) {
  208. text += I18n.tr('status.homeless_player') + "\n";
  209. } else {
  210. text += SaloonWindow.playerStat(player).replace(/(<([^>]+)>)/gi, "");
  211. if (!(player.isSleeping || player.isSleepingFort)) {
  212. text += " | " + I18n.tr('status.player_not_sleeping');
  213. }
  214. text += " | " + player.duel_level + " | " + Character.calcWayTo(player.x, player.y).formatDuration() + "\n";
  215. }
  216. }
  217. txtLog.textarea.val(text);
  218. SaloonWindow.self = tmp;
  219. wnd.hideLoader();
  220. });
  221. });
  222. $(button.getMainDiv()).css("position", "absolute").css("left", "0").css("top", "342px");
  223. var buttonSave = new west.gui.Button(I18n.tr('buttons.save'), function() {
  224. try {
  225. var text = txtPlayers.textarea.val().trim();
  226. localStorage.setItem("players", text);
  227. new UserMessage(I18n.tr('messages.players_saved'), UserMessage.TYPE_SUCCESS).show();
  228. } catch (e) {
  229. new UserMessage(e, UserMessage.TYPE_ERROR).show();
  230. }
  231. });
  232. $(buttonSave.getMainDiv()).css("position", "absolute").css("left", 104).css("top", 342);
  233. wnd.appendToContentPane(txtPlayers.getMainDiv());
  234. //wnd.appendToContentPane(tablePlayers.getMainDiv());
  235. wnd.appendToContentPane(txtLog.getMainDiv());
  236. wnd.appendToContentPane(button.getMainDiv());
  237. wnd.appendToContentPane(buttonSave.getMainDiv());
  238. };
  239. var menuImage = 'data:image/png;base64,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';
  240. var menuButton = $("<div class='menulink' title='Player Checker' />");
  241. menuButton.css("background-image", "url(" + menuImage + ")");
  242. menuButton.hover(function() {
  243. $(this).css("background-position", "-25px 0px");
  244. return true;
  245. }, function() {
  246. $(this).css("background-position", "0px 0px");
  247. return true;
  248. }).on("click", function() {
  249. PlayerChecker.showWindow();
  250. return false;
  251. });
  252. $("div#ui_menubar").append($('<div class="ui_menucontainer" />').append(menuButton).append('<div class="menucontainer_bottom" />'));
  253. });
  254. });