Browser Implants + True CSS Hover v5.39 (With Inventory Implant)

Browser Implants panel injected below AutoBank; includes Inventory Implant, Boss Map Implant, and others.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Browser Implants + True CSS Hover v5.39 (With Inventory Implant)
// @namespace    Zega
// @version      5.39
// @description  Browser Implants panel injected below AutoBank; includes Inventory Implant, Boss Map Implant, and others.
// @match        https://fairview.deadfrontier.com/onlinezombiemmo/index.php*
// @grant        none
// @run-at       document-start
// ==/UserScript==

(function() {
  'use strict';

  let _autoBankQueued = false, _autoBankDone = false;
  let _qbQueued = false, _qbDone = false;
  let _miniMapQueued = false, _miniMapDone = false;

  function _onAutoBank() {
    if (_autoBankDone) return;
    _autoBankQueued = true;
    if (typeof fillAutoBankSlot === 'function') fillAutoBankSlot();
  }
  function _onQuickBuy() {
    if (_qbDone) return;
    _qbQueued = true;
    if (typeof fillQuickBuySlot === 'function') fillQuickBuySlot();
  }
  function _onMiniBossMap() {
    if (_miniMapDone) return;
    _miniMapQueued = true;
    if (typeof fillMiniBossMapSlot === 'function') fillMiniBossMapSlot();
  }

  Object.defineProperty(window, 'BrowserImplant_AutoBank', {
    configurable:true, enumerable:true,
    set(v) { if(v) _onAutoBank(); Object.defineProperty(window,'BrowserImplant_AutoBank',{value:v,writable:true,configurable:true,enumerable:true}); },
    get(){ return false; }
  });
  Object.defineProperty(window, 'BrowserImplant_QuickBuy', {
    configurable:true, enumerable:true,
    set(v) { if(v) _onQuickBuy(); Object.defineProperty(window,'BrowserImplant_QuickBuy',{value:v,writable:true,configurable:true,enumerable:true}); },
    get(){ return false; }
  });
  Object.defineProperty(window, 'BrowserImplant_MiniBossMap', {
    configurable:true, enumerable:true,
    set(v) { if(v) _onMiniBossMap(); Object.defineProperty(window,'BrowserImplant_MiniBossMap',{value:v,writable:true,configurable:true,enumerable:true}); },
    get(){ return false; }
  });

  window.addEventListener('load', initWhenReady);

  function initWhenReady() {
    const interval = setInterval(() => {
      const rightTd = document.querySelector('td.design2010[style*="right_margin.jpg"]');
      const quickBuy = rightTd?.querySelector('#quickbuy-fieldset');
      const autoBank = rightTd?.querySelector('#auto-bank-panel');
      if (rightTd && quickBuy && autoBank) {
        clearInterval(interval);
        attachImplants(rightTd, autoBank);
      }
    }, 100);
  }

  function attachImplants(rightTd, autoBank) {
    rightTd.style.position = 'relative';
    const panel = document.createElement('div');
    panel.id = 'browser-implant-panel';
    panel.innerHTML = `
      <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;">
        <strong style="color:#ffd700;">Browser Implants</strong>
        <button id="collapse-browser-implant" style="background:none;border:none;color:#ffd700;font-size:16px;cursor:pointer">[–]</button>
      </div>
      <div class="implant-grid" id="implant-grid-container"></div>
    `;
    Object.assign(panel.style, {
      position: 'absolute',
      top: `${autoBank.offsetTop + autoBank.offsetHeight + 8}px`,
      left: autoBank.style.left || '10px',
      width: '420px',
      background: 'rgba(0,0,0,0.35)',
      padding: '8px 12px',
      border: '1px solid #666',
      borderRadius: '8px',
      boxShadow: '0 4px 12px rgba(0,0,0,0.6)',
      zIndex: '10000'
    });
    autoBank.parentNode.insertBefore(panel, autoBank.nextSibling);

    const gridEl = panel.querySelector('#implant-grid-container');
    Object.assign(gridEl.style, {
      display: 'grid',
      gridTemplateColumns: 'repeat(4,36px)',
      gridTemplateRows: 'repeat(2,36px)',
      gap: '4px',
      justifyContent: 'center'
    });

    const collapseBtn = panel.querySelector('#collapse-browser-implant');
    if (localStorage.getItem('browserImplantCollapsed') === 'true') {
      gridEl.style.display = 'none';
      collapseBtn.textContent = '[+]';
    }
    collapseBtn.addEventListener('click', () => {
      const hidden = gridEl.style.display === 'none';
      gridEl.style.display = hidden ? 'grid' : 'none';
      collapseBtn.textContent = hidden ? '[–]' : '[+]';
      localStorage.setItem('browserImplantCollapsed', hidden ? 'false' : 'true');
    });

    const slots = [];
    for (let i = 0; i < 8; i++) {
      const slot = document.createElement('div');
      slot.className = 'slot';
      Object.assign(slot.style, {
        width: '36px', height: '36px', background: 'rgba(255,255,255,0.05)', border: '1px solid #888', borderRadius: '4px', position: 'relative'
      });
      const img = document.createElement('img');
      img.className = 'implant-icon';
      Object.assign(img.style, { position: 'absolute', top: '0', left: '0', objectFit: 'contain', cursor: 'default', display: 'none', width: '100%', height: '100%' });
      const popup = document.createElement('div');
      popup.className = 'hover-popup';
      Object.assign(popup.style, {
        display: 'none', position: 'absolute', bottom: '-58px', left: '50%', transform: 'translateX(-50%)', background: 'rgba(0,0,0,0.85)', padding: '6px', border: '1px solid #555', borderRadius: '6px', flexDirection: 'column', alignItems: 'center', zIndex: '1000', opacity: '0', transition: 'opacity .2s', width: '130px'
      });
      const hoverImg = document.createElement('img');
      hoverImg.className = 'hover-img'; hoverImg.style.width = '50px'; hoverImg.style.height = '50px'; hoverImg.style.marginBottom = '4px'; hoverImg.style.objectFit = 'contain';
      const hoverName = document.createElement('div'); hoverName.className = 'hover-name'; hoverName.style.cssText = 'color:gold;font-size:12px;margin:1px 0;line-height:1.1;text-align:center;';
      const hoverStat = document.createElement('div'); hoverStat.className = 'hover-stat'; hoverStat.style.cssText = hoverName.style.cssText;
      popup.appendChild(hoverImg); popup.appendChild(hoverName); popup.appendChild(hoverStat);
      slot.appendChild(img); slot.appendChild(popup);
      slot.addEventListener('mouseenter', () => { popup.style.display = 'flex'; popup.style.opacity = '1'; });
      slot.addEventListener('mouseleave', () => { popup.style.display = 'none'; popup.style.opacity = '0'; });
      gridEl.appendChild(slot);
      slots.push({ slot, img, hoverImg, hoverName, hoverStat });
    }

    let next = 0;
    function fillSlot(data) {
      if (next >= slots.length) return;
      const { img, hoverImg, hoverName, hoverStat } = slots[next++];
      img.src = data.url; img.style.display = 'block';
      hoverImg.src = data.url;
      hoverName.textContent = data.name;
      hoverStat.textContent = data.stat;
    }

    window.fillAutoBankSlot = () => { _autoBankDone || fillSlot({ url: 'https://files.catbox.moe/ry7yd2.png', name: 'Auto Bank Implant', stat: 'Bank Speed +60%' }); _autoBankDone = true; };
    window.fillQuickBuySlot = () => { _qbDone || fillSlot({ url: 'https://files.catbox.moe/urko7b.png', name: 'QuickBuy Implant', stat: 'Barter Speed +70%' }); _qbDone = true; };
    window.fillMiniBossMapSlot = () => { _miniMapDone || fillSlot({ url: 'https://files.catbox.moe/nvuk60.webp', name: 'Boss Map Implant', stat: 'They cant hide from us. Time to go hunting!' }); _miniMapDone = true; };

    // Always fill core implants
    fillSlot({ url: 'https://files.catbox.moe/y2n5ij.png', name: 'Browser Implant', stat: 'Gain Efficiency +20%' });
    fillSlot({ url: 'https://files.catbox.moe/ry7yd2.png', name: 'Auto Bank Implant', stat: 'Bank Speed +60%' });
    if (window.BrowserImplant_MarketHover) fillSlot({ url: 'https://files.catbox.moe/kqee23.png', name: 'Market Hover Implant', stat: 'Trade Values +15%' });

    // ✅ NEW: Inventory Implant
    if (window.BrowserImplant_InventoryCounter) {
      fillSlot({
        url: 'https://files.catbox.moe/axazel.png',
        name: 'Inventory Implant',
        stat: 'Capacity Awareness +100%'
      });
    }

    if (_qbQueued) window.fillQuickBuySlot();
    if (_miniMapQueued) window.fillMiniBossMapSlot();
  }
})();