您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Tweaks Senpa.io UI: draggable mod box, fast mode, visual enhancements, help menu
当前为
- // ==UserScript==
- // @name Hammer Senpa.io Mod - Enhanced UI & Fast Mode
- // @namespace http://tampermonkey.net/
- // @version 2.0
- // @description Tweaks Senpa.io UI: draggable mod box, fast mode, visual enhancements, help menu
- // @author Hammer
- // @match https://senpa.io/*
- // @grant GM_addStyle
- // ==/UserScript==
- (function () {
- 'use strict';
- const localStorageKey = 'modBoxPosition';
- let optimizationEnabled = true;
- let fxOn = true;
- let isFrozen = false;
- let fastMode = false;
- function savePosition(x, y) {
- localStorage.setItem(localStorageKey, JSON.stringify({ x, y }));
- }
- function loadPosition() {
- const pos = localStorage.getItem(localStorageKey);
- return pos ? JSON.parse(pos) : null;
- }
- const smallGui = document.createElement('div');
- smallGui.id = 'small-gui';
- Object.assign(smallGui.style, {
- position: 'fixed',
- width: '70px',
- height: '50px',
- backgroundColor: 'rgba(0, 0, 0, 0.7)',
- color: 'white',
- textAlign: 'center',
- fontSize: '14px',
- borderRadius: '5px',
- cursor: 'grab',
- zIndex: '9999',
- border: '2px solid red',
- transition: 'top 0.3s ease, left 0.3s ease'
- });
- smallGui.innerText = 'Mods';
- document.body.appendChild(smallGui);
- const helpBox = document.createElement('div');
- helpBox.innerText = `
- Mod Features:
- ✔ FPS Optimization: Hides backgrounds, ads, & animations
- ✔ FX Toggle: Adds visual contrast for better vision
- ✔ Freeze on Death: Prevents respawn inputs for 3 seconds
- ✔ Fast Mode: Removes unnecessary UI but allows respawn
- ✔ Draggable GUI: Move and place mod menu where you like
- `;
- Object.assign(helpBox.style, {
- backgroundColor: '#fff',
- color: '#000',
- padding: '10px',
- borderRadius: '8px',
- fontSize: '12px',
- marginTop: '10px',
- display: 'none',
- whiteSpace: 'pre-wrap'
- });
- const guiContainer = document.createElement('div');
- guiContainer.id = 'gui-container';
- Object.assign(guiContainer.style, {
- position: 'fixed',
- width: '250px',
- backgroundColor: 'rgba(0, 0, 0, 0.85)',
- color: 'white',
- padding: '20px',
- borderRadius: '10px',
- zIndex: '9999',
- display: 'none',
- fontFamily: 'Arial, sans-serif',
- border: '2px solid red',
- transition: 'top 0.3s ease, left 0.3s ease'
- });
- const closeButton = document.createElement('button');
- closeButton.innerText = 'X';
- Object.assign(closeButton.style, {
- backgroundColor: '#dc3545',
- color: 'white',
- border: 'none',
- padding: '5px',
- borderRadius: '50%',
- cursor: 'pointer',
- position: 'absolute',
- top: '10px',
- right: '10px'
- });
- closeButton.onclick = () => {
- guiContainer.style.display = 'none';
- helpBox.style.display = 'none';
- };
- function createToggleButton(textOn, textOff, initial, callback) {
- const btn = document.createElement('button');
- btn.innerText = initial ? textOff : textOn;
- btn.style.backgroundColor = initial ? '#28a745' : '#dc3545';
- btn.style.color = 'white';
- btn.style.border = 'none';
- btn.style.padding = '10px';
- btn.style.borderRadius = '5px';
- btn.style.cursor = 'pointer';
- btn.style.marginBottom = '10px';
- btn.style.width = '100%';
- btn.addEventListener('click', () => {
- const state = callback();
- btn.innerText = state ? textOff : textOn;
- btn.style.backgroundColor = state ? '#28a745' : '#dc3545';
- });
- return btn;
- }
- function enableOptimization() {
- document.querySelectorAll('.ad, .sidebar, .popup').forEach(e => e.remove());
- document.body.style.backgroundImage = 'none';
- document.querySelectorAll('img').forEach(img => img.src = '');
- const style = document.createElement('style');
- style.innerHTML = `
- * {
- animation: none !important;
- transition: none !important;
- box-shadow: none !important;
- }
- canvas {
- image-rendering: optimizeSpeed;
- will-change: transform;
- }
- body, html {
- background: #000 !important;
- overflow: hidden;
- margin: 0;
- padding: 0;
- }
- `;
- document.head.appendChild(style);
- document.querySelectorAll('audio').forEach(a => a.pause());
- }
- function disableOptimization() {
- const style = document.createElement('style');
- style.innerHTML = `
- * {
- animation: initial !important;
- transition: initial !important;
- }
- `;
- document.head.appendChild(style);
- }
- function applyVisualEffects() {
- const canvas = document.querySelector('canvas');
- if (canvas) {
- canvas.style.filter = fxOn ? 'brightness(1.1) contrast(1.2) saturate(1.1)' : 'none';
- }
- }
- function freezeOnDeath() {
- if (!isFrozen) return;
- const prevent = e => e.preventDefault();
- document.addEventListener('keydown', prevent);
- document.addEventListener('mousemove', prevent);
- document.addEventListener('mousedown', prevent);
- setTimeout(() => {
- document.removeEventListener('keydown', prevent);
- document.removeEventListener('mousemove', prevent);
- document.removeEventListener('mousedown', prevent);
- }, 3000);
- }
- function enableFastMode() {
- document.querySelectorAll('img, .ad, .sidebar, .middle, .popup, .footer, .header, .menu, .info').forEach(e => e.remove());
- }
- guiContainer.appendChild(closeButton);
- guiContainer.appendChild(createToggleButton('Enable FPS Optimization', 'Disable FPS Optimization', optimizationEnabled, () => {
- optimizationEnabled = !optimizationEnabled;
- optimizationEnabled ? enableOptimization() : disableOptimization();
- return optimizationEnabled;
- }));
- guiContainer.appendChild(createToggleButton('Enable FX', 'Disable FX', fxOn, () => {
- fxOn = !fxOn;
- applyVisualEffects();
- return fxOn;
- }));
- guiContainer.appendChild(createToggleButton('Freeze on Death', 'Unfreeze on Death', isFrozen, () => {
- isFrozen = !isFrozen;
- return isFrozen;
- }));
- guiContainer.appendChild(createToggleButton('Enable Fast Mode', 'Disable Fast Mode', fastMode, () => {
- fastMode = !fastMode;
- if (fastMode) enableFastMode();
- return fastMode;
- }));
- const helpBtn = document.createElement('button');
- helpBtn.innerText = 'Help';
- Object.assign(helpBtn.style, {
- backgroundColor: '#ffffff',
- color: '#000',
- padding: '10px',
- borderRadius: '5px',
- cursor: 'pointer',
- marginTop: '10px',
- width: '100%'
- });
- helpBtn.onclick = () => helpBox.style.display = helpBox.style.display === 'none' ? 'block' : 'none';
- guiContainer.appendChild(helpBtn);
- guiContainer.appendChild(helpBox);
- document.body.appendChild(guiContainer);
- smallGui.addEventListener('click', () => {
- const isHidden = guiContainer.style.display === 'none';
- guiContainer.style.display = isHidden ? 'block' : 'none';
- helpBox.style.display = 'none';
- });
- // Load saved position or default to bottom right
- const saved = loadPosition();
- if (saved) {
- smallGui.style.top = saved.y + 'px';
- smallGui.style.left = saved.x + 'px';
- guiContainer.style.top = saved.y + 60 + 'px';
- guiContainer.style.left = saved.x + 'px';
- } else {
- smallGui.style.bottom = '20px';
- smallGui.style.right = '20px';
- }
- // Draggable
- let dragging = false, offsetX, offsetY;
- smallGui.addEventListener('mousedown', (e) => {
- dragging = true;
- offsetX = e.clientX - smallGui.offsetLeft;
- offsetY = e.clientY - smallGui.offsetTop;
- smallGui.style.cursor = 'grabbing';
- });
- document.addEventListener('mousemove', (e) => {
- if (!dragging) return;
- const x = e.clientX - offsetX;
- const y = e.clientY - offsetY;
- smallGui.style.left = x + 'px';
- smallGui.style.top = y + 'px';
- smallGui.style.right = 'auto';
- smallGui.style.bottom = 'auto';
- guiContainer.style.left = x + 'px';
- guiContainer.style.top = y + 60 + 'px';
- });
- document.addEventListener('mouseup', () => {
- if (dragging) {
- savePosition(parseInt(smallGui.style.left), parseInt(smallGui.style.top));
- }
- dragging = false;
- smallGui.style.cursor = 'grab';
- });
- const observer = new MutationObserver(() => {
- const middleAd = document.querySelector('.middle, .middle-panel, .ad-middle');
- if (middleAd) middleAd.remove();
- const inGame = document.querySelector('.player');
- if (inGame) {
- const savedPos = loadPosition();
- if (!savedPos) {
- smallGui.style.bottom = '20px';
- smallGui.style.right = '20px';
- guiContainer.style.bottom = '80px';
- guiContainer.style.right = '20px';
- }
- }
- });
- observer.observe(document.body, { childList: true, subtree: true });
- setInterval(() => {
- const dead = document.querySelector('.dead');
- if (dead && isFrozen) freezeOnDeath();
- }, 1000);
- if (optimizationEnabled) enableOptimization();
- if (fxOn) applyVisualEffects();
- })();