您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Automatically clicks "Start Hunt" and "Battle Max" based on game conditions. Includes a GUI for toggling settings, viewing logs, and copying the log, with customizable cooldown and randomization to prevent bans.
// ==UserScript== // @name Idle MMO Battle Automation with GUI and Logs // @namespace https://web.idle-mmo.com/ // @version 1.3 // @description Automatically clicks "Start Hunt" and "Battle Max" based on game conditions. Includes a GUI for toggling settings, viewing logs, and copying the log, with customizable cooldown and randomization to prevent bans. // @author Unknown Monkey // @match https://web.idle-mmo.com/battle // @match https://web.idle-mmo.com/battle?same_window=true // @grant GM_addStyle // ==/UserScript== (function() { 'use strict'; // Settings let autoBattleEnabled = true; let cooldownMin = 2000; // Minimum cooldown (milliseconds) let cooldownMax = 5000; // Maximum cooldown (milliseconds) let randomizeCooldown = true; // Function to log messages to the GUI function logMessage(message) { const logArea = document.getElementById('logArea'); const timestamp = new Date().toLocaleTimeString(); logArea.value += `[${timestamp}] ${message}\n`; logArea.scrollTop = logArea.scrollHeight; // Auto-scroll to the bottom } // Function to click buttons by CSS selector with improved timing function clickButtonBySelector(selector) { const waitForButton = setInterval(() => { const button = document.querySelector(selector); if (button) { const isButtonDisabled = button.hasAttribute('disabled') || button.classList.contains('opacity-40'); logMessage(`Button found with selector: ${selector}`); logMessage(`Button disabled state: ${isButtonDisabled}`); if (!isButtonDisabled) { try { clearInterval(waitForButton); // Introduce a small random delay before clicking to simulate more human-like behavior setTimeout(() => { button.click(); logMessage(`Clicked button with selector: ${selector}`); // Log button action logMessage(`Button ${selector} action triggered.`); }, getRandomCooldown()); // Use a small random delay } catch (error) { logMessage(`Error clicking button with selector: ${selector} - ${error.message}`); } } else { logMessage(`Button with selector: ${selector} is disabled`); } } else { logMessage(`Button with selector: ${selector} not found`); } }, 1000); // Check every 1000ms } // Function to get the value of an element by CSS selector function getValueBySelector(selector) { const element = document.querySelector(selector); return element ? parseInt(element.textContent.trim(), 10) : null; } // Function to get a random cooldown value within the specified range function getRandomCooldown() { return Math.floor(Math.random() * (cooldownMax - cooldownMin + 1)) + cooldownMin; } // Automation logic (focuses on "Start Hunt", "Battle Max" and "Battle Max" button) function automateBattle() { if (!autoBattleEnabled) return; const battleMaxValueSelector = 'div.w-5'; // Adjust selector if necessary const startHuntSelector = 'button.bg-white\\/10:nth-child(1)'; const battleMaxButtonSelector = 'button.battle-max'; // Placeholder selector for "Battle Max" button setTimeout(() => { const battleMaxValue = getValueBySelector(battleMaxValueSelector); logMessage(`Battle Max Value: ${battleMaxValue}`); if (document.querySelector(startHuntSelector)) { logMessage(`Attempting to click "Start Hunt"`); clickButtonBySelector(startHuntSelector); } else if (battleMaxValue > 0 && document.querySelector(battleMaxButtonSelector)) { logMessage(`Attempting to click "Battle Max" button`); clickButtonBySelector(battleMaxButtonSelector); } else { logMessage(`"Start Hunt" button not found or Battle Max value is not greater than 0, or "Battle Max" button not found.`); } }, randomizeCooldown ? getRandomCooldown() : cooldownMin); } // Set up an interval for automation setInterval(automateBattle, randomizeCooldown ? getRandomCooldown() : cooldownMin); // GUI creation with a toggle button function createGUI() { // Create GUI container const gui = document.createElement('div'); gui.id = 'battle-automation-gui'; gui.innerHTML = ` <div> <h3>Battle Automation</h3> <label><input type="checkbox" id="toggleAutoBattle" checked> Auto Battle</label><br> <label for="cooldownMin">Cooldown Min (ms):</label> <input type="number" id="cooldownMin" value="${cooldownMin}" min="0"><br> <label for="cooldownMax">Cooldown Max (ms):</label> <input type="number" id="cooldownMax" value="${cooldownMax}" min="0"><br> <label><input type="checkbox" id="toggleRandomizeCooldown" checked> Randomize Cooldown</label><br> <textarea id="logArea" rows="10" cols="40" readonly></textarea><br> <button id="copyLogButton">Copy Log</button><br> </div> `; document.body.appendChild(gui); // Create Show/Hide GUI button const toggleGUIButton = document.createElement('button'); toggleGUIButton.id = 'toggleGUIButton'; toggleGUIButton.textContent = 'Hide GUI'; toggleGUIButton.style.position = 'fixed'; toggleGUIButton.style.top = '10px'; toggleGUIButton.style.right = '10px'; toggleGUIButton.style.zIndex = '1001'; // Above GUI document.body.appendChild(toggleGUIButton); // Event listeners for toggling settings document.getElementById('toggleAutoBattle').addEventListener('change', (e) => { autoBattleEnabled = e.target.checked; logMessage(`Auto Battle: ${autoBattleEnabled}`); }); // Event listeners for cooldown settings document.getElementById('cooldownMin').addEventListener('change', (e) => { cooldownMin = parseInt(e.target.value, 10); logMessage(`Cooldown Min set to: ${cooldownMin}`); }); document.getElementById('cooldownMax').addEventListener('change', (e) => { cooldownMax = parseInt(e.target.value, 10); logMessage(`Cooldown Max set to: ${cooldownMax}`); }); // Event listeners for randomizing cooldown document.getElementById('toggleRandomizeCooldown').addEventListener('change', (e) => { randomizeCooldown = e.target.checked; logMessage(`Randomize Cooldown: ${randomizeCooldown}`); }); // Event listener for copying logs document.getElementById('copyLogButton').addEventListener('click', () => { const logArea = document.getElementById('logArea'); logArea.select(); document.execCommand('copy'); logMessage('Log copied to clipboard.'); }); // Event listener for hiding/showing GUI document.getElementById('toggleGUIButton').addEventListener('click', () => { const gui = document.getElementById('battle-automation-gui'); if (gui.style.opacity === '0') { gui.style.opacity = '1'; document.getElementById('toggleGUIButton').textContent = 'Hide GUI'; } else { gui.style.opacity = '0'; document.getElementById('toggleGUIButton').textContent = 'Show GUI'; } }); // Inject CSS for GUI GM_addStyle(` #battle-automation-gui { position: fixed; top: 10px; right: 10px; background: #ffffff; border: 1px solid #cccccc; padding: 10px; border-radius: 5px; box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1); z-index: 1000; opacity: 1; /* Ensure GUI is initially visible */ transition: opacity 0.3s; /* Smooth transition for hiding/showing */ } #battle-automation-gui h3 { margin: 0; font-size: 16px; color: black; } #battle-automation-gui label, #battle-automation-gui input, #battle-automation-gui button, #battle-automation-gui textarea { font-size: 14px; color: black; } #battle-automation-gui textarea { width: 100%; font-family: monospace; } #toggleGUIButton { background: #f39c12; color: white; border: none; padding: 8px 16px; cursor: pointer; z-index: 1001; } `); } // Initialize GUI createGUI(); })();