Combat Online hack

Combat Online

// ==UserScript==
// @name         Combat Online hack
// @match        https://dddavit.github.io/combat/
// @license      MIT
// @version      1.1
// @author       huang-wei-lun
// @description  Combat Online
// @grant        none
// @namespace http://tampermonkey.net/
// ==/UserScript==
(function(){
  // ====== 建立模組選單 ======
  let menuVisible = false;
  const menu = document.createElement('div');
  menu.style.position = 'fixed';
  menu.style.top = '50px';
  menu.style.left = '50px';
  menu.style.background = 'rgba(0,0,0,0.7)';
  menu.style.color = '#fff';
  menu.style.padding = '12px 16px';
  menu.style.borderRadius = '8px';
  menu.style.zIndex = 99999;
  menu.style.cursor = 'move';
  menu.style.userSelect = 'none';
  menu.style.minWidth = '180px';
  menu.style.display = 'none';
  menu.innerHTML = `
    <h3 style="margin:0 0 10px 0;">Combat Online 輔助模組</h3>
    <label><input type="checkbox" id="autoAim"> 自動鎖頭</label><br>
    <label><input type="checkbox" id="showEnemies"> 顯示敵人點位</label><br>
    <label><input type="checkbox" id="invisible"> 隱身</label>
  `;
  document.body.appendChild(menu);

  // ====== 模組選單拖動 ======
  let dragging = false, offsetX = 0, offsetY = 0;
  menu.addEventListener('mousedown', e => {
    dragging = true;
    offsetX = e.clientX - menu.offsetLeft;
    offsetY = e.clientY - menu.offsetTop;
  });
  document.addEventListener('mouseup', () => dragging = false);
  document.addEventListener('mousemove', e => {
    if(dragging){
      menu.style.left = (e.clientX - offsetX) + 'px';
      menu.style.top = (e.clientY - offsetY) + 'px';
    }
  });

  // ====== 熱鍵 M 切換模組選單 ======
  document.addEventListener('keydown', e => {
    if(e.key.toLowerCase() === 'm'){
      menuVisible = !menuVisible;
      menu.style.display = menuVisible ? 'block' : 'none';
    }
  });

  // ====== 建立敵人標記層 ======
  let enemyOverlay = document.createElement('div');
  enemyOverlay.style.position = 'fixed';
  enemyOverlay.style.top = 0;
  enemyOverlay.style.left = 0;
  enemyOverlay.style.width = '100vw';
  enemyOverlay.style.height = '100vh';
  enemyOverlay.style.pointerEvents = 'none';
  enemyOverlay.style.zIndex = '99998';
  document.body.appendChild(enemyOverlay);

  // ====== 主迴圈 ======
  function mainLoop(){
    // 假設遊戲有這些變數,需自行修改對應遊戲資料
    const player = window.player;
    const enemies = window.enemies || [];

    // 顯示敵人點位
    enemyOverlay.innerHTML = '';
    if(document.getElementById('showEnemies').checked){
      enemies.forEach(enemy => {
        if(enemy && enemy.x !== undefined && enemy.y !== undefined){
          // 簡單計算螢幕座標(假設遊戲座標即螢幕座標,實際需轉換)
          let el = document.createElement('div');
          el.style.position = 'absolute';
          el.style.width = '12px';
          el.style.height = '12px';
          el.style.background = 'red';
          el.style.borderRadius = '50%';
          el.style.left = enemy.x + 'px';
          el.style.top = enemy.y + 'px';
          enemyOverlay.appendChild(el);
        }
      });
    }

    // 自動鎖頭
    if(document.getElementById('autoAim').checked && player && enemies.length){
      let closestEnemy = null;
      let minDist = Infinity;
      enemies.forEach(enemy => {
        let dx = enemy.x - player.x;
        let dy = enemy.y - player.y;
        let dist = Math.sqrt(dx*dx + dy*dy);
        if(dist < minDist){
          minDist = dist;
          closestEnemy = enemy;
        }
      });
      if(closestEnemy){
        // 控制玩家朝向敵人(假設 player.angle 是角度)
        player.angle = Math.atan2(closestEnemy.y - player.y, closestEnemy.x - player.x);
      }
    }

    // 隱身
    if(document.getElementById('invisible').checked && player){
      player.visible = false;  // 假設遊戲能這麼控制
    } else if(player){
      player.visible = true;
    }

    requestAnimationFrame(mainLoop);
  }

  mainLoop();
})();