Greasy Fork is available in English.
Boss opf
Dieses Skript sollte nicht direkt installiert werden. Es handelt sich hier um eine Bibliothek für andere Skripte, welche über folgenden Befehl in den Metadaten eines Skriptes eingebunden wird // @require https://update.greasyfork.org/scripts/529334/1550668/Beta%20Boss.js
// ==UserScript==
// @name Beta Boss
// @namespace Violentmonkey Scripts
// @match https://opfrontier.fr/*
// @grant none
// @version 1.1
// @author -
// ==/UserScript==
const socket = new WebSocket('wss://bot-discord-ckbl.onrender.com');
function resetVariables() {
console.log("Réinitialisation des variables...");
localStorage.setItem("etapeCombat", "0");
}
// Récupérer l'ID unique depuis le localStorage (ou cookie) et s'assurer que le joueur envoie cet ID au serveur
const playerId = localStorage.getItem('playerId') || generateUniqueId(); // Si pas trouvé, générer un nouvel ID
// Stocker cet ID dans localStorage pour qu'il persiste après actualisation
localStorage.setItem('playerId', playerId);
let scriptRunning = localStorage.getItem('scriptRunning') === 'true'; // Vérifier si le script était en cours avant l'actualisation
socket.onopen = () => {
console.log("Connexion WebSocket ouverte.");
// Envoie l'ID du joueur pour rétablir la session
socket.send(JSON.stringify({ type: 'handshake', playerId }));
// Si le script était en cours avant l'actualisation, le redémarrer
if (scriptRunning) {
console.log("Redémarrage du script.");
socket.send("start_script");
allscript(); // Remplace par la fonction que tu veux exécuter
}
};
socket.onmessage = (event) => {
console.log("📨 Message reçu :", event.data);
if (event.data === "start_script") {
console.log("🚀 Exécution du script !");
allscript(); // Remplace par la fonction que tu veux exécuter
scriptRunning = true; // Mettre à jour l'état du script
localStorage.setItem('scriptRunning', 'true'); // Persister l'état du script
}
if (event.data === "stop_script") {
console.log("Le script a été arrêté.");
scriptRunning = false; // Mettre à jour l'état du script
resetVariables();
localStorage.setItem('scriptRunning', 'false'); // Persister l'état du script
}
try {
const data = JSON.parse(event.data);
if (data.type === "activePlayers") {
console.log(`Nombre de joueurs actifs : ${data.count}`);
localStorage.setItem('nb_membres_ge', data.count); // Persister l'état du script
}
if (data.type === "executionLink") {
// Redirige l'utilisateur vers l'URL dans le même onglet
window.location.href = data.url;
}
} catch (e) {
console.log("Message reçu :", event.data);
}
};
socket.onerror = (error) => {
console.error("❌ Erreur WebSocket :", error);
};
socket.onclose = () => {
console.log("🔴 Connexion WebSocket fermée.");
};
// Fonction pour générer un ID unique
function generateUniqueId() {
const timestamp = Date.now(); // Récupère le temps actuel en millisecondes
const randomNum = Math.floor(Math.random() * 1000000); // Génère un nombre aléatoire entre 0 et 999999
return `${timestamp}-${randomNum}`; // Combine le timestamp et le nombre aléatoire pour obtenir un ID unique
}
function allscript(){
// ==UserScript==
// @name Combat Automatique Boss opf
// @namespace http://tampermonkey.net/
// @version 1.1
// @description Automatisation des combats contre les boss avec gestion d'étapes
// @author TonNom
// @match https://opfrontier.fr/*
// @grant none
// ==/UserScript==
function resetVariables() {
console.log("Réinitialisation des variables...");
localStorage.setItem("etapeCombat", "0");
}
if(document.body.innerHTML.indexOf('La page demandée n\'existe pas ou a renvoyé une erreur.') == - 1 &&
document.body.innerHTML.indexOf('Un code a été envoyé pour prévenir contre toutes tentatives de triche') == - 1){
////////////////////////////////////////////////////////////////////VARIABLES A TOUCHER////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
var membre = parseInt(localStorage.getItem("nb_membres_ge"));
var vie = parseInt(document.getElementById("pv_player").innerHTML);
// Récupérer la valeur actuelle des PV
const pvPlayerElement = document.getElementById('pv_player');
const pvCurrent = parseInt(pvPlayerElement.innerText, 10);
// Récupérer la largeur du div représentant la barre de progression (en %)
const progressBar = pvPlayerElement.closest('.text-sm').querySelector('.bg-green-500');
const progressBarWidth = progressBar.style.width; // Valeur en %
const vieMax = Math.round(pvCurrent / (parseInt(progressBarWidth, 10) / 100));
console.log('Vie Max:', vieMax);
var forceTraitement = document.getElementsByClassName("w-full bg-gray-200 rounded-full h-2.5 dark:bg-gray-700")[7].innerHTML
var forcenow = forceTraitement.substring(forceTraitement.indexOf('now="'), forceTraitement.indexOf('aria-valuemin'))
var force = parseInt(forcenow.substring(5, forcenow.indexOf('" ')));
var forceMaxValue = forceTraitement.substring(forceTraitement.indexOf('max="'), forceTraitement.indexOf('</div'))
var forceMax = parseInt(forceMaxValue .substring(5, forceMaxValue .indexOf('">')));
if (window.location.href.includes("index.php?page=rassemblement&lieu=")) {
// Récupérer le texte qui contient le nombre de membres
let membresText = document.querySelector('#load2 .font-bold').textContent.trim();
// Utiliser une expression régulière pour extraire les nombres avant et après le "/"
let matches = membresText.match(/^Membres : (\d+) \/ \d+$/);
if (matches) {
// Extraire le nombre de membres (avant le "/")
let membresCount = parseInt(matches[1]);
if(membresCount == membre)
{
const link = document.querySelector("a.font-bold.text-green-600");
if (link && link.textContent.includes("Lancer l'assault")) {
console.log("Élément trouvé :", link);
link.click(); // Simule un clic si l'élément est trouvé
} else {
console.log("Aucun élément correspondant trouvé.");
}
}
else {setTimeout(function(){location.reload()}, 3000);}
// Afficher le nombre de membres dans la console (ou l'utiliser dans d'autres logiques)
console.log("Nombre de membres : " + membresCount);
} else {
console.error("Le texte des membres n'est pas dans le format attendu");
}
}
if (window.location == "https://opfrontier.fr/index.php?page=boss") {
// Liste des stratégies par boss
const strategies = {
"Wapol": ["C", "C", "C", "C", "S", "S", "S", "S", "S", "S", "S"],
"Smoker": ["C", "C", "C", "C", "C", "C", "S", "S", "S", "S", "S", "S", "S"],
"Ener": ["C", "C", "C", "C", "C", "C", "C", "C", "C", "S", "S", "S", "S", "S"],
"Monster Point": ["C", "C", "C", "C", "S", "S", "S", "S", "S"],
"Oz": ["C", "C", "C", "C", "C", "S", "S", "S", "S", "S"],
"PX-1": ["C", "C", "C", "C", "C", "C", "S", "S", "S", "S", "S", "S"],
"Magellan": ["C", "C", "C", "C", "C", "C", "S", "S", "S", "S", "S", "S", "S"],
"Sengoku": ["C", "C", "C", "C", "C", "C", "C", "S", "S", "S", "S", "S", "S", "S"],
"Hody": ["C", "C", "C", "C", "C", "C", "S", "S", "S", "S", "S", "S"],
"Mihawk": ["C", "C", "C", "C", "C", "C", "S", "S", "S", "S", "S", "S"],
"Smiley": ["C", "C", "C", "C", "C", "C","C","C","C","C", "S", "S", "S", "S", "S", "S"],
};
// Liens des attaques
const attackLinks = {
"P": "index.php?page=boss&a=2",
"C": "index.php?page=boss&a=33",
"S": "index.php?page=boss&a=39",
};
// Sélectionne le div contenant le combat
const combatDiv = document.getElementById("div-combat");
// Extraction du texte brut du combat
const tempDiv = document.createElement("div");
tempDiv.innerHTML = combatDiv.innerHTML;
const textContent = tempDiv.innerText.trim();
// Séparer chaque phrase proprement
const sentences = textContent.split(/\.\s*|\n/).map(s => s.trim()).filter(s => s);
// Trouver la **dernière** attaque de l'ennemi (attaque la plus récente)
const lastEnemyAttack = sentences.find(sentence => sentence.startsWith("L'ennemi")) || "Aucune attaque trouvée";
console.log("Dernière attaque de l'ennemi :", lastEnemyAttack);
// Fonction pour récupérer le nom du boss sur la page
function getBossName() {
const enemyNameElement = document.querySelector('.flex.flex-col.mt-2.items-center span.font-bold');
let bossNameElement = enemyNameElement ? enemyNameElement.textContent.trim() : null;
if (bossNameElement) return bossNameElement;
let match = document.title.match(/Boss : (\w+)/);
return match ? match[1] : null;
}
// Fonction principale d'exécution de la stratégie
async function executeStrategy() {
const bossName = getBossName();
if (!bossName || !strategies[bossName]) {
console.error("Boss non reconnu ou aucune stratégie définie.");
return;
}
console.log(`Détection du boss : ${bossName}`);
const strategy = strategies[bossName];
// Récupération de l'étape actuelle (0 par défaut)
let etape = parseInt(localStorage.getItem("etapeCombat")) || 0;
if (etape >= strategy.length || document.body.innerHTML.includes('Vous êtes KO...')) {
console.log("Toutes les attaques ont été effectuées. Réinitialisation.");
localStorage.setItem("etapeCombat", "0");
return;
}
console.log(`Étape actuelle : ${etape + 1} / ${strategy.length}`);
// Vérifier si une attaque est déjà sélectionnée
if (isAttackAlreadySelected()) {
if (!localStorage.getItem("combatRefreshed")) {
console.log("Une attaque est déjà sélectionnée. Rafraîchissement de la page...");
localStorage.setItem("combatRefreshed", "true"); // Marquer qu'un refresh a été fait
location.reload();
} else {
console.log("Une attaque est déjà sélectionnée, mais le refresh a déjà été fait. Attente du prochain tour...");
await waitForNextTurn();
localStorage.removeItem("combatRefreshed");
}
return;
}
// Une fois une attaque exécutée correctement, on enlève le flag du refresh
// Déterminer l'attaque à exécuter
let attackAcronym = strategy[etape];
// Récupérer la dernière attaque effectuée (étape précédente)
let previousAttack = etape > 0 ? strategy[etape - 1] : null;
// Vérifier si la stratégie contient un "P"
let containsP = strategy.includes("P");
// ⚡ Vérification spéciale pour "L'ennemi est paralysé"
if (!containsP && lastEnemyAttack === "L'ennemi est paralysé" && attackAcronym !== "S" && previousAttack !== "S") {
console.log("⚠️ Condition spéciale remplie : Exécution de 'C' sans avancer l'étape !");
window.location.href = attackLinks["C"];
return; // NE PAS mettre à jour l'étape
}
// Exécuter l'attaque normalement
console.log(`Exécution de l'attaque ${attackAcronym}`);
window.location.href = attackLinks[attackAcronym];
// Mise à jour de l'étape pour la prochaine attaque
localStorage.setItem("etapeCombat", etape + 1);
// Attente du prochain tour
await waitForNextTurn();
}
// Vérifie si une attaque est sélectionnée
function isAttackAlreadySelected() {
return document.querySelector('span.oi-check') !== null;
}
// Attend le prochain tour en surveillant l'évolution du timer
function waitForNextTurn() {
return new Promise(resolve => {
const initialTimerValue = parseInt(document.getElementById('timer').innerText, 10);
const interval = setInterval(() => {
const currentTimerValue = parseInt(document.getElementById('timer').innerText, 10);
if (currentTimerValue > initialTimerValue) {
clearInterval(interval);
resolve();
}
}, 1000);
});
}
// Lancer la stratégie dès le chargement de la page
executeStrategy();
}
//////////////////////////////////////////
(function () {
let observer = null;
function checkAndQuit() {
let enemyHp = document.querySelector("#pv_actu");
let quitButton = document.querySelector("a[href*='fuite=1']");
if (enemyHp && parseInt(enemyHp.textContent.trim()) === 0 && quitButton) {
console.log("L'ennemi est à 0 PV, tentative de quitter...");
quitButton.click();
} else {
setTimeout(checkAndQuit, 1000); // Vérifie toutes les secondes
}
}
if(document.body.innerHTML.indexOf('Vous êtes KO...') != - 1){
window.location = "https://opfrontier.fr/index.php?page=auberge"
localStorage.setItem("etapeCombat", "0");
}
if(window.location =="https://opfrontier.fr/index.php?page=accueil" && force != forceMax)
{
window.location = "https://opfrontier.fr/index.php?page=auberge"
localStorage.setItem("etapeCombat", "0");
}
if(window.location == "https://opfrontier.fr/index.php?page=auberge" && vie != vieMax)
{
window.location = "https://opfrontier.fr/index.php?page=sac"
localStorage.setItem("etapeCombat", "0");
}
if(window.location == ("https://opfrontier.fr/index.php?page=sac") && vie != vieMax){
window.location = 'https://opfrontier.fr/index.php?page=sac&obj=155';
}
if(document.location.href.indexOf("&obj") != -1){
document.querySelector("button[name='consommer']").click();
}
checkAndQuit();
})();
/////////////////////
}
else {
function Sound(url, vol, autoplay, loop)
{
var that = this;
that.url = (url === undefined) ? "http://mire.ipadsl.net/speedtest.php" : url;
that.vol = (vol === undefined) ? 1.0 : vol;
that.autoplay = (autoplay === undefined) ? true : autoplay;
that.loop = (loop === undefined) ? false : loop;
that.sample = null;
if(that.url !== "http://mire.ipadsl.net/speedtest.php")
{
that.sync = function(){
that.sample.volume = that.vol;
that.sample.loop = that.loop;
that.sample.autoplay = that.autoplay;
setTimeout(function(){ that.sync(); }, 60);
};
that.sample = document.createElement("audio");
that.sample.src = that.url;
that.sync();
that.play = function(){
if(that.sample)
{
that.sample.play();
}
};
that.pause = function(){
if(that.sample)
{
that.sample.pause();
}
};
}
}
var test = new Sound("https://www.cjoint.com/doc/15_09/EIyePM8cEQL_One-Piece-Opening-10-Full-Version---We-Are-.mp3");
test.play();
};
}