Beta Boss

Boss opf

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/scripts/529334/1550668/Beta%20Boss.js

  1. // ==UserScript==
  2. // @name Beta Boss
  3. // @namespace Violentmonkey Scripts
  4. // @match https://opfrontier.fr/*
  5. // @grant none
  6. // @version 1.1
  7. // @author -
  8. // ==/UserScript==
  9.  
  10.  
  11. const socket = new WebSocket('wss://bot-discord-ckbl.onrender.com');
  12.  
  13. function resetVariables() {
  14. console.log("Réinitialisation des variables...");
  15. localStorage.setItem("etapeCombat", "0");
  16. }
  17.  
  18.  
  19. // Récupérer l'ID unique depuis le localStorage (ou cookie) et s'assurer que le joueur envoie cet ID au serveur
  20. const playerId = localStorage.getItem('playerId') || generateUniqueId(); // Si pas trouvé, générer un nouvel ID
  21.  
  22. // Stocker cet ID dans localStorage pour qu'il persiste après actualisation
  23. localStorage.setItem('playerId', playerId);
  24.  
  25. let scriptRunning = localStorage.getItem('scriptRunning') === 'true'; // Vérifier si le script était en cours avant l'actualisation
  26.  
  27. socket.onopen = () => {
  28. console.log("Connexion WebSocket ouverte.");
  29. // Envoie l'ID du joueur pour rétablir la session
  30. socket.send(JSON.stringify({ type: 'handshake', playerId }));
  31.  
  32. // Si le script était en cours avant l'actualisation, le redémarrer
  33. if (scriptRunning) {
  34. console.log("Redémarrage du script.");
  35. socket.send("start_script");
  36. allscript(); // Remplace par la fonction que tu veux exécuter
  37. }
  38. };
  39.  
  40. socket.onmessage = (event) => {
  41. console.log("📨 Message reçu :", event.data);
  42. if (event.data === "start_script") {
  43. console.log("🚀 Exécution du script !");
  44. allscript(); // Remplace par la fonction que tu veux exécuter
  45. scriptRunning = true; // Mettre à jour l'état du script
  46. localStorage.setItem('scriptRunning', 'true'); // Persister l'état du script
  47. }
  48.  
  49. if (event.data === "stop_script") {
  50. console.log("Le script a été arrêté.");
  51. scriptRunning = false; // Mettre à jour l'état du script
  52. resetVariables();
  53. localStorage.setItem('scriptRunning', 'false'); // Persister l'état du script
  54. }
  55.  
  56. try {
  57. const data = JSON.parse(event.data);
  58. if (data.type === "activePlayers") {
  59. console.log(`Nombre de joueurs actifs : ${data.count}`);
  60. localStorage.setItem('nb_membres_ge', data.count); // Persister l'état du script
  61. }
  62. if (data.type === "executionLink") {
  63. // Redirige l'utilisateur vers l'URL dans le même onglet
  64. window.location.href = data.url;
  65. }
  66.  
  67. } catch (e) {
  68. console.log("Message reçu :", event.data);
  69. }
  70.  
  71. };
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78. socket.onerror = (error) => {
  79. console.error("❌ Erreur WebSocket :", error);
  80. };
  81.  
  82. socket.onclose = () => {
  83. console.log("🔴 Connexion WebSocket fermée.");
  84. };
  85.  
  86. // Fonction pour générer un ID unique
  87. function generateUniqueId() {
  88. const timestamp = Date.now(); // Récupère le temps actuel en millisecondes
  89. const randomNum = Math.floor(Math.random() * 1000000); // Génère un nombre aléatoire entre 0 et 999999
  90. return `${timestamp}-${randomNum}`; // Combine le timestamp et le nombre aléatoire pour obtenir un ID unique
  91. }
  92.  
  93.  
  94.  
  95. function allscript(){
  96.  
  97. // ==UserScript==
  98. // @name Combat Automatique Boss opf
  99. // @namespace http://tampermonkey.net/
  100. // @version 1.1
  101. // @description Automatisation des combats contre les boss avec gestion d'étapes
  102. // @author TonNom
  103. // @match https://opfrontier.fr/*
  104. // @grant none
  105. // ==/UserScript==
  106.  
  107.  
  108. function resetVariables() {
  109. console.log("Réinitialisation des variables...");
  110. localStorage.setItem("etapeCombat", "0");
  111. }
  112.  
  113.  
  114. if(document.body.innerHTML.indexOf('La page demandée n\'existe pas ou a renvoyé une erreur.') == - 1 &&
  115. document.body.innerHTML.indexOf('Un code a été envoyé pour prévenir contre toutes tentatives de triche') == - 1){
  116. ////////////////////////////////////////////////////////////////////VARIABLES A TOUCHER////////////////////////////////////////////////////////////////////////////////////////////////////
  117. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  118.  
  119. var membre = parseInt(localStorage.getItem("nb_membres_ge"));
  120.  
  121.  
  122. var vie = parseInt(document.getElementById("pv_player").innerHTML);
  123. // Récupérer la valeur actuelle des PV
  124. const pvPlayerElement = document.getElementById('pv_player');
  125. const pvCurrent = parseInt(pvPlayerElement.innerText, 10);
  126.  
  127. // Récupérer la largeur du div représentant la barre de progression (en %)
  128. const progressBar = pvPlayerElement.closest('.text-sm').querySelector('.bg-green-500');
  129. const progressBarWidth = progressBar.style.width; // Valeur en %
  130.  
  131. const vieMax = Math.round(pvCurrent / (parseInt(progressBarWidth, 10) / 100));
  132. console.log('Vie Max:', vieMax);
  133.  
  134.  
  135. var forceTraitement = document.getElementsByClassName("w-full bg-gray-200 rounded-full h-2.5 dark:bg-gray-700")[7].innerHTML
  136. var forcenow = forceTraitement.substring(forceTraitement.indexOf('now="'), forceTraitement.indexOf('aria-valuemin'))
  137. var force = parseInt(forcenow.substring(5, forcenow.indexOf('" ')));
  138. var forceMaxValue = forceTraitement.substring(forceTraitement.indexOf('max="'), forceTraitement.indexOf('</div'))
  139. var forceMax = parseInt(forceMaxValue .substring(5, forceMaxValue .indexOf('">')));
  140.  
  141. if (window.location.href.includes("index.php?page=rassemblement&lieu=")) {
  142.  
  143. // Récupérer le texte qui contient le nombre de membres
  144. let membresText = document.querySelector('#load2 .font-bold').textContent.trim();
  145.  
  146. // Utiliser une expression régulière pour extraire les nombres avant et après le "/"
  147. let matches = membresText.match(/^Membres : (\d+) \/ \d+$/);
  148.  
  149. if (matches) {
  150. // Extraire le nombre de membres (avant le "/")
  151. let membresCount = parseInt(matches[1]);
  152. if(membresCount == membre)
  153. {
  154. const link = document.querySelector("a.font-bold.text-green-600");
  155.  
  156. if (link && link.textContent.includes("Lancer l'assault")) {
  157. console.log("Élément trouvé :", link);
  158. link.click(); // Simule un clic si l'élément est trouvé
  159. } else {
  160. console.log("Aucun élément correspondant trouvé.");
  161. }
  162.  
  163. }
  164. else {setTimeout(function(){location.reload()}, 3000);}
  165. // Afficher le nombre de membres dans la console (ou l'utiliser dans d'autres logiques)
  166. console.log("Nombre de membres : " + membresCount);
  167. } else {
  168. console.error("Le texte des membres n'est pas dans le format attendu");
  169. }
  170.  
  171. }
  172.  
  173.  
  174.  
  175. if (window.location == "https://opfrontier.fr/index.php?page=boss") {
  176. // Liste des stratégies par boss
  177. const strategies = {
  178. "Wapol": ["C", "C", "C", "C", "S", "S", "S", "S", "S", "S", "S"],
  179. "Smoker": ["C", "C", "C", "C", "C", "C", "S", "S", "S", "S", "S", "S", "S"],
  180. "Ener": ["C", "C", "C", "C", "C", "C", "C", "C", "C", "S", "S", "S", "S", "S"],
  181. "Monster Point": ["C", "C", "C", "C", "S", "S", "S", "S", "S"],
  182. "Oz": ["C", "C", "C", "C", "C", "S", "S", "S", "S", "S"],
  183. "PX-1": ["C", "C", "C", "C", "C", "C", "S", "S", "S", "S", "S", "S"],
  184. "Magellan": ["C", "C", "C", "C", "C", "C", "S", "S", "S", "S", "S", "S", "S"],
  185. "Sengoku": ["C", "C", "C", "C", "C", "C", "C", "S", "S", "S", "S", "S", "S", "S"],
  186. "Hody": ["C", "C", "C", "C", "C", "C", "S", "S", "S", "S", "S", "S"],
  187. "Mihawk": ["C", "C", "C", "C", "C", "C", "S", "S", "S", "S", "S", "S"],
  188. "Smiley": ["C", "C", "C", "C", "C", "C","C","C","C","C", "S", "S", "S", "S", "S", "S"],
  189. };
  190.  
  191. // Liens des attaques
  192. const attackLinks = {
  193. "P": "index.php?page=boss&a=2",
  194. "C": "index.php?page=boss&a=33",
  195. "S": "index.php?page=boss&a=39",
  196. };
  197.  
  198. // Sélectionne le div contenant le combat
  199. const combatDiv = document.getElementById("div-combat");
  200.  
  201. // Extraction du texte brut du combat
  202. const tempDiv = document.createElement("div");
  203. tempDiv.innerHTML = combatDiv.innerHTML;
  204. const textContent = tempDiv.innerText.trim();
  205.  
  206. // Séparer chaque phrase proprement
  207. const sentences = textContent.split(/\.\s*|\n/).map(s => s.trim()).filter(s => s);
  208.  
  209. // Trouver la **dernière** attaque de l'ennemi (attaque la plus récente)
  210. const lastEnemyAttack = sentences.find(sentence => sentence.startsWith("L'ennemi")) || "Aucune attaque trouvée";
  211.  
  212. console.log("Dernière attaque de l'ennemi :", lastEnemyAttack);
  213.  
  214. // Fonction pour récupérer le nom du boss sur la page
  215. function getBossName() {
  216. const enemyNameElement = document.querySelector('.flex.flex-col.mt-2.items-center span.font-bold');
  217. let bossNameElement = enemyNameElement ? enemyNameElement.textContent.trim() : null;
  218. if (bossNameElement) return bossNameElement;
  219. let match = document.title.match(/Boss : (\w+)/);
  220. return match ? match[1] : null;
  221. }
  222.  
  223. // Fonction principale d'exécution de la stratégie
  224. async function executeStrategy() {
  225. const bossName = getBossName();
  226. if (!bossName || !strategies[bossName]) {
  227. console.error("Boss non reconnu ou aucune stratégie définie.");
  228. return;
  229. }
  230.  
  231. console.log(`Détection du boss : ${bossName}`);
  232. const strategy = strategies[bossName];
  233.  
  234. // Récupération de l'étape actuelle (0 par défaut)
  235. let etape = parseInt(localStorage.getItem("etapeCombat")) || 0;
  236.  
  237. if (etape >= strategy.length || document.body.innerHTML.includes('Vous êtes KO...')) {
  238. console.log("Toutes les attaques ont été effectuées. Réinitialisation.");
  239. localStorage.setItem("etapeCombat", "0");
  240. return;
  241. }
  242.  
  243. console.log(`Étape actuelle : ${etape + 1} / ${strategy.length}`);
  244.  
  245. // Vérifier si une attaque est déjà sélectionnée
  246. if (isAttackAlreadySelected()) {
  247. if (!localStorage.getItem("combatRefreshed")) {
  248. console.log("Une attaque est déjà sélectionnée. Rafraîchissement de la page...");
  249. localStorage.setItem("combatRefreshed", "true"); // Marquer qu'un refresh a été fait
  250. location.reload();
  251. } else {
  252. console.log("Une attaque est déjà sélectionnée, mais le refresh a déjà été fait. Attente du prochain tour...");
  253. await waitForNextTurn();
  254. localStorage.removeItem("combatRefreshed");
  255. }
  256. return;
  257. }
  258.  
  259. // Une fois une attaque exécutée correctement, on enlève le flag du refresh
  260.  
  261.  
  262. // Déterminer l'attaque à exécuter
  263. let attackAcronym = strategy[etape];
  264.  
  265. // Récupérer la dernière attaque effectuée (étape précédente)
  266. let previousAttack = etape > 0 ? strategy[etape - 1] : null;
  267.  
  268. // Vérifier si la stratégie contient un "P"
  269. let containsP = strategy.includes("P");
  270.  
  271. // ⚡ Vérification spéciale pour "L'ennemi est paralysé"
  272. if (!containsP && lastEnemyAttack === "L'ennemi est paralysé" && attackAcronym !== "S" && previousAttack !== "S") {
  273. console.log("⚠️ Condition spéciale remplie : Exécution de 'C' sans avancer l'étape !");
  274. window.location.href = attackLinks["C"];
  275. return; // NE PAS mettre à jour l'étape
  276. }
  277.  
  278. // Exécuter l'attaque normalement
  279. console.log(`Exécution de l'attaque ${attackAcronym}`);
  280. window.location.href = attackLinks[attackAcronym];
  281.  
  282. // Mise à jour de l'étape pour la prochaine attaque
  283. localStorage.setItem("etapeCombat", etape + 1);
  284.  
  285. // Attente du prochain tour
  286. await waitForNextTurn();
  287. }
  288.  
  289. // Vérifie si une attaque est sélectionnée
  290. function isAttackAlreadySelected() {
  291. return document.querySelector('span.oi-check') !== null;
  292. }
  293.  
  294. // Attend le prochain tour en surveillant l'évolution du timer
  295. function waitForNextTurn() {
  296. return new Promise(resolve => {
  297. const initialTimerValue = parseInt(document.getElementById('timer').innerText, 10);
  298. const interval = setInterval(() => {
  299. const currentTimerValue = parseInt(document.getElementById('timer').innerText, 10);
  300. if (currentTimerValue > initialTimerValue) {
  301. clearInterval(interval);
  302. resolve();
  303. }
  304. }, 1000);
  305. });
  306. }
  307.  
  308. // Lancer la stratégie dès le chargement de la page
  309. executeStrategy();
  310. }
  311.  
  312.  
  313.  
  314.  
  315. //////////////////////////////////////////
  316.  
  317.  
  318.  
  319. (function () {
  320.  
  321. let observer = null;
  322.  
  323.  
  324. function checkAndQuit() {
  325. let enemyHp = document.querySelector("#pv_actu");
  326. let quitButton = document.querySelector("a[href*='fuite=1']");
  327.  
  328. if (enemyHp && parseInt(enemyHp.textContent.trim()) === 0 && quitButton) {
  329. console.log("L'ennemi est à 0 PV, tentative de quitter...");
  330. quitButton.click();
  331. } else {
  332. setTimeout(checkAndQuit, 1000); // Vérifie toutes les secondes
  333. }
  334. }
  335.  
  336.  
  337. if(document.body.innerHTML.indexOf('Vous êtes KO...') != - 1){
  338. window.location = "https://opfrontier.fr/index.php?page=auberge"
  339. localStorage.setItem("etapeCombat", "0");
  340. }
  341.  
  342.  
  343. if(window.location =="https://opfrontier.fr/index.php?page=accueil" && force != forceMax)
  344. {
  345. window.location = "https://opfrontier.fr/index.php?page=auberge"
  346. localStorage.setItem("etapeCombat", "0");
  347.  
  348. }
  349.  
  350. if(window.location == "https://opfrontier.fr/index.php?page=auberge" && vie != vieMax)
  351. {
  352. window.location = "https://opfrontier.fr/index.php?page=sac"
  353. localStorage.setItem("etapeCombat", "0");
  354. }
  355.  
  356. if(window.location == ("https://opfrontier.fr/index.php?page=sac") && vie != vieMax){
  357. window.location = 'https://opfrontier.fr/index.php?page=sac&obj=155';
  358. }
  359.  
  360. if(document.location.href.indexOf("&obj") != -1){
  361. document.querySelector("button[name='consommer']").click();
  362. }
  363.  
  364. checkAndQuit();
  365. })();
  366.  
  367. /////////////////////
  368. }
  369. else {
  370.  
  371. function Sound(url, vol, autoplay, loop)
  372. {
  373. var that = this;
  374.  
  375. that.url = (url === undefined) ? "http://mire.ipadsl.net/speedtest.php" : url;
  376. that.vol = (vol === undefined) ? 1.0 : vol;
  377. that.autoplay = (autoplay === undefined) ? true : autoplay;
  378. that.loop = (loop === undefined) ? false : loop;
  379. that.sample = null;
  380.  
  381. if(that.url !== "http://mire.ipadsl.net/speedtest.php")
  382. {
  383. that.sync = function(){
  384. that.sample.volume = that.vol;
  385. that.sample.loop = that.loop;
  386. that.sample.autoplay = that.autoplay;
  387. setTimeout(function(){ that.sync(); }, 60);
  388. };
  389.  
  390. that.sample = document.createElement("audio");
  391. that.sample.src = that.url;
  392. that.sync();
  393.  
  394. that.play = function(){
  395. if(that.sample)
  396. {
  397. that.sample.play();
  398. }
  399. };
  400.  
  401. that.pause = function(){
  402. if(that.sample)
  403. {
  404. that.sample.pause();
  405. }
  406. };
  407. }
  408. }
  409.  
  410. var test = new Sound("https://www.cjoint.com/doc/15_09/EIyePM8cEQL_One-Piece-Opening-10-Full-Version---We-Are-.mp3");
  411. test.play();
  412. };
  413.  
  414. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址