Skip to content

Commit

Permalink
Fixed Shapeshifter Created Dialog Crash
Browse files Browse the repository at this point in the history
Fixes #5137.
  • Loading branch information
DelnarErsike committed May 8, 2024
1 parent 010db8f commit 480a469
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 38 deletions.
111 changes: 75 additions & 36 deletions Chummer/Backend/Attributes/AttributeSection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2429,55 +2429,94 @@ public static void CopyAttribute(CharacterAttrib objSource, CharacterAttrib objT
{
if (objSource == null || objTarget == null)
return;
using (objSource.LockObject.EnterReadLock())
{
string strSourceAbbrev = objSource.Abbrev.ToLowerInvariant();
if (strSourceAbbrev == "magadept")
strSourceAbbrev = "mag";
XPathNavigator node = !string.IsNullOrEmpty(strMetavariantXPath)
? xmlDoc?.SelectSingleNode(strMetavariantXPath)
: null;
if (node != null)
using (objTarget.LockObject.EnterUpgradeableReadLock())
{
int intBase;
int intKarma;
int intMinimum = 0;
int intMaximum = 0;
int intAugmentedMaximum = 0;
using (objSource.LockObject.EnterReadLock())
{
int.TryParse(node.SelectSingleNodeAndCacheExpression(strSourceAbbrev + "min")?.Value, NumberStyles.Any,
GlobalSettings.InvariantCultureInfo, out int intMinimum);
int.TryParse(node.SelectSingleNodeAndCacheExpression(strSourceAbbrev + "max")?.Value, NumberStyles.Any,
GlobalSettings.InvariantCultureInfo, out int intMaximum);
int.TryParse(node.SelectSingleNodeAndCacheExpression(strSourceAbbrev + "aug")?.Value, NumberStyles.Any,
GlobalSettings.InvariantCultureInfo, out int intAugmentedMaximum);
intMaximum = Math.Max(intMaximum, intMinimum);
intAugmentedMaximum = Math.Max(intAugmentedMaximum, intMaximum);
objTarget.AssignBaseKarmaLimits(objSource.Base, objSource.Karma, intMinimum, intMaximum, intAugmentedMaximum);
intBase = objSource.Base;
intKarma = objSource.Karma;
string strSourceAbbrev = objSource.Abbrev.ToLowerInvariant();
if (strSourceAbbrev == "magadept")
strSourceAbbrev = "mag";
XPathNavigator node = !string.IsNullOrEmpty(strMetavariantXPath)
? xmlDoc?.SelectSingleNode(strMetavariantXPath)
: null;
if (node != null)
{
int.TryParse(node.SelectSingleNodeAndCacheExpression(strSourceAbbrev + "min")?.Value,
NumberStyles.Any,
GlobalSettings.InvariantCultureInfo, out intMinimum);
int.TryParse(node.SelectSingleNodeAndCacheExpression(strSourceAbbrev + "max")?.Value,
NumberStyles.Any,
GlobalSettings.InvariantCultureInfo, out intMaximum);
int.TryParse(node.SelectSingleNodeAndCacheExpression(strSourceAbbrev + "aug")?.Value,
NumberStyles.Any,
GlobalSettings.InvariantCultureInfo, out intAugmentedMaximum);
intMaximum = Math.Max(intMaximum, intMinimum);
intAugmentedMaximum = Math.Max(intAugmentedMaximum, intMaximum);
}
}

objTarget.AssignBaseKarmaLimits(intBase, intKarma, intMinimum, intMaximum, intAugmentedMaximum);
}
}

public static async Task CopyAttributeAsync(CharacterAttrib objSource, CharacterAttrib objTarget, string strMetavariantXPath, XPathNavigator xmlDoc, CancellationToken token = default)
public static async Task CopyAttributeAsync(CharacterAttrib objSource, CharacterAttrib objTarget,
string strMetavariantXPath, XPathNavigator xmlDoc, CancellationToken token = default)
{
if (objSource == null || objTarget == null)
return;
IAsyncDisposable objLocker = await objSource.LockObject.EnterReadLockAsync(token).ConfigureAwait(false);
IAsyncDisposable objLocker =
await objTarget.LockObject.EnterUpgradeableReadLockAsync(token).ConfigureAwait(false);
try
{
token.ThrowIfCancellationRequested();
string strSourceAbbrev = objSource.Abbrev.ToLowerInvariant();
if (strSourceAbbrev == "magadept")
strSourceAbbrev = "mag";
XPathNavigator node = !string.IsNullOrEmpty(strMetavariantXPath)
? xmlDoc?.SelectSingleNode(strMetavariantXPath)
: null;
if (node != null)
int intBase;
int intKarma;
int intMinimum = 0;
int intMaximum = 0;
int intAugmentedMaximum = 0;
IAsyncDisposable objLocker2 =
await objSource.LockObject.EnterReadLockAsync(token).ConfigureAwait(false);
try
{
token.ThrowIfCancellationRequested();
intBase = await objSource.GetBaseAsync(token).ConfigureAwait(false);
intKarma = await objSource.GetKarmaAsync(token).ConfigureAwait(false);
string strSourceAbbrev = objSource.Abbrev.ToLowerInvariant();
if (strSourceAbbrev == "magadept")
strSourceAbbrev = "mag";
XPathNavigator node = !string.IsNullOrEmpty(strMetavariantXPath)
? xmlDoc?.SelectSingleNode(strMetavariantXPath)
: null;
if (node != null)
{
int.TryParse(node.SelectSingleNodeAndCacheExpression(strSourceAbbrev + "min", token)?.Value,
NumberStyles.Any,
GlobalSettings.InvariantCultureInfo, out intMinimum);
int.TryParse(node.SelectSingleNodeAndCacheExpression(strSourceAbbrev + "max", token)?.Value,
NumberStyles.Any,
GlobalSettings.InvariantCultureInfo, out intMaximum);
int.TryParse(node.SelectSingleNodeAndCacheExpression(strSourceAbbrev + "aug", token)?.Value,
NumberStyles.Any,
GlobalSettings.InvariantCultureInfo, out intAugmentedMaximum);
intMaximum = Math.Max(intMaximum, intMinimum);
intAugmentedMaximum = Math.Max(intAugmentedMaximum, intMaximum);
}
}
finally
{
int.TryParse(node.SelectSingleNodeAndCacheExpression(strSourceAbbrev + "min", token)?.Value, NumberStyles.Any,
GlobalSettings.InvariantCultureInfo, out int intMinimum);
int.TryParse(node.SelectSingleNodeAndCacheExpression(strSourceAbbrev + "max", token)?.Value, NumberStyles.Any,
GlobalSettings.InvariantCultureInfo, out int intMaximum);
int.TryParse(node.SelectSingleNodeAndCacheExpression(strSourceAbbrev + "aug", token)?.Value, NumberStyles.Any,
GlobalSettings.InvariantCultureInfo, out int intAugmentedMaximum);
intMaximum = Math.Max(intMaximum, intMinimum);
intAugmentedMaximum = Math.Max(intAugmentedMaximum, intMaximum);
await objTarget.AssignBaseKarmaLimitsAsync(objSource.Base, objSource.Karma, intMinimum, intMaximum, intAugmentedMaximum, token).ConfigureAwait(false);
await objLocker2.DisposeAsync().ConfigureAwait(false);
}

await objTarget
.AssignBaseKarmaLimitsAsync(intBase, intKarma, intMinimum, intMaximum, intAugmentedMaximum, token)
.ConfigureAwait(false);
}
finally
{
Expand Down
5 changes: 3 additions & 2 deletions Chummer/Forms/Character Forms/CharacterCreate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17493,7 +17493,8 @@ await CharacterObject.ExpenseEntries.AddWithSortAsync(objKarma, token: token)
+ strMetavariantGuidString.ToUpperInvariant().CleanXPath()
+ ']';
AttributeSection objAttributeSection = await CharacterObject.GetAttributeSectionAsync(token).ConfigureAwait(false);
await objAttributeSection.AttributeList.ForEachAsync(async objOldAttribute =>
ThreadSafeObservableCollection<CharacterAttrib> lstAttributeList = await objAttributeSection.GetAttributeListAsync(token).ConfigureAwait(false);
await lstAttributeList.ForEachWithSideEffectsAsync(async objOldAttribute =>
{
CharacterAttrib objNewAttribute = new CharacterAttrib(
CharacterObject, objOldAttribute.Abbrev,
Expand All @@ -17507,7 +17508,7 @@ await CharacterObject.ExpenseEntries.AddWithSortAsync(objKarma, token: token)

foreach (CharacterAttrib objAttributeToAdd in lstAttributesToAdd)
{
await CharacterObject.AttributeSection.AttributeList.AddAsync(objAttributeToAdd, token)
await lstAttributeList.AddAsync(objAttributeToAdd, token)
.ConfigureAwait(false);
}
}
Expand Down

0 comments on commit 480a469

Please sign in to comment.