From 9f21f45f255b05ef38118619c3e2bd10015802d3 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 15 Nov 2025 22:24:15 -0600 Subject: [PATCH] Sanity check ability index on transfer Passing an entity with AbilityNumber of 7 no longer throws an exception on transfer logic --- PKHeX.Core/PKM/HOME/GameDataPA8.cs | 5 ++++- PKHeX.Core/PKM/HOME/GameDataPA9.cs | 5 ++++- PKHeX.Core/PKM/HOME/GameDataPB7.cs | 5 ++++- PKHeX.Core/PKM/HOME/GameDataPB8.cs | 5 ++++- PKHeX.Core/PKM/HOME/GameDataPK8.cs | 5 ++++- PKHeX.Core/PKM/HOME/GameDataPK9.cs | 5 ++++- 6 files changed, 24 insertions(+), 6 deletions(-) diff --git a/PKHeX.Core/PKM/HOME/GameDataPA8.cs b/PKHeX.Core/PKM/HOME/GameDataPA8.cs index 3a59b87a4..10bfb7f71 100644 --- a/PKHeX.Core/PKM/HOME/GameDataPA8.cs +++ b/PKHeX.Core/PKM/HOME/GameDataPA8.cs @@ -201,7 +201,10 @@ private void PopulateFromCore(PKH pkh) var pi = PersonalTable.LA.GetFormEntry(pkh.Species, pkh.Form); HeightAbsolute = PA8.GetHeightAbsolute(pi, pkh.HeightScalar); WeightAbsolute = PA8.GetWeightAbsolute(pi, pkh.HeightScalar, pkh.WeightScalar); - Ability = (ushort)pi.GetAbilityAtIndex(AbilityNumber >> 1); + var index = AbilityNumber >> 1; + if (index >= pi.AbilityCount) + index = 0; + Ability = (ushort)pi.GetAbilityAtIndex(index); var level = Experience.GetLevel(pkh.EXP, pi.EXPGrowth); this.ResetMoves(pkh.Species, pkh.Form, level, LearnSource8LA.Instance, EntityContext.Gen8a); diff --git a/PKHeX.Core/PKM/HOME/GameDataPA9.cs b/PKHeX.Core/PKM/HOME/GameDataPA9.cs index 541d758db..d034c4c6a 100644 --- a/PKHeX.Core/PKM/HOME/GameDataPA9.cs +++ b/PKHeX.Core/PKM/HOME/GameDataPA9.cs @@ -273,7 +273,10 @@ private void PopulateFromCore(PKH pkh) Obedience_Level = pkh.MetLevel; var pi = PersonalTable.ZA.GetFormEntry(pkh.Species, pkh.Form); - Ability = (ushort)pi.GetAbilityAtIndex(AbilityNumber >> 1); + var index = AbilityNumber >> 1; + if (index >= pi.AbilityCount) + index = 0; + Ability = (ushort)pi.GetAbilityAtIndex(index); var level = Experience.GetLevel(pkh.EXP, pi.EXPGrowth); this.ResetMoves(pkh.Species, pkh.Form, level, LearnSource9ZA.Instance, EntityContext.Gen9); diff --git a/PKHeX.Core/PKM/HOME/GameDataPB7.cs b/PKHeX.Core/PKM/HOME/GameDataPB7.cs index 0e193acb2..5b0d1de30 100644 --- a/PKHeX.Core/PKM/HOME/GameDataPB7.cs +++ b/PKHeX.Core/PKM/HOME/GameDataPB7.cs @@ -203,7 +203,10 @@ private void PopulateFromCore(PKH pkh) var pi = PersonalTable.GG.GetFormEntry(pkh.Species, pkh.Form); HeightAbsolute = PB7.GetHeightAbsolute(pi, pkh.HeightScalar); WeightAbsolute = PB7.GetWeightAbsolute(pi, pkh.HeightScalar, pkh.WeightScalar); - Ability = (ushort)pi.GetAbilityAtIndex(AbilityNumber >> 1); + var index = AbilityNumber >> 1; + if (index >= pi.AbilityCount) + index = 0; + Ability = (ushort)pi.GetAbilityAtIndex(index); } private static IGameDataSide? GetNearestNeighbor(PKH pkh) => pkh.DataPK9 as IGameDataSide diff --git a/PKHeX.Core/PKM/HOME/GameDataPB8.cs b/PKHeX.Core/PKM/HOME/GameDataPB8.cs index 2785507a1..5bdbad4c2 100644 --- a/PKHeX.Core/PKM/HOME/GameDataPB8.cs +++ b/PKHeX.Core/PKM/HOME/GameDataPB8.cs @@ -126,7 +126,10 @@ public void InitializeFrom(IGameDataSide side, PKH pkh) private void PopulateFromCore(PKH pkh) { var pi = PersonalTable.BDSP.GetFormEntry(pkh.Species, pkh.Form); - Ability = (ushort)pi.GetAbilityAtIndex(AbilityNumber >> 1); + var index = AbilityNumber >> 1; + if (index >= pi.AbilityCount) + index = 0; + Ability = (ushort)pi.GetAbilityAtIndex(index); var level = Experience.GetLevel(pkh.EXP, pi.EXPGrowth); this.ResetMoves(pkh.Species, pkh.Form, level, LearnSource8BDSP.Instance, EntityContext.Gen8b); diff --git a/PKHeX.Core/PKM/HOME/GameDataPK8.cs b/PKHeX.Core/PKM/HOME/GameDataPK8.cs index e77793efb..bcc763cf3 100644 --- a/PKHeX.Core/PKM/HOME/GameDataPK8.cs +++ b/PKHeX.Core/PKM/HOME/GameDataPK8.cs @@ -201,7 +201,10 @@ public void InitializeFrom(IGameDataSide side, PKH pkh) private void PopulateFromCore(PKH pkh) { var pi = PersonalTable.SWSH.GetFormEntry(pkh.Species, pkh.Form); - Ability = (ushort)pi.GetAbilityAtIndex(AbilityNumber >> 1); + var index = AbilityNumber >> 1; + if (index >= pi.AbilityCount) + index = 0; + Ability = (ushort)pi.GetAbilityAtIndex(index); } private static void RemapMetEgg(GameVersion version, ref ushort met, ref ushort egg) diff --git a/PKHeX.Core/PKM/HOME/GameDataPK9.cs b/PKHeX.Core/PKM/HOME/GameDataPK9.cs index d9f1bafd7..cee285682 100644 --- a/PKHeX.Core/PKM/HOME/GameDataPK9.cs +++ b/PKHeX.Core/PKM/HOME/GameDataPK9.cs @@ -208,7 +208,10 @@ private void PopulateFromCore(PKH pkh) Obedience_Level = pkh.MetLevel; var pi = PersonalTable.SV.GetFormEntry(pkh.Species, pkh.Form); - Ability = (ushort)pi.GetAbilityAtIndex(AbilityNumber >> 1); + var index = AbilityNumber >> 1; + if (index >= pi.AbilityCount) + index = 0; + Ability = (ushort)pi.GetAbilityAtIndex(index); TeraTypeOriginal = TeraTypeOverride = TeraTypeUtil.GetTeraTypeImport(pi.Type1, pi.Type2); var level = Experience.GetLevel(pkh.EXP, pi.EXPGrowth);