diff --git a/LethalAPI.Core/Loader/PluginLoader.cs b/LethalAPI.Core/Loader/PluginLoader.cs
index cb964ab..855bfbe 100644
--- a/LethalAPI.Core/Loader/PluginLoader.cs
+++ b/LethalAPI.Core/Loader/PluginLoader.cs
@@ -76,6 +76,7 @@ public PluginLoader(LoadMethod loadType)
// Ensure that these are registered by loading the reference.
_ = new UnknownResourceParser();
_ = new DllParser();
+ _ = new AssetBundleParser();
// Instance is stored in the type.
_ = new EmbeddedResourceLoader();
diff --git a/LethalAPI.Core/Loader/Resources/AssetBundleParser.cs b/LethalAPI.Core/Loader/Resources/AssetBundleParser.cs
new file mode 100644
index 0000000..cf38b9d
--- /dev/null
+++ b/LethalAPI.Core/Loader/Resources/AssetBundleParser.cs
@@ -0,0 +1,96 @@
+// -----------------------------------------------------------------------
+//
+// Copyright (c) LethalAPI Modding Community. All rights reserved.
+// Licensed under the LGPL-3.0 license.
+//
+// -----------------------------------------------------------------------
+
+namespace LethalAPI.Core.Loader.Resources;
+
+using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
+using System.IO;
+using System.Linq;
+
+using JetBrains.Annotations;
+using UnityEngine;
+
+///
+public class AssetBundleParser : ResourceParser
+{
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ internal AssetBundleParser()
+ {
+ Instance = this;
+ }
+
+ ///
+ /// Gets the instance of this resource parser.
+ ///
+ public static ResourceParser Instance { get; private set; } = null!;
+
+ ///
+ /// Gets a list of all cached asset bundles by name.
+ ///
+ ///
+ /// MyBundle.bundle -> CachedBundles[MyBundle].
+ ///
+ public static Dictionary CachedBundles => new ();
+
+ ///
+ public override string ExtensionName => "bundle";
+
+ ///
+ /// Tries to get an asset bundle from the embedded bundles.
+ ///
+ /// The name of the bundle.
+ /// The returned bundle.
+ /// True if the bundle was found, false if the bundle could not be found.
+ public static bool TryGetBundle(string name, [NotNullWhen(true)] out AssetBundle? bundle)
+ {
+ bundle = null;
+ if (CachedBundles.ContainsKey(name))
+ {
+ bundle = CachedBundles[name];
+ return true;
+ }
+
+ return false;
+ }
+
+ ///
+ /// Gets a cached asset resource.
+ ///
+ /// The name of the asset.
+ /// The name of the bundle (optional).
+ /// The type of resource to get.
+ /// The asset resource if found. Null if not found.
+ public static T? GetResource(string assetName, string bundleName = "")
+ where T : Object
+ {
+ if (bundleName != string.Empty && !CachedBundles.ContainsKey(bundleName))
+ return null;
+
+ List bundles = bundleName == string.Empty ? CachedBundles.Values.ToList() : new() { CachedBundles[bundleName] };
+ foreach (AssetBundle bundle in bundles)
+ {
+ return bundle.LoadAsset(assetName);
+ }
+
+ return null;
+ }
+
+ ///
+ public override object Parse(MemoryStream stream)
+ {
+ return AssetBundle.LoadFromStream(stream);
+ }
+
+ ///
+ public override void ResourceFound(EmbeddedResourceData resourceData)
+ {
+ CachedBundles.Add(resourceData.FileName.Replace(".bundle", string.Empty), (AssetBundle)Parse(resourceData.GetStream()));
+ }
+}
\ No newline at end of file