您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
tester
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/534027/1591171/koc%20chatv2.js
Tabs.TabDemo = { tabOrder: 8001, tabLabel: 'Truce/AP Monitor', tabColor: 'blue', myDiv: null, Options: { Counter: 0, }, targets: [], init: function(div) { var t = Tabs.TabDemo; t.myDiv = div; if (!Options.TabDemo) { Options.TabDemo = t.Options; } else { for (var y in t.Options) { if (!Options.TabDemo.hasOwnProperty(y)) { Options.TabDemo[y] = t.Options[y]; } } } }, hide: function() { var t = Tabs.TabDemo; }, show: function() { var t = Tabs.TabDemo; t.loadTargets(); t.displayTargetList(); }, paint: function() { var m = ` <div class="divHeader" align="center">Truce/AP Monitor</div> <br> <div align="center"> <label for="targetInput">Player Name/UID:</label> <input type="text" id="targetInput" class="btInput"> <button id="addTargetButton" class="buttonv2 std blue">Add Target</button> <br><br> <div id="targetList"></div> <br> <div id="truceMonitorStatus"></div> </div> `; this.myDiv.innerHTML = m; // Event listeners var self = this; $("#addTargetButton").click(function() { self.addTarget(); }); }, addTarget: function() { var targetInput = $("#targetInput").val().trim(); if (targetInput === "") { return; } var self = this; getPlayerInfo(targetInput) .then(function(player) { if (player) { self.targets.push(player); self.saveTargets(); self.displayTargetList(); self.updateStatus(tx("Target added.")); } else { self.updateStatus(tx("Player not found.")); } }) .catch(function(error) { self.updateStatus(tx("Error adding target: ") + error.message); }); $("#targetInput").val(""); // Clear input field }, displayTargetList: function() { var targetList = $("#targetList"); targetList.empty(); if (this.targets.length === 0) { targetList.append("<p>No targets are currently being monitored.</p>"); return; } var html = "<ul>"; this.targets.forEach(function(target) { html += `<li>${target.name} (${target.uid})</li>`; }); html += "</ul>"; targetList.html(html); }, checkTrucesAndAP: function() { var self = this; this.targets.forEach(function(target) { var truceEnds = getTruceEndTime(target); var apEnds = getAPEndTime(target); if (truceEnds) { self.displayTruceInfo(target, truceEnds); } if (apEnds) { self.displayAPInfo(target, apEnds); } }); }, displayTruceInfo: function(target, endTime) { var timeLeft = endTime - unixTime(); if (timeLeft <= 0) { this.notifyTruceEnded(target); } else { var hours = Math.floor(timeLeft / 3600); var minutes = Math.floor((timeLeft % 3600) / 60); $("#targetList").append( `<p>${target.name}'s truce ends in ${hours}h ${minutes}m</p>` ); } }, displayAPInfo: function(target, endTime) { var timeLeft = endTime - unixTime(); if (timeLeft <= 0) { this.notifyAPEnded(target); } else { var hours = Math.floor(timeLeft / 3600); var minutes = Math.floor((timeLeft % 3600) / 60); $("#targetList").append( `<p>${target.name}'s AP ends in ${hours}h ${minutes}m</p>` ); } }, notifyTruceEnded: function(target) { this.updateStatus("Target " + target.name + "'s truce has ended!"); this.playNotificationSound(); }, notifyAPEnded: function(target) { this.updateStatus("Target " + target.name + "'s AP has ended!"); this.playNotificationSound(); }, updateStatus: function(message) { $("#truceMonitorStatus").html(message); }, saveTargets: function() { GM_setValue("truceTargets", JSON.stringify(this.targets)); }, loadTargets: function() { var savedTargets = GM_getValue("truceTargets", "[]"); this.targets = JSON.parse(savedTargets); }, playNotificationSound: function() { var audio = new Audio("/sounds/notification.mp3"); audio.play(); }, hide: function() { // Clear interval when hiding if (this.checkInterval) { clearInterval(this.checkInterval); } }, EverySecond: function() { this.checkTrucesAndAP(); } };