mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-12 10:17:22 +01:00
enable nullability checks, wip service locator
This commit is contained in:
parent
9cff2da484
commit
eb0301f964
12 changed files with 115 additions and 41 deletions
|
|
@ -2,6 +2,7 @@ using System.Linq;
|
|||
using EmbedIO;
|
||||
using EmbedIO.Routing;
|
||||
using EmbedIO.WebApi;
|
||||
using Penumbra.Mods;
|
||||
|
||||
namespace Penumbra.API
|
||||
{
|
||||
|
|
@ -14,7 +15,8 @@ namespace Penumbra.API
|
|||
[Route( HttpVerbs.Get, "/mods" )]
|
||||
public object GetMods()
|
||||
{
|
||||
return _plugin.ModManager.Mods.ModSettings.Select( x => new
|
||||
var modManager = Service< ModManager >.Get();
|
||||
return modManager.Mods.ModSettings.Select( x => new
|
||||
{
|
||||
x.Enabled,
|
||||
x.Priority,
|
||||
|
|
@ -28,7 +30,8 @@ namespace Penumbra.API
|
|||
[Route( HttpVerbs.Get, "/files" )]
|
||||
public object CreateMod()
|
||||
{
|
||||
return _plugin.ModManager.ResolvedFiles.ToDictionary(
|
||||
var modManager = Service< ModManager >.Get();
|
||||
return modManager.ResolvedFiles.ToDictionary(
|
||||
o => o.Key,
|
||||
o => o.Value.FullName
|
||||
);
|
||||
|
|
|
|||
|
|
@ -112,7 +112,7 @@ namespace Penumbra.Mods
|
|||
if( settings.Conf == null )
|
||||
{
|
||||
settings.Conf = new Dictionary< string, int >();
|
||||
_plugin.ModManager.Mods.Save();
|
||||
Mods.Save();
|
||||
}
|
||||
|
||||
ProcessModFiles( registeredFiles, mod, settings );
|
||||
|
|
@ -162,7 +162,7 @@ namespace Penumbra.Mods
|
|||
&& settings.Conf[ group.GroupName ] >= group.Options.Count )
|
||||
{
|
||||
settings.Conf[ group.GroupName ] = 0;
|
||||
_plugin.ModManager.Mods.Save();
|
||||
Mods.Save();
|
||||
setting = 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
<AssemblyVersion>1.0.0.0</AssemblyVersion>
|
||||
<OutputPath>bin\$(Configuration)\</OutputPath>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
|
|
|
|||
|
|
@ -22,8 +22,6 @@ namespace Penumbra
|
|||
|
||||
public ResourceLoader ResourceLoader { get; set; }
|
||||
|
||||
public ModManager ModManager { get; set; }
|
||||
|
||||
public SettingsInterface SettingsInterface { get; set; }
|
||||
|
||||
public GameUtils GameUtils { get; set; }
|
||||
|
|
@ -41,8 +39,8 @@ namespace Penumbra
|
|||
|
||||
GameUtils = new GameUtils( PluginInterface );
|
||||
|
||||
ModManager = new ModManager( this );
|
||||
ModManager.DiscoverMods( Configuration.CurrentCollection );
|
||||
var modManager = Service< ModManager >.Set( this );
|
||||
modManager.DiscoverMods( Configuration.CurrentCollection );
|
||||
|
||||
ResourceLoader = new ResourceLoader( this );
|
||||
|
||||
|
|
@ -94,7 +92,7 @@ namespace Penumbra
|
|||
|
||||
public void Dispose()
|
||||
{
|
||||
ModManager?.Dispose();
|
||||
// ModManager?.Dispose();
|
||||
|
||||
PluginInterface.UiBuilder.OnBuildUi -= SettingsInterface.Draw;
|
||||
|
||||
|
|
@ -115,9 +113,9 @@ namespace Penumbra
|
|||
{
|
||||
case "reload":
|
||||
{
|
||||
ModManager.DiscoverMods();
|
||||
Service< ModManager >.Get().DiscoverMods();
|
||||
PluginInterface.Framework.Gui.Chat.Print(
|
||||
$"Reloaded Penumbra mods. You have {ModManager.Mods.ModSettings.Count} mods, {ModManager.Mods.EnabledMods.Length} of which are enabled."
|
||||
$"Reloaded Penumbra mods. You have {Service< ModManager >.Get().Mods.ModSettings.Count} mods, {Service< ModManager >.Get().Mods.EnabledMods.Length} of which are enabled."
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,10 @@
|
|||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using Dalamud.Plugin;
|
||||
using Penumbra.Mods;
|
||||
using Penumbra.Structs;
|
||||
using Penumbra.Util;
|
||||
using Reloaded.Hooks;
|
||||
|
|
@ -129,31 +131,35 @@ namespace Penumbra
|
|||
PluginLog.Log( "[GetResourceHandler] {0}", gameFsPath );
|
||||
}
|
||||
|
||||
if( Plugin.Configuration.IsEnabled )
|
||||
var modManager = Service< ModManager >.Get();
|
||||
|
||||
if( !Plugin.Configuration.IsEnabled || modManager == null )
|
||||
{
|
||||
var replacementPath = Plugin.ModManager.ResolveSwappedOrReplacementFilePath( gameFsPath );
|
||||
return CallOriginalHandler( isSync, pFileManager, pCategoryId, pResourceType, pResourceHash, pPath, pUnknown, isUnknown );
|
||||
}
|
||||
|
||||
// path must be < 260 because statically defined array length :(
|
||||
if( replacementPath == null || replacementPath.Length >= 260 )
|
||||
{
|
||||
return CallOriginalHandler( isSync, pFileManager, pCategoryId, pResourceType, pResourceHash, pPath, pUnknown, isUnknown );
|
||||
}
|
||||
var replacementPath = modManager.ResolveSwappedOrReplacementFilePath( gameFsPath );
|
||||
|
||||
var cleanPath = replacementPath.Replace( '\\', '/' );
|
||||
var path = Encoding.ASCII.GetBytes( cleanPath );
|
||||
// path must be < 260 because statically defined array length :(
|
||||
if( replacementPath == null || replacementPath.Length >= 260 )
|
||||
{
|
||||
return CallOriginalHandler( isSync, pFileManager, pCategoryId, pResourceType, pResourceHash, pPath, pUnknown, isUnknown );
|
||||
}
|
||||
|
||||
var bPath = stackalloc byte[path.Length + 1];
|
||||
Marshal.Copy( path, 0, new IntPtr( bPath ), path.Length );
|
||||
pPath = ( char* )bPath;
|
||||
var cleanPath = replacementPath.Replace( '\\', '/' );
|
||||
var path = Encoding.ASCII.GetBytes( cleanPath );
|
||||
|
||||
Crc32.Init();
|
||||
Crc32.Update( path );
|
||||
*pResourceHash = Crc32.Checksum;
|
||||
var bPath = stackalloc byte[path.Length + 1];
|
||||
Marshal.Copy( path, 0, new IntPtr( bPath ), path.Length );
|
||||
pPath = ( char* )bPath;
|
||||
|
||||
Crc32.Init();
|
||||
Crc32.Update( path );
|
||||
*pResourceHash = Crc32.Checksum;
|
||||
|
||||
#if DEBUG
|
||||
PluginLog.Log( "[GetResourceHandler] resolved {GamePath} to {NewPath}", gameFsPath, replacementPath );
|
||||
PluginLog.Log( "[GetResourceHandler] resolved {GamePath} to {NewPath}", gameFsPath, replacementPath );
|
||||
#endif
|
||||
}
|
||||
|
||||
return CallOriginalHandler( isSync, pFileManager, pCategoryId, pResourceType, pResourceHash, pPath, pUnknown, isUnknown );
|
||||
}
|
||||
|
|
|
|||
60
Penumbra/Service.cs
Normal file
60
Penumbra/Service.cs
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
using System;
|
||||
|
||||
namespace Penumbra
|
||||
{
|
||||
/// <summary>
|
||||
/// Basic service locator
|
||||
/// </summary>
|
||||
/// <typeparam name="T">The class you want to store in the service locator</typeparam>
|
||||
public static class Service< T > where T : class
|
||||
{
|
||||
private static T? _object;
|
||||
|
||||
static Service()
|
||||
{
|
||||
}
|
||||
|
||||
public static void Set( T obj )
|
||||
{
|
||||
// ReSharper disable once JoinNullCheckWithUsage
|
||||
if( obj == null )
|
||||
{
|
||||
throw new ArgumentNullException( $"{nameof( obj )} is null!" );
|
||||
}
|
||||
|
||||
_object = obj;
|
||||
}
|
||||
|
||||
public static T Set()
|
||||
{
|
||||
_object = Activator.CreateInstance< T >();
|
||||
|
||||
return _object;
|
||||
}
|
||||
|
||||
public static T Set( params object[] args )
|
||||
{
|
||||
var obj = ( T? )Activator.CreateInstance( typeof( T ), args );
|
||||
|
||||
// ReSharper disable once JoinNullCheckWithUsage
|
||||
if( obj == null )
|
||||
{
|
||||
throw new Exception( "what he fuc" );
|
||||
}
|
||||
|
||||
_object = obj;
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
public static T Get()
|
||||
{
|
||||
if( _object == null )
|
||||
{
|
||||
throw new InvalidOperationException( $"{nameof( T )} hasn't been registered!" );
|
||||
}
|
||||
|
||||
return _object;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
using System.IO;
|
||||
using System.Numerics;
|
||||
using Penumbra.Mods;
|
||||
|
||||
namespace Penumbra.UI
|
||||
{
|
||||
|
|
@ -40,7 +41,8 @@ namespace Penumbra.UI
|
|||
// create the directory if it doesn't exist
|
||||
Directory.CreateDirectory( _plugin.Configuration.CurrentCollection );
|
||||
|
||||
_plugin.ModManager.DiscoverMods( _plugin.Configuration.CurrentCollection );
|
||||
var modManager = Service< ModManager >.Get();
|
||||
modManager.DiscoverMods( _plugin.Configuration.CurrentCollection );
|
||||
_menu.EffectiveTab.RebuildFileList( _plugin.Configuration.ShowAdvanced );
|
||||
_menu.InstalledTab.Selector.ResetModNamesLower();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,13 +11,12 @@ namespace Penumbra.UI
|
|||
private const string LabelTab = "Effective File List";
|
||||
private const float TextSizePadding = 5f;
|
||||
|
||||
private readonly ModManager _mods;
|
||||
private ModManager _mods => Service< ModManager >.Get();
|
||||
private (string, string)[] _fileList;
|
||||
private float _maxGamePath;
|
||||
|
||||
public TabEffective( SettingsInterface ui )
|
||||
{
|
||||
_mods = ui._plugin.ModManager;
|
||||
RebuildFileList( ui._plugin.Configuration.ShowAdvanced );
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
using ImGuiNET;
|
||||
using Penumbra.Mods;
|
||||
|
||||
namespace Penumbra.UI
|
||||
{
|
||||
|
|
@ -37,7 +38,7 @@ namespace Penumbra.UI
|
|||
return;
|
||||
}
|
||||
|
||||
if( _base._plugin.ModManager.Mods != null )
|
||||
if( Service< ModManager >.Get().Mods != null )
|
||||
{
|
||||
Selector.Draw();
|
||||
ImGui.SameLine();
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ using System.Collections.Generic;
|
|||
using System.Linq;
|
||||
using ImGuiNET;
|
||||
using Penumbra.Models;
|
||||
using Penumbra.Mods;
|
||||
|
||||
namespace Penumbra.UI
|
||||
{
|
||||
|
|
@ -127,8 +128,9 @@ namespace Penumbra.UI
|
|||
|
||||
private void Save()
|
||||
{
|
||||
_base._plugin.ModManager.Mods.Save();
|
||||
_base._plugin.ModManager.CalculateEffectiveFileList();
|
||||
var modManager = Service< ModManager >.Get();
|
||||
modManager.Mods.Save();
|
||||
modManager.CalculateEffectiveFileList();
|
||||
_base._menu.EffectiveTab.RebuildFileList( _base._plugin.Configuration.ShowAdvanced );
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ using System.Numerics;
|
|||
using Dalamud.Plugin;
|
||||
using ImGuiNET;
|
||||
using Penumbra.Models;
|
||||
using Penumbra.Mods;
|
||||
|
||||
namespace Penumbra.UI
|
||||
{
|
||||
|
|
@ -184,8 +185,9 @@ namespace Penumbra.UI
|
|||
if( ImGui.Checkbox( LabelModEnabled, ref enabled ) )
|
||||
{
|
||||
Mod.Enabled = enabled;
|
||||
_base._plugin.ModManager.Mods.Save();
|
||||
_base._plugin.ModManager.CalculateEffectiveFileList();
|
||||
var modManager = Service< ModManager >.Get();
|
||||
modManager.Mods.Save();
|
||||
modManager.CalculateEffectiveFileList();
|
||||
_base._menu.EffectiveTab.RebuildFileList( _base._plugin.Configuration.ShowAdvanced );
|
||||
}
|
||||
}
|
||||
|
|
@ -241,7 +243,7 @@ namespace Penumbra.UI
|
|||
new Deduplicator( Mod.Mod.ModBasePath, Meta ).Run();
|
||||
_selector.SaveCurrentMod();
|
||||
Mod.Mod.RefreshModFiles();
|
||||
_base._plugin.ModManager.CalculateEffectiveFileList();
|
||||
Service< ModManager >.Get().CalculateEffectiveFileList();
|
||||
_base._menu.EffectiveTab.RebuildFileList( _base._plugin.Configuration.ShowAdvanced );
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ namespace Penumbra.UI
|
|||
private static readonly string ArrowDownString = FontAwesomeIcon.ArrowDown.ToIconString();
|
||||
|
||||
private readonly SettingsInterface _base;
|
||||
private ModCollection Mods => _base._plugin.ModManager.Mods;
|
||||
private ModCollection Mods => Service< ModManager >.Get().Mods;
|
||||
|
||||
private ModInfo _mod;
|
||||
private int _index;
|
||||
|
|
@ -60,7 +60,7 @@ namespace Penumbra.UI
|
|||
if( ImGui.Button( iconString, SelectorButtonSizes ) )
|
||||
{
|
||||
SetSelection( _index );
|
||||
_base._plugin.ModManager.ChangeModPriority( _mod, up );
|
||||
Service< ModManager >.Get().ChangeModPriority( _mod, up );
|
||||
_modNamesLower.Swap( _index, _index + ( up ? 1 : -1 ) );
|
||||
_index += up ? 1 : -1;
|
||||
}
|
||||
|
|
@ -177,7 +177,7 @@ namespace Penumbra.UI
|
|||
if( ImGui.Button( ButtonYesDelete ) )
|
||||
{
|
||||
ImGui.CloseCurrentPopup();
|
||||
_base._plugin.ModManager.DeleteMod( _mod.Mod );
|
||||
Service< ModManager >.Get().DeleteMod( _mod.Mod );
|
||||
ClearSelection();
|
||||
_base.ReloadMods();
|
||||
}
|
||||
|
|
@ -321,7 +321,7 @@ namespace Penumbra.UI
|
|||
}
|
||||
|
||||
_mod.Mod.RefreshModFiles();
|
||||
_base._plugin.ModManager.CalculateEffectiveFileList();
|
||||
Service< ModManager >.Get().CalculateEffectiveFileList();
|
||||
_base._menu.EffectiveTab.RebuildFileList( _base._plugin.Configuration.ShowAdvanced );
|
||||
ResetModNamesLower();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue