Greasy Fork 支持简体中文。

掌心纵横四海-任务通用

现在还不能做商店买东西的任务,同时有时候打怪如果怪物在后面位置可能会重复打前面的怪

  1. // ==UserScript==
  2. // @name 掌心纵横四海-任务通用
  3. // @namespace http://fybgame.top/
  4. // @version 1.0.0
  5. // @description 现在还不能做商店买东西的任务,同时有时候打怪如果怪物在后面位置可能会重复打前面的怪
  6. // @author fyb
  7. // @match http://wwvv.anxiusuo.com/wap/*
  8. // @grant none
  9. // @license MIT
  10. // ==/UserScript==
  11. (function() {
  12. 'use strict';
  13.  
  14. // 定义常量
  15. const CONSTANTS = {
  16. BASE_URL: 'http://wwvv.anxiusuo.com/wap/',
  17. URLS: {
  18. CK: '?ck',
  19. MAP: '?map',
  20. TASK: '?task',
  21. PK: '?pk',
  22. NPC: '?npc',
  23. TASK_ID: '?task_id',
  24. TASK_SUBMIT: '?task_id_submit_into',
  25. NPC_GET: '?npc_get_into',
  26. TASK_GET: '?task_get_into'
  27. },
  28. SELECTORS: {
  29. WAP_CLASS: 'wap_class',
  30. TASK_COMPLETE_TEXT: '完成任务'
  31. }
  32. };
  33.  
  34. // 工具函数
  35. function generateRandomDelay(min, max) {
  36. min = Math.ceil(min * 10);
  37. max = Math.floor(max * 10);
  38. const result = (Math.floor(Math.random() * (max - min + 1)) + min) / 10;
  39. return parseFloat(result.toFixed(1));
  40. }
  41.  
  42. function removeChinese(str) {
  43. return str.replace(/[\u4E00-\u9FA5]/g, '');
  44. }
  45.  
  46. function clickElement(element) {
  47. if (element) {
  48. element.click();
  49. return true;
  50. }
  51. return false;
  52. }
  53.  
  54. // 核心功能
  55. function attack() {
  56. const firstLink = document.getElementsByTagName('a')[0];
  57. clickElement(firstLink);
  58. }
  59.  
  60. function checkTaskCompletion() {
  61. const wapClass = document.getElementById(CONSTANTS.SELECTORS.WAP_CLASS);
  62. if (!wapClass || !wapClass.textContent.includes(CONSTANTS.SELECTORS.TASK_COMPLETE_TEXT)) {
  63. return false;
  64. }
  65.  
  66. const [current, total] = wapClass.textContent
  67. .split('(')[1]
  68. .split(')')[0]
  69. .split('/')
  70. .map(num => parseInt(removeChinese(num)));
  71.  
  72. if (current >= total) {
  73. window.localStorage.setItem('task', '1');
  74. return true;
  75. }
  76. return false;
  77. }
  78.  
  79. // 页面处理函数
  80. function handleMainPage() {
  81. const links = document.getElementsByTagName('a');
  82. const urlPatterns = [
  83. { pattern: CONSTANTS.URLS.TASK, condition: () => true },
  84. { pattern: CONSTANTS.URLS.PK, condition: () => true },
  85. { pattern: CONSTANTS.URLS.NPC, condition: (link) => link.previousElementSibling.tagName === 'IMG' },
  86. { pattern: CONSTANTS.URLS.MAP, condition: () => true }
  87. ];
  88.  
  89. for (let i = 0; i < links.length; i++) {
  90. const link = links[i];
  91.  
  92. if (window.localStorage.getItem('task') === '1' && link.innerHTML === '任务') {
  93. clickElement(link);
  94. break;
  95. }
  96.  
  97. for (const { pattern, condition } of urlPatterns) {
  98. if (link.href.includes(CONSTANTS.BASE_URL + pattern) && condition(link)) {
  99. clickElement(link);
  100. return;
  101. }
  102. }
  103. }
  104. }
  105.  
  106. function handleTaskPage() {
  107. const links = document.getElementsByTagName('a');
  108. for (let i = 0; i < links.length; i++) {
  109. if (links[i].href.includes(CONSTANTS.BASE_URL + CONSTANTS.URLS.TASK_ID)) {
  110. clickElement(links[i]);
  111. window.localStorage.setItem('task', '0');
  112. break;
  113. }
  114. }
  115. }
  116.  
  117. function handlePKPage() {
  118. checkTaskCompletion();
  119. setInterval(attack, generateRandomDelay(800, 1000));
  120. }
  121.  
  122. function handleNPCPage() {
  123. const links = document.getElementsByTagName('a');
  124. for (let i = 0; i < links.length; i++) {
  125. if (['IMG', 'FONT'].includes(links[i].previousElementSibling?.tagName)) {
  126. clickElement(links[i]);
  127. }
  128. }
  129. }
  130.  
  131. function handleTaskGetPage() {
  132. const links = document.getElementsByTagName('a');
  133.  
  134. // 特殊情况处理
  135. if (links.length === 4 && !links[0].childNodes[0].className.includes('todaguai')) {
  136. for (let i = 0; i < links.length; i++) {
  137. if (links[i].href.includes(CONSTANTS.BASE_URL + CONSTANTS.URLS.TASK_SUBMIT)) {
  138. clickElement(links[i]);
  139. return;
  140. }
  141. }
  142. }
  143.  
  144. // 常规情况处理
  145. for (let i = 0; i < links.length; i++) {
  146. if (links[i].childNodes[0].style.display !== 'none' &&
  147. links[i].innerHTML.includes('引路蜂')) {
  148. clickElement(links[i]);
  149. break;
  150. }
  151. }
  152. }
  153.  
  154. // 主要处理逻辑
  155. function handleCurrentPage() {
  156. const currentUrl = window.location.href;
  157.  
  158. if (currentUrl.includes(CONSTANTS.BASE_URL + CONSTANTS.URLS.CK) ||
  159. currentUrl.includes(CONSTANTS.BASE_URL + CONSTANTS.URLS.MAP)) {
  160. handleMainPage();
  161. } if (currentUrl.includes(CONSTANTS.BASE_URL + CONSTANTS.URLS.TASK)) {
  162. handleTaskPage();
  163. } if (currentUrl.includes(CONSTANTS.BASE_URL + CONSTANTS.URLS.PK)) {
  164. handlePKPage();
  165. } if (currentUrl.includes(CONSTANTS.BASE_URL + CONSTANTS.URLS.TASK_SUBMIT)) {
  166. clickElement(document.getElementsByTagName('a')[0]);
  167. } if (currentUrl.includes(CONSTANTS.BASE_URL + CONSTANTS.URLS.NPC_GET)) {
  168. handleNPCPage();
  169. } if (currentUrl.includes(CONSTANTS.BASE_URL + CONSTANTS.URLS.TASK_GET)) {
  170. handleTaskGetPage();
  171. }
  172. }
  173.  
  174. // 初始化执行
  175. handleCurrentPage();
  176. })();