您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
labels panel from catliife
// ==UserScript== // @name labels panel // @namespace http://tampermonkey.net/ // @version 2025-01-19 // @description labels panel from catliife // @author me // @match https://worldcats.ru/play/ // @match https://worldcats.ru/play/?v=b // @match https://catlifeonline.com/play/ // @match https://catlifeonline.com/play/?v=b // @icon https://www.google.com/s2/favicons?sz=64&domain=catlifeonline.com // @grant none // ==/UserScript== // Создаем контейнер для интерфейса var mapUI = document.createElement('div'); mapUI.style.position = 'fixed'; mapUI.style.top = '10px'; mapUI.style.right = '80px'; mapUI.style.zIndex = '9999'; mapUI.style.background = 'rgba(0,0,0,0.7)'; mapUI.style.padding = '10px'; mapUI.style.borderRadius = '5px'; mapUI.style.color = 'white'; mapUI.style.fontFamily = 'Arial'; mapUI.style.width = '300px'; mapUI.style.display = 'none'; // Кнопка для показа/скрытия панели var toggleBtn = document.createElement('button'); toggleBtn.textContent = 'Метки'; toggleBtn.style.position = 'fixed'; toggleBtn.style.top = '10px'; toggleBtn.style.right = '80px'; toggleBtn.style.zIndex = '9998'; toggleBtn.style.padding = '5px 10px'; toggleBtn.style.background = '#3498db'; toggleBtn.style.border = 'none'; toggleBtn.style.borderRadius = '3px'; toggleBtn.style.cursor = 'pointer'; toggleBtn.onclick = function() { mapUI.style.display = mapUI.style.display === 'none' ? 'block' : 'none'; }; document.body.appendChild(toggleBtn); // Заголовок и кнопка закрытия var header = document.createElement('div'); header.style.display = 'flex'; header.style.justifyContent = 'space-between'; header.style.alignItems = 'center'; header.style.marginBottom = '15px'; var title = document.createElement('h3'); title.textContent = 'Панель меток'; title.style.margin = '0'; var closeBtn = document.createElement('button'); closeBtn.textContent = '×'; closeBtn.style.background = 'transparent'; closeBtn.style.border = 'none'; closeBtn.style.color = 'white'; closeBtn.style.fontSize = '20px'; closeBtn.style.cursor = 'pointer'; closeBtn.style.padding = '0 5px'; closeBtn.onclick = function() { mapUI.style.display = 'none'; }; header.appendChild(title); header.appendChild(closeBtn); mapUI.appendChild(header); // Секция для ввода названия var nameSection = document.createElement('div'); nameSection.style.marginBottom = '10px'; var nameLabel = document.createElement('label'); nameLabel.textContent = 'Название локации:'; nameLabel.style.display = 'block'; nameLabel.style.marginBottom = '5px'; var nameInput = document.createElement('input'); nameInput.type = 'text'; nameInput.id = 'wcNameInput'; nameInput.placeholder = 'Введите название'; nameInput.style.width = '100%'; nameInput.style.padding = '5px'; nameSection.appendChild(nameLabel); nameSection.appendChild(nameInput); mapUI.appendChild(nameSection); // Секция для ввода локации var locSection = document.createElement('div'); locSection.style.marginBottom = '15px'; var locLabel = document.createElement('label'); locLabel.textContent = 'ID локации:'; locLabel.style.display = 'block'; locLabel.style.marginBottom = '5px'; var locInput = document.createElement('input'); locInput.type = 'text'; locInput.id = 'wcLocationInput'; locInput.placeholder = 'Введите ID'; locInput.style.width = '100%'; locInput.style.padding = '5px'; locSection.appendChild(locLabel); locSection.appendChild(locInput); mapUI.appendChild(locSection); // Кнопки для меток var btnContainer = document.createElement('div'); btnContainer.style.display = 'flex'; btnContainer.style.flexWrap = 'wrap'; btnContainer.style.gap = '5px'; btnContainer.style.marginBottom = '10px'; var btnResource = createButton('Ресурсы', '#2ecc71'); var btnDanger = createButton('Опасность', '#e74c3c'); var btnCustom = createButton('Своя метка', '#9b59b6'); var btnDelete = createButton('Удалить', '#e74c3c'); btnContainer.appendChild(btnResource); btnContainer.appendChild(btnDanger); btnContainer.appendChild(btnCustom); btnContainer.appendChild(btnDelete); mapUI.appendChild(btnContainer);// Кнопка для просмотра всех меток var btnShowAll = createButton('Все метки', '#f39c12'); btnShowAll.style.marginTop = '10px'; mapUI.appendChild(btnShowAll); // Блок для отображения информации var infoDiv = document.createElement('div'); infoDiv.id = 'wcMarkerInfo'; infoDiv.style.marginTop = '15px'; infoDiv.style.padding = '10px'; infoDiv.style.background = 'rgba(255,255,255,0.1)'; infoDiv.style.borderRadius = '5px'; mapUI.appendChild(infoDiv);// Добавляем контейнер в документ document.body.appendChild(mapUI); // Функция создания кнопки function createButton(text, color) { var btn = document.createElement('button'); btn.textContent = text; btn.style.background = color; btn.style.border = 'none'; btn.style.padding = '5px 10px'; btn.style.borderRadius = '3px'; btn.style.cursor = 'pointer'; btn.style.flex = '1 1 auto'; return btn; } // Загружаем сохраненные метки var savedMarkers = loadMarkers(); // Функция загрузки меток function loadMarkers() { try { var savedData = localStorage.getItem('wcMarkers'); return savedData ? JSON.parse(savedData) : {}; } catch (e) { console.error('Ошибка загрузки меток:', e); return {}; } } // Функция сохранения меток function saveMarkers() { try { localStorage.setItem('wcMarkers', JSON.stringify(savedMarkers)); return true; } catch (e) { console.error('Ошибка сохранения меток:', e); return false; } } // Функция для добавления метки function addMarker(type, color) { var locId = document.getElementById('wcLocationInput').value.trim(); var name = document.getElementById('wcNameInput').value.trim(); if (!locId) return alert('Введите ID локации!'); if (!name) return alert('Введите название локации!'); var details = prompt('Описание для метки "' + type + '":', type); if (details === null) return; if (type === 'Своя метка') { color = prompt('Цвет метки (HEX, например #ff0000):', color); if (color === null) return; } savedMarkers[locId] = { type: type, color: color, name: name, text: details, date: new Date().toLocaleString() }; if (!saveMarkers()) { return alert('Ошибка сохранения! Возможно, закончилось место.'); } alert('✅ Метка добавлена на локацию ' + locId + '!'); } // Функция для удаления метки function deleteMarker() { var locId = document.getElementById('wcLocationInput').value.trim(); if (!locId) return alert('Введите ID локации!'); if (!savedMarkers[locId]) return alert('Метка не найдена!'); if (confirm('Удалить метку для локации ' + locId + '?')) { delete savedMarkers[locId]; if (saveMarkers()) { alert('Метка удалена!'); } else { alert('Ошибка при удалении!'); } } } // Обработчики для кнопок btnResource.onclick = function() { addMarker('Ресурсы', '#2ecc71'); }; btnDanger.onclick = function() { addMarker('Опасность', '#e74c3c'); }; btnCustom.onclick = function() { addMarker('Своя метка', '#9b59b6'); }; btnDelete.onclick = deleteMarker; // Функция для показа всех меток btnShowAll.onclick = showAllMarkers; // Переменная для хранения текущего окна меток var currentMarkersWindow = null; function showAllMarkers() { // Закрываем предыдущее окно, если оно есть if (currentMarkersWindow) { document.body.removeChild(currentMarkersWindow); } currentMarkersWindow = document.createElement('div'); currentMarkersWindow.style.position = 'fixed'; currentMarkersWindow.style.top = '50%'; currentMarkersWindow.style.left = '50%'; currentMarkersWindow.style.transform = 'translate(-50%, -50%)'; currentMarkersWindow.style.background = 'rgba(0,0,0,0.9)'; currentMarkersWindow.style.padding = '20px'; currentMarkersWindow.style.borderRadius = '5px'; currentMarkersWindow.style.zIndex = '10000'; currentMarkersWindow.style.width = '80%'; currentMarkersWindow.style.maxWidth = '600px'; currentMarkersWindow.style.maxHeight = '80vh'; currentMarkersWindow.style.overflow = 'hidden'; currentMarkersWindow.style.color = 'white'; currentMarkersWindow.style.boxShadow = '0 0 20px rgba(0,0,0,0.5)';// Заголовок var header = document.createElement('div'); header.style.display = 'flex'; header.style.justifyContent = 'space-between'; header.style.alignItems = 'center';header.style.marginBottom = '15px'; var title = document.createElement('h3'); title.textContent = 'Все метки (' + Object.keys(savedMarkers).length + ')'; title.style.margin = '0'; var closeBtn = document.createElement('button'); closeBtn.textContent = '×'; closeBtn.style.background = 'transparent'; closeBtn.style.border = 'none'; closeBtn.style.color = 'white'; closeBtn.style.fontSize = '20px'; closeBtn.style.cursor = 'pointer'; closeBtn.style.padding = '0 5px'; closeBtn.onclick = function() { document.body.removeChild(currentMarkersWindow); currentMarkersWindow = null; }; header.appendChild(title); header.appendChild(closeBtn); currentMarkersWindow.appendChild(header); // Контейнер для списка меток var markersContainer = document.createElement('div'); markersContainer.style.maxHeight = 'calc(80vh - 100px)'; markersContainer.style.overflowY = 'auto'; markersContainer.style.paddingRight = '10px'; // Добавляем прокрутку колесиком мыши markersContainer.addEventListener('wheel', function(e) { this.scrollTop += e.deltaY; }); if (Object.keys(savedMarkers).length === 0) { var emptyMsg = document.createElement('div'); emptyMsg.textContent = 'Нет сохраненных меток'; emptyMsg.style.textAlign = 'center'; emptyMsg.style.padding = '20px'; emptyMsg.style.color = '#aaa'; markersContainer.appendChild(emptyMsg); } else { // Сортируем метки по дате (новые сверху) var sortedMarkers = Object.entries(savedMarkers).sort((a, b) => { return new Date(b[1].date) - new Date(a[1].date); }); sortedMarkers.forEach(([locId, marker]) => { var markerElement = createMarkerElement(locId, marker); markersContainer.appendChild(markerElement); }); } currentMarkersWindow.appendChild(markersContainer); document.body.appendChild(currentMarkersWindow); } // Функция создания элемента метки function createMarkerElement(locId, marker) { var markerDiv = document.createElement('div'); markerDiv.style.marginBottom = '15px'; markerDiv.style.padding = '10px'; markerDiv.style.background = 'rgba(255,255,255,0.1)'; markerDiv.style.borderRadius = '5px'; markerDiv.style.borderLeft = '4px solid ' + marker.color; markerDiv.style.position = 'relative'; var locSpan = document.createElement('div'); locSpan.textContent = 'ID: ' + locId; locSpan.style.fontWeight = 'bold'; var nameSpan = document.createElement('div'); nameSpan.textContent = 'Название: ' + marker.name; nameSpan.style.marginTop = '5px'; var typeSpan = document.createElement('div'); typeSpan.textContent = 'Тип: ' + marker.type; typeSpan.style.marginTop = '5px'; var textSpan = document.createElement('div'); textSpan.textContent = 'Описание: ' + marker.text; textSpan.style.marginTop = '5px'; textSpan.style.fontStyle = 'italic'; var dateSpan = document.createElement('div'); dateSpan.textContent = 'Дата: ' + marker.date; dateSpan.style.marginTop = '5px'; dateSpan.style.fontSize = '0.8em'; dateSpan.style.color = '#ccc'; // Кнопка удаления var deleteBtn = document.createElement('button'); deleteBtn.textContent = 'Удалить'; deleteBtn.style.position = 'absolute'; deleteBtn.style.top = '10px'; deleteBtn.style.right = '10px'; deleteBtn.style.background = '#e74c3c'; deleteBtn.style.border = 'none'; deleteBtn.style.padding = '3px 8px'; deleteBtn.style.borderRadius = '3px'; deleteBtn.style.cursor = 'pointer'; deleteBtn.onclick = function() { if (confirm('Удалить метку для локации ' + locId + '?')) { delete savedMarkers[locId]; if (saveMarkers()) { markerDiv.style.opacity = '0.5'; markerDiv.style.transition = 'opacity 0.3s'; setTimeout(function() {markerDiv.remove(); updateMarkersCount(); }, 300); } } };markerDiv.appendChild(locSpan); markerDiv.appendChild(nameSpan); markerDiv.appendChild(typeSpan); markerDiv.appendChild(textSpan); markerDiv.appendChild(dateSpan); markerDiv.appendChild(deleteBtn); return markerDiv; } // Обновление счетчика меток function updateMarkersCount() { if (!currentMarkersWindow) return; var title = currentMarkersWindow.querySelector('h3'); if (title) { title.textContent = 'Все метки (' + Object.keys(savedMarkers).length + ')'; } }