// ==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 https://greasyfork.org/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);
}
});
});
})();