diff --git a/.editorconfig b/.editorconfig
index bc29f5d7..e283b2a2 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,67 +1,85 @@
-
-[*]
-charset=utf-8
-end_of_line=lf
-trim_trailing_whitespace=false
-insert_final_newline=false
-indent_style=space
-indent_size=4
-
-# Microsoft .NET properties
-csharp_new_line_before_members_in_object_initializers=false
-csharp_preferred_modifier_order=public, private, protected, internal, new, abstract, virtual, sealed, override, static, readonly, extern, unsafe, volatile, async:suggestion
-csharp_space_after_cast=false
-csharp_space_after_keywords_in_control_flow_statements=false
-csharp_space_between_method_call_parameter_list_parentheses=true
-csharp_space_between_method_declaration_parameter_list_parentheses=true
-csharp_space_between_parentheses=control_flow_statements,expressions,type_casts
-csharp_style_var_elsewhere=true:suggestion
-csharp_style_var_for_built_in_types=true:suggestion
-csharp_style_var_when_type_is_apparent=true:suggestion
-dotnet_style_parentheses_in_arithmetic_binary_operators=never_if_unnecessary:none
-dotnet_style_parentheses_in_other_binary_operators=never_if_unnecessary:none
-dotnet_style_parentheses_in_relational_binary_operators=never_if_unnecessary:none
-dotnet_style_predefined_type_for_locals_parameters_members=true:suggestion
-dotnet_style_predefined_type_for_member_access=true:suggestion
-dotnet_style_qualification_for_event=false:suggestion
-dotnet_style_qualification_for_field=false:suggestion
-dotnet_style_qualification_for_method=false:suggestion
-dotnet_style_qualification_for_property=false:suggestion
-dotnet_style_require_accessibility_modifiers=for_non_interface_members:suggestion
-
-# ReSharper properties
-resharper_autodetect_indent_settings=true
-resharper_csharp_space_within_array_access_brackets=true
-resharper_enforce_line_ending_style=true
-resharper_place_attribute_on_same_line=false
-resharper_space_after_cast=false
-resharper_space_within_checked_parentheses=true
-resharper_space_within_default_parentheses=true
-resharper_space_within_nameof_parentheses=true
-resharper_space_within_single_line_array_initializer_braces=true
-resharper_space_within_sizeof_parentheses=true
-resharper_space_within_typeof_parentheses=true
-resharper_space_within_type_argument_angles=true
-resharper_space_within_type_parameter_angles=true
-resharper_use_indent_from_vs=false
-resharper_wrap_lines=true
-
-# ReSharper inspection severities
-resharper_arrange_redundant_parentheses_highlighting=hint
-resharper_arrange_this_qualifier_highlighting=hint
-resharper_arrange_type_member_modifiers_highlighting=hint
-resharper_arrange_type_modifiers_highlighting=hint
-resharper_built_in_type_reference_style_for_member_access_highlighting=hint
-resharper_built_in_type_reference_style_highlighting=hint
-resharper_redundant_base_qualifier_highlighting=warning
-resharper_suggest_var_or_type_built_in_types_highlighting=hint
-resharper_suggest_var_or_type_elsewhere_highlighting=hint
-resharper_suggest_var_or_type_simple_types_highlighting=hint
-resharper_web_config_module_not_resolved_highlighting=warning
-resharper_web_config_type_not_resolved_highlighting=warning
-resharper_web_config_wrong_module_highlighting=warning
-
-[*.{appxmanifest,asax,ascx,aspx,build,cg,cginc,compute,cs,cshtml,dtd,hlsl,hlsli,hlslinc,master,nuspec,razor,resw,resx,shader,skin,usf,ush,vb,xaml,xamlx,xoml,xsd}]
-indent_style=space
-indent_size=4
-tab_width=4
+
+[*]
+charset=utf-8
+end_of_line=lf
+trim_trailing_whitespace=true
+insert_final_newline=false
+indent_style=space
+indent_size=4
+
+# Microsoft .NET properties
+csharp_new_line_before_members_in_object_initializers=false
+csharp_preferred_modifier_order=public, private, protected, internal, new, abstract, virtual, sealed, override, static, readonly, extern, unsafe, volatile, async:suggestion
+csharp_prefer_braces=true:none
+csharp_space_after_cast=false
+csharp_space_after_keywords_in_control_flow_statements=false
+csharp_space_between_method_call_parameter_list_parentheses=true
+csharp_space_between_method_declaration_parameter_list_parentheses=true
+csharp_space_between_parentheses=control_flow_statements,expressions,type_casts
+csharp_style_var_elsewhere=true:suggestion
+csharp_style_var_for_built_in_types=true:suggestion
+csharp_style_var_when_type_is_apparent=true:suggestion
+dotnet_style_parentheses_in_arithmetic_binary_operators=never_if_unnecessary:none
+dotnet_style_parentheses_in_other_binary_operators=never_if_unnecessary:none
+dotnet_style_parentheses_in_relational_binary_operators=never_if_unnecessary:none
+dotnet_style_predefined_type_for_locals_parameters_members=true:suggestion
+dotnet_style_predefined_type_for_member_access=true:suggestion
+dotnet_style_qualification_for_event=false:suggestion
+dotnet_style_qualification_for_field=false:suggestion
+dotnet_style_qualification_for_method=false:suggestion
+dotnet_style_qualification_for_property=false:suggestion
+dotnet_style_require_accessibility_modifiers=for_non_interface_members:suggestion
+
+# ReSharper properties
+resharper_align_multiline_binary_expressions_chain=false
+resharper_align_multiline_calls_chain=false
+resharper_autodetect_indent_settings=true
+resharper_braces_redundant=true
+resharper_constructor_or_destructor_body=expression_body
+resharper_csharp_empty_block_style=together
+resharper_csharp_max_line_length=144
+resharper_csharp_space_within_array_access_brackets=true
+resharper_enforce_line_ending_style=true
+resharper_int_align_assignments=true
+resharper_int_align_comments=true
+resharper_int_align_fields=true
+resharper_int_align_invocations=false
+resharper_int_align_nested_ternary=true
+resharper_int_align_properties=false
+resharper_int_align_switch_expressions=true
+resharper_int_align_switch_sections=true
+resharper_int_align_variables=true
+resharper_local_function_body=expression_body
+resharper_method_or_operator_body=expression_body
+resharper_place_attribute_on_same_line=false
+resharper_space_after_cast=false
+resharper_space_within_checked_parentheses=true
+resharper_space_within_default_parentheses=true
+resharper_space_within_nameof_parentheses=true
+resharper_space_within_single_line_array_initializer_braces=true
+resharper_space_within_sizeof_parentheses=true
+resharper_space_within_typeof_parentheses=true
+resharper_space_within_type_argument_angles=true
+resharper_space_within_type_parameter_angles=true
+resharper_use_indent_from_vs=false
+resharper_wrap_lines=true
+
+# ReSharper inspection severities
+resharper_arrange_redundant_parentheses_highlighting=hint
+resharper_arrange_this_qualifier_highlighting=hint
+resharper_arrange_type_member_modifiers_highlighting=hint
+resharper_arrange_type_modifiers_highlighting=hint
+resharper_built_in_type_reference_style_for_member_access_highlighting=hint
+resharper_built_in_type_reference_style_highlighting=hint
+resharper_redundant_base_qualifier_highlighting=warning
+resharper_suggest_var_or_type_built_in_types_highlighting=hint
+resharper_suggest_var_or_type_elsewhere_highlighting=hint
+resharper_suggest_var_or_type_simple_types_highlighting=hint
+resharper_web_config_module_not_resolved_highlighting=warning
+resharper_web_config_type_not_resolved_highlighting=warning
+resharper_web_config_wrong_module_highlighting=warning
+
+[*.{appxmanifest,asax,ascx,aspx,build,cg,cginc,compute,cs,cshtml,dtd,hlsl,hlsli,hlslinc,master,nuspec,razor,resw,resx,shader,skin,usf,ush,vb,xaml,xamlx,xoml,xsd}]
+indent_style=space
+indent_size=4
+tab_width=4
diff --git a/Penumbra/API/ModsController.cs b/Penumbra/API/ModsController.cs
index a48bdd12..93e939e8 100644
--- a/Penumbra/API/ModsController.cs
+++ b/Penumbra/API/ModsController.cs
@@ -9,10 +9,7 @@ namespace Penumbra.API
{
private readonly Plugin _plugin;
- public ModsController( Plugin plugin )
- {
- _plugin = plugin;
- }
+ public ModsController( Plugin plugin ) => _plugin = plugin;
[Route( HttpVerbs.Get, "/mods" )]
public object GetMods()
@@ -24,7 +21,7 @@ namespace Penumbra.API
x.FolderName,
x.Mod.Meta,
BasePath = x.Mod.ModBasePath.FullName,
- Files = x.Mod.ModFiles.Select( fi => fi.FullName )
+ Files = x.Mod.ModFiles.Select( fi => fi.FullName )
} );
}
diff --git a/Penumbra/Configuration.cs b/Penumbra/Configuration.cs
index b8eae639..09dc4219 100644
--- a/Penumbra/Configuration.cs
+++ b/Penumbra/Configuration.cs
@@ -1,7 +1,7 @@
-using Dalamud.Configuration;
-using Dalamud.Plugin;
using System;
using System.Collections.Generic;
+using Dalamud.Configuration;
+using Dalamud.Plugin;
namespace Penumbra
{
@@ -13,7 +13,7 @@ namespace Penumbra
public bool IsEnabled { get; set; } = true;
public bool ShowAdvanced { get; set; }
-
+
public bool DisableFileSystemNotifications { get; set; }
public bool EnableHttpApi { get; set; }
diff --git a/Penumbra/DialogExtensions.cs b/Penumbra/DialogExtensions.cs
index ac48e9f2..31bc3c80 100644
--- a/Penumbra/DialogExtensions.cs
+++ b/Penumbra/DialogExtensions.cs
@@ -18,7 +18,7 @@ namespace Penumbra
public static Task< DialogResult > ShowDialogAsync( this CommonDialog form, IWin32Window owner )
{
var taskSource = new TaskCompletionSource< DialogResult >();
- var th = new Thread( () => DialogThread( form, owner, taskSource ) );
+ var th = new Thread( () => DialogThread( form, owner, taskSource ) );
th.Start();
return taskSource.Task;
}
@@ -38,28 +38,25 @@ namespace Penumbra
{
public IntPtr Handle { get; set; }
- public DialogHandle( IntPtr handle )
- {
- Handle = handle;
- }
+ public DialogHandle( IntPtr handle ) => Handle = handle;
}
public class HiddenForm : Form
{
- private readonly CommonDialog _form;
- private readonly IWin32Window _owner;
+ private readonly CommonDialog _form;
+ private readonly IWin32Window _owner;
private readonly TaskCompletionSource< DialogResult > _taskSource;
public HiddenForm( CommonDialog form, IWin32Window owner, TaskCompletionSource< DialogResult > taskSource )
{
- this._form = form;
- this._owner = owner;
- this._taskSource = taskSource;
+ _form = form;
+ _owner = owner;
+ _taskSource = taskSource;
- Opacity = 0;
+ Opacity = 0;
FormBorderStyle = FormBorderStyle.None;
- ShowInTaskbar = false;
- Size = new Size( 0, 0 );
+ ShowInTaskbar = false;
+ Size = new Size( 0, 0 );
Shown += HiddenForm_Shown;
}
diff --git a/Penumbra/Extensions/FuckedExtensions.cs b/Penumbra/Extensions/FuckedExtensions.cs
index 55720713..f9f41413 100644
--- a/Penumbra/Extensions/FuckedExtensions.cs
+++ b/Penumbra/Extensions/FuckedExtensions.cs
@@ -25,7 +25,8 @@ namespace Penumbra.Extensions
/// The type of the underlying field
/// A delegate that will return a reference to a particular field - zero copy
///
- private static RefGet< TObject, TField > CreateRefGetter< TObject, TField >( string fieldName ) where TField : unmanaged
+ private static RefGet< TObject, TField > CreateRefGetter< TObject, TField >( string fieldName )
+ where TField : unmanaged
{
const BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance;
diff --git a/Penumbra/Game/GameUtils.cs b/Penumbra/Game/GameUtils.cs
index 628adc00..95eb89fc 100644
--- a/Penumbra/Game/GameUtils.cs
+++ b/Penumbra/Game/GameUtils.cs
@@ -14,11 +14,11 @@ namespace Penumbra.Game
public unsafe delegate void* UnloadPlayerResourcesPrototype( IntPtr pResourceManager );
- public LoadPlayerResourcesPrototype LoadPlayerResources { get; private set; }
- public UnloadPlayerResourcesPrototype UnloadPlayerResources { get; private set; }
+ public LoadPlayerResourcesPrototype LoadPlayerResources { get; }
+ public UnloadPlayerResourcesPrototype UnloadPlayerResources { get; }
// Object addresses
- private IntPtr _playerResourceManagerAddress;
+ private readonly IntPtr _playerResourceManagerAddress;
public IntPtr PlayerResourceManagerPtr => Marshal.ReadIntPtr( _playerResourceManagerAddress );
public GameUtils( DalamudPluginInterface pluginInterface )
@@ -33,7 +33,7 @@ namespace Penumbra.Game
_playerResourceManagerAddress = scanner.GetStaticAddressFromSig( "0F 44 FE 48 8B 0D ?? ?? ?? ?? 48 85 C9 74 05" );
- LoadPlayerResources = Marshal.GetDelegateForFunctionPointer< LoadPlayerResourcesPrototype >( loadPlayerResourcesAddress );
+ LoadPlayerResources = Marshal.GetDelegateForFunctionPointer< LoadPlayerResourcesPrototype >( loadPlayerResourcesAddress );
UnloadPlayerResources = Marshal.GetDelegateForFunctionPointer< UnloadPlayerResourcesPrototype >( unloadPlayerResourcesAddress );
}
diff --git a/Penumbra/Game/RefreshActors.cs b/Penumbra/Game/RefreshActors.cs
index 16a8f934..573f26db 100644
--- a/Penumbra/Game/RefreshActors.cs
+++ b/Penumbra/Game/RefreshActors.cs
@@ -1,54 +1,61 @@
-using System.Runtime.InteropServices;
-using Dalamud.Game.ClientState.Actors;
-using Dalamud.Game.ClientState.Actors.Types;
+using System.Linq;
+using System.Runtime.InteropServices;
using System.Threading.Tasks;
+using Dalamud.Game.ClientState.Actors;
+using Dalamud.Game.ClientState.Actors.Types;
-namespace Penumbra
+namespace Penumbra.Game
{
- public static class RefreshActors
- {
- private const int RenderModeOffset = 0x0104;
- private const int RenderTaskPlayerDelay = 75;
- private const int RenderTaskOtherDelay = 25;
- private const int ModelInvisibilityFlag = 0b10;
-
- private static async void Redraw(Actor actor)
- {
- var ptr = actor.Address;
- var renderModePtr = ptr + RenderModeOffset;
- var renderStatus = Marshal.ReadInt32(renderModePtr);
-
- async void DrawObject(int delay)
- {
- Marshal.WriteInt32(renderModePtr, renderStatus | ModelInvisibilityFlag);
- await Task.Delay(delay);
- Marshal.WriteInt32(renderModePtr, renderStatus & ~ModelInvisibilityFlag);
- }
-
- if (actor.ObjectKind == Dalamud.Game.ClientState.Actors.ObjectKind.Player)
- {
- DrawObject(RenderTaskPlayerDelay);
- await Task.Delay(RenderTaskPlayerDelay);
- }
- else
- DrawObject(RenderTaskOtherDelay);
-
- }
-
- public static void RedrawSpecific(ActorTable actors, string name)
- {
- if (name?.Length == 0)
- RedrawAll(actors);
-
- foreach (var actor in actors)
- if (actor.Name == name)
- Redraw(actor);
- }
-
- public static void RedrawAll(ActorTable actors)
- {
- foreach (var actor in actors)
- Redraw(actor);
- }
+ public static class RefreshActors
+ {
+ private const int RenderModeOffset = 0x0104;
+ private const int RenderTaskPlayerDelay = 75;
+ private const int RenderTaskOtherDelay = 25;
+ private const int ModelInvisibilityFlag = 0b10;
+
+ private static async void Redraw( Actor actor )
+ {
+ var ptr = actor.Address;
+ var renderModePtr = ptr + RenderModeOffset;
+ var renderStatus = Marshal.ReadInt32( renderModePtr );
+
+ async void DrawObject( int delay )
+ {
+ Marshal.WriteInt32( renderModePtr, renderStatus | ModelInvisibilityFlag );
+ await Task.Delay( delay );
+ Marshal.WriteInt32( renderModePtr, renderStatus & ~ModelInvisibilityFlag );
+ }
+
+ if( actor.ObjectKind == ObjectKind.Player )
+ {
+ DrawObject( RenderTaskPlayerDelay );
+ await Task.Delay( RenderTaskPlayerDelay );
+ }
+ else
+ {
+ DrawObject( RenderTaskOtherDelay );
+ }
+ }
+
+ public static void RedrawSpecific( ActorTable actors, string name )
+ {
+ if( name?.Length == 0 )
+ {
+ RedrawAll( actors );
+ }
+
+ foreach( var actor in actors.Where( A => A.Name == name ) )
+ {
+ Redraw( actor );
+ }
+ }
+
+ public static void RedrawAll( ActorTable actors )
+ {
+ foreach( var actor in actors )
+ {
+ Redraw( actor );
+ }
+ }
}
-}
+}
\ No newline at end of file
diff --git a/Penumbra/Importer/MagicTempFileStreamManagerAndDeleterFuckery.cs b/Penumbra/Importer/MagicTempFileStreamManagerAndDeleterFuckery.cs
index 68f12965..6667f2e0 100644
--- a/Penumbra/Importer/MagicTempFileStreamManagerAndDeleterFuckery.cs
+++ b/Penumbra/Importer/MagicTempFileStreamManagerAndDeleterFuckery.cs
@@ -8,10 +8,7 @@ namespace Penumbra.Importer
{
private readonly FileStream _fileStream;
- public MagicTempFileStreamManagerAndDeleterFuckery( FileStream stream ) : base( stream )
- {
- _fileStream = stream;
- }
+ public MagicTempFileStreamManagerAndDeleterFuckery( FileStream stream ) : base( stream ) => _fileStream = stream;
public new void Dispose()
{
diff --git a/Penumbra/Importer/TexToolsImport.cs b/Penumbra/Importer/TexToolsImport.cs
index 7d587314..f6b366eb 100644
--- a/Penumbra/Importer/TexToolsImport.cs
+++ b/Penumbra/Importer/TexToolsImport.cs
@@ -16,12 +16,12 @@ namespace Penumbra.Importer
{
private readonly DirectoryInfo _outDirectory;
- private const string TempFileName = "textools-import";
+ private const string TempFileName = "textools-import";
private readonly string _resolvedTempFilePath;
public ImporterState State { get; private set; }
- public long TotalProgress { get; private set; }
+ public long TotalProgress { get; private set; } = 0;
public long CurrentProgress { get; private set; }
public float Progress
@@ -42,7 +42,7 @@ namespace Penumbra.Importer
public TexToolsImport( DirectoryInfo outDirectory )
{
- _outDirectory = outDirectory;
+ _outDirectory = outDirectory;
_resolvedTempFilePath = Path.Combine( _outDirectory.FullName, TempFileName );
}
@@ -50,19 +50,7 @@ namespace Penumbra.Importer
{
CurrentModPack = modPackFile.Name;
- switch( modPackFile.Extension )
- {
- case ".ttmp":
- ImportV1ModPack( modPackFile );
- break;
-
- case ".ttmp2":
- ImportV2ModPack( modPackFile );
- break;
-
- default:
- throw new ArgumentException( $"Unrecognized modpack format: {modPackFile.Extension}", nameof(modPackFile) );
- }
+ VerifyVersionAndImport( modPackFile );
State = ImporterState.Done;
}
@@ -79,8 +67,8 @@ namespace Penumbra.Importer
State = ImporterState.WritingPackToDisk;
// write shitty zip garbage to disk
- var entry = file.GetEntry( entryName );
- using var s = file.GetInputStream( entry );
+ var entry = file.GetEntry( entryName );
+ using var s = file.GetInputStream( entry );
WriteZipEntryToTempFile( s );
@@ -88,15 +76,39 @@ namespace Penumbra.Importer
return new MagicTempFileStreamManagerAndDeleterFuckery( fs );
}
- private void ImportV1ModPack( FileInfo modPackFile )
+ private void VerifyVersionAndImport( FileInfo modPackFile )
+ {
+ using var zfs = modPackFile.OpenRead();
+ using var extractedModPack = new ZipFile( zfs );
+ var mpl = extractedModPack.GetEntry( "TTMPL.mpl" );
+ var modRaw = GetStringFromZipEntry( extractedModPack, mpl, Encoding.UTF8 );
+
+ // At least a better validation than going by the extension.
+ if( modRaw.Contains( "\"TTMPVersion\":" ) )
+ {
+ if( modPackFile.Extension != ".ttmp2" )
+ {
+ PluginLog.Warning( $"File {modPackFile.FullName} seems to be a V2 TTMP, but has the wrong extension." );
+ }
+
+ ImportV2ModPack( modPackFile, extractedModPack, modRaw );
+ }
+ else
+ {
+ if( modPackFile.Extension != ".ttmp" )
+ {
+ PluginLog.Warning( $"File {modPackFile.FullName} seems to be a V1 TTMP, but has the wrong extension." );
+ }
+
+ ImportV1ModPack( modPackFile, extractedModPack, modRaw );
+ }
+ }
+
+ private void ImportV1ModPack( FileInfo modPackFile, ZipFile extractedModPack, string modRaw )
{
PluginLog.Log( " -> Importing V1 ModPack" );
- using var zfs = modPackFile.OpenRead();
- using var extractedModPack = new ZipFile( zfs );
-
- var mpl = extractedModPack.GetEntry( "TTMPL.mpl" );
- var modListRaw = GetStringFromZipEntry( extractedModPack, mpl, Encoding.UTF8 ).Split(
+ var modListRaw = modRaw.Split(
new[] { "\r\n", "\r", "\n" },
StringSplitOptions.None
);
@@ -106,8 +118,8 @@ namespace Penumbra.Importer
// Create a new ModMeta from the TTMP modlist info
var modMeta = new ModMeta
{
- Author = "Unknown",
- Name = modPackFile.Name,
+ Author = "Unknown",
+ Name = modPackFile.Name,
Description = "Mod imported from TexTools mod pack"
};
@@ -129,38 +141,31 @@ namespace Penumbra.Importer
ExtractSimpleModList( newModFolder, modList, modData );
}
- private void ImportV2ModPack( FileInfo modPackFile )
+ private void ImportV2ModPack( FileInfo modPackFile, ZipFile extractedModPack, string modRaw )
{
- using var zfs = modPackFile.OpenRead();
- using var extractedModPack = new ZipFile( zfs );
-
- var mpl = extractedModPack.GetEntry( "TTMPL.mpl" );
- var modList = JsonConvert.DeserializeObject< SimpleModPack >( GetStringFromZipEntry( extractedModPack, mpl, Encoding.UTF8 ) );
+ var modList = JsonConvert.DeserializeObject< SimpleModPack >( modRaw );
if( modList.TTMPVersion.EndsWith( "s" ) )
{
- ImportSimpleV2ModPack( extractedModPack );
+ ImportSimpleV2ModPack( extractedModPack, modList );
return;
}
if( modList.TTMPVersion.EndsWith( "w" ) )
{
- ImportExtendedV2ModPack( extractedModPack );
+ ImportExtendedV2ModPack( extractedModPack, modRaw );
}
}
- private void ImportSimpleV2ModPack( ZipFile extractedModPack )
+ private void ImportSimpleV2ModPack( ZipFile extractedModPack, SimpleModPack modList )
{
PluginLog.Log( " -> Importing Simple V2 ModPack" );
- var mpl = extractedModPack.GetEntry( "TTMPL.mpl" );
- var modList = JsonConvert.DeserializeObject< SimpleModPack >( GetStringFromZipEntry( extractedModPack, mpl, Encoding.UTF8 ) );
-
// Create a new ModMeta from the TTMP modlist info
var modMeta = new ModMeta
{
Author = modList.Author,
- Name = modList.Name,
+ Name = modList.Name,
Description = string.IsNullOrEmpty( modList.Description )
? "Mod imported from TexTools mod pack"
: modList.Description
@@ -179,18 +184,17 @@ namespace Penumbra.Importer
ExtractSimpleModList( newModFolder, modList.SimpleModsList, modData );
}
- private void ImportExtendedV2ModPack( ZipFile extractedModPack )
+ private void ImportExtendedV2ModPack( ZipFile extractedModPack, string modRaw )
{
PluginLog.Log( " -> Importing Extended V2 ModPack" );
- var mpl = extractedModPack.GetEntry( "TTMPL.mpl" );
- var modList = JsonConvert.DeserializeObject< ExtendedModPack >( GetStringFromZipEntry( extractedModPack, mpl, Encoding.UTF8 ) );
+ var modList = JsonConvert.DeserializeObject< ExtendedModPack >( modRaw );
// Create a new ModMeta from the TTMP modlist info
var modMeta = new ModMeta
{
Author = modList.Author,
- Name = modList.Name,
+ Name = modList.Name,
Description = string.IsNullOrEmpty( modList.Description )
? "Mod imported from TexTools mod pack"
: modList.Description,
@@ -202,28 +206,32 @@ namespace Penumbra.Importer
var newModFolder = new DirectoryInfo(
Path.Combine( _outDirectory.FullName,
- Path.GetFileNameWithoutExtension( modList.Name )
+ Path.GetFileNameWithoutExtension( modList.Name ).ReplaceInvalidPathSymbols()
)
);
newModFolder.Create();
if( modList.SimpleModsList != null )
+ {
ExtractSimpleModList( newModFolder, modList.SimpleModsList, modData );
+ }
if( modList.ModPackPages == null )
+ {
return;
+ }
// Iterate through all pages
- foreach( var page in modList.ModPackPages)
+ foreach( var group in modList.ModPackPages.SelectMany( page => page.ModGroups ) )
{
- foreach(var group in page.ModGroups) {
- var groupFolder = new DirectoryInfo(Path.Combine(newModFolder.FullName, group.GroupName));
- foreach(var option in group.OptionList) {
- var optionFolder = new DirectoryInfo( Path.Combine( groupFolder.FullName, option.Name ) );
- ExtractSimpleModList( optionFolder, option.ModsJsons, modData );
- }
- AddMeta(newModFolder, groupFolder, group, modMeta);
+ var groupFolder = new DirectoryInfo( Path.Combine( newModFolder.FullName, group.GroupName.ReplaceInvalidPathSymbols() ) );
+ foreach( var option in group.OptionList )
+ {
+ var optionFolder = new DirectoryInfo( Path.Combine( groupFolder.FullName, option.Name.ReplaceInvalidPathSymbols() ) );
+ ExtractSimpleModList( optionFolder, option.ModsJsons, modData );
}
+
+ AddMeta( newModFolder, groupFolder, group, modMeta );
}
File.WriteAllText(
@@ -232,32 +240,35 @@ namespace Penumbra.Importer
);
}
- private void AddMeta( DirectoryInfo baseFolder, DirectoryInfo groupFolder,ModGroup group, ModMeta meta)
+ private void AddMeta( DirectoryInfo baseFolder, DirectoryInfo groupFolder, ModGroup group, ModMeta meta )
{
var Inf = new InstallerInfo
{
SelectionType = group.SelectionType,
- GroupName = group.GroupName,
- Options = new List