|
9 | 9 | using PugSharp.Models; |
10 | 10 | using PugSharp.Server.Contract; |
11 | 11 |
|
| 12 | +using System.IO; |
| 13 | +using System.Text.Json; |
| 14 | + |
12 | 15 | namespace PugSharp; |
13 | 16 |
|
14 | 17 | public class CsServer : ICsServer |
15 | 18 | { |
16 | 19 | private readonly ILogger<CsServer> _Logger; |
17 | 20 | private readonly ICssDispatcher _Dispatcher; |
18 | 21 |
|
| 22 | + private Dictionary<string, string>? _workshopMapLookup; |
| 23 | + private readonly string _workshopMapConfigPath; |
| 24 | + |
19 | 25 | public CsServer(ILogger<CsServer> logger, ICssDispatcher dispatcher) |
20 | 26 | { |
21 | 27 | _Logger = logger; |
22 | 28 | _Dispatcher = dispatcher; |
| 29 | + |
| 30 | + _workshopMapConfigPath = Path.Combine(GameDirectory, "csgo", "PugSharp", "Config", "workshop_maps.json"); |
23 | 31 | } |
24 | 32 |
|
25 | 33 | public string GameDirectory => CounterStrikeSharp.API.Server.GameDirectory; |
@@ -210,14 +218,56 @@ public void SwitchMap(string selectedMap) |
210 | 218 | { |
211 | 219 | _Dispatcher.NextWorldUpdate(() => |
212 | 220 | { |
213 | | - if (!IsMapValid(selectedMap)) |
| 221 | + if (string.IsNullOrWhiteSpace(selectedMap)) |
214 | 222 | { |
215 | | - _Logger.LogInformation("The selected map is not valid: \"{SelectedMap}\"!", selectedMap); |
| 223 | + _Logger.LogInformation("The selected map is null or empty!"); |
216 | 224 | return; |
217 | 225 | } |
218 | 226 |
|
219 | | - _Logger.LogInformation("Switch map to: \"{SelectedMap}\"!", selectedMap); |
220 | | - ExecuteCommand($"changelevel {selectedMap}"); |
| 227 | + // Lazy-load the workshop map config if not already loaded |
| 228 | + if (_workshopMapLookup == null) |
| 229 | + { |
| 230 | + try |
| 231 | + { |
| 232 | + if (File.Exists(_workshopMapConfigPath)) |
| 233 | + { |
| 234 | + string json = File.ReadAllText(_workshopMapConfigPath); |
| 235 | + _workshopMapLookup = JsonSerializer.Deserialize<Dictionary<string, string>>(json); |
| 236 | + _Logger.LogInformation("Loaded workshop map config from {Path}", _workshopMapConfigPath); |
| 237 | + } |
| 238 | + else |
| 239 | + { |
| 240 | + _Logger.LogWarning("Workshop map config not found at {Path}. Workshop maps will not be available.", _workshopMapConfigPath); |
| 241 | + _workshopMapLookup = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); |
| 242 | + } |
| 243 | + } |
| 244 | + catch (Exception ex) |
| 245 | + { |
| 246 | + _Logger.LogError(ex, "Failed to load workshop map config from {Path}", _workshopMapConfigPath); |
| 247 | + _workshopMapLookup = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); |
| 248 | + } |
| 249 | + } |
| 250 | + |
| 251 | + string command; |
| 252 | + |
| 253 | + if (_workshopMapLookup != null && _workshopMapLookup.TryGetValue(selectedMap, out var workshopId)) |
| 254 | + { |
| 255 | + _Logger.LogInformation("Translating map \"{SelectedMap}\" to Workshop ID: {WorkshopId}", selectedMap, workshopId); |
| 256 | + command = $"host_workshop_map {workshopId}"; |
| 257 | + } |
| 258 | + else |
| 259 | + { |
| 260 | + if (!IsMapValid(selectedMap)) |
| 261 | + { |
| 262 | + _Logger.LogInformation("The selected map is not valid: \"{SelectedMap}\"!", selectedMap); |
| 263 | + return; |
| 264 | + } |
| 265 | + |
| 266 | + _Logger.LogInformation("Switching to standard map: \"{SelectedMap}\"", selectedMap); |
| 267 | + command = $"changelevel {selectedMap}"; |
| 268 | + } |
| 269 | + |
| 270 | + ExecuteCommand(command); |
221 | 271 | }); |
222 | 272 | } |
223 | 273 |
|
|
0 commit comments