您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Audio Alerts for DHP
// ==UserScript== // @name Idle Pixel Audio Alerts // @namespace http://tampermonkey.net/ // @version 1.2.1 // @description Audio Alerts for DHP // @author Felipe Dounford // @require https://gf.qytechs.cn/scripts/461221-hack-timer-js-by-turuslan/code/Hack%20Timerjs%20By%20Turuslan.js?version=1159560 // @require https://gf.qytechs.cn/scripts/441206-idlepixel/code/IdlePixel+.js // @match *://idle-pixel.com/login/play* // @icon https://www.google.com/s2/favicons?sz=64&domain=gf.qytechs.cn // @grant none // @license MIT // ==/UserScript== (function() { 'use strict'; //Change ding url to set default sound let ding = 'https://raw.githubusercontent.com/Dounford-Felipe/Audio-Alerts/main/ding.wav' //Change defaultText to set default TTS Text let defaultText = 'Ready' let dropdownPresets = { "Key Items": ["Treasure Map", "Green Treasure Map", "Red Treasure Map","Moon Distance","Sun Distance"], Geodes: ["Grey Geode", "Blue Geode", "Green Geode", "Red Geode", "Cyan Geode", "Ancient Geode"], Resources: ["Oil", "Stardust", "Energy"], "Potions Timers": ["Stardust Potion", "Anti Disease", "Tree Speed", "Great Stardust", "Farming Speed", "Super Stardust", "Unique Gathering", "Heat", "Bait", "Bone", "Promethium", "Ultra Stardust", "Rocket Speed", "Titanium", "Geode", "Stone Converter", "Combat Loot", "Rotten", "Merchant Speed", "Ancient Ore", "Guardian Key"], Timers: ["Rocket", "Rocket Idle", "Beehive", "Aquarium", "Birdhouse", "Cook Book", "Crystal Ball", "Event Upcomming", "Row Boat", "Canoe Boat", "Stardust Boat", "Farm Timer 1", "Farm Timer 2", "Farm Timer 3", "Farm Timer 4", "Farm Timer 5", "Tree Timer 1", "Tree Timer 2", "Tree Timer 3", "Tree Timer 4", "Tree Timer 5"], "Fight Points": ["Fields", "Forest", "Caves", "Volcano", "Northern Fields", "Haunted Mansion", "Beach", "Blood Fields", "Blood Forest", "Blood Caves", "Blood Volcano", "Guardian 1", "Guardian 2", "Guardian 3", "Guardian 4"] } let Presets = { "treasureMap": { "name": "treasure_map", "type": "eq", "value": "1" }, "greenTreasureMap": { "name": "green_treasure_map", "type": "eq", "value": "1" }, "redTreasureMap": { "name": "red_treasure_map", "type": "eq", "value": "1" }, "moonDistance": { "name": "moon_distance", "type": "le", "value": "300000" }, "sunDistance": { "name": "sun_distance", "type": "le", "value": "130000000" }, "greyGeode": { "name": "grey_geode", "type": "gt", "value": "5" }, "blueGeode": { "name": "blue_geode", "type": "gt", "value": "5" }, "greenGeode": { "name": "green_geode", "type": "gt", "value": "5" }, "redGeode": { "name": "red_geode", "type": "gt", "value": "5" }, "cyanGeode": { "name": "cyan_geode", "type": "gt", "value": "5" }, "ancientGeode": { "name": "ancient_geode", "type": "gt", "value": "5" }, "oil": { "name": "oil", "type": "ge", "value": "25000" }, "stardust": { "name": "stardust", "type": "ge", "value": "2000000" }, "energy": { "name": "energy", "type": "lt", "value": "10000" }, "stardustPotion": { "name": "stardust_potion_timer", "type": "le", "value": "10" }, "antiDisease": { "name": "anti_disease_potion_timer", "type": "le", "value": "10" }, "treeSpeed": { "name": "tree_speed_potion_timer", "type": "le", "value": "10" }, "greatStardust": { "name": "great_stardust_potion_timer", "type": "le", "value": "10" }, "farmingSpeed": { "name": "farming_speed_potion_timer", "type": "le", "value": "10" }, "superStardust": { "name": "super_stardust_potion_timer", "type": "le", "value": "10" }, "uniqueGathering": { "name": "gathering_unique_potion_timer", "type": "le", "value": "10" }, "heat": { "name": "heat_potion_timer", "type": "le", "value": "10" }, "bait": { "name": "bait_potion_timer", "type": "le", "value": "10" }, "bone": { "name": "bone_potion_timer", "type": "le", "value": "10" }, "promethium": { "name": "promethium_potion_timer", "type": "le", "value": "10" }, "ultraStardust": { "name": "ultra_stardust_potion_timer", "type": "le", "value": "10" }, "rocketSpeed": { "name": "rocket_potion_timer", "type": "le", "value": "10" }, "titanium": { "name": "titanium_potion_timer", "type": "le", "value": "10" }, "geode": { "name": "geode_potion_timer", "type": "le", "value": "10" }, "stoneConverter": { "name": "stone_converter_potion_timer", "type": "le", "value": "10" }, "combatLoot": { "name": "combat_loot_potion_timer", "type": "le", "value": "10" }, "rotten": { "name": "rotten_potion_timer", "type": "le", "value": "10" }, "merchantSpeed": { "name": "merchant_speed_potion_timer", "type": "le", "value": "10" }, "ancientOre": { "name": "ancient_ore_potion_timer", "type": "le", "value": "10" }, "guardianKey": { "name": "guardian_key_potion_timer", "type": "le", "value": "10" }, "rocket": { "name": "rocket_km", "type": "eq", "value": "0" }, "rocketIdle": { "name": "rocket_status", "type": "eq", "value": "none" }, "beehive": { "name": "beehive_timer", "type": "eq", "value": "1" }, "aquarium": { "name": "aquarium_timer", "type": "eq", "value": "0" }, "birdhouse": { "name": "birdhouse_timer", "type": "eq", "value": "1" }, "cookBook": { "name": "cooks_book_timer", "type": "eq", "value": "1" }, "crystalBall": { "name": "crystal_ball_timer", "type": "eq", "value": "0" }, "eventUpcomming": { "name": "event_upcomming_timer", "type": "ne", "value": "0" }, "rowBoat": { "name": "row_boat_timer", "type": "eq", "value": "1" }, "canoeBoat": { "name": "canoe_boat_timer", "type": "eq", "value": "1" }, "stardustBoat": { "name": "stardust_boat_timer", "type": "eq", "value": "1" }, "farmTimer1": { "name": "farm_timer_1", "type": "eq", "value": "1" }, "farmTimer2": { "name": "farm_timer_2", "type": "eq", "value": "1" }, "farmTimer3": { "name": "farm_timer_3", "type": "eq", "value": "1" }, "farmTimer4": { "name": "farm_timer_4", "type": "eq", "value": "1" }, "farmTimer5": { "name": "farm_timer_5", "type": "eq", "value": "1" }, "treeTimer1": { "name": "tree_timer_1", "type": "eq", "value": "1" }, "treeTimer2": { "name": "tree_timer_2", "type": "eq", "value": "1" }, "treeTimer3": { "name": "tree_timer_3", "type": "eq", "value": "1" }, "treeTimer4": { "name": "tree_timer_4", "type": "eq", "value": "1" }, "treeTimer5": { "name": "tree_timer_5", "type": "eq", "value": "1" }, "fields": { "name": "fight_points", "type": "ge", "value": "300" }, "forest": { "name": "fight_points", "type": "ge", "value": "600" }, "caves": { "name": "fight_points", "type": "ge", "value": "900" }, "volcano": { "name": "fight_points", "type": "ge", "value": "1500" }, "northernFields": { "name": "fight_points", "type": "ge", "value": "2000" }, "hauntedMansion": { "name": "fight_points", "type": "ge", "value": "3500" }, "beach": { "name": "fight_points", "type": "ge", "value": "5000" }, "bloodFields": { "name": "fight_points", "type": "ge", "value": "1000" }, "bloodForest": { "name": "fight_points", "type": "ge", "value": "2000" }, "bloodCaves": { "name": "fight_points", "type": "ge", "value": "3500" }, "bloodVolcano": { "name": "fight_points", "type": "ge", "value": "5000" }, "guardian1": { "name": "fight_points", "type": "ge", "value": "4000" }, "guardian2": { "name": "fight_points", "type": "ge", "value": "6000" }, "guardian3": { "name": "fight_points", "type": "ge", "value": "10000" }, "guardian4": { "name": "fight_points", "type": "ge", "value": "10000" } } class AlertsPlugin extends IdlePixelPlusPlugin { constructor() { super("alerts", { about: { name: GM_info.script.name + " (ver: " + GM_info.script.version + ")", version: GM_info.script.version, author: GM_info.script.author, description: GM_info.script.description } }); this.muteAllAlerts = false; this.alertVolume = 100; this.alertVoices = []; this.alertVoice = ''; this.alerts = []; } onLogin() { IdlePixelPlus.plugins.alerts.addUI() IdlePixelPlus.plugins.alerts.loadAlerts() IdlePixelPlus.plugins.alerts.addDropdown() speechSynthesis.onvoiceschanged = function () { IdlePixelPlus.plugins.alerts.getVoices() } const alertLoopInterval = setInterval(function(){ IdlePixelPlus.plugins.alerts.newValue() IdlePixelPlus.plugins.alerts.alertLoop() }, 1000); } //Gets the tts voices, populate the select with them and set the current voice getVoices() { IdlePixelPlus.plugins.alerts.alertVoices = speechSynthesis.getVoices(); const voiceSelect = document.getElementById('ttsVoices'); IdlePixelPlus.plugins.alerts.alertVoices.forEach((voice, index) => { const option = document.createElement('option'); option.value = index; option.textContent = voice.name; voiceSelect.appendChild(option); }); // Set the current voice based on the value stored in localStorage or use the first voice IdlePixelPlus.plugins.alerts.alertVoice = localStorage.getItem('audioAlertsVoice') ? IdlePixelPlus.plugins.alerts.alertVoices[localStorage.getItem('audioAlertsVoice')] : IdlePixelPlus.plugins.alerts.alertVoices[0] document.getElementById('ttsVoices').value = localStorage.getItem('audioAlertsVoice') ? localStorage.getItem('audioAlertsVoice') : 0 } //Adds the table and Style addUI() { if (document.querySelector('.dounModalDim') == null) { let style = document.createElement('style'); style.innerHTML = ` .dounModalParent { width: 100%; height: 100%; position: absolute; top: 0px; } .dounModalDim { background-color: black; opacity: 0.7; width: 100%; height: 100%; position: absolute; } .dounModalContent { margin-right: auto; margin-left: auto; width: 35%; border-radius: 5px; top: 100px; position: sticky; }`; document.head.appendChild(style); } let alertTable = `<table class="table table-secondary table-bordered table-striped" style="text-align: center;font-weight: bold;text-shadow: 1px 1px white;"> <thead style="vertical-align: middle;"> <tr> <th style="width: 30%;">Variable</th> <th style="width: 10%;" colspan="2">Trigger</th> <th style="width: 10%;">Current Value</th> <th style="width: 10%;">Sound Type</th> <th style="width: 20%;">Option</th> <th style="width: 10%;">Enabled</th> <th></th> </tr> </thead> <tbody id="alertsBody"> </tbody> <tfoot> <tr id="alertsFooter"> <td colspan="3"> <select id="ttsVoices" onchange="IdlePixelPlus.plugins.alerts.alertVoice = IdlePixelPlus.plugins.alerts.alertVoices[this.value]" style="width:100%"></select> </td> <td colspan="2"> <input type="checkbox" onclick="IdlePixelPlus.plugins.alerts.muteAllAlerts = !IdlePixelPlus.plugins.alerts.muteAllAlerts" style="margin-right: 10px;"> Mute ALL </td> <td> <input type="range" min="1" max="100" value="100" id="alertVolume" onchange="IdlePixelPlus.plugins.alerts.alertVolume = this.value"> Volume </td> <td> <button onclick="IdlePixelPlus.plugins.alerts.saveAlerts()">Save</button> </td> <td> <button onclick="IdlePixelPlus.plugins.alerts.addAlert()">ADD</button> </td> </tr> <tr> <td colspan="4"> <button onclick="IdlePixelPlus.plugins.alerts.openImportModal()">Import Alerts</button> </td> <td colspan="4"> <button onclick="IdlePixelPlus.plugins.alerts.exportAlerts()" style="margin-left: 30;">Export Alerts</button> </td> </tr> </tfoot> </table> <br> <br> <table class="table table-secondary table-borderless" style="text-align: center;text-shadow: 1px 1px white;width: 60%;margin: auto;border: 1px solid black;"> <thead> <tr> <th style="width: 20%;">Preset Type</th> <th style="width: 20%;">Preset</th> <th style="width: 10%;"></th> </tr> </thead> <tbody> <tr> <td style="padding-bottom: 10px;"> <select id="dropdownPresetsType" size="1"> <option value="" selected="selected">Select Type</option> </select> </td> <td style="padding-bottom: 10px;"> <select id="dropdownPresetsPreset" size="1"> <option value="" selected="selected">Select Preset</option> </select> </td> <td style="padding-bottom: 10px;"> <button onclick="IdlePixelPlus.plugins.alerts.addPreset()">ADD</button> </td> </tr> </tbody> </table>` IdlePixelPlus.addPanel("audioAlerts", "Audio Alerts", alertTable); let alertButton = `<div onclick="IdlePixelPlus.setPanel('audioAlerts')" class="hover hover-menu-bar-item left-menu-item"> <table class="game-menu-bar-left-table-btn left-menu-item-other" style="width: 100%;"> <tbody> <tr> <td style="width: 30px;"><img id="menu-bar-idlepixelplus-icon" src="https://dhm.idle-pixel.com/images/soundOn.png" class="w20" title="alerts"></td> <td>AUDIO ALERTS</td> </tr> </tbody> </table> </div>` document.getElementById('menu-bar-buttons').insertAdjacentHTML('beforeend', alertButton); let importAlertsModal = `<div class="dounModalParent" style="display:none" id="importAlertsModal"> <div class="dounModalDim" onclick="document.getElementById('importAlertsModal').style.display='none'"></div> <div class="modal-content dounModalContent"> <div class="modal-header"> <h5 class="modal-title text-secondary">Import Alerts</h5> <button type="button" class="btn-close" onclick="document.getElementById('importAlertsModal').style.display = 'none'"></button> </div> <div class="modal-body" style="text-align: center;"> <center> Enter Alerts JSON<br> <input type="text" id="importAlerts"> </center> </div> <div class="modal-footer"> <button onclick="document.getElementById('importAlertsModal').style.display = 'none'"><span class="font-pixel hover">Close</span></button> <button onclick="IdlePixelPlus.plugins.alerts.importAlerts()" class="background-primary"><span class="font-pixel hover">Import</span></button> </div> </div> </div>` document.getElementById('content').insertAdjacentHTML('beforeend', importAlertsModal) } //Adds new alert row and a new key to alerts array addAlert = function() { let alertRows = document.getElementById('alertsBody').getElementsByTagName("tr") let totalAlerts = alertRows.length let alertRow = document.createElement('tr') alertRow.id = `alert${totalAlerts+1}` alertRow.innerHTML = `<td> <input placeholder="Variable Name" id="variableName${totalAlerts+1}" style="width:100%"> </td> <td> <select id="variableType${totalAlerts+1}"> <option value="lt"><</option> <option value="le">≤</option> <option value="gt">></option> <option value="ge">≥</option> <option value="mod">%</option> <option value="eq">=</option> <option value="ne">≠</option> </select> </td> <td> <input placeholder="Value to Trigger" id="wantedValue${totalAlerts+1}"> </td> <td><span id="variableValue${totalAlerts+1}"></span></td> <td> <select id="audioType${totalAlerts+1}"> <option value="audio" selected="">Audio File</option> <option value="tts">Text To Speech</option> <option value="eval">Eval (Advanced Users Only!)</option> </select> </td> <td> <input placeholder="Text to Speech or sound URL" id="soundOption${totalAlerts+1}"> </td> <td> <input type="checkbox" id="enabled${totalAlerts+1}"> </td> <td style="padding-right: 6px;"> <button onclick="IdlePixelPlus.plugins.alerts.removeAlert(this.parentNode.parentNode)">Delete</button> </td>` document.getElementById('alertsBody').append(alertRow) IdlePixelPlus.plugins.alerts.alerts[totalAlerts] = {type:'lt',variableName:'',wantedValue:'',soundType:'audio',sound:ding,enabled:false,triggered:false} } //Remove alert row and the array key, also changes the id of the remaining rows removeAlert = function(row) { let oldRows = document.getElementById('alertsBody').getElementsByTagName("tr").length let newId = 1 let id = row.id.slice(5) IdlePixelPlus.plugins.alerts.alerts.splice(id-1,1) row.remove() let alertRows = document.getElementById('alertsBody').getElementsByTagName("tr") // Update remaining row IDs for (let i = 0; i < alertRows.length; i++) {alertRows[i].id = `alert${i+1}`} for (let i = 0; i <= oldRows; i++){ if(document.getElementById("variableName"+i)){ document.getElementById("variableName"+i).id = "variableName"+newId document.getElementById("variableType"+i).id = "variableType"+newId document.getElementById("wantedValue"+i).id = "wantedValue"+newId document.getElementById("variableValue"+i).id = "variableValue"+newId document.getElementById("audioType"+i).id = "audioType"+newId document.getElementById("soundOption"+i).id = "soundOption"+newId document.getElementById("enabled"+i).id = "enabled"+newId newId++ } } // Add a new alert if there are no rows remaining if (alertRows.length == 0) {IdlePixelPlus.plugins.alerts.addAlert()} } //Save the alerts, also sets the alerts, volume and current voice on localStorage saveAlerts = function() { let alertRows = document.getElementById('alertsBody').getElementsByTagName("tr") for (let i = 0; i < alertRows.length; i++) { IdlePixelPlus.plugins.alerts.alerts[i].type = alertRows[i].getElementsByTagName('select')[0].value IdlePixelPlus.plugins.alerts.alerts[i].variableName = 'var_' + alertRows[i].getElementsByTagName('input')[0].value IdlePixelPlus.plugins.alerts.alerts[i].wantedValue = alertRows[i].getElementsByTagName('input')[1].value IdlePixelPlus.plugins.alerts.alerts[i].soundType = alertRows[i].getElementsByTagName('select')[1].value IdlePixelPlus.plugins.alerts.alerts[i].sound = alertRows[i].getElementsByTagName('input')[2].value == '' ? ding : alertRows[i].getElementsByTagName('input')[2].value IdlePixelPlus.plugins.alerts.alerts[i].enabled = alertRows[i].getElementsByTagName("input")[3].checked IdlePixelPlus.plugins.alerts.alerts[i].triggered = document.getElementById('alertsBody').getElementsByTagName("tr")[i].getElementsByTagName('td')[3].style.cssText == '--bs-table-accent-bg: yellow;' ? true : false; } let key = `audioAlerts`; localStorage.setItem(key, JSON.stringify(IdlePixelPlus.plugins.alerts.alerts)); localStorage.setItem('audioAlertsVolume', IdlePixelPlus.plugins.alerts.alertVolume); let voiceIndex = document.getElementById('ttsVoices').value localStorage.setItem('audioAlertsVoice', voiceIndex); localStorage.setItem('audioAlertsMuted', IdlePixelPlus.plugins.alerts.muteAllAlerts); } //Loads both volume and alerts from the localStorage loadAlerts() { let key = `audioAlerts`; let audioAlerts = localStorage.getItem(key); if (audioAlerts) { audioAlerts = JSON.parse(audioAlerts); let alertRows = document.getElementById('alertsBody').getElementsByTagName("tr") for (let i = 0; i < audioAlerts.length; i++) { IdlePixelPlus.plugins.alerts.addAlert() alertRows[i].getElementsByTagName('select')[0].value = audioAlerts[i].type alertRows[i].getElementsByTagName('input')[0].value = audioAlerts[i].variableName.slice(4) alertRows[i].getElementsByTagName('input')[1].value = audioAlerts[i].wantedValue alertRows[i].getElementsByTagName('select')[1].value = audioAlerts[i].soundType alertRows[i].getElementsByTagName('input')[3].checked = audioAlerts[i].enabled alertRows[i].getElementsByTagName('input')[2].value = audioAlerts[i].sound == ding ? '' : audioAlerts[i].sound; alertRows[i].getElementsByTagName('td')[3].style.cssText = audioAlerts[i].triggered == true ? '--bs-table-accent-bg: yellow;' : '' } IdlePixelPlus.plugins.alerts.alerts = audioAlerts; } else {IdlePixelPlus.plugins.alerts.addAlert()} IdlePixelPlus.plugins.alerts.alertVolume = localStorage.getItem('audioAlertsVolume') ? localStorage.getItem('audioAlertsVolume') : 100; IdlePixelPlus.plugins.alerts.muteAllAlerts = localStorage.getItem('audioAlertsMuted') ? localStorage.getItem('audioAlertsMuted') : false; document.getElementById('alertVolume').value = IdlePixelPlus.plugins.alerts.alertVolume } //Displays the current value of the alert variables newValue() { let alertRows = document.getElementById('alertsBody').getElementsByTagName("tr") for (let i = 0; i < alertRows.length; i++) { alertRows[i].getElementsByTagName('span')[0].innerText = window[IdlePixelPlus.plugins.alerts.alerts[i].variableName] == undefined ? '' : window[IdlePixelPlus.plugins.alerts.alerts[i].variableName] } } //This is were the alert is checked alertLoop() { let alertNumber = IdlePixelPlus.plugins.alerts.alerts.length; for (let i = 0; i < alertNumber; i++) { if (IdlePixelPlus.plugins.alerts.alerts[i].enabled) { let type = IdlePixelPlus.plugins.alerts.alerts[i].type let triggered = 0 switch(type) { case "lt": { triggered = parseInt(window[IdlePixelPlus.plugins.alerts.alerts[i].variableName]) < parseInt(IdlePixelPlus.plugins.alerts.alerts[i].wantedValue) ? 1 : 0 break; } case "le": { triggered = parseInt(window[IdlePixelPlus.plugins.alerts.alerts[i].variableName]) <= parseInt(IdlePixelPlus.plugins.alerts.alerts[i].wantedValue) ? 1 : 0 break; } case "gt": { triggered = parseInt(window[IdlePixelPlus.plugins.alerts.alerts[i].variableName]) > parseInt(IdlePixelPlus.plugins.alerts.alerts[i].wantedValue) ? 1 : 0 break; } case "ge": { triggered = parseInt(window[IdlePixelPlus.plugins.alerts.alerts[i].variableName]) >= parseInt(IdlePixelPlus.plugins.alerts.alerts[i].wantedValue) ? 1 : 0 break; } case "mod": { const [mod, remainder] = IdlePixelPlus.plugins.alerts.alerts[i].wantedValue.split(","); triggered = parseInt(window[IdlePixelPlus.plugins.alerts.alerts[i].variableName]) % parseInt(mod) == parseInt(remainder) ? 1 : 0 break; } case "eq": { triggered = window[IdlePixelPlus.plugins.alerts.alerts[i].variableName] === IdlePixelPlus.plugins.alerts.alerts[i].wantedValue ? 1 : 0 break; } case "ne": { triggered = window[IdlePixelPlus.plugins.alerts.alerts[i].variableName] !== IdlePixelPlus.plugins.alerts.alerts[i].wantedValue && typeof window[IdlePixelPlus.plugins.alerts.alerts[i].variableName] != 'undefined' ? 1 : 0 break; } } if (triggered == 1 && IdlePixelPlus.plugins.alerts.alerts[i].triggered == false) { IdlePixelPlus.plugins.alerts.triggerAlert(i); } if (triggered == 0 && IdlePixelPlus.plugins.alerts.alerts[i].triggered == true) { IdlePixelPlus.plugins.alerts.alerts[i].triggered = false document.getElementById('alertsBody').getElementsByTagName("tr")[i].getElementsByTagName('td')[3].style.cssText='' } } } } //This is were the alert happen triggerAlert(i) { IdlePixelPlus.plugins.alerts.alerts[i].triggered = true document.getElementById('alertsBody').getElementsByTagName("tr")[i].getElementsByTagName('td')[3].style.cssText = '--bs-table-accent-bg: yellow;'; if (IdlePixelPlus.plugins.alerts.muteAllAlerts != true) { if(IdlePixelPlus.plugins.alerts.alerts[i].soundType == "audio") { let sound = new Audio(IdlePixelPlus.plugins.alerts.alerts[i].sound) sound = isNaN(sound.duration) ? new Audio(ding) : sound sound.volume = IdlePixelPlus.plugins.alerts.alertVolume / 100 sound.play() } else if (IdlePixelPlus.plugins.alerts.alerts[i].soundType == "tts") { const message = new SpeechSynthesisUtterance(); message.text = IdlePixelPlus.plugins.alerts.alerts[i].sound == ding ? defaultText : IdlePixelPlus.plugins.alerts.alerts[i].sound message.voice = IdlePixelPlus.plugins.alerts.alertVoice message.volume = IdlePixelPlus.plugins.alerts.alertVolume / 100 window.speechSynthesis.speak(message); } else if (IdlePixelPlus.plugins.alerts.alerts[i].soundType == "eval") {// Remove from here let command = IdlePixelPlus.plugins.alerts.alerts[i].sound == 'https://raw.githubusercontent.com/Dounford-Felipe/Audio-Alerts/main/ding.wav' ? `console.log('You need to set ' + IdlePixelPlus.plugins.alerts.alerts[i].variableName + ' command')` : IdlePixelPlus.plugins.alerts.alerts[i].sound eval(command) // To here if you don't want eval } IdlePixelPlus.plugins.alerts.saveAlerts() } } //Presets are added here addPreset() { IdlePixelPlus.plugins.alerts.addAlert() let alertRows = document.getElementById('alertsBody').getElementsByTagName("tr") let alertRow = alertRows.length - 1; let preset = document.getElementById("dropdownPresetsPreset").value; alertRows[alertRow].getElementsByTagName('select')[0].value = Presets[preset].type alertRows[alertRow].getElementsByTagName('input')[0].value = Presets[preset].name alertRows[alertRow].getElementsByTagName('input')[1].value = Presets[preset].value alertRows[alertRow].getElementsByTagName('input')[3].checked = true IdlePixelPlus.plugins.alerts.saveAlerts() } addDropdown() { let typeSel = document.getElementById("dropdownPresetsType"); let fieldSel = document.getElementById("dropdownPresetsPreset"); for (let type in dropdownPresets) { typeSel.options[typeSel.options.length] = new Option(type, type); } typeSel.onchange = function () { fieldSel.length = 1; // remove all options bar first if (this.selectedIndex < 1) return; // done let ft = dropdownPresets[this.value]; for (let field in dropdownPresets[this.value]) { fieldSel.options[fieldSel.options.length] = new Option(ft[field], ft[field].charAt(0).toLocaleLowerCase() + ft[field].slice(1).replaceAll(' ','')); } } typeSel.onchange(); } openImportModal() { document.getElementById('importAlertsModal').style.display='' } importAlerts() { let importedJSON = ''; if (document.getElementById('importAlerts').value == '') {return} else {importedJSON = JSON.parse(document.getElementById('importAlerts').value)}; let currentRows = document.getElementById('alertsBody').getElementsByTagName("tr").length; if (document.getElementById("variableName"+currentRows).value !== '') {currentRows++}; importedJSON.forEach(function(alert){ IdlePixelPlus.plugins.alerts.addAlert() document.getElementById("variableName"+currentRows).value = alert.variableName.slice(4) document.getElementById("variableType"+currentRows).value = alert.type document.getElementById("wantedValue"+currentRows).value = alert.wantedValue document.getElementById("audioType"+currentRows).value = alert.soundType document.getElementById("soundOption"+currentRows).value = alert.sound == ding ? '' : alert.sound; document.getElementById("variableValue"+currentRows).parentNode.cssText = alert.triggered == true ? '--bs-table-accent-bg: yellow;' : '' document.getElementById("enabled"+currentRows).checked = alert.enabled currentRows++ }) document.getElementById('importAlerts').value = '' document.getElementById('importAlertsModal').style.display='none'; IdlePixelPlus.plugins.alerts.saveAlerts(); } exportAlerts () { let saveData = JSON.stringify(IdlePixelPlus.plugins.alerts.alerts); const blob = new Blob([saveData], { type: "application/json" }); const a = document.createElement("a"); a.href = window.URL.createObjectURL(blob); a.download = 'DHP-Alerts-' + var_username; document.body.appendChild(a); a.click(); document.body.removeChild(a); } } const plugin = new AlertsPlugin(); IdlePixelPlus.registerPlugin(plugin); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址