Greasy Fork

Greasy Fork is available in English.

Powerline Respawner

Auto respawn to death point for powerline

当前为 2024-08-22 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Powerline Respawner
// @author       Rumini - Discord: rumini & rainbowdxsh_ & A0
// @description  Auto respawn to death point for powerline
// @version      1.0
// @match        *://powerline.io/*
// @icon         https://i.imgur.com/bfcFQF7.png
// @license      MIT
// @run-at       document-start
// @namespace http://greasyfork.icu/users/1356205
// ==/UserScript==

if (window.location.href === 'https://powerline.io/') {
  window.location.href = 'https://powerline.io/maindev.html';
}

(function () {
  'use strict';

  let currentPosition = { x: 0, y: 0 };
  let lastSnakeId = null;
  let trackingInterval = null;
  let storedLastPosition = null;

  const DIRECTION_UP = 1;
  const DIRECTION_LEFT = 2;
  const DIRECTION_DOWN = 3;
  const DIRECTION_RIGHT = 4;

  function waitForGame(callback) {
    if (typeof Snake !== 'undefined' && typeof localPlayer !== 'undefined' &&
        typeof input !== 'undefined' && typeof entities !== 'undefined' &&
        typeof localPlayerID !== 'undefined' && typeof hud !== 'undefined') {
      callback();
    } else {
      setTimeout(() => waitForGame(callback), 100);
    }
  }

  function teleportTurn(direction, x, y, fakelag1, fakelag2) {
    if (antiLagEnabled) {
      if (0) {
        localPlayer.setTurnPoint(direction, x, y);
      } else {
        var timeNow = +new Date();
        var deltaTime = timeNow - lastTurnTime;
        lastTurnTime = timeNow;
        if (deltaTime < 30) {
          fakelag1 += 30;
        }

        var selectedPoint = localPlayer.addTurnPoint(direction, fakelag1);
      }

      if (direction == DIRECTION_UP || direction == DIRECTION_DOWN) {
        x = storedLastPosition ? storedLastPosition.x * GAME_SCALE : x;
      } else {
        y = storedLastPosition ? storedLastPosition.y * GAME_SCALE : y;
      }

      localPlayer.x = x / GAME_SCALE;
      localPlayer.y = -y / GAME_SCALE;

      localPlayer.headPos.x = x / GAME_SCALE;
      localPlayer.headPos.y = -y / GAME_SCALE;

      var coord;
      if (direction == DIRECTION_UP || direction == DIRECTION_DOWN)
        coord = x / GAME_SCALE;
      else
        coord = -y / GAME_SCALE;

      network.sendTurnPoint(direction, coord);
    } else {
      network.sendDirection(direction);
    }
  }

  function syncTurn(direction, x, y, fakelag1, fakelag2) {
    if (antiLagEnabled) {
      if (0) {
        localPlayer.setTurnPoint(direction, x, y);
      } else {
        var timeNow = +new Date();
        var deltaTime = timeNow - lastTurnTime;
        lastTurnTime = timeNow;
        if (deltaTime < 30) {
          fakelag1 += 30;
        }

        var selectedPoint = localPlayer.addTurnPoint(direction, fakelag1);
        x = selectedPoint.x * GAME_SCALE;
        y = selectedPoint.y * GAME_SCALE;
      }

      var coord;
      if (direction == DIRECTION_UP || direction == DIRECTION_DOWN)
        coord = x / GAME_SCALE;
      else
        coord = -y / GAME_SCALE;

      network.sendTurnPoint(direction, coord);
    } else {
      network.sendDirection(direction);
    }
  }

  function sendSyncTurn(snake) {
    if (localPlayer && storedLastPosition) {
      var x = snake.headPos.x;
      var y = snake.headPos.y;
      var fakelag1 = globalWebLag;
      var fakelag2 = 0;

      switch (input.direction) {
        case DIRECTION_UP:
        case DIRECTION_DOWN:
          input.direction = (localPlayer.x / GAME_SCALE > storedLastPosition.x) ? DIRECTION_RIGHT : DIRECTION_LEFT;
          break;
        case DIRECTION_LEFT:
        case DIRECTION_RIGHT:
          input.direction = (localPlayer.y / GAME_SCALE > storedLastPosition.y) ? DIRECTION_DOWN : DIRECTION_UP;
          break;
      }


      syncTurn(input.direction, x, y, fakelag1, fakelag2);
    }
  }

  function sendTeleportTurn(snake) {
    if (localPlayer) {
      var x = snake.headPos.x;
      var y = snake.headPos.y;
      var fakelag1 = globalWebLag;
      var fakelag2 = 0;

      input.direction = snake.direction;

      teleportTurn(input.direction, x, y, fakelag1, fakelag2);
    }
  }

  function sendNormalTurn() {
    if (localPlayer) {
        const x = localPlayer.x;
        const y = localPlayer.y;
        const fakelag1 = globalWebLag;
        const fakelag2 = 0;

        if (input.direction === DIRECTION_UP || input.direction === DIRECTION_DOWN) {
            if (x < 0) {
                input.direction = DIRECTION_RIGHT;
            } else if (x >= 0) {
                input.direction = DIRECTION_LEFT;
            }
        } else {
            input.direction = DIRECTION_UP;
        }

        input.turn(input.direction, x, y, fakelag1, fakelag2);
    }
  }

  function teleport() {
    const snake = localPlayer;
    if (!snake) return;

    const actions = [
        { func: sendSyncTurn, delay: 0 },
        { func: sendTeleportTurn, delay: 10 },
        { func: sendNormalTurn, delay: 20 },
        { func: sendSyncTurn, delay: 600 },
        { func: sendTeleportTurn, delay: 10 }
    ];

    let cumulativeDelay = 0;

    actions.forEach(action => {
        cumulativeDelay += action.delay;
        setTimeout(() => {
            action.func(snake);
        }, cumulativeDelay);
    });
  }

  function trackPosition() {
    const currentSnakeId = localPlayerID;

    if (lastSnakeId !== null && lastSnakeId !== 0 && currentSnakeId === 0) {
      storeLastPosition();
    }

    if (currentSnakeId !== 0) {
      const snake = entities[currentSnakeId];
      if (snake) {
        currentPosition = {
          x: snake.lastServerX / GAME_SCALE,
          y: snake.lastServerY / GAME_SCALE
        };
      }
    }

    lastSnakeId = currentSnakeId;
  }

  function storeLastPosition() {
    storedLastPosition = { ...currentPosition };
    displayStoredPosition();
  }

  function displayStoredPosition() {
    if (storedLastPosition) {
      const { x, y } = storedLastPosition;
      const message = `Stored last position: X ${x.toFixed(2)}, Y ${y.toFixed(2)}`;
      hud.showTip(message, 5000);
      console.log(message);
    }
  }

  function startTracking() {
    trackingInterval = setInterval(trackPosition, 100);
    console.log("Position tracking started");
  }

  waitForGame(() => {
    startTracking();

    document.addEventListener('keydown', e => {
      if (e.key === 'r') {
        teleport();
        hud.showTip("Teleported!", 1000);
      }
    });
  });
})();