EA FC 25 Ultimate Pack Manager

Öffnet Packs automatisch und sortiert Karten nach Wertung

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         EA FC 25 Ultimate Pack Manager
// @namespace    http://tampermonkey.net/
// @version      2.0
// @description  Öffnet Packs automatisch und sortiert Karten nach Wertung
// @author       Your Name
// @match        https://www.ea.com/*fc*
// @grant        GM_addStyle
// @require      https://code.jquery.com/jquery-3.6.0.min.js
// ==/UserScript==

(function() {
    'use strict';

    let isOpening = false;
    let openInterval;
    let cardProcessing = false;
    let totalCardsProcessed = 0;

    // Styling für zusätzliche UI-Elemente
    GM_addStyle(`
        .fc-control-panel {
            position: fixed;
            bottom: 20px;
            right: 20px;
            z-index: 99999;
            background: rgba(40, 40, 40, 0.93);
            border-radius: 15px;
            padding: 20px;
            box-shadow: 0 10px 30px rgba(0,0,0,0.5);
            border: 2px solid #00aeff;
            width: 300px;
            color: white;
            font-family: Arial, sans-serif;
        }
        .fc-control-btn {
            display: block;
            width: 100%;
            padding: 15px;
            margin: 10px 0;
            font-size: 18px;
            font-weight: bold;
            text-align: center;
            border-radius: 50px;
            cursor: pointer;
            transition: all 0.3s;
            border: none;
            color: white;
        }
        #fc-start-btn {
            background: linear-gradient(to right, #00c853, #009624);
        }
        #fc-start-btn:hover {
            background: linear-gradient(to right, #00e676, #00c853);
            transform: translateY(-2px);
        }
        #fc-start-btn.stopping {
            background: linear-gradient(to right, #ff5252, #b71c1c);
        }
        .fc-stats {
            text-align: center;
            margin: 15px 0;
            font-size: 16px;
            color: #00aeff;
        }
        .fc-status {
            margin-top: 15px;
            padding: 10px;
            background: rgba(0, 50, 80, 0.4);
            border-radius: 8px;
            font-size: 14px;
            min-height: 40px;
        }
    `);

    // Control Panel erstellen
    const controlPanel = document.createElement('div');
    controlPanel.className = 'fc-control-panel';
    controlPanel.innerHTML = `
        <h3 style="text-align:center; margin-top:0; color:#00aeff">FC 25 Pack Manager</h3>
        <button id="fc-start-btn" class="fc-control-btn">START AUTO-OPEN</button>
        <div class="fc-stats">
            Verarbeitete Karten: <span id="fc-card-count">0</span>
        </div>
        <div class="fc-status" id="fc-status">Bereit zum Starten...</div>
    `;
    document.body.appendChild(controlPanel);

    const startButton = document.getElementById('fc-start-btn');
    const cardCount = document.getElementById('fc-card-count');
    const statusDisplay = document.getElementById('fc-status');

    function updateStatus(message) {
        statusDisplay.textContent = message;
    }

    function findPackElements() {
        // Aktualisierte Selektoren für EA FC 25
        return {
            packButton: document.querySelector('.ut-store-pack-item .ut-store-pack-details-view .ut-button-group button'),
            cardElements: document.querySelectorAll('.ut-item-view .item-info'),
            quickSellBtn: document.querySelector('[data-tid="quick-sell-btn"]'),
            sendToClubBtn: document.querySelector('[data-tid="send-to-club-btn"]'),
            sendToSbcBtn: document.querySelector('[data-tid="squad-building-challenge-btn"]'),
            confirmBtn: document.querySelector('.ut-dialog-content .ut-confirmation-dialog-view .call-to-action'),
            closeBtn: document.querySelector('.ut-dialog-content .ut-dialog-close')
        };
    }

    function getCardRating(cardElement) {
        try {
            const ratingText = cardElement.querySelector('.item-rating').textContent;
            return parseInt(ratingText);
        } catch (e) {
            return 0;
        }
    }

    async function processCard(cardElement) {
        cardProcessing = true;
        cardElement.click();
        await wait(1500);

        const elements = findPackElements();
        const cardRating = getCardRating(cardElement);

        if (cardRating >= 85) {
            // Versuche zuerst in den Verein zu senden
            if (elements.sendToClubBtn) {
                elements.sendToClubBtn.click();
                updateStatus(`Karte (${cardRating}) zum Verein hinzugefügt`);
            } 
            // Falls nicht verfügbar, versende zu SBC
            else if (elements.sendToSbcBtn) {
                elements.sendToSbcBtn.click();
                updateStatus(`Karte (${cardRating}) zu SBC hinzugefügt`);
            }
        } else {
            if (elements.quickSellBtn) {
                elements.quickSellBtn.click();
                await wait(1000);
                
                if (elements.confirmBtn) {
                    elements.confirmBtn.click();
                    updateStatus(`Karte (${cardRating}) schnellverkauft`);
                }
            }
        }

        totalCardsProcessed++;
        cardCount.textContent = totalCardsProcessed;
        await wait(2000);
        cardProcessing = false;
    }

    async function processPack() {
        updateStatus("Verarbeite Pack...");
        await wait(4000);

        const elements = findPackElements();
        if (!elements.cardElements || elements.cardElements.length === 0) {
            updateStatus("Keine Karten gefunden");
            return false;
        }

        // Verarbeite jede Karte nacheinander
        for (const card of elements.cardElements) {
            if (!isOpening) break;
            await processCard(card);
            await wait(1000);
        }

        return true;
    }

    function openNextPack() {
        const elements = findPackElements();
        
        if (elements.packButton && !cardProcessing) {
            elements.packButton.click();
            updateStatus("Öffne Pack...");
            return true;
        }
        
        return false;
    }

    function closePack() {
        const elements = findPackElements();
        if (elements.closeBtn) {
            elements.closeBtn.click();
            updateStatus("Pack geschlossen");
            return true;
        }
        return false;
    }

    async function packOpeningCycle() {
        if (!isOpening) return;

        if (openNextPack()) {
            await wait(3000);
            await processPack();
            await wait(2000);
            closePack();
            await wait(3000);
        } else {
            updateStatus("Warte auf verfügbare Packs...");
        }

        if (isOpening) {
            setTimeout(packOpeningCycle, 3000);
        }
    }

    function startOpening() {
        if (isOpening) return;
        isOpening = true;
        startButton.textContent = 'STOPP';
        startButton.classList.add('stopping');
        updateStatus("Starte automatisches Öffnen...");
        totalCardsProcessed = 0;
        cardCount.textContent = '0';
        packOpeningCycle();
    }

    function stopOpening() {
        isOpening = false;
        startButton.textContent = 'START AUTO-OPEN';
        startButton.classList.remove('stopping');
        updateStatus("Prozess gestoppt");
    }

    startButton.addEventListener('click', function() {
        if (isOpening) {
            stopOpening();
        } else {
            startOpening();
        }
    });

    // Hilfsfunktion für Wartezeiten
    function wait(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }
})();