Dead Frontier – Browser Implants + True CSS Hover (v5.19: QuickBuy Description Added)

Browser Implants panel with CSS hover; MarketHover, AutoBank & QuickBuy icons appear instantly; panel moved to left-margin cell and lowered; QuickBuy tooltip updated.

当前为 2025-04-27 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Dead Frontier – Browser Implants + True CSS Hover (v5.19: QuickBuy Description Added)
// @namespace    Zega
// @version      5.19
// @description  Browser Implants panel with CSS hover; MarketHover, AutoBank & QuickBuy icons appear instantly; panel moved to left-margin cell and lowered; QuickBuy tooltip updated.
// @match        https://fairview.deadfrontier.com/onlinezombiemmo/index.php*
// @grant        none
// @run-at       document-start
// ==/UserScript==

(function() {
  'use strict';

  // — AUTO-BANK QUEUEING —
  let _autoBankQueued = false, _autoBankDone = false;
  function _onAutoBank() {
    if (_autoBankDone) return;
    _autoBankQueued = true;
    if (typeof fillAutoBankSlot === 'function') fillAutoBankSlot();
  }
  Object.defineProperty(window, 'BrowserImplant_AutoBank', {
    configurable: true,
    enumerable:   true,
    set(val) {
      if (val) _onAutoBank();
      Object.defineProperty(window, 'BrowserImplant_AutoBank', {
        value:        val,
        writable:     true,
        configurable: true,
        enumerable:   true
      });
    },
    get() { return false; }
  });

  // — QUICKBUY QUEUEING —
  let _qbQueued = false, _qbDone = false;
  function _onQuickBuy() {
    if (_qbDone) return;
    _qbQueued = true;
    if (typeof fillQuickBuySlot === 'function') fillQuickBuySlot();
  }
  Object.defineProperty(window, 'BrowserImplant_QuickBuy', {
    configurable: true,
    enumerable:   true,
    set(val) {
      if (val) _onQuickBuy();
      Object.defineProperty(window, 'BrowserImplant_QuickBuy', {
        value:        val,
        writable:     true,
        configurable: true,
        enumerable:   true
      });
    },
    get() { return false; }
  });

  window.addEventListener('DOMContentLoaded', init);

  function init() {
    const marginTd = document.querySelector("td.design2010[style*='left_margin.jpg']");
    if (!marginTd) return console.warn('Left-margin TD not found');
    marginTd.style.position = 'relative';

    const panel = document.createElement('div');
    panel.id = 'browser-implant-panel';
    panel.innerHTML = `
      <strong style="color:#ffd700;display:block;margin-bottom:4px;text-align:center;">
        Browser Implants
      </strong>
      <div class="implant-grid">
        ${Array(8).fill(0).map((_,i)=>`
          <div class="slot" data-slot="${i}">
            <img class="implant-icon" style="display:none;" />
            <div class="hover-popup">
              <img class="hover-img" src="" />
              <div class="hover-name"></div>
              <div class="hover-stat"></div>
            </div>
          </div>
        `).join('')}
      </div>
    `;
    marginTd.appendChild(panel);

    const slots = panel.querySelectorAll('.slot');
    let next = 0;

    function fill(slot, url, name, stat) {
      const img = slot.querySelector('img.implant-icon');
      const pop = slot.querySelector('.hover-popup');
      img.src = url;
      img.style.display = 'block';
      img.style.width = '100%';
      img.style.height = '100%';
      img.style.objectFit = 'contain';
      pop.querySelector('.hover-img').src = url;
      pop.querySelector('.hover-name').textContent = name;
      pop.querySelector('.hover-stat').textContent = stat;
    }

    // slot 0: Browser Implant
    fill(
      slots[next++],
      'https://files.catbox.moe/y2n5ij.png',
      'Browser Implant',
      'Gain Efficiency In Outpost +20%'
    );

    // slot 1: Market Hover
    if (window.BrowserImplant_MarketHover) {
      fill(
        slots[next++],
        'https://files.catbox.moe/kqee23.png',
        'Market Hover Implant',
        'Quick Access to Trade Values +15%'
      );
    }

    // slot 2: Auto Bank
    window.fillAutoBankSlot = () => {
      if (_autoBankDone || next >= slots.length) return;
      fill(
        slots[next++],
        'https://files.catbox.moe/ry7yd2.png',
        'Auto Bank Implant',
        'Instant bank link—deposits & withdrawals +60% speed!'
      );
      _autoBankDone = true;
    };
    if (_autoBankQueued) window.fillAutoBankSlot();

    // slot 3: QuickBuy
    window.fillQuickBuySlot = () => {
      if (_qbDone || next >= slots.length) return;
      fill(
        slots[next++],
        'https://files.catbox.moe/urko7b.png',
        'QuickBuy Implant',
        'Quickly buy your survival items. 70% Barter Speed!'
      );
      _qbDone = true;
    };
    if (_qbQueued) window.fillQuickBuySlot();

    // disable clicks on slots
    slots.forEach(s => s.addEventListener('click', e => e.stopPropagation()));
  }

  // — STYLES —
  const css = `
    #browser-implant-panel {
      position:absolute;
      top:120px;
      left:10px;
      background:rgba(0,0,0,0.5);
      padding:8px 12px;
      border-radius:6px;
      text-align:center;
      z-index:999;
    }
    #browser-implant-panel .implant-grid {
      display:grid;
      grid-template-columns:repeat(4,36px);
      grid-template-rows:repeat(2,36px);
      gap:4px;
      justify-content:center;
    }
    #browser-implant-panel .slot {
      width:36px;
      height:36px;
      background:rgba(255,255,255,0.05);
      border:1px solid #888;
      border-radius:4px;
      position:relative;
    }
    #browser-implant-panel .slot img.implant-icon {
      position:absolute;
      top:0; left:0;
      width:100%; height:100%;
      object-fit:contain;
      cursor:default;
      display:none;
    }
    #browser-implant-panel .hover-popup {
      display:none;
      position:absolute;
      bottom:-18px;
      left:50%;
      transform:translateX(-50%);
      background:rgba(0,0,0,0.85);
      padding:6px;
      border:1px solid #555;
      border-radius:6px;
      flex-direction:column;
      align-items:center;
      z-index:1000;
      opacity:0;
      transition:opacity .2s;
      width:130px;
    }
    #browser-implant-panel .hover-popup .hover-img {
      width:50px;
      height:50px;
      margin-bottom:4px;
      object-fit:contain;
    }
    #browser-implant-panel .hover-name,
    #browser-implant-panel .hover-stat {
      color:gold;
      font-size:12px;
      margin:1px 0;
      line-height:1.1;
      text-align:center;
    }
    #browser-implant-panel .slot:hover .hover-popup {
      display:flex;
      opacity:1;
    }
    #browser-implant-panel .slot:not(:has(img.implant-icon[style*="display: block"]))
      .hover-popup {
      display:none!important;
      opacity:0!important;
    }
  `;
  const style = document.createElement('style');
  style.textContent = css;
  document.head.appendChild(style);

})();