Beta Boss

Boss opf

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