// ==UserScript==
// @name IB Minimap
// @namespace http://tampermonkey.net/
// @version 0.4
// @description IB PixelPlanet Minimap
// @author IlyaBOT
// @match https://pixelplanet.fun/*
// @match http://pixelplanet.fun/*
// @homepage https://github.com/IlyaBOT/IBminimap
// @updateURL https://raw.githubusercontent.com/IlyaBOT/IBminimap/main/minimap.user.js
// @downloadURL https://raw.githubusercontent.com/IlyaBOT/IBminimap/main/minimap.user.js
// @grant none
// ==/UserScript==
Number.prototype.between = function(a, b) {
var min = Math.min.apply(Math, [a, b]),
max = Math.max.apply(Math, [a, b]);
return this > min && this < max;
};
var range = 45;
window.baseTepmlateUrl = 'https://raw.githubusercontent.com/IlyaBOT/IBminimap/main/';
window.addEventListener('load', function () {
//Регулярное выражение для получения координат из URL-адреса
re = /(.*)\/\?p=(\-?(?:\d*)),(\-?(?:\d*))/g;
//Регулярное выражение для получения координат от курсора
rec = /x\:(\d*) y\:(\d*)/g;
//DOM Элемент отображаемых переменных X, Y
coorDOM = null;
findCoor();
//Координаты середины окна
x_window = 0;
y_window = 0;
//Координаты курсора
x = 0;
y = 0;
//Список всех доступных шаблонов
template_list = null;
zoomlevel = 2;
//Изменяющиеся параметры
toggle_show = true;
toggle_follow = true; //Если миникарта следует за окном, x_window = x и y_window = y;
zooming_in = false;
zooming_out = false;
zoom_time = 100;
//Массив со всеми загруженными изображениями-шаблонами
image_list = [];
counter = 0;
//Шаблоны, которые нужны в текущей области
needed_templates = null;
//Cachebreaker для принудительного обновления
cachebreaker = null;
var div = document.createElement('div');
div.setAttribute('class', 'post block bc2');
div.innerHTML = '
' +
'
' +
'
' +
'
' +
'' +
//'
' +
' Свернуть' +
' | | Масштаб: + / ' +
'-' +
'
' +
'
';
document.body.appendChild(div);
minimap = document.getElementById("minimap");
minimap_board = document.getElementById("minimap-board");
minimap_cursor = document.getElementById("minimap-cursor");
//minimap_settings = document.getElementById("minimapsettings");
minimap.width = minimap.offsetWidth;
minimap_board.width = minimap_board.offsetWidth;
minimap_cursor.width = minimap_cursor.offsetWidth;
minimap.height = minimap.offsetHeight;
minimap_board.height = minimap_board.offsetHeight;
minimap_cursor.height = minimap_cursor.offsetHeight;
//minimap_settings.width = minimap_settings.offsetWidth;
//minimap_settings.height = minimap_settings.offsetHeight;
ctx_minimap = minimap.getContext("2d");
ctx_minimap_board = minimap_board.getContext("2d");
ctx_minimap_cursor = minimap_cursor.getContext("2d");
//ctx_minimap_sett = minimap_settings.getContext("2d"); // Я не знаю почему эта херня не работает...
// Она должна работать, но она не делает этого...
//Никакого сглаживания при масштабировании!
ctx_minimap.mozImageSmoothingEnabled = false;
ctx_minimap.webkitImageSmoothingEnabled = false;
ctx_minimap.msImageSmoothingEnabled = false;
ctx_minimap.imageSmoothingEnabled = false;
drawBoard();
drawCursor();
document.getElementById("hide-map").onclick = function () {
console.log("This should do something, but it doesn't");
toggle_show = false;
document.getElementById("minimap-box").style.display = "none";
document.getElementById("minimap-config").style.display = "none";
document.getElementById("minimap-text").style.display = "block";
document.getElementById("minimap-text").innerHTML = "Развернуть миникарту";
document.getElementById("minimap-text").style.cursor = "pointer";
};
document.getElementById("minimap-text").onclick = function () {
toggle_show = true;
document.getElementById("minimap-box").style.display = "block";
document.getElementById("minimap-config").style.display = "block";
document.getElementById("minimap-text").style.display = "none";
document.getElementById("minimap-text").style.cursor = "default";
loadTemplates();
};
document.getElementById("zoom-plus").addEventListener('mousedown', function (e) {
e.preventDefault();
zooming_in = true;
zooming_out = false;
zoomIn();
}, false);
document.getElementById("zoom-minus").addEventListener('mousedown', function (e) {
e.preventDefault();
zooming_out = true;
zooming_in = false;
zoomOut();
}, false);
document.getElementById("zoom-plus").addEventListener('mouseup', function (e) {
zooming_in = false;
}, false);
document.getElementById("zoom-minus").addEventListener('mouseup', function (e) {
zooming_out = false;
}, false);
addEventListener('mouseup', function (evt) {
if (!toggle_show)
return;
if (!toggle_follow)
setTimeout(getCenter, 100);
}, false);
addEventListener('mousemove', function (evt) {
if (!toggle_show)
return;
coorDOM = document.querySelector('.coorbox');
coordsXY = coorDOM.innerHTML.match(/\d+/g)
//console.log(coordsXY);
x_new = coordsXY[0]*1
y_new = coordsXY[1]*1;
//console.log({x_new,y_new});
if (x != x_new || y != y_new) {
x = parseInt(x_new);
y = parseInt(y_new);
if (toggle_follow) {
x_window = x;
y_window = y;
} else {
drawCursor();
}
loadTemplates();
}
}, false);
updateloop();
}, false);
function updateloop() {
console.log("Updating Template List");
//Получение JSON файла с доступными шаблонами
var xmlhttp = new XMLHttpRequest();
var url = window.baseTepmlateUrl + "templates/data.json?" + new Date().getTime();
xmlhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
template_list = JSON.parse(this.responseText);
if (!toggle_follow)
getCenter();
}
};
xmlhttp.open("GET", url, true);
xmlhttp.send();
console.log("Refresh got forced.");
image_list = [];
loadTemplates();
setTimeout(updateloop, 60000)
}
function toggleShow() {
toggle_show = !toggle_show;
if (toggle_show) {
document.getElementById("minimap-box").style.display = "block";
document.getElementById("minimap-config").style.display = "block";
document.getElementById("minimap-text").style.display = "none";
document.getElementById("minimapbg").onclick = function () {
};
loadTemplates();
} else {
document.getElementById("minimap-box").style.display = "none";
document.getElementById("minimap-config").style.display = "none";
document.getElementById("minimap-text").style.display = "block";
document.getElementById("minimap-text").innerHTML = "Mostrar Minimap";
document.getElementById("minimapbg").onclick = function () {
toggleShow()
};
}
}
function zoomIn() {
if (!zooming_in)
return;
zoomlevel = zoomlevel * 1.1;
if (zoomlevel > 45) {
zoomlevel = 45;
return;
}
drawBoard();
drawCursor();
loadTemplates();
setTimeout(zoomIn, zoom_time);
}
function zoomOut() {
if (!zooming_out)
return;
zoomlevel = zoomlevel / 1.1;
if (zoomlevel < 1) {
zoomlevel = 1;
return;
}
drawBoard();
drawCursor();
loadTemplates();
setTimeout(zoomOut, zoom_time);
}
function loadTemplates() {
if (!toggle_show)
return;
if (template_list == null)
return;
var x_left = x_window * 1 - minimap.width / zoomlevel / 2;
var x_right = x_window * 1 + minimap.width / zoomlevel / 2;
var y_top = y_window * 1 - minimap.height / zoomlevel / 2;
var y_bottom = y_window * 1 + minimap.height / zoomlevel / 2;
//console.log("x_left : " + x_left);
//console.log("x_right : " + x_right);
//console.log("y_top : " + y_top);
//console.log("y_bottom : " + y_bottom);
//console.log(template_list);
var keys = [];
for (var k in template_list) keys.push(k);
needed_templates = [];
var i;
for (i = 0; i < keys.length; i++) {
template = keys[i];
var temp_x = parseInt(template_list[template]["x"]) * 1;
var temp_y = parseInt(template_list[template]["y"]) * 1;
var temp_xr = parseInt(template_list[template]["x"]) + parseInt(template_list[template]["width"]);
var temp_yb = parseInt(template_list[template]["y"]) + parseInt(template_list[template]["height"]);
// if (temp_xr <= x_left || temp_yb <= y_top || temp_x >= x_right || temp_y >= y_bottom)
// continue
if (!x_window.between(temp_x-range*1, temp_xr+range*1))
continue
if (!y_window.between(temp_y-range*1, temp_yb+range*1))
continue
console.log("Template " + template + " is in range!");
// console.log(x_window, y_window);
needed_templates.push(template);
}
if (needed_templates.length == 0) {
if (zooming_in == false && zooming_out == false) {
document.getElementById("minimap-box").style.display = "none";
document.getElementById("minimap-text").style.display = "block";
document.getElementById("minimap-text").innerHTML = "Вы далеко от шаблона.";
}
} else {
document.getElementById("minimap-box").style.display = "block";
document.getElementById("minimap-text").style.display = "none";
counter = 0;
for (i = 0; i < needed_templates.length; i++) {
if (image_list[needed_templates[i]] == null) {
loadImage(needed_templates[i]);
} else {
counter += 1;
//Если загружено последнее необходимое изображение, начинаем рисовать.
if (counter == needed_templates.length)
drawTemplates();
}
}
}
}
function loadImage(imagename) {
console.log(" Load image " + imagename);
image_list[imagename] = new Image();
if (cachebreaker != null)
image_list[imagename].src = window.baseTepmlateUrl +"images/"+template_list[imagename].name;
else
image_list[imagename].src = window.baseTepmlateUrl +"images/"+ template_list[imagename].name;
image_list[imagename].onload = function () {
counter += 1;
//Если загружено последнее необходимое изображение, начинаем рисовать.
if (counter == needed_templates.length)
drawTemplates();
}
}
function drawTemplates() {
ctx_minimap.clearRect(0, 0, minimap.width, minimap.height);
var x_left = x_window * 1 - minimap.width / zoomlevel / 2;
var y_top = y_window * 1 - minimap.height / zoomlevel / 2;
var i;
for (i = 0; i < needed_templates.length; i++) {
var template = needed_templates[i];
var xoff = (template_list[template]["x"] * 1 - x_left * 1) * zoomlevel;
var yoff = (template_list[template]["y"] * 1 - y_top * 1) * zoomlevel;
var newwidth = zoomlevel * image_list[template].width;
var newheight = zoomlevel * image_list[template].height;
var img = image_list[template];
ctx_minimap.drawImage(img, xoff, yoff, newwidth, newheight);
console.log("Drawn!");
}
}
function drawBoard() {
ctx_minimap_board.clearRect(0, 0, minimap_board.width, minimap_board.height);
if (zoomlevel <= 4.6)
return;
ctx_minimap_board.beginPath();
var bw = minimap_board.width + zoomlevel;
var bh = minimap_board.height + zoomlevel;
var xoff_m = (minimap.width / 2) % zoomlevel - zoomlevel;
var yoff_m = (minimap.height / 2) % zoomlevel - zoomlevel;
var z = 1 * zoomlevel;
for (var x = 0; x <= bw; x += z) {
ctx_minimap_board.moveTo(x + xoff_m, yoff_m);
ctx_minimap_board.lineTo(x + xoff_m, bh + yoff_m);
}
for (var x = 0; x <= bh; x += z) {
ctx_minimap_board.moveTo(xoff_m, x + yoff_m);
ctx_minimap_board.lineTo(bw + xoff_m, x + yoff_m);
}
ctx_minimap_board.strokeStyle = "black";
ctx_minimap_board.stroke();
}
function drawCursor() {
var x_left = x_window * 1 - minimap.width / zoomlevel / 2;
var x_right = x_window * 1 + minimap.width / zoomlevel / 2;
var y_top = y_window * 1 - minimap.height / zoomlevel / 2;
var y_bottom = y_window * 1 + minimap.height / zoomlevel / 2;
ctx_minimap_cursor.clearRect(0, 0, minimap_cursor.width, minimap_cursor.height);
if (x < x_left || x > x_right || y < y_top || y > y_bottom)
return
xoff_c = x - x_left;
yoff_c = y - y_top;
ctx_minimap_cursor.beginPath();
ctx_minimap_cursor.lineWidth = zoomlevel / 3;
ctx_minimap_cursor.strokeStyle = "red";
ctx_minimap_cursor.rect(zoomlevel * xoff_c, zoomlevel * yoff_c, zoomlevel, zoomlevel);
ctx_minimap_cursor.stroke();
}
function getCenter() {
var url = window.location.href;
x_window = url.replace(re, '$2');
y_window = url.replace(re, '$3');
if (x_window == url || y_window == url) {
x_window = 0;
y_window = 0;
}
loadTemplates();
}
function findCoor() {
//Все элементы с атрибутами стиля
var elms = document.querySelectorAll("*[style]");
//Выполнение цикла и поиск элемента с правильными атрибутами стиля
/*Array.prototype.forEach.call(elms, function (elm) {
var style = elm.style.cssText;
if (style == "position: absolute; left: 1em; bottom: 1em;") {
console.log("Found It!");
coorDOM = elm.firstChild;
console.log(coorDOM.innerHTML);
}
});*/
coorDOM = document.getElementById("coords");
}
//Мусорка:
//function settings() {
// ctx_minimap_settings.clearRect(0, 0, minimap_settings.width, minimap_settings.height);
// ctx_minimap_settings.beginPath();
// ctx_minimap_settings.lineWidth = 6;
// ctx_minimap_settings.strokeStyle = "black";
// ctx_minimap_settings.rect(0, 0, minimap_settings.width, minimap_settings.height);
// ctx_minimap_settings.stroke();
//}