Greasy Fork 支持简体中文。

Jerkmate Cheats

CheatGUI for jerkmate, Auto-clicker, Auto-Upgrader, Infinite points, Max level.

// ==UserScript==
// @name         Jerkmate Cheats
// @namespace    http://tampermonkey.net/
// @version      0.5
// @description  CheatGUI for jerkmate, Auto-clicker, Auto-Upgrader, Infinite points, Max level.
// @match        https://jerkmate.com/jerkmate-ranked
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    const createGUI = () => {
        const container = document.createElement('div');
        container.innerHTML = `
            <style>
                .jm-gui {
                    position: fixed;
                    top: 10px;
                    right: 10px;
                    background: rgba(28, 28, 28, 0.95);
                    color: white;
                    padding: 15px;
                    border-radius: 10px;
                    z-index: 10000;
                    font-family: 'Segoe UI', Arial, sans-serif;
                    min-width: 250px;
                    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
                    backdrop-filter: blur(5px);
                    border: 1px solid rgba(255, 255, 255, 0.1);
                }
                .jm-header {
                    display: flex;
                    justify-content: space-between;
                    align-items: center;
                    margin-bottom: 15px;
                    cursor: move;
                    padding-bottom: 10px;
                    border-bottom: 1px solid rgba(255, 255, 255, 0.1);
                }
                .jm-title {
                    font-weight: bold;
                    font-size: 14px;
                    color: #fff;
                }
                .jm-controls {
                    display: flex;
                    gap: 5px;
                }
                .jm-button {
                    background: none;
                    border: none;
                    color: #fff;
                    cursor: pointer;
                    padding: 2px 6px;
                    font-size: 12px;
                    border-radius: 4px;
                }
                .jm-button:hover {
                    background: rgba(255, 255, 255, 0.1);
                }
                .jm-section {
                    margin-bottom: 15px;
                }
                .jm-input-group {
                    display: flex;
                    align-items: center;
                    margin-bottom: 8px;
                }
                .jm-input {
                    background: rgba(255, 255, 255, 0.1);
                    border: 1px solid rgba(255, 255, 255, 0.2);
                    border-radius: 4px;
                    color: white;
                    padding: 4px 8px;
                    width: 70px;
                    margin-right: 8px;
                }
                .jm-label {
                    font-size: 12px;
                    margin-right: 8px;
                    min-width: 100px;
                }
                .jm-action-button {
                    background: rgba(79, 70, 229, 0.8);
                    border: none;
                    border-radius: 4px;
                    color: white;
                    padding: 4px 12px;
                    cursor: pointer;
                    font-size: 12px;
                    transition: background 0.2s;
                }
                .jm-action-button:hover {
                    background: rgba(79, 70, 229, 1);
                }
                .jm-content {
                    transition: max-height 0.3s ease-out;
                    overflow: hidden;
                }
                .auto-buy-section {
                    display: grid;
                    grid-template-columns: repeat(2, 1fr);
                    gap: 8px;
                    margin-top: 15px;
                    padding-top: 15px;
                    border-top: 1px solid rgba(255, 255, 255, 0.1);
                }
                .auto-buy-toggle {
                    background: rgba(79, 70, 229, 0.8);
                    border: none;
                    border-radius: 4px;
                    color: white;
                    padding: 6px;
                    cursor: pointer;
                    font-size: 12px;
                    transition: background 0.2s;
                }
                .auto-buy-toggle.active {
                    background: #22c55e;
                }
            </style>
            <div class="jm-gui">
                <div class="jm-header">
                    <div class="jm-title">JM CheatGUI | github.com/theogbob</div>
                    <div class="jm-controls">
                        <button class="jm-button" id="minimize-btn">−</button>
                        <button class="jm-button" id="close-btn">×</button>
                    </div>
                </div>
                <div class="jm-content">
                    <div class="jm-section"></div>
                </div>
            </div>
        `;

        document.body.appendChild(container);

        const gui = container.querySelector('.jm-gui');
        const header = container.querySelector('.jm-header');
        const content = container.querySelector('.jm-content');
        const minimizeBtn = container.querySelector('#minimize-btn');
        const closeBtn = container.querySelector('#close-btn');

        let isDragging = false;
        let currentX;
        let currentY;
        let initialX;
        let initialY;
        let xOffset = 0;
        let yOffset = 0;

        const dragStart = (e) => {
            initialX = e.clientX - xOffset;
            initialY = e.clientY - yOffset;
            if (e.target === header) {
                isDragging = true;
            }
        };

        const dragEnd = () => {
            isDragging = false;
        };

        const drag = (e) => {
            if (isDragging) {
                e.preventDefault();
                currentX = e.clientX - initialX;
                currentY = e.clientY - initialY;
                xOffset = currentX;
                yOffset = currentY;
                gui.style.transform = `translate(${currentX}px, ${currentY}px)`;
            }
        };

        header.addEventListener('mousedown', dragStart);
        document.addEventListener('mousemove', drag);
        document.addEventListener('mouseup', dragEnd);

        let isMinimized = false;
        minimizeBtn.addEventListener('click', () => {
            isMinimized = !isMinimized;
            content.style.maxHeight = isMinimized ? '0' : '1000px';
            minimizeBtn.textContent = isMinimized ? '+' : '−';
        });

        closeBtn.addEventListener('click', () => {
            container.remove();
        });

        const createControlSection = () => {
            const section = content.querySelector('.jm-section');

            const controls = [
                { label: 'Level', id: 'level', default: 1 },
                { label: 'Orgasm Points', id: 'orgasmPoints', default: 1 },
                { label: 'Click Speed (ms)', id: 'clickSpeed', default: 1000 }
            ];

            controls.forEach(control => {
                const group = document.createElement('div');
                group.className = 'jm-input-group';

                const label = document.createElement('label');
                label.className = 'jm-label';
                label.textContent = control.label;

                const input = document.createElement('input');
                input.type = 'number';
                input.className = 'jm-input';
                input.id = control.id;
                input.value = control.default;
                input.min = control.id === 'clickSpeed' ? 50 : 0;

                const button = document.createElement('button');
                button.className = 'jm-action-button';
                button.textContent = control.id === 'clickSpeed' ? 'Toggle Auto' : 'Set';

                group.appendChild(label);
                group.appendChild(input);
                group.appendChild(button);
                section.appendChild(group);

                if (control.id === 'clickSpeed') {
                    let clickInterval = null;
                    button.onclick = () => {
                        if (clickInterval === null) {
                            const speed = Math.max(50, parseInt(input.value));
                            const videoElement = document.evaluate(
                                '/html/body/div[7]/div[1]/div/div[3]/div[2]/video',
                                document,
                                null,
                                XPathResult.FIRST_ORDERED_NODE_TYPE,
                                null
                            ).singleNodeValue;

                            if (videoElement) {
                                clickInterval = setInterval(() => videoElement.click(), speed);
                                button.textContent = 'Stop Auto';
                                button.style.background = '#ef4444';
                            }
                        } else {
                            clearInterval(clickInterval);
                            clickInterval = null;
                            button.textContent = 'Toggle Auto';
                            button.style.background = '';
                        }
                    };
                } else {
                    button.onclick = () => updateGameData(control.id, parseInt(input.value));
                }
            });

            const autoBuySection = document.createElement('div');
            autoBuySection.className = 'auto-buy-section';

            const upgrades = [
                { name: 'Lube', xpath: '/html/body/div[7]/div[1]/div/div[2]/div[2]/div[1]/button' },
                { name: 'Poster', xpath: '/html/body/div[7]/div[1]/div/div[2]/div[2]/div[2]/button' },
                { name: 'Magazine', xpath: '/html/body/div[7]/div[1]/div/div[2]/div[2]/div[3]/button' },
                { name: 'Private Show', xpath: '/html/body/div[7]/div[1]/div/div[2]/div[2]/div[4]/button' },
                { name: 'Cam-to-Cam', xpath: '/html/body/div[7]/div[1]/div/div[2]/div[2]/div[5]/button' }
            ];

            upgrades.forEach(upgrade => {
                const button = document.createElement('button');
                button.className = 'auto-buy-toggle';
                button.textContent = `Auto ${upgrade.name}`;

                let buyInterval = null;
                button.onclick = () => {
                    if (buyInterval === null) {
                        buyInterval = setInterval(() => {
                            const upgradeButton = document.evaluate(
                                upgrade.xpath,
                                document,
                                null,
                                XPathResult.FIRST_ORDERED_NODE_TYPE,
                                null
                            ).singleNodeValue;
                            if (upgradeButton) upgradeButton.click();
                        }, 100);
                        button.classList.add('active');
                    } else {
                        clearInterval(buyInterval);
                        buyInterval = null;
                        button.classList.remove('active');
                    }
                };

                autoBuySection.appendChild(button);
            });

            section.appendChild(autoBuySection);
        };

        createControlSection();
    };

    const updateGameData = (key, value) => {
        try {
            let gameData = JSON.parse(getCookie('gameData'));
            gameData[key] = value;
            document.cookie = `gameData=${JSON.stringify(gameData)}; path=/`;
            location.reload();
        } catch (error) {
            console.error('Error updating game data:', error);
        }
    };

    const getCookie = (name) => {
        const value = `; ${document.cookie}`;
        const parts = value.split(`; ${name}=`);
        if (parts.length === 2) return parts.pop().split(';').shift();
    };

    if (window.location.href === 'https://jerkmate.com/jerkmate-ranked') {
        window.addEventListener('load', () => setTimeout(createGUI, 1000));
    }
})();