您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Inject script untuk manipulasi hasil akhir roll dadu berdasarkan API
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.sleazyfork.org/scripts/544272/1633760/Set%20Dice.js
// ==UserScript== // @name Set Dice // @version 1.2 // @description Inject script untuk manipulasi hasil akhir roll dadu berdasarkan API // @author Zyetaa // @match *://*/* // @grant none // ==/UserScript== (function () { 'use strict'; const originalRandom = Math.random; let apiResponse = null; let isScriptActive = false; // Variabel untuk melacak pattern let patternValues = []; let patternIndex = 0; let currentPatternStr = ''; // Untuk melacak pattern saat ini // Load pattern state dari localStorage saat script dimulai function loadPatternState() { try { const savedPattern = localStorage.getItem('dicePattern'); const savedIndex = localStorage.getItem('dicePatternIndex'); if (savedPattern) { currentPatternStr = savedPattern; patternValues = savedPattern.split('-').map(val => val.trim().toLowerCase()); patternIndex = parseInt(savedIndex) || 0; console.log('Pattern state loaded from localStorage:', { pattern: currentPatternStr, values: patternValues, index: patternIndex }); } } catch (error) { console.error('Error loading pattern state:', error); } } // Save pattern state ke localStorage function savePatternState() { try { localStorage.setItem('dicePattern', currentPatternStr); localStorage.setItem('dicePatternIndex', patternIndex.toString()); } catch (error) { console.error('Error saving pattern state:', error); } } // Load state saat script dimulai loadPatternState(); async function fetchApiData() { try { const response = await fetch('https://kaptenxxi2-blublublublu.hf.space/set?__sign=eyJhbGciOiJFZERTQSJ9.eyJyZWFkIjp0cnVlLCJwZXJtaXNzaW9ucyI6eyJyZXBvLmNvbnRlbnQucmVhZCI6dHJ1ZX0sIm9uQmVoYWxmT2YiOnsia2luZCI6InVzZXIiLCJfaWQiOiI2ODI2YWMwMjk3NTQ0YmNiMjI5ZTEyMGIiLCJ1c2VyIjoiS2FwdGVuWHhpMiIsInNlc3Npb25JZCI6IjY4N2VkMjQ4OTcwMTU2ODU2ZTg4ZDNjZSJ9LCJpYXQiOjE3NTQwMzE3NTksInN1YiI6Ii9zcGFjZXMvS2FwdGVuWHhpMi9ibHVibHVibHVibHUiLCJleHAiOjE3NTQxMTgxNTksImlzcyI6Imh0dHBzOi8vaHVnZ2luZ2ZhY2UuY28ifQ.hupQLCW4CWjJKTOmBdT3ZQT1U9J5RGibE7UWSkIIfyhw_gHe8sloFemfQCDemsaIxpJouqBsYml1bPVvuzFTBg&key=cuanku'); const data = await response.json(); apiResponse = data; console.log('API Response:', apiResponse); // Parse pattern jika ada dan berubah if (apiResponse && apiResponse.value && apiResponse.value.includes('-')) { // Cek apakah pattern berubah if (currentPatternStr !== apiResponse.value) { currentPatternStr = apiResponse.value; parsePattern(apiResponse.value); savePatternState(); // Save state setelah pattern berubah console.log('Pattern changed to:', currentPatternStr); } } else { // Jika bukan pattern, reset pattern tracking if (currentPatternStr !== '') { currentPatternStr = ''; patternValues = []; patternIndex = 0; savePatternState(); // Save state setelah reset console.log('Pattern reset (no pattern in response)'); } } } catch (error) { console.error('Error fetching API data:', error); } } function parsePattern(patternStr) { // Parse pola string menjadi array nilai // Contoh: "b-k-b" -> ["b", "k", "b"] patternValues = patternStr.split('-').map(val => val.trim().toLowerCase()); patternIndex = 0; console.log('Pattern parsed:', patternValues); } function getNextPatternValue() { if (patternValues.length === 0) { return null; } // Ambil nilai berdasarkan index saat ini const currentValue = patternValues[patternIndex]; // Increment index untuk request berikutnya (loop jika sudah habis) patternIndex = (patternIndex + 1) % patternValues.length; // Save state setelah index berubah savePatternState(); return currentValue; } setInterval(fetchApiData, 1000); fetchApiData(); function generateFixedTotal(total, len = 9) { const maxTotal = len * 6; total = Math.min(total, maxTotal); const out = Array(len).fill(1); const freq = { 1: len }; let sisa = total - len; let attempt = 0, maxAttempt = 20000; while (sisa > 0 && attempt < maxAttempt) { attempt++; const i = Math.floor(originalRandom() * len); const curr = out[i]; if (curr >= 6) continue; const next = curr + 1; const countNext = freq[next] || 0; // Batasi maksimal kemunculan angka (kecuali terpaksa) const maxRepeat = Math.floor(len / 2); // misalnya: 4 if (countNext >= maxRepeat) continue; // Prioritaskan angka yang jarang muncul const score = 1 / (1 + countNext); if (originalRandom() > score) continue; out[i] = next; freq[curr] = (freq[curr] || 0) - 1; freq[next] = (freq[next] || 0) + 1; sisa--; } if (attempt >= maxAttempt) { console.warn("Distribusi kurang optimal. Sisa:", sisa); } return out; } let i = 0, p = []; function set(tipe) { let total; if (tipe === "k") { total = Math.floor(originalRandom() * (31 - 20 + 1)) + 20; } else if (tipe === "b") { total = Math.floor(originalRandom() * (42 - 32 + 1)) + 32; } else { total = 30; } p = generateFixedTotal(total); i = 0; console.log("Total:", total); console.log("Generated array:", p); isScriptActive = true; Math.random = () => (p[i++ % p.length] - 0.0001) / 6; setTimeout(() => { isScriptActive = false; Math.random = originalRandom; }, 1000); } // Tunggu hingga tombol tersedia di DOM const interval = setInterval(() => { const btn = document.querySelector('[jsname="puTT7d"]'); if (btn) { clearInterval(interval); btn.addEventListener('click', () => { let tipe; // Cek apakah ada pattern yang aktif if (patternValues.length > 0) { tipe = getNextPatternValue(); console.log('Using pattern value:', tipe); } else if (apiResponse && apiResponse.value) { tipe = apiResponse.value; } else { tipe = "k"; } set(tipe); }); } }, 500); })();