Greasy Fork

来自缓存

Greasy Fork is available in English.

[银河奶牛]怪物换皮 + 战败cg

替换怪物图标为自定义图片URL,替换玩家死亡和怪物死亡时为自定义图片URL

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         [银河奶牛]怪物换皮 + 战败cg
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  替换怪物图标为自定义图片URL,替换玩家死亡和怪物死亡时为自定义图片URL
// @match        https://www.milkywayidle.com/*
// @grant        none
// @license      MIT

// ==/UserScript==

(function () {
  'use strict';

  const monsterImageMap = {
    'fly': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'rat': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'skunk': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'porcupine': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'slimy': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'frog': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'snake': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'swampy': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'alligator': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'sea_snail': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'crab': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'aquahorse': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'nom_nom': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'turtle': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'jungle_sprite': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'myconid': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'treant': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'centaur_archer': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'stabby': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'slashy': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'smashy': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'shooty': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'boomy': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'eye': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'eyes': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'veyes': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'novice_sorcerer': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'ice_sorcerer': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'flame_sorcerer': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'elementalist': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'gummy_bear': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'panda': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'black_bear': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'grizzly_bear': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'polar_bear': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'zombie': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'vampire': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'werewolf': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'abyssal_imp': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'soul_hunter': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'infernal_warlock': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'granite_golem': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'magnetic_golem': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'stalactite_golem': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'crystal_colossus': 'https://tupian.li/images/2025/04/18/680c4019ce7a1.gif',
    'giant_shoebill': 'https://tupian.li/images/2025/04/18/680c4019ce7a1.gif',
    'marine_huntress': 'https://tupian.li/images/2025/04/18/680c4019ce7a1.gif',
    'luna_empress': 'https://tupian.li/images/2025/04/18/680c4019ce7a1.gif',
    'gobo_chieftain': 'https://tupian.li/images/2025/04/18/680c4019ce7a1.gif',
    'the_watcher': 'https://tupian.li/images/2025/04/18/680c4019ce7a1.gif',
    'chronofrost_sorcerer': 'https://tupian.li/images/2025/04/18/680c4019ce7a1.gif',
    'red_panda': 'https://tupian.li/images/2025/04/18/680c4019ce7a1.gif',
    'dusk_revenant': 'https://tupian.li/images/2025/04/18/680c4019ce7a1.gif',
    'demonic_overlord': 'https://tupian.li/images/2025/04/18/680c4019ce7a1.gif',
  };

  const reviveImageUrl = 'https://tupian.li/images/2025/04/18/6801c297a15ef.gif'; // 玩家战败cg
  const monsterDeadImageUrl = 'https://tupian.li/images/2025/04/18/6801c297a15ef.gif';// 怪物战败cg
  let isPlayerReplaced = false;
  let originalPlayerModel = null;


  // 替换怪物图标
  const replaceIcons = () => {
    document.querySelectorAll('svg use[href*="combat_monsters_sprite"]').forEach(useEl => {
      const svgEl = useEl.closest('svg');
      if (!svgEl) return;

      const modelContainer = svgEl.closest('.CombatUnit_model__2qQML');
      if (!modelContainer) return;

      const href = useEl.getAttribute('href');
      const monsterId = Object.keys(monsterImageMap).find(id => href.endsWith(id));

      if (monsterId) {
        modelContainer.innerHTML = `
          <div style="width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;">
            <img src="${monsterImageMap[monsterId]}" alt="${monsterId}" style="max-height: 100px;" />
          </div>
        `;
      }
    });
  };

  // 怪物战败cg
  const checkMonsterDeathStatus = () => {
    const monsters = document.querySelectorAll('.CombatUnit_combatUnit__1m3XT');
    monsters.forEach((unit) => {
      const isDead = unit.classList.contains('CombatUnit_dead__10Kxb');
      const modelContainer = unit.querySelector('.CombatUnit_model__2qQML');
      if (!modelContainer) return;
      if (isDead && !unit._originalMonsterModel) {
        unit._originalMonsterModel = modelContainer.cloneNode(true);
        modelContainer.innerHTML = `
          <div style="width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;">
            <img src="${monsterDeadImageUrl}" alt="已死亡" style="max-height: 100px;" />
          </div>
        `;
      } else if (!isDead && unit._originalMonsterModel) {
        modelContainer.replaceWith(unit._originalMonsterModel);
        unit._originalMonsterModel = null;
      }
    });
  };

  // 玩家战败cg
  const checkReviveStatus = () => {
    const unit = document.querySelector('.CombatUnit_combatUnit__1m3XT'); // 玩家一般在第一个
    const reviveOverlay = unit?.querySelector('.CountdownOverlay_countdownOverlay__2QRmL');
    const modelContainer = unit?.querySelector('.CombatUnit_model__2qQML');
    if (!unit || !modelContainer) return;
    if (reviveOverlay && !isPlayerReplaced) {
      originalPlayerModel = modelContainer.cloneNode(true);
      modelContainer.innerHTML = `
        <div style="width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;">
          <img src="${reviveImageUrl}" alt="复活中" style="max-height: 100px;" />
        </div>
      `;
      isPlayerReplaced = true;
    } else if (!reviveOverlay && isPlayerReplaced && originalPlayerModel) {
      modelContainer.replaceWith(originalPlayerModel);
      isPlayerReplaced = false;
      originalPlayerModel = null;
    }
  };

  // 监听
  const observer = new MutationObserver(() => {
    replaceIcons();
    checkMonsterDeathStatus();
    checkReviveStatus();
  });

  observer.observe(document.body, { childList: true, subtree: true });

  // 初始化
  setTimeout(() => {
    replaceIcons();
    checkMonsterDeathStatus();
    checkReviveStatus();
  }, 500);

  // 定时器
  setInterval(checkMonsterDeathStatus, 500);
  setInterval(checkReviveStatus, 500);

})();