Dead Frontier Market Value on Hover

Show market prices on hover for ammo and singular items like Repair Kits and Easter Eggs.

目前為 2025-04-25 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Dead Frontier Market Value on Hover
// @namespace    http://tampermonkey.net/
// @version      1.1
// @license MIT
// @description  Show market prices on hover for ammo and singular items like Repair Kits and Easter Eggs.
// @author       Zega
// @match        https://fairview.deadfrontier.com/*
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    const itemNames = {
        "repairkit": "Repair Kit",
        "biomassammo": "Biomass",
      "20gaugeammo": "20 gauge shells",
      "16gaugeammo": "16 gauge shells",
      "10gaugeammo": "10 gauge shells",
      "12gaugeammo": "12 gauge shells",
      "38ammo": ".38 Handgun Bullets",
      "40ammo": ".40 Handgun Bullets",
      "45ammo": ".45 Handgun Bullets",
      "50ammo": ".50 Handgun Bullets",
      "fuelammo": "Gasoline",
      "55ammo": ".55 Handgun Bullets",
      "35ammo": "9mm Handgun Bullets",
      "357ammo": ".357 Handgun Bullets",
        "32ammo": ".32 Handgun Bullets",
      "9rifleammo": "9mm Rifle Bullets",
       "55rifleammo": "5.5mm Rifle Bullets",
       "75rifleammo": "7.5mm Rifle Bullets",
       "127rifleammo": "12.7mm Rifle Bullets",
       "14rifleammo": "14mm Rifle Bullets",
      "heavygrenadeammo": "Heavy Grenades",
      "grenadeammo": "grenades",
      "energycellammo": "Energy Cell",
      "nerotonin8b": "Nerotonin 8b",
      "inhaler": "Inhaler",
        "nerotonin5a": "Nerotonin 5A",
        "steroids": "Steroids",
        "woodenplanks": "Wooden Planks",
        "nails": "Nails",
        "energybar": "Energy Bar",
        "whiskey": "whiskey",
        "driedtruffles": "Dried Truffles",
        "meatjerky": "Meat Jerky",
      
        "easteregg2025": "Easter Egg 2025", 
      "trickortreat2024": "Trick Or Treat 2024", // Add easter egg or any singular item here
        // Add more item mappings as needed
    };

    const style = document.createElement('style');
    style.textContent = `
        .price-tooltip {
            position: absolute;
            background: rgba(0, 0, 0, 0.85);
            color: white;
            padding: 6px 10px;
            font-size: 12px;
            border-radius: 6px;
            z-index: 9999;
            pointer-events: none;
            display: none;
        }
    `;
    document.head.appendChild(style);

    const tooltip = document.createElement('div');
    tooltip.className = 'price-tooltip';
    document.body.appendChild(tooltip);

    function attachListeners() {
        document.querySelectorAll('.item:not([data-hover-added])').forEach(item => {
            item.setAttribute('data-hover-added', 'true');

            item.addEventListener('mouseenter', e => {
                const type = item.getAttribute('data-type');
                const nameAttr = item.getAttribute('data-name');
                const name = itemNames[type] || nameAttr;

                console.log("Hovered item:", { type, name });

                const stack = parseInt(item.getAttribute('data-quantity')) || 1; // Default to 1 for singular items
                if (name && stack > 0) fetchAndShowPrice(name, e, stack);
            });

            item.addEventListener('mouseleave', () => {
                tooltip.style.display = 'none';
            });
        });
    }

    const observer = new MutationObserver(attachListeners);
    observer.observe(document.body, { childList: true, subtree: true });

    function fetchAndShowPrice(itemName, event, stackCount) {
        const hash = getCookie('DeadFrontierFairview');
        const pagetime = Math.floor(Date.now() / 1000);

        const payload = {
            hash,
            pagetime,
            tradezone: 21,
            searchname: itemName,
            memID: '',
            profession: '',
            category: '',
            search: 'trades',
            searchtype: 'buyinglistitemname'
        };

        console.log("Fetching price for:", itemName); 

        fetch('https://fairview.deadfrontier.com/onlinezombiemmo/trade_search.php', {
            method: 'POST',
            headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
            body: Object.entries(payload).map(([k, v]) => `${k}=${encodeURIComponent(v)}`).join('&')
        })
        .then(res => res.text())
        .then(text => {
            console.log("Market Response: ", text); 
            const msg = parseMarketResponse(text, stackCount, itemName);
            showTooltip(msg, event);
        })
        .catch(err => {
            console.error("Fetch error:", err);
            showTooltip("Error fetching price", event);
        });
    }

    function parseMarketResponse(html, stackCount, itemName) {
        console.log("Raw HTML Response:", html);

        const regex = /tradelist_\d+_price=(\d+)&.*?tradelist_\d+_quantity=(\d+)/g;
        const entries = [];
        let match;

        while ((match = regex.exec(html)) !== null) {
            const price = parseInt(match[1]);
            const quantity = parseInt(match[2]);
            if (quantity > 0) {
                const perUnit = price / quantity;
                entries.push({ price, quantity, perUnit });
            }
        }

        console.log("Parsed Market Entries: ", entries);

        if (entries.length === 0) {
            console.log("No listings found for the item");
            return "Price not available";
        }

        entries.sort((a, b) => a.perUnit - b.perUnit);
        const best = entries[0];

        // For singular items like Repair Kit or Easter Egg
        if (stackCount === 1) {
            return `Value: $${best.price.toFixed(2)}`;
        }

        const totalValue = (best.perUnit * stackCount).toFixed(2);
        console.log("Total Value for Stack:", totalValue);

        return `Value: $${totalValue}`;
    }

    function showTooltip(msg, e) {
        tooltip.textContent = msg;
        tooltip.style.left = `${e.pageX + 12}px`;
        tooltip.style.top = `${e.pageY + 12}px`;
        tooltip.style.display = 'block';
    }

    function getCookie(name) {
        const value = `; ${document.cookie}`;
        const parts = value.split(`; ${name}=`);
        return parts.length === 2 ? parts.pop().split(';')[0] : null;
    }

    attachListeners();
})();

QingJ © 2025

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