Greasy Fork is available in English.

Beta Boss OPF

Battre des boss

Този скрипт не може да бъде инсталиран директно. Това е библиотека за други скриптове и може да бъде използвана с мета-директива // @require https://update.greasyfork.org/scripts/529338/1554083/Beta%20Boss%20OPF.js

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