/
Timur0603
/
rust
Обзор
Документация
Войти
/
Timur0603
/
rust
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
templates/craft.html
438 строк
21 KB
Timur0603
1
14 май 2026, 18:51
14 май 2026, 18:51
fac2b15
Код
Авторство
О чём код?
{% extends 'base.html' %} {% block title %} RUST {% endblock %} {% block extra_css %} * { margin: 0; padding: 0; box-sizing: border-box; } /* ФОН С КАРТИНКОЙ (вставьте свою) */ body { background-image: url('/static/images/rust2.jpg'); background-size: cover; background-attachment: fixed; font-family: 'Segoe UI', 'Inter', system-ui, sans-serif; color: #e0e0e0; position: relative; } /* Затемнение */ body::before { content: ''; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.75); z-index: 0; pointer-events: none; } .container { position: relative; z-index: 10; max-width: 1400px; margin: 0 auto; padding: 1.5rem; } /* ШАПКА */ .header { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 1rem; margin-bottom: 2rem; padding-bottom: 1rem; border-bottom: 1px solid rgba(255, 100, 0, 0.4); } .logo h1 { font-size: 1.8rem; background: linear-gradient(135deg, #ffffff, #ffaa55); background-clip: text; -webkit-background-clip: text; color: transparent; } .logo p { font-size: 0.8rem; color: #ffaa66; } /* КНОПКИ НАВИГАЦИИ */ .nav-links { display: flex; gap: 1rem; flex-wrap: wrap; } .nav-link { background: rgba(0, 0, 0, 0.6); border: 1px solid #ff8c42; color: #ffbb77; padding: 0.5rem 1.5rem; border-radius: 40px; text-decoration: none; font-weight: 600; transition: all 0.2s; } .nav-link:hover { background: #ff8c42; color: #0a0c10; } /* ЗАГОЛОВОК СТРАНИЦЫ */ .page-title { text-align: center; margin: 1rem 0 2rem; } .page-title h2 { font-size: 2.5rem; background: linear-gradient(135deg, #fff, #ffaa55); background-clip: text; -webkit-background-clip: text; color: transparent; } .page-title p { color: #ffaa66; margin-top: 0.5rem; } /* ПОИСК И ФИЛЬТРЫ */ .search-section { margin-bottom: 2rem; } .search-box { display: flex; justify-content: center; margin-bottom: 1.5rem; } .search-box input { width: 100%; max-width: 500px; padding: 0.8rem 1.2rem; background: rgba(10, 12, 18, 0.8); border: 1px solid #3a3a4a; border-radius: 50px; color: #fff; font-size: 1rem; outline: none; transition: 0.2s; } .search-box input:focus { border-color: #ff8c42; } .filter-buttons { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.6rem; } .filter-btn { background: rgba(30, 30, 40, 0.8); border: 1px solid #3a3a4a; padding: 0.4rem 1.2rem; border-radius: 30px; cursor: pointer; color: #ccc; transition: 0.2s; font-size: 0.85rem; } .filter-btn.active { background: #ff8c42; color: #0a0c10; border-color: #ff8c42; } .filter-btn:hover:not(.active) { border-color: #ff8c42; color: #ffaa66; } /* СЕТКА ПРЕДМЕТОВ */ .items-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 1.2rem; margin: 2rem 0; } /* КАРТОЧКА ПРЕДМЕТА */ .item-card { background: rgba(10, 12, 18, 0.75); backdrop-filter: blur(12px); border-radius: 20px; border: 1px solid rgba(255, 100, 0, 0.3); overflow: hidden; transition: transform 0.2s, border-color 0.2s; } .item-card:hover { transform: translateY(-3px); border-color: #ff8c42; } .item-header { padding: 1rem; background: rgba(0, 0, 0, 0.4); border-bottom: 1px solid rgba(255, 100, 0, 0.2); } .item-name { font-size: 1.2rem; font-weight: 700; color: #ffaa66; } .item-category { font-size: 0.7rem; color: #888; text-transform: uppercase; margin-top: 0.2rem; } .crafting-details { padding: 1rem; } .ingredient-list { margin-bottom: 1rem; } .ingredient-item { display: flex; justify-content: space-between; padding: 0.5rem 0; border-bottom: 1px dashed rgba(255, 140, 0, 0.2); font-size: 0.9rem; } .ingredient-name { color: #ccc; } .ingredient-amount { color: #ffaa55; font-weight: 600; } .craft-info { display: flex; justify-content: space-between; margin-top: 0.8rem; padding-top: 0.8rem; border-top: 1px solid rgba(255, 140, 0, 0.3); font-size: 0.8rem; } .workbench-level { color: #6fcf97; } .craft-time { color: #aaa; } .footer { margin-top: 3rem; text-align: center; padding: 1.5rem; border-top: 1px solid rgba(255, 100, 0, 0.3); font-size: 0.75rem; color: #aa9977; } @media (max-width: 700px) { .container { padding: 1rem; } .items-grid { grid-template-columns: 1fr; } .page-title h2 { font-size: 1.8rem; } } </style> {% endblock %} {% block content %} <div class="container"> <!-- ЗАГОЛОВОК --> <div class="page-title"> <h2>🔧 Калькулятор крафта</h2> <p>Рассчитайте стоимость крафта любого предмета в Rust</p> </div> <!-- ПОИСК И ФИЛЬТРЫ --> <div class="search-section"> <div class="search-box"> <input type="text" id="searchInput" placeholder="🔍 Поиск предмета..."> </div> <div class="filter-buttons" id="filterButtons"> <button class="filter-btn active" data-category="all">Все</button> </div> </div> <!-- СЕТКА ПРЕДМЕТОВ --> <div id="itemsContainer" class="items-grid"></div> </div> <script> // ========== БАЗА ДАННЫХ ПРЕДМЕТОВ С РЕЦЕПТАМИ ========== // Данные основаны на реальных рецептах крафта в Rust const craftItems = [ // ОРУЖИЕ { name: "Штурмовая винтовка", category: "weapon", workbench: 3, time: 1, ingredients: [{ name: "metal.refined", displayName: "Металл Высокого Качества", amount: 50 }, { name: "wood", displayName: "Дерево", amount: 200 }, { name: "riflebody", displayName: "Корпус винтовки", amount: 1 }, { name: "metalspring", displayName: "Металлическая пружина", amount: 4 }] }, { name: "Пистолет-пулимет Томсона", category: "weapon", workbench: 2, time: 1, ingredients: [{ name: "metal.refined", displayName: "Металл Высокого Качества", amount: 10 }, { name: "wood", displayName: "Дерево", amount: 100 }, { name: "riflebody", displayName: "Корпус пистолет-пулимета", amount: 1 }, { name: "metalspring", displayName: "Металлическая пружина", amount: 1 }] }, { name: "СКС", category: "weapon", workbench: 3, time: 1, ingredients: [{ name: "metal.refined", displayName: "Металл Высокого Качества", amount: 12}, { name: "metall", displayName: "Фрагмент металла", amount: 200 }, { name: "smgbody", displayName: "Корпус полуавтомата", amount: 1 }, { name: "metalspring", displayName: "Металлическая пружина", amount: 2 }] }, { name: "Самодельный ручной пулимет", category: "weapon", workbench: 3, time: 1, ingredients: [{ name: "metal.fragments", displayName: "Металл Высокого Качества", amount: 60 }, { name: "riflebody", displayName: "Корпус винтовки", amount: 1 },{ name: "shisterni", displayName: "Шистерни", amount: 2 }, { name: "metalspring", displayName: "Металлическая пружина", amount: 2 }] }, { name: "Револьвер Питон", category: "weapon", workbench: 2, time: 1, ingredients: [{ name: "metal.refined", displayName: "Металл Высокого Качества", amount: 10 }, { name: "trub", displayName: "Трубы", amount: 3 }, { name: "metalspring", displayName: "Металлическая пружина", amount: 1 }] }, { name: "Полуавтоматическая винтовка", category: "weapon", workbench: 2, time: 1, ingredients: [{ name: "metall", displayName: "Фрагмент металла", amount: 450 }, { name: "metal.refined", displayName: "Металл Высокого Качества", amount: 4 }, { name: "smgbody", displayName: "Корпус полуавтомата", amount: 1 }, { name: "metalspring", displayName: "Металлическая пружина", amount: 1 }] }, { name: "Винтовка", category: "weapon", workbench: 3, time: 1, ingredients: [{ name: "metal.refined", displayName: "Металл Высокого Качества", amount: 20 }, { name: "riflebody", displayName: "Корпус винтовки", amount: 1 }, { name: "trub", displayName: "Трубы", amount: 3 }, { name: "metalspring", displayName: "Металлическая пружина", amount: 1 } ] }, { name: "MP5A4", category: "weapon", workbench: 3, time: 1, ingredients: [{ name: "metal.refined", displayName: "Металл Высокого Качества", amount: 15 }, { name: "riflebody", displayName: "Корпус пистолет-пулимета", amount: 1 }, { name: "metalspring", displayName: "Металлическая пружина", amount: 2 }] }, { name: "Полуавтоматический Писталет", category: "weapon", workbench: 2, time: 1, ingredients: [{ name: "metal.refined", displayName: "Металл Высокого Качества", amount: 4 }, { name: "smgbody", displayName: "Корпус полуавтомата", amount: 1 }, { name: "trub", displayName: "Трубы", amount: 3 }] }, // ПАТРОНЫ { name: "Пистолетный патрон", category: "ammo", workbench: 1, time: 2, ingredients:[{ name: "metall", displayName: "Фрагменты металла", amount: 10 }, { name: "sulfur", displayName: "Сера", amount: 20 }, { name: "ugol", displayName: "Уголь", amount: 30 }] }, { name: "Зажигательный Пистолетный патрон", category: "ammo", workbench: 2, time: 2, ingredients: [{ name: "metall", displayName: "Фрагменты металла", amount: 10 }, { name: "sulfur", displayName: "Сера", amount: 25 }, { name: "ugol", displayName: "Уголь", amount: 30 }] }, { name: "Патрон 5.56-мм", category: "ammo", workbench: 1, time: 2, ingredients: [{ name: "metall", displayName: "Фрагменты металла", amount: 10 }, { name: "sulfur", displayName: "Сера", amount: 20 }, { name: "ugol", displayName: "Уголь", amount: 30 }] }, { name: "Патрон 5.56-мм (скоростной)", category: "ammo", workbench: 2, time: 2, ingredients: [{ name: "metall", displayName: "Фрагменты металла", amount: 10 }, { name: "sulfur", displayName: "Сера", amount: 20 }, { name: "ugol", displayName: "Уголь", amount: 30 }] }, { name: "Патрон 5.56-мм (зажигательный)", category: "ammo", workbench: 2, time: 3, ingredients: [{ name: "metall", displayName: "Фрагменты металла", amount: 10 }, { name: "sulfur", displayName: "Сера", amount: 25 }, { name: "ugol", displayName: "Уголь", amount: 30 }] }, { name: "Разрывной патрон 5.56-мм", category: "ammo", workbench: 3, time: 3, ingredients: [{ name: "metall", displayName: "Фрагменты металла", amount: 10 }, { name: "sulfur", displayName: "Сера", amount: 50 }, { name: "ugol", displayName: "Уголь", amount: 60 }] }, // ВЗРЫВЧАТКА { name: "Взрывчатка с таймером", category: "explosive", workbench: 3, time: 60, ingredients: [{ name: "metall", displayName: "Фрагменты металла", amount: 200 }, { name: "mikro", displayName: "Старные микросхемы", amount: 2 }, { name: "sullfur", displayName: "Сера", amount: 2200 }, { name: "tkan", displayName: "Ткань", amount: 20 }, { name: "shir", displayName: "Животный жир", amount: 45 }, { name: "ygol", displayName: "Уголь", amount: 3000 } ] }, { name: "Ракета", category: "explosive", workbench: 3, time: 45, ingredients: [{ name: "metall", displayName: "Фрагменты металла", amount: 100 }, { name: "trub", displayName: "Трубы", amount: 2 }, { name: "sullfur", displayName: "Сера", amount: 1400 }, { name: "tkan", displayName: "Ткань", amount: 8 }, { name: "shir", displayName: "Животный жир", amount: 24 }, { name: "ygol", displayName: "Уголь", amount: 1950 } ] }, { name: "Разрывной патрон 5.56-мм", category: "explosive", workbench: 3, time: 3, ingredients: [{ name: "metall", displayName: "Фрагменты металла", amount: 10 }, { name: "sulfur", displayName: "Сера", amount: 50 }, { name: "ugol", displayName: "Уголь", amount: 60 }] }, { name: "", category: "explosive", workbench: 0, time: 15, ingredients: [{ name: "metal.fragments", displayName: "Металлолом", amount: 25 }, { name: "gunpowder", displayName: "Порох", amount: 10 }] }, // БРОНЯ { name: "", category: "armor", workbench: 2, time: 90, ingredients: [{ name: "metal.fragments", displayName: "Металлолом", amount: 200 }, { name: "metal.refined", displayName: "Металл (переплавленный)", amount: 30 }, { name: "cloth", displayName: "Ткань", amount: 25 }] }, { name: "", category: "armor", workbench: 1, time: 30, ingredients: [{ name: "metal.fragments", displayName: "Металлолом", amount: 150 }, { name: "cloth", displayName: "Ткань", amount: 10 }] }, { name: "", category: "armor", workbench: 0, time: 20, ingredients: [{ name: "cloth", displayName: "Ткань", amount: 50 }, { name: "leather", displayName: "Кожа", amount: 20 }] }, // ИНСТРУМЕНТЫ И СНАРЯЖЕНИЕ { name: "", category: "tool", workbench: 0, time: 10, ingredients: [{ name: "stones", displayName: "Камень", amount: 100 }, { name: "wood", displayName: "Древесина", amount: 50 }] }, { name: "", category: "tool", workbench: 0, time: 15, ingredients: [{ name: "metal.fragments", displayName: "Металлолом", amount: 50 }, { name: "wood", displayName: "Древесина", amount: 50 }] }, { name: "", category: "tool", workbench: 1, time: 30, ingredients: [{ name: "metal.fragments", displayName: "Металлолом", amount: 100 }, { name: "climbing.rope", displayName: "Альпинистская верёвка", amount: 2 }, { name: "gears", displayName: "Шестерни", amount: 2 }, { name: "lowgradefuel", displayName: "Низкокачественное топливо", amount: 40 }] }, { name: "", category: "tool", workbench: 1, time: 30, ingredients: [{ name: "metal.fragments", displayName: "Металлолом", amount: 200 }, { name: "cloth", displayName: "Ткань", amount: 10 }, { name: "tarp", displayName: "Тент", amount: 2 }] }, // МЕДИЦИНА { name: "", category: "medical", workbench: 0, time: 10, ingredients: [{ name: "metal.fragments", displayName: "Металлолом", amount: 10 }, { name: "cloth", displayName: "Ткань", amount: 15 }] }, { name: "", category: "medical", workbench: 1, time: 30, ingredients: [{ name: "metal.fragments", displayName: "Металлолом", amount: 30 }, { name: "cloth", displayName: "Ткань", amount: 50 }, { name: "bleach", displayName: "Белизна", amount: 1 }] } ]; // Категории для фильтрации const categories = { weapon: "Оружие", ammo: "Боеприпасы", explosive: "Взрывчатка", armor: "Броня", tool: "Инструменты", medical: "Медицина" }; // Получаем уникальные категории для кнопок const uniqueCategories = [...new Set(craftItems.map(item => item.category))]; // Заполняем фильтры const filterContainer = document.getElementById('filterButtons'); uniqueCategories.forEach(cat => { const btn = document.createElement('button'); btn.className = 'filter-btn'; btn.setAttribute('data-category', cat); btn.textContent = categories[cat] || cat; filterContainer.appendChild(btn); }); // Текущее состояние фильтров let currentCategory = 'all'; let currentSearch = ''; // Элементы DOM const itemsContainer = document.getElementById('itemsContainer'); const searchInput = document.getElementById('searchInput'); // Функция отображения предметов function renderItems() { let filtered = craftItems; // Фильтр по категории if (currentCategory !== 'all') { filtered = filtered.filter(item => item.category === currentCategory); } // Фильтр по поиску if (currentSearch.trim()) { const searchLower = currentSearch.toLowerCase(); filtered = filtered.filter(item => item.name.toLowerCase().includes(searchLower)); } if (filtered.length === 0) { itemsContainer.innerHTML = ` <div style="text-align: center; padding: 3rem; background: rgba(0,0,0,0.5); border-radius: 30px;"> 🔍 Предметов не найдено. Попробуйте изменить поиск. </div> `; return; } itemsContainer.innerHTML = filtered.map(item => ` <div class="item-card"> <div class="item-header"> <div class="item-name">${item.name}</div> <div class="item-category">${categories[item.category] || item.category}</div> </div> <div class="crafting-details"> <div class="ingredient-list"> ${item.ingredients.map(ing => ` <div class="ingredient-item"> <span class="ingredient-name">${ing.displayName}</span> <span class="ingredient-amount">${ing.amount} шт.</span> </div> `).join('')} </div> <div class="craft-info"> <span class="workbench-level">🛠️ Верстак ${item.workbench} ур.</span> <span class="craft-time">⏱️ ${item.time} сек.</span> </div> </div> </div> `).join(''); } // Обработчики фильтров document.querySelectorAll('.filter-btn').forEach(btn => { btn.addEventListener('click', () => { document.querySelectorAll('.filter-btn').forEach(b => b.classList.remove('active')); btn.classList.add('active'); currentCategory = btn.getAttribute('data-category'); renderItems(); }); }); // Обработчик поиска searchInput.addEventListener('input', (e) => { currentSearch = e.target.value; renderItems(); }); // Инициализация renderItems(); </script> {% endblock %}