Jacob Schmidt ebfe77a340 feat: implement complete Forge framework with Rust/Redis backend and Arma 3 integration
Implemented features:
- High-performance Rust extension with Redis persistence
- Actor/player management with loadout, position, and state tracking
- Banking system with deposit, withdraw, and transfer operations
- Physical and virtual garage/locker systems for vehicle and equipment storage
- Organization management with member tracking and permissions
- Client-side UI with React-like state management
- Server-side event-driven architecture with CBA Events
- Security: Self-transfer prevention at multiple layers
- Logging system with per-module log files
- ICOM module for inter-server communication

Co-Authored-By: Warp <agent@warp.dev>
2026-01-04 12:52:15 -06:00

206 lines
9.2 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vehicle Garage</title>
<link rel="stylesheet" href="style.css" />
<!--
Dynamic Resource Loading
The following script loads CSS and JavaScript files dynamically using the A3API
This approach is used instead of static HTML imports to work with Arma 3's file system
-->
<script>
Promise.all([
A3API.RequestFile(
"forge\\forge_client\\addons\\garage\\ui\\_site\\style.css",
),
A3API.RequestFile(
"forge\\forge_client\\addons\\garage\\ui\\_site\\script.js",
),
]).then(([css, js]) => {
const style = document.createElement("style");
style.textContent = css;
document.head.appendChild(style);
const script = document.createElement("script");
script.text = js;
document.head.appendChild(script);
});
</script>
</head>
<body>
<div class="garage-container">
<!-- Header Section -->
<div class="garage-header">
<div class="garage-logo">
<div class="logo-icon">🚗</div>
</div>
<div class="garage-info">
<h1 class="garage-title">Vehicle Garage</h1>
<p class="garage-subtitle">Vehicle Management System</p>
</div>
<div class="garage-stats">
<div class="stat-item">
<span class="stat-label">Stored</span>
<span class="stat-value" id="storedCount">12</span>
</div>
<div class="stat-item">
<span class="stat-label">Active</span>
<span class="stat-value" id="activeCount">2</span>
</div>
<div class="stat-item">
<span class="stat-label">Capacity</span>
<span class="stat-value" id="capacityCount">20</span>
</div>
</div>
<div class="header-actions">
<button class="action-btn close-btn">Close</button>
</div>
</div>
<!-- Main Content -->
<div class="garage-content">
<!-- Left Panel - Filters -->
<div class="garage-panel filters-panel">
<div class="panel-header">
<h2 class="panel-title">Filters</h2>
</div>
<div class="panel-content">
<!-- Status Filter -->
<div class="filter-section">
<h3 class="filter-title">Status</h3>
<div class="filter-buttons">
<button class="filter-btn active" data-filter="all">All</button>
<button class="filter-btn" data-filter="stored">Stored</button>
<button class="filter-btn" data-filter="active">Active</button>
</div>
</div>
<!-- Type Filter -->
<div class="filter-section">
<h3 class="filter-title">Vehicle Type</h3>
<div class="type-list">
<button class="type-item active" data-type="all">
<span class="type-icon">📦</span>
<span class="type-name">All Types</span>
</button>
<button class="type-item" data-type="car">
<span class="type-icon">🚗</span>
<span class="type-name">Cars</span>
</button>
<button class="type-item" data-type="truck">
<span class="type-icon">🚛</span>
<span class="type-name">Trucks</span>
</button>
<button class="type-item" data-type="air">
<span class="type-icon">🚁</span>
<span class="type-name">Aircraft</span>
</button>
<button class="type-item" data-type="sea">
<span class="type-icon">🚤</span>
<span class="type-name">Boats</span>
</button>
</div>
</div>
<!-- Search -->
<div class="filter-section">
<h3 class="filter-title">Search</h3>
<input type="text" class="search-input" id="searchInput" placeholder="Search vehicles...">
</div>
</div>
</div>
<!-- Center Panel - Vehicle Grid -->
<div class="garage-panel vehicles-panel">
<div class="panel-header">
<h2 class="panel-title">Your Vehicles</h2>
</div>
<div class="panel-content">
<div class="vehicles-grid" id="vehiclesGrid">
<!-- Vehicles will be dynamically generated -->
</div>
</div>
</div>
<!-- Right Panel - Vehicle Details -->
<div class="garage-panel details-panel" id="detailsPanel">
<div class="panel-header">
<h2 class="panel-title">Vehicle Details</h2>
</div>
<div class="panel-content">
<div class="no-selection" id="noSelection">
<div class="no-selection-icon">🚗</div>
<p>Select a vehicle to view details</p>
</div>
<div class="vehicle-details" id="vehicleDetails" style="display: none;">
<div class="detail-header">
<div class="detail-icon" id="detailIcon">🚗</div>
<div class="detail-info">
<h3 class="detail-name" id="detailName">Vehicle Name</h3>
<p class="detail-type" id="detailType">Type</p>
</div>
</div>
<div class="detail-stats">
<div class="detail-stat">
<span class="detail-label">Status</span>
<span class="detail-value" id="detailStatus">Stored</span>
</div>
<div class="detail-stat">
<span class="detail-label">Condition</span>
<span class="detail-value" id="detailCondition">100%</span>
</div>
<div class="detail-stat">
<span class="detail-label">Fuel</span>
<span class="detail-value" id="detailFuel">100%</span>
</div>
<div class="detail-stat">
<span class="detail-label">Location</span>
<span class="detail-value" id="detailLocation">Garage A</span>
</div>
</div>
<div class="detail-actions">
<button class="detail-btn spawn-btn" id="spawnBtn">
<span class="btn-icon">🚀</span>
<span class="btn-text">Spawn Vehicle</span>
</button>
<button class="detail-btn store-btn" id="storeBtn" style="display: none;">
<span class="btn-icon">📦</span>
<span class="btn-text">Store Vehicle</span>
</button>
</div>
<div class="detail-specs">
<h4 class="specs-title">Specifications</h4>
<div class="specs-list">
<div class="spec-item">
<span class="spec-label">Seats</span>
<span class="spec-value" id="detailSeats">4</span>
</div>
<div class="spec-item">
<span class="spec-label">Speed</span>
<span class="spec-value" id="detailSpeed">180 km/h</span>
</div>
<div class="spec-item">
<span class="spec-label">Cargo</span>
<span class="spec-value" id="detailCargo">200 kg</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="script.js"></script>
</body>
</html>