diff --git a/OpenRA.Mods.Common/AssetBrowser.cs b/OpenRA.Mods.Common/AssetBrowser.cs index 38fa92f091..47debd7282 100644 --- a/OpenRA.Mods.Common/AssetBrowser.cs +++ b/OpenRA.Mods.Common/AssetBrowser.cs @@ -15,7 +15,8 @@ namespace OpenRA { public class AssetBrowser : IGlobalModData { - [FieldLoader.Require] - public readonly string[] SupportedExtensions = Array.Empty(); + public readonly string[] SpriteExtensions = Array.Empty(); + public readonly string[] ModelExtensions = Array.Empty(); + public readonly string[] VideoExtensions = Array.Empty(); } } diff --git a/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs index a4c5151d4c..5faf1e8396 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs @@ -25,6 +25,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic public class AssetBrowserLogic : ChromeLogic { readonly string[] allowedExtensions; + readonly string[] allowedSpriteExtensions; + readonly string[] allowedModelExtensions; + readonly string[] allowedVideoExtensions; readonly IEnumerable acceptablePackages; readonly string[] palettes; readonly World world; @@ -283,7 +286,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic } var assetBrowserModData = modData.Manifest.Get(); - allowedExtensions = assetBrowserModData.SupportedExtensions; + allowedSpriteExtensions = assetBrowserModData.SpriteExtensions; + allowedModelExtensions = assetBrowserModData.ModelExtensions; + allowedVideoExtensions = assetBrowserModData.VideoExtensions; + allowedExtensions = allowedSpriteExtensions + .Union(allowedModelExtensions) + .Union(allowedVideoExtensions) + .ToArray(); acceptablePackages = modData.ModFiles.MountedPackages.Where(p => p.Contents.Any(c => allowedExtensions.Contains(Path.GetExtension(c).ToLowerInvariant()))); @@ -397,30 +406,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic prefix += "|"; } - var video = VideoLoader.GetVideo(Game.ModData.DefaultFileSystem.Open(filename), Game.ModData.VideoLoaders); - if (video != null) - { - player = panel.Get("PLAYER"); - player.Load(prefix + filename); - player.DrawOverlay = false; - isVideoLoaded = true; - - if (frameSlider != null) - { - frameSlider.MaximumValue = (float)player.Video.Frames - 1; - frameSlider.Ticks = 0; - } - - return true; - } - - if (Path.GetExtension(filename.ToLowerInvariant()) == ".vxl") - { - var voxelName = Path.GetFileNameWithoutExtension(filename); - currentVoxel = world.ModelCache.GetModel(voxelName); - currentSprites = null; - } - else + var fileExtension = Path.GetExtension(filename.ToLowerInvariant()); + if (allowedSpriteExtensions.Contains(fileExtension)) { currentSprites = world.Map.Rules.Sequences.SpriteCache[prefix + filename]; currentFrame = 0; @@ -433,6 +420,32 @@ namespace OpenRA.Mods.Common.Widgets.Logic currentVoxel = null; } + else if (allowedModelExtensions.Contains(fileExtension)) + { + var voxelName = Path.GetFileNameWithoutExtension(filename); + currentVoxel = world.ModelCache.GetModel(voxelName); + currentSprites = null; + } + else if (allowedVideoExtensions.Contains(fileExtension)) + { + var video = VideoLoader.GetVideo(Game.ModData.DefaultFileSystem.Open(filename), Game.ModData.VideoLoaders); + if (video != null) + { + + player = panel.Get("PLAYER"); + player.Load(prefix + filename); + player.DrawOverlay = false; + isVideoLoaded = true; + + if (frameSlider != null) + { + frameSlider.MaximumValue = (float)player.Video.Frames - 1; + frameSlider.Ticks = 0; + } + } + } + else + return false; } catch (Exception ex) { diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml index 02050f693c..cbcb9839e1 100644 --- a/mods/cnc/mod.yaml +++ b/mods/cnc/mod.yaml @@ -239,7 +239,8 @@ SpriteSequenceFormat: ClassicTilesetSpecificSpriteSequence ModelSequenceFormat: PlaceholderModelSequence AssetBrowser: - SupportedExtensions: .shp, .tem, .des, .sno, .jun, .vqa, .wsa + SpriteExtensions: .shp, .tem, .des, .sno, .jun + VideoExtensions: .vqa, .wsa GameSpeeds: DefaultSpeed: default diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index f97780903e..5a3923451b 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -214,7 +214,8 @@ SpriteSequenceFormat: DefaultSpriteSequence ModelSequenceFormat: PlaceholderModelSequence AssetBrowser: - SupportedExtensions: .shp, .r8, .vqa + SpriteExtensions: .shp, .r8 + VideoExtensions: .vqa GameSpeeds: DefaultSpeed: default diff --git a/mods/ra/mod.yaml b/mods/ra/mod.yaml index 5529da8680..d2ed4e56e8 100644 --- a/mods/ra/mod.yaml +++ b/mods/ra/mod.yaml @@ -244,7 +244,8 @@ SpriteSequenceFormat: ClassicTilesetSpecificSpriteSequence ModelSequenceFormat: PlaceholderModelSequence AssetBrowser: - SupportedExtensions: .shp, .tmp, .tem, .des, .sno, .int, .vqa, .wsa + SpriteExtensions: .shp, .tmp, .tem, .des, .sno, .int + VideoExtensions: .vqa, .wsa GameSpeeds: DefaultSpeed: default diff --git a/mods/ts/mod.yaml b/mods/ts/mod.yaml index 94db110b96..66b95d25ca 100644 --- a/mods/ts/mod.yaml +++ b/mods/ts/mod.yaml @@ -272,7 +272,9 @@ SpriteSequenceFormat: TilesetSpecificSpriteSequence ModelSequenceFormat: VoxelModelSequence AssetBrowser: - SupportedExtensions: .shp, .tem, .sno, .vqa, .vxl + SpriteExtensions: .shp, .tem, .sno + ModelExtensions: .vxl + VideoExtensions: .vqa GameSpeeds: DefaultSpeed: default