您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Play sounds when specific chat messages are received
// ==UserScript== // @name SoundBoard // @version 1.4.0 // @description Play sounds when specific chat messages are received // @author FeiFei // @match https://bonk.io/gameframe-release.html // @run-at document-end // @grant none // @namespace https://greasyfork.org/users/1366475 // ==/UserScript== "use strict"; let soundBoard = {}; soundBoard.windowConfigs = { windowName: "SoundBoard", windowId: "soundBoard_window", modVersion: "1.4.0", bonkLIBVersion: "1.1.3", bonkVersion: "49", windowContent: null, settingsContent: null, }; // Initialize global mute state soundBoard.globalMute = false; soundBoard.modIndex = null; soundBoard.windowContentElement = null; soundBoard.settingsContentElement = null; // Define the sounds and their corresponding messages and audio URLs soundBoard.sounds = [ { name: "a", triggerMessage: "a", audioUrl: "https://www.myinstants.com/media/sounds/gawr-gura-a.mp3", enabled: true, // default enabled }, // *Add more sounds here if needed ]; soundBoard.setWindowContent = function () { let windowHTML = document.createElement("div"); // !Maybe dont need this windowHTML.id = soundBoard.windowConfigs.windowId; // Unique ID for scoping windowHTML.classList.add("bonkhud-background-color"); // Create the global mute toggle button let muteButton = document.createElement("button"); muteButton.id = "muteButton"; muteButton.textContent = this.globalMute ? "🔇" : "🔊"; muteButton.title = this.globalMute ? "Unmute" : "Mute"; muteButton.classList.add("bonkhud-text-color"); // Apply text color muteButton.addEventListener("click", () => { this.globalMute = !this.globalMute; muteButton.textContent = this.globalMute ? "🔇" : "🔊"; muteButton.title = this.globalMute ? "Unmute" : "Mute"; // Save the global mute setting this.saveSettings(); }); windowHTML.appendChild(muteButton); // Create the list of sounds let soundList = document.createElement("div"); soundList.id = "soundList"; this.sounds.forEach((sound, index) => { let soundDiv = document.createElement("div"); soundDiv.className = "sound-item bonkhud-border-color"; // Apply border color let soundName = document.createElement("span"); soundName.className = "sound-name bonkhud-text-color"; // Apply text color soundName.textContent = sound.name; soundName.title = sound.triggerMessage; // Create the checkbox input let checkbox = document.createElement("input"); checkbox.type = "checkbox"; checkbox.id = `checkbox_${index}`; checkbox.checked = sound.enabled; // Create the label for the checkbox let label = document.createElement("label"); label.htmlFor = `checkbox_${index}`; label.className = "soundBoardToggle bonkhud-button-color"; // Apply button color // Event listener to update the sound enabled state checkbox.addEventListener("change", () => { sound.enabled = checkbox.checked; // Save the settings this.saveSettings(); }); // Create a container for the toggle switch let toggleContainer = document.createElement("div"); toggleContainer.style.display = "flex"; toggleContainer.style.alignItems = "center"; toggleContainer.appendChild(checkbox); toggleContainer.appendChild(label); soundDiv.appendChild(soundName); soundDiv.appendChild(toggleContainer); soundList.appendChild(soundDiv); }); windowHTML.appendChild(soundList); // Add to windowContent this.windowConfigs.windowContent = windowHTML; // Store a reference to the window content element this.windowContentElement = windowHTML; }; soundBoard.setSettingsContent = function () { let settingsHTML = document.createElement("div"); settingsHTML.className = "settings-container bonkhud-background-color"; // Apply background color // Create the list of sounds with delete buttons let soundList = document.createElement("div"); soundList.id = "settingsSoundList"; this.sounds.forEach((sound, index) => { let soundDiv = document.createElement("div"); soundDiv.className = "settings-sound-item bonkhud-border-color"; // Apply border color let soundInfo = document.createElement("span"); soundInfo.className = "settings-sound-info bonkhud-text-color"; // Apply text color soundInfo.textContent = `${sound.name} | Trigger: "${sound.triggerMessage}" | URL: ${sound.audioUrl}`; let deleteButton = document.createElement("button"); deleteButton.className = "delete-button bonkhud-button-color"; // Apply button color deleteButton.textContent = "Delete"; deleteButton.addEventListener("mouseover", () => { deleteButton.classList.add("bonkhud-button-color-hover"); }); deleteButton.addEventListener("mouseout", () => { deleteButton.classList.remove("bonkhud-button-color-hover"); }); deleteButton.addEventListener("click", () => { // Remove the sound from the list this.sounds.splice(index, 1); // Save settings this.saveSettings(); // Update the settings content this.updateSettingsContent(); // Update the window content this.updateWindowContent(); }); soundDiv.appendChild(soundInfo); soundDiv.appendChild(deleteButton); soundList.appendChild(soundDiv); }); settingsHTML.appendChild(soundList); // Create GUI for importing new sounds let importDiv = document.createElement("div"); importDiv.className = "import-div"; importDiv.style.marginTop = "10px"; let nameInput = document.createElement("input"); nameInput.type = "text"; nameInput.placeholder = "Sound Name"; nameInput.classList.add("bonkhud-text-color", "bonkhud-background-color"); // Apply text and background color let triggerInput = document.createElement("input"); triggerInput.type = "text"; triggerInput.placeholder = "Trigger Message"; triggerInput.classList.add("bonkhud-text-color", "bonkhud-background-color"); let urlInput = document.createElement("input"); urlInput.type = "text"; urlInput.placeholder = "Audio URL"; urlInput.classList.add("bonkhud-text-color", "bonkhud-background-color"); let addButton = document.createElement("button"); addButton.className = "add-button bonkhud-button-color"; // Apply button color addButton.textContent = "Add Sound"; addButton.addEventListener("click", () => { let name = nameInput.value.trim(); let triggerMessage = triggerInput.value.trim(); let audioUrl = urlInput.value.trim(); if (name && triggerMessage && audioUrl) { this.sounds.push({ name: name, triggerMessage: triggerMessage, audioUrl: audioUrl, enabled: true }); // Save settings this.saveSettings(); // Update the settings content this.updateSettingsContent(); // Update the window content this.updateWindowContent(); // Clear inputs nameInput.value = ''; triggerInput.value = ''; urlInput.value = ''; } else { alert("Please fill in all fields."); } }); importDiv.appendChild(nameInput); importDiv.appendChild(triggerInput); importDiv.appendChild(urlInput); importDiv.appendChild(addButton); settingsHTML.appendChild(importDiv); // Add to settingsContent this.windowConfigs.settingsContent = settingsHTML; // Store a reference to the settings content element this.settingsContentElement = settingsHTML; }; // Create the mod window using BonkHUD soundBoard.createWindow = function () { // Create the window using BonkHUD const modIndex = bonkHUD.createMod(this.windowConfigs.windowName, this.windowConfigs); this.modIndex = modIndex; // Store the mod index just in case // Load UI settings if available bonkHUD.loadUISetting(modIndex); }; // Function to add custom styles soundBoard.addStyles = function() { const css = ` /* Scoped Styles for SoundBoard Mod */ #soundBoard_window { font-family: Poppins; padding: 10px; } #soundBoard_window #muteButton { background-color: transparent; border: none; font-size: 24px; cursor: pointer; margin-bottom: 10px; } #soundBoard_window .sound-item { display: flex; justify-content: space-between; align-items: center; padding: 5px 0; border-bottom: 1px solid; } #soundBoard_window .sound-item:last-child { border-bottom: none; } #soundBoard_window .sound-name { flex-grow: 1; font-size: 16px; } #soundBoard_window .soundBoardToggle { position: relative; width: 40px; height: 20px; border-radius: 20px; cursor: pointer; transition: background-color 0.2s; } #soundBoard_window .soundBoardToggle::before { content: ''; position: absolute; width: 18px; height: 18px; left: 1px; top: 1px; background-color: #fff; border-radius: 18px; transition: transform 0.2s; } #soundBoard_window input[type="checkbox"]:checked + .soundBoardToggle::before { transform: translateX(20px); } #soundBoard_window input[type="checkbox"] { display: none; } /* Style the Settings Content */ #soundBoardModContainer .settings-container { margin-top: 15px; } #soundBoardModContainer .settings-sound-item { display: flex; justify-content: space-between; align-items: center; padding: 5px 0; border-bottom: 1px solid; } #soundBoardModContainer .settings-sound-item:last-child { border-bottom: none; } #soundBoardModContainer .settings-sound-info { flex-grow: 1; font-size: 14px; } /* Style the Input Fields and Add Button */ #soundBoardModContainer .import-div { margin-top: 15px; } #soundBoardModContainer .import-div input[type="text"] { width: calc(33% - 10px); padding: 5px; margin-right: 5px; border-radius: 4px; } #soundBoardModContainer .import-div input[type="text"]:last-of-type { margin-right: 0; } `; let style = document.createElement('style'); style.innerHTML = css; document.head.appendChild(style); }; soundBoard.updateWindowContent = function () { let soundList = this.windowContentElement.querySelector('#soundList'); if (soundList) { // Clear existing content soundList.innerHTML = ''; // Re-create the list of sounds this.sounds.forEach((sound, index) => { let soundDiv = document.createElement("div"); soundDiv.className = "sound-item bonkhud-border-color"; // Apply border color let soundName = document.createElement("span"); soundName.className = "sound-name bonkhud-text-color"; // Apply text color soundName.textContent = sound.name; soundName.title = sound.triggerMessage; // Create the checkbox input let checkbox = document.createElement("input"); checkbox.type = "checkbox"; checkbox.id = `checkbox_${index}`; checkbox.checked = sound.enabled; // Create the label for the checkbox let label = document.createElement("label"); label.htmlFor = `checkbox_${index}`; label.className = "soundBoardToggle bonkhud-button-color"; // Apply button color // Event listener to update the sound enabled state checkbox.addEventListener("change", () => { sound.enabled = checkbox.checked; // Save the settings this.saveSettings(); }); // Create a container for the toggle switch let toggleContainer = document.createElement("div"); toggleContainer.style.display = "flex"; toggleContainer.style.alignItems = "center"; toggleContainer.appendChild(checkbox); toggleContainer.appendChild(label); soundDiv.appendChild(soundName); soundDiv.appendChild(toggleContainer); soundList.appendChild(soundDiv); }); bonkHUD.updateStyleSettings(); } }; soundBoard.updateSettingsContent = function () { let soundList = this.settingsContentElement.querySelector('#settingsSoundList'); if (soundList) { // Clear existing content soundList.innerHTML = ''; // Re-create the list of sounds with delete buttons this.sounds.forEach((sound, index) => { let soundDiv = document.createElement("div"); soundDiv.className = "settings-sound-item bonkhud-border-color"; // Apply border color let soundInfo = document.createElement("span"); soundInfo.className = "settings-sound-info bonkhud-text-color"; // Apply text color soundInfo.textContent = `${sound.name} | Trigger: "${sound.triggerMessage}" | URL: ${sound.audioUrl}`; let deleteButton = document.createElement("button"); deleteButton.className = "delete-button bonkhud-button-color"; // Apply button color deleteButton.textContent = "Delete"; deleteButton.addEventListener("mouseover", () => { deleteButton.classList.add("bonkhud-button-color-hover"); }); deleteButton.addEventListener("mouseout", () => { deleteButton.classList.remove("bonkhud-button-color-hover"); }); deleteButton.addEventListener("click", () => { // Remove the sound from the list this.sounds.splice(index, 1); // Save settings this.saveSettings(); // Update the settings content this.updateSettingsContent(); // Update the window content this.updateWindowContent(); }); soundDiv.appendChild(soundInfo); soundDiv.appendChild(deleteButton); soundList.appendChild(soundDiv); }); bonkHUD.updateStyleSettings(); } }; // Function to save settings to localStorage soundBoard.saveSettings = function () { let settings = { globalMute: this.globalMute, sounds: this.sounds, }; localStorage.setItem('bonkHUD_Mod_Setting_SoundBoard', JSON.stringify(settings)); }; // Function to load settings from localStorage soundBoard.loadSettings = function () { let savedSettings = JSON.parse(localStorage.getItem('bonkHUD_Mod_Setting_SoundBoard') || '{}'); if (typeof savedSettings.globalMute !== "undefined") { this.globalMute = savedSettings.globalMute; } if (Array.isArray(savedSettings.sounds)) { this.sounds = savedSettings.sounds; } }; // Initialize the mod (run when document is ready) soundBoard.initMod = function () { // Ensure BonkHUD is available if (!window.bonkHUD) { console.error("BonkHUD is not loaded. Please make sure BonkHUD is installed."); return; } this.loadSettings(); this.setWindowContent(); this.setSettingsContent(); this.createWindow(); this.addStyles(); // Add event listener for chat messages bonkAPI.addEventListener("chatIn", (e) => { if (this.globalMute) return; this.sounds.forEach((sound) => { if (sound.enabled && e.message === sound.triggerMessage) { this.playSound(sound.audioUrl); } }); }); console.log(this.windowConfigs.windowName + " initialized"); }; // Function to play audio soundBoard.playSound = function (url) { let audio = new Audio(url); audio.play(); }; // Function to handle document readiness and initialize the mod soundBoard.onDocumentReady = function () { if (document.readyState === "complete" || document.readyState === "interactive") { this.initMod(); } else { document.addEventListener("DOMContentLoaded", () => { this.initMod(); }); } }; // Call the function to check document readiness and initialize the mod soundBoard.onDocumentReady();