fix RewriteMods option ignored when rewriting mod for OS
This commit is contained in:
parent
699a07ecf7
commit
5a2258f419
|
@ -13,6 +13,7 @@
|
|||
|
||||
* For mod authors:
|
||||
* Added three stages to the `LoadStageChanged` event: `CreatedInitialLocations`/`SaveAddedLocations` (raised immediately after the game adds locations but before they're initialized), and `ReturningToTitle` (raised before exiting to the title screen).
|
||||
* Fixed `RewriteMods` option in `smapi-internal/config.json` ignored when rewriting mod for OS compatibility.
|
||||
* Fixed edge case when playing as a farmhand in non-English where translatable assets loaded via `IAssetLoader` weren't reapplied immediately when the server disconnects.
|
||||
|
||||
## 3.9.2
|
||||
|
|
|
@ -276,37 +276,40 @@ namespace StardewModdingAPI.Framework.ModLoading
|
|||
|
||||
// swap assembly references if needed (e.g. XNA => MonoGame)
|
||||
bool platformChanged = false;
|
||||
for (int i = 0; i < module.AssemblyReferences.Count; i++)
|
||||
if (this.RewriteMods)
|
||||
{
|
||||
// remove old assembly reference
|
||||
if (this.AssemblyMap.RemoveNames.Any(name => module.AssemblyReferences[i].Name == name))
|
||||
for (int i = 0; i < module.AssemblyReferences.Count; i++)
|
||||
{
|
||||
this.Monitor.LogOnce(loggedMessages, $"{logPrefix}Rewriting {filename} for OS...");
|
||||
platformChanged = true;
|
||||
module.AssemblyReferences.RemoveAt(i);
|
||||
i--;
|
||||
}
|
||||
}
|
||||
if (platformChanged)
|
||||
{
|
||||
// add target assembly references
|
||||
foreach (AssemblyNameReference target in this.AssemblyMap.TargetReferences.Values)
|
||||
module.AssemblyReferences.Add(target);
|
||||
|
||||
// rewrite type scopes to use target assemblies
|
||||
IEnumerable<TypeReference> typeReferences = module.GetTypeReferences().OrderBy(p => p.FullName);
|
||||
foreach (TypeReference type in typeReferences)
|
||||
this.ChangeTypeScope(type);
|
||||
|
||||
// rewrite types using custom attributes
|
||||
foreach (TypeDefinition type in module.GetTypes())
|
||||
{
|
||||
foreach (var attr in type.CustomAttributes)
|
||||
// remove old assembly reference
|
||||
if (this.AssemblyMap.RemoveNames.Any(name => module.AssemblyReferences[i].Name == name))
|
||||
{
|
||||
foreach (var conField in attr.ConstructorArguments)
|
||||
this.Monitor.LogOnce(loggedMessages, $"{logPrefix}Rewriting {filename} for OS...");
|
||||
platformChanged = true;
|
||||
module.AssemblyReferences.RemoveAt(i);
|
||||
i--;
|
||||
}
|
||||
}
|
||||
if (platformChanged)
|
||||
{
|
||||
// add target assembly references
|
||||
foreach (AssemblyNameReference target in this.AssemblyMap.TargetReferences.Values)
|
||||
module.AssemblyReferences.Add(target);
|
||||
|
||||
// rewrite type scopes to use target assemblies
|
||||
IEnumerable<TypeReference> typeReferences = module.GetTypeReferences().OrderBy(p => p.FullName);
|
||||
foreach (TypeReference type in typeReferences)
|
||||
this.ChangeTypeScope(type);
|
||||
|
||||
// rewrite types using custom attributes
|
||||
foreach (TypeDefinition type in module.GetTypes())
|
||||
{
|
||||
foreach (var attr in type.CustomAttributes)
|
||||
{
|
||||
if (conField.Value is TypeReference typeRef)
|
||||
this.ChangeTypeScope(typeRef);
|
||||
foreach (var conField in attr.ConstructorArguments)
|
||||
{
|
||||
if (conField.Value is TypeReference typeRef)
|
||||
this.ChangeTypeScope(typeRef);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue