您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Persistent RNG dice color predictor with dark purple UI
// ==UserScript== // @name Dice Color RNG Predictor // @namespace http://tampermonkey.net/ // @version 1.3 // @description Persistent RNG dice color predictor with dark purple UI // @author theo // @match https://www.online-dice.com/roll-color-dice/3/* // @include https://www.online-dice.com/* // @grant GM_addStyle // @grant GM_setValue // @grant GM_getValue // @description join our discord https://discord.gg/MuUCebSYSD // ==/UserScript== (function() { 'use strict'; // Check if we've already injected the UI if (document.getElementById('dicePredictorContainer')) { return; } // Dark purple UI styles const css = ` #dicePredictorContainer { position: fixed; top: 20px; right: 20px; width: 320px; background-color: #2a0a3a; border: 2px solid #8a2be2; border-radius: 10px; padding: 15px; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; color: #e6d5ff; z-index: 9999; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5); } #dicePredictorTitle { font-size: 18px; font-weight: bold; margin-bottom: 15px; text-align: center; color: #b388ff; border-bottom: 1px solid #8a2be2; padding-bottom: 8px; position: relative; } .discord-icon { position: absolute; right: 0; top: 0; width: 24px; height: 24px; cursor: pointer; transition: transform 0.2s; } .discord-icon:hover { transform: scale(1.1); } /* [Rest of your existing CSS remains exactly the same] */ `; // Add styles to head GM_addStyle(css); // Color definitions const COLORS = { 'red': '#ff5252', 'orange': '#ff9800', 'yellow': '#ffeb3b', 'green': '#0f9d58', 'blue': '#4285f4', 'purple': '#9c27b0' }; // Color names for display const COLOR_NAMES = { 'red': 'Red', 'orange': 'Orange', 'yellow': 'Yellow', 'green': 'Green', 'blue': 'Blue', 'purple': 'Purple' }; // Create container for our predictor function createUI() { const container = document.createElement('div'); container.id = 'dicePredictorContainer'; container.innerHTML = ` <div id="dicePredictorTitle"> Dice Color RNG Predictor <svg class="discord-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 127.14 96.36"> <path fill="#5865F2" d="M107.7,8.07A105.15,105.15,0,0,0,81.47,0a72.06,72.06,0,0,0-3.36,6.83A97.68,97.68,0,0,0,49,6.83,72.37,72.37,0,0,0,45.64,0,105.89,105.89,0,0,0,19.39,8.09C2.79,32.65-1.71,56.6.54,80.21h0A105.73,105.73,0,0,0,32.71,96.36,77.7,77.7,0,0,0,39.6,85.25a68.42,68.42,0,0,1-10.85-5.18c.91-.66,1.8-1.34,2.66-2a75.57,75.57,0,0,0,64.32,0c.87.71,1.76,1.39,2.66,2a68.68,68.68,0,0,1-10.87,5.19,77,77,0,0,0,6.89,11.1A105.25,105.25,0,0,0,126.6,80.22h0C129.24,52.84,122.09,29.11,107.7,8.07ZM42.45,65.69C36.18,65.69,31,60,31,53s5-12.74,11.43-12.74S54,46,53.89,53,48.84,65.69,42.45,65.69Zm42.24,0C78.41,65.69,73.25,60,73.25,53s5-12.74,11.44-12.74S96.23,46,96.12,53,91.08,65.69,84.69,65.69Z"/> </svg> </div> <div class="inputSection"> <label class="inputLabel" for="dice1Color">First Dice Color:</label> <select class="colorSelect" id="dice1Color"> ${Object.entries(COLORS).map(([value, color]) => `<option value="${value}">${COLOR_NAMES[value]}</option>` ).join('')} </select> <label class="inputLabel" for="dice2Color">Second Dice Color:</label> <select class="colorSelect" id="dice2Color"> ${Object.entries(COLORS).map(([value, color]) => `<option value="${value}">${COLOR_NAMES[value]}</option>` ).join('')} </select> <label class="inputLabel" for="dice3Color">Third Dice Color:</label> <select class="colorSelect" id="dice3Color"> ${Object.entries(COLORS).map(([value, color]) => `<option value="${value}">${COLOR_NAMES[value]}</option>` ).join('')} </select> <button id="predictButton">Generate Random Prediction</button> </div> <div id="predictionResult"> <div id="predictionText">Random prediction will appear here</div> <div id="nextColorPrediction">?</div> </div> <div id="historyTitle">Prediction History</div> <div id="historyList"></div> `; // Add to body document.body.appendChild(container); // Add click handler for Discord icon document.querySelector('.discord-icon').addEventListener('click', () => { window.open('https://discord.gg/MuUCebSYSD', '_blank'); }); // Load saved state loadState(); // Set up predict button document.getElementById('predictButton').addEventListener('click', makeRandomPrediction); } // [Rest of your existing functions remain exactly the same] // Save current state function saveState() { const state = { dice1: document.getElementById('dice1Color').value, dice2: document.getElementById('dice2Color').value, dice3: document.getElementById('dice3Color').value, history: predictionHistory }; GM_setValue('dicePredictorState', JSON.stringify(state)); } // Load saved state function loadState() { const savedState = GM_getValue('dicePredictorState'); if (savedState) { try { const state = JSON.parse(savedState); // Restore dropdown values document.getElementById('dice1Color').value = state.dice1; document.getElementById('dice2Color').value = state.dice2; document.getElementById('dice3Color').value = state.dice3; // Restore history predictionHistory = state.history || []; updateHistoryDisplay(); } catch (e) { console.error('Failed to load state:', e); } } } // Track history of predictions let predictionHistory = []; const MAX_HISTORY = 15; // Pure RNG prediction function makeRandomPrediction() { const color1 = document.getElementById('dice1Color').value; const color2 = document.getElementById('dice2Color').value; const color3 = document.getElementById('dice3Color').value; const currentColors = [color1, color2, color3]; const allColors = Object.keys(COLORS); const prediction = allColors[Math.floor(Math.random() * allColors.length)]; // Update prediction display const predictionElement = document.getElementById('nextColorPrediction'); predictionElement.textContent = COLOR_NAMES[prediction]; predictionElement.style.backgroundColor = COLORS[prediction]; predictionElement.style.color = (prediction === 'yellow') ? '#000' : '#fff'; // Add to history const time = new Date().toLocaleTimeString(); const historyEntry = { time: time, colors: currentColors, prediction: prediction }; predictionHistory.unshift(historyEntry); if (predictionHistory.length > MAX_HISTORY) { predictionHistory.pop(); } updateHistoryDisplay(); saveState(); } // Update history display function updateHistoryDisplay() { const historyList = document.getElementById('historyList'); if (!historyList) return; historyList.innerHTML = ''; if (predictionHistory.length === 0) { historyList.innerHTML = '<div style="text-align: center; color: #ba55d3; padding: 10px;">No predictions yet</div>'; return; } predictionHistory.forEach((entry, index) => { const historyItem = document.createElement('div'); historyItem.className = 'historyItem'; historyItem.innerHTML = ` <div class="historyTime">${index + 1}. ${entry.time}</div> <div class="historyColors"> ${entry.colors.map(color => ` <div class="colorBox" style="background-color: ${COLORS[color]}; color: ${(color === 'yellow') ? '#000' : '#fff'}"> ${COLOR_NAMES[color]} </div> `).join('')} </div> <div class="historyPrediction"> <span>Prediction:</span> <div class="colorBox" style="background-color: ${COLORS[entry.prediction]}; color: ${(entry.prediction === 'yellow') ? '#000' : '#fff'}"> ${COLOR_NAMES[entry.prediction]} </div> </div> `; historyList.appendChild(historyItem); }); } // Initialize with random selections function randomizeInputs() { const colors = Object.keys(COLORS); document.getElementById('dice1Color').value = colors[Math.floor(Math.random() * colors.length)]; document.getElementById('dice2Color').value = colors[Math.floor(Math.random() * colors.length)]; document.getElementById('dice3Color').value = colors[Math.floor(Math.random() * colors.length)]; } // Create the UI createUI(); // Set up mutation observer to re-inject UI if removed const observer = new MutationObserver(function(mutations) { if (!document.getElementById('dicePredictorContainer')) { createUI(); } }); observer.observe(document.body, { childList: true, subtree: true }); // Save state before page unload window.addEventListener('beforeunload', saveState); })();