YoHoHo.io OpenSource

inf kills, inf score, inf gold, inf wins and more

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         YoHoHo.io OpenSource
// @namespace    http://tampermonkey.net/
// @version      4.0
// @description  inf kills, inf score, inf gold, inf wins and more
// @author       YourName
// @match        https://yohoho.io/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    window.addEventListener('load', () => {
        // Create main container
        const panel = document.createElement('div');
        panel.id = 'yh-custom-panel';
        panel.style.position = 'fixed';
        panel.style.top = '50px';
        panel.style.right = '50px';
        panel.style.zIndex = '100000';
        panel.style.backgroundColor = '#111827';
        panel.style.color = '#f3f4f6';
        panel.style.borderRadius = '12px';
        panel.style.fontFamily = '"Segoe UI", system-ui, sans-serif';
        panel.style.boxShadow = '0 20px 25px -5px rgba(0,0,0,0.5), 0 10px 10px -5px rgba(0,0,0,0.5)';
        panel.style.width = '240px';
        panel.style.userSelect = 'none';
        panel.style.border = '1px solid #374151';

        // Add Header Container
        const header = document.createElement('div');
        header.style.padding = '12px';
        header.style.background = '#1f2937';
        header.style.borderTopLeftRadius = '11px';
        header.style.borderTopRightRadius = '11px';
        header.style.borderBottom = '1px solid #374151';
        header.style.cursor = 'move';
        header.style.fontWeight = 'bold';
        header.style.color = '#f59e0b';
        header.style.fontSize = '14px';
        header.style.display = 'flex';
        header.style.justifyContent = 'space-between';
        header.style.alignItems = 'center';

        // Title text inside header
        const titleText = document.createElement('span');
        titleText.innerHTML = '🏴‍☠️ OpenSource 🏴‍';
        header.appendChild(titleText);

        // Collapse Button (+ / -)
        const toggleBtn = document.createElement('span');
        toggleBtn.innerText = '−'; // Starts open (minus sign)
        toggleBtn.style.cursor = 'pointer';
        toggleBtn.style.padding = '0 5px';
        toggleBtn.style.fontSize = '16px';
        toggleBtn.style.color = '#9ca3af';
        toggleBtn.style.fontWeight = 'bold';
        header.appendChild(toggleBtn);

        panel.appendChild(header);

        // Add Vertical Body
        const body = document.createElement('div');
        body.style.padding = '15px';
        body.style.display = 'flex';
        body.style.flexDirection = 'column';
        body.style.gap = '10px';
        panel.appendChild(body);

        // List of all accessible profile variables
        const variables = [
            { key: 'coinsOwned', label: 'Coins' },
            { key: 'playerXP', label: 'Player XP' },
            { key: 'abBotSkillLevel', label: 'Bot Level' },
            { key: 'totalWins', label: 'Wins' },
            { key: 'totalKills', label: 'Total Kills' },
            { key: 'bestKills', label: 'Best Kills' },
            { key: 'bestScore', label: 'Best Score' },
            { key: 'gamesStarted', label: 'Matches' }
        ];

        // Dynamically build vertical forms (stacked one under the other)
        variables.forEach(item => {
            const row = document.createElement('div');

            const label = document.createElement('label');
            label.style.display = 'block';
            label.style.fontSize = '11px';
            label.style.color = '#9ca3af';
            label.style.marginBottom = '4px';
            label.style.fontWeight = '500';
            label.innerText = item.label;

            const input = document.createElement('input');
            input.type = 'number';
            input.className = 'yh-input';
            input.dataset.key = item.key;
            input.value = localStorage.getItem(item.key) || '0';
            input.style.width = '100%';
            input.style.padding = '6px 8px';
            input.style.boxSizing = 'border-box';
            input.style.backgroundColor = '#1f2937';
            input.style.border = '1px solid #4b5563';
            input.style.borderRadius = '6px';
            input.style.color = '#fff';
            input.style.fontSize = '13px';

            row.appendChild(label);
            row.appendChild(input);
            body.appendChild(row);
        });

        // Add Action Button
        const saveBtn = document.createElement('button');
        saveBtn.innerText = 'Save & Sync';
        saveBtn.style.width = '100%';
        saveBtn.style.padding = '8px';
        saveBtn.style.marginTop = '4px';
        saveBtn.style.backgroundColor = '#d97706';
        saveBtn.style.color = '#fff';
        saveBtn.style.border = 'none';
        saveBtn.style.borderRadius = '6px';
        saveBtn.style.cursor = 'pointer';
        saveBtn.style.fontWeight = 'bold';
        saveBtn.style.fontSize = '13px';
        saveBtn.style.transition = 'background 0.2s';

        saveBtn.onmouseover = () => saveBtn.style.backgroundColor = '#b45309';
        saveBtn.onmouseout = () => saveBtn.style.backgroundColor = '#d97706';

        body.appendChild(saveBtn);
        document.body.appendChild(panel);

        // Collapse/Expand Functionality
        toggleBtn.addEventListener('click', (e) => {
            e.stopPropagation(); // Prevent drag triggers on click
            if (body.style.display === 'none') {
                body.style.display = 'flex';
                toggleBtn.innerText = '−'; // Unicode minus sign
                panel.style.borderBottomRightRadius = '12px';
                panel.style.borderBottomLeftRadius = '12px';
            } else {
                body.style.display = 'none';
                toggleBtn.innerText = '+'; // Plus sign
                panel.style.borderBottomRightRadius = '0px';
                panel.style.borderBottomLeftRadius = '0px';
            }
        });

        // Save Functionality
        saveBtn.addEventListener('click', () => {
            const inputs = body.querySelectorAll('.yh-input');
            inputs.forEach(input => {
                localStorage.setItem(input.dataset.key, input.value);
            });
            window.location.reload();
        });

        // Make the Panel Draggable via Header
        let isDragging = false;
        let offsetX, offsetY;

        header.addEventListener('mousedown', (e) => {
            if (e.target === toggleBtn) return; // Don't drag if clicking the +/- button
            isDragging = true;
            offsetX = e.clientX - panel.getBoundingClientRect().left;
            offsetY = e.clientY - panel.getBoundingClientRect().top;
            header.style.cursor = 'grabbing';
        });

        document.addEventListener('mousemove', (e) => {
            if (!isDragging) return;
            panel.style.left = `${e.clientX - offsetX}px`;
            panel.style.top = `${e.clientY - offsetY}px`;
            panel.style.right = 'auto';
        });

        document.addEventListener('mouseup', () => {
            isDragging = false;
            header.style.cursor = 'move';
        });
    });
})();