Skip to content

Commit fba7024

Browse files
authored
fix(2398): don't unsafely grab strings from ItemOptions.RarityTiers (#2441)
* fix: don't unsafely grab strings from ItemOptions.RarityTiers * fix: prevent editor from having an index-out-of-range exception
1 parent 6ecbea6 commit fba7024

File tree

5 files changed

+37
-27
lines changed

5 files changed

+37
-27
lines changed
Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Diagnostics.CodeAnalysis;
12
using Newtonsoft.Json;
23

34
namespace Intersect.Config;
@@ -10,14 +11,21 @@ public class ItemOptions
1011
/// <summary>
1112
/// The available rarity tiers.
1213
/// </summary>
14+
/// <remarks>This is not intended to be a localized string, please see Strings for localization.</remarks>
1315
[JsonProperty(ObjectCreationHandling = ObjectCreationHandling.Replace)]
14-
public List<string> RarityTiers { get; set; } = new List<string>
15-
{
16-
@"None",
17-
@"Common",
18-
@"Uncommon",
19-
@"Rare",
20-
@"Epic",
21-
@"Legendary",
22-
};
16+
public List<string> RarityTiers { get; set; } =
17+
[
18+
@"None",
19+
@"Common",
20+
@"Uncommon",
21+
@"Rare",
22+
@"Epic",
23+
@"Legendary",
24+
];
25+
26+
public bool TryGetRarityName(int rarityLevel, [NotNullWhen(true)] out string? rarityName)
27+
{
28+
rarityName = RarityTiers.Skip(rarityLevel).FirstOrDefault();
29+
return rarityName != default;
30+
}
2331
}

Intersect.Client.Core/Interface/Game/DescriptionWindows/ItemDescriptionWindow.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,11 @@ protected void SetupHeader()
134134
// Set up the item rarity label.
135135
try
136136
{
137-
var rarityName = Options.Instance.Items.RarityTiers[mItem.Rarity];
138-
_ = Strings.ItemDescription.Rarity.TryGetValue(rarityName, out var rarityLabel);
139-
header.SetDescription(rarityLabel, rarityColor ?? Color.White);
137+
if (Options.Instance.Items.TryGetRarityName(mItem.Rarity, out var rarityName))
138+
{
139+
_ = Strings.ItemDescription.Rarity.TryGetValue(rarityName, out var rarityLabel);
140+
header.SetDescription(rarityLabel, rarityColor ?? Color.White);
141+
}
140142
}
141143
catch (Exception exception)
142144
{

Intersect.Client.Core/Localization/Strings.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,12 @@ private static void SynchronizeConfigurableStrings()
8383
return;
8484
}
8585

86-
for (var rarityCode = 0; rarityCode < Options.Instance.Items.RarityTiers.Count; rarityCode++)
86+
var keyedRarityTiers = Options.Instance.Items.RarityTiers.Select((rarityName, rarity) => (rarity, rarityName));
87+
foreach (var (rarity, rarityName) in keyedRarityTiers)
8788
{
88-
var rarityName = Options.Instance.Items.RarityTiers[rarityCode];
8989
if (!ItemDescription.Rarity.ContainsKey(rarityName))
9090
{
91-
ItemDescription.Rarity[rarityName] = $"{rarityCode}:{rarityName}";
91+
ItemDescription.Rarity[rarityName] = $"{rarity}:{rarityName}";
9292
}
9393
}
9494
}
@@ -1932,7 +1932,7 @@ public partial struct Settings
19321932

19331933
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
19341934
public static LocalizedString ShowPlayerOverheadInformation = @"Show players overhead information";
1935-
1935+
19361936
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
19371937
public static LocalizedString SimplifiedEscapeMenu = @"Simplified escape menu";
19381938

Intersect.Editor/Forms/Editors/frmItem.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,10 @@ private void InitLocalization()
216216
lblBankStackLimit.Text = Strings.ItemEditor.BankStackLimit;
217217

218218
cmbRarity.Items.Clear();
219-
for (var i = 0; i < Options.Instance.Items.RarityTiers.Count; i++)
219+
var keyedRarityTiers = Options.Instance.Items.RarityTiers.Select((rarityName, rarity) => (rarity, rarityName));
220+
foreach (var (rarity, rarityName) in keyedRarityTiers)
220221
{
221-
var rarityName = Options.Instance.Items.RarityTiers[i];
222-
cmbRarity.Items.Add(Strings.ItemEditor.rarity[rarityName]);
222+
cmbRarity.Items.Add(Strings.ItemEditor.rarity.GetValueOrDefault(rarityName, $"{rarity}:{rarityName}"));
223223
}
224224

225225
grpEvents.Text = Strings.ItemEditor.EventGroup;
@@ -345,7 +345,7 @@ private void UpdateEditor()
345345
nudRgbaA.Value = mEditorItem.Color.A;
346346
cmbEquipmentAnimation.SelectedIndex = AnimationBase.ListIndex(mEditorItem.EquipmentAnimationId) + 1;
347347
nudPrice.Value = mEditorItem.Price;
348-
cmbRarity.SelectedIndex = mEditorItem.Rarity;
348+
cmbRarity.Select(mEditorItem.Rarity, 1);
349349

350350
nudStr.Value = mEditorItem.StatsGiven[0];
351351
nudMag.Value = mEditorItem.StatsGiven[1];
@@ -1529,7 +1529,7 @@ private void cmbEventTriggers_SelectedIndexChanged(object sender, EventArgs e)
15291529
{
15301530
return;
15311531
}
1532-
1532+
15331533
mEditorItem.EventTriggers[SelectedEventTrigger.Value] = EventBase.IdFromList(cmbEventTriggers.SelectedIndex - 1);
15341534

15351535
PopulateEventTriggerList(lstEventTriggers.SelectedIndex);

Intersect.Editor/Localization/Strings.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -494,12 +494,12 @@ private static void SynchronizeConfigurableStrings()
494494
return;
495495
}
496496

497-
for (var rarityCode = 0; rarityCode < Intersect.Options.Instance.Items.RarityTiers.Count; rarityCode++)
497+
var keyedRarityTiers = Intersect.Options.Instance.Items.RarityTiers.Select((rarityName, rarity) => (rarity, rarityName));
498+
foreach (var (rarity, rarityName) in keyedRarityTiers)
498499
{
499-
var rarityName = Intersect.Options.Instance.Items.RarityTiers[rarityCode];
500500
if (!ItemEditor.rarity.ContainsKey(rarityName))
501501
{
502-
ItemEditor.rarity[rarityName] = $"{rarityCode}:{rarityName}";
502+
ItemEditor.rarity[rarityName] = $"{rarity}:{rarityName}";
503503
}
504504
}
505505
}
@@ -825,7 +825,7 @@ public partial struct AnimationEditor
825825
public static LocalizedString sound = @"Sound:";
826826

827827
public static LocalizedString soundcomplete = @"Complete Sound Playback After Anim Dies";
828-
828+
829829
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
830830
public static LocalizedString LoopSoundDuringPreview = @"Loop sound during preview";
831831

@@ -1761,7 +1761,7 @@ public partial struct EventChangeSpells
17611761
public static LocalizedString okay = @"Ok";
17621762

17631763
public static LocalizedString RemoveBound = @"Remove Bound Spell ?";
1764-
1764+
17651765
public static LocalizedString spell = @"Spell: ";
17661766

17671767
public static LocalizedString title = @"Change Player Spells";
@@ -4678,7 +4678,7 @@ public partial struct Options
46784678

46794679
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
46804680
public static LocalizedString TextureSize = @"Max Texture Pack Size (Resolution):";
4681-
4681+
46824682
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
46834683
public static LocalizedString CursorSprites = @"Enable cursor sprites for map tools.";
46844684
}

0 commit comments

Comments
 (0)