tModLoader

tModLoader

Dynamic Gear Advancements
andro951 19 May, 2024 @ 2:53pm
Ammo Compatability issue
[18:55:47.826] [Main Thread/WARN] [tML]: Silently Caught Exception:
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at Terraria.Player.GetModPlayer[T](T baseInstance) in tModLoader\Terraria\Player.TML.cs:line 99
at androLib.UI.BagUI.get_MyStorage() in androLib\UI\BagUI.cs:line 45
at androLib.StorageManager.HasRequiredItemToUseStorageFromBagTypeSlow(Player player, Int32 bagType) in androLib\StorageManager.cs:line 728
at VacuumBags.VacuumBags.On_Player_HasItem_int(orig_HasItem_int orig, Player self, Int32 type) in VacuumBags.cs:line 169
at Hook<System.Boolean VacuumBags.VacuumBags::On_Player_HasItem_int(Terraria.On_Player+orig_HasItem_int,Terraria.Player,System.Int32)>(Player , Int32 )
at SyncProxy<System.Boolean Terraria.Player:HasItem(System.Int32)>(Player , Int32 )
at AmmoTool.GlobalModItem.GetValidAmmoIDs(Player player, Item item, Boolean allowOnCursor) in AmmoTool\GlobalModItem.cs:line 43
at AmmoTool.GlobalModItem.CanBeChosenAsAmmo(Item ammo, Item weapon, Player player) in AmmoTool\GlobalModItem.cs:line 85
at DMD<System.Boolean Terraria.ModLoader.ItemLoader:CanChooseAmmo(Terraria.Item, Terraria.Item, Terraria.Player)>(Item weapon, Item ammo, Player player)
at Hook<System.Boolean VacuumBags.VacuumBags::GlobalItemCanBeChosenAsAmmoDetour(VacuumBags.VacuumBags+orig_GlobalItemCanBeChosenAsAmmo,Terraria.Item,Terraria.Item,Terraria.Player)>(Item , Item , Player )
at SyncProxy<System.Boolean Terraria.ModLoader.ItemLoader:CanChooseAmmo(Terraria.Item, Terraria.Item, Terraria.Player)>(Item , Item , Player )
at DMD<Terraria.Item Terraria.Player:ChooseAmmo(Terraria.Item)>(Player this, Item weapon)
at VacuumBags.Items.AmmoBag.OnChooseAmmo(orig_ChooseAmmo orig, Player self, Item weapon)
at Hook<Terraria.Item VacuumBags.Items.AmmoBag::OnChooseAmmo(Terraria.On_Player+orig_ChooseAmmo,Terraria.Player,Terraria.Item)>(Player , Item )
at SyncProxy<Terraria.Item Terraria.Player:ChooseAmmo(Terraria.Item)>(Player , Item )
at dynamicgearadvancements.DynamicItem.Sum(String stat, Int32 index, Player player, Item item)
at dynamicgearadvancements.PlayerInstance.ModifyMaxStats(StatModifier& health, StatModifier& mana)
at Terraria.ModLoader.PlayerLoader.ModifyMaxStats(Player player)
at Terraria.Player.ResetEffects()
at Terraria.Player.LoadPlayer_Finish(Player newPlayer)
at Terraria.Player.LoadPlayer_LastMinuteFixes(Player newPlayer)
at Terraria.Player.Deserialize(PlayerFileData data, Player newPlayer, BinaryReader fileIO, Byte[] tplrData, Int32 release, Boolean& gotToReadName)
at Terraria.Player.LoadPlayerFromStream(PlayerFileData playerFileData, Byte[] plrData, Byte[] tplrData)
at Terraria.Player.LoadPlayer(String playerPath, Boolean cloudSave)
at Terraria.Player.GetFileData(String file, Boolean cloudSave)
at Terraria.Main.LoadPlayers()
at Terraria.GameContent.UI.States.UICharacterSelect.OnActivate()
at Terraria.UI.UIElement.Activate()
at Terraria.UI.UserInterface.SetState(UIState state)
at Terraria.Main.OpenCharacterSelectUI()
at Terraria.Main.DrawMenu(GameTime gameTime)
at DMD<System.Void Terraria.Main:DoDraw(Microsoft.Xna.Framework.GameTime)>(Main this, GameTime gameTime)
at GravityDontFlipScreen.GravityFlipSystem.Main_DoDraw(orig_DoDraw orig, Main self, GameTime gameTime)
at Hook<System.Void GravityDontFlipScreen.GravityFlipSystem::Main_DoDraw(Terraria.On_Main+orig_DoDraw,Terraria.Main,Microsoft.Xna.Framework.GameTime)>(Main , GameTime )
at SyncProxy<System.Void Terraria.Main:DoDraw(Microsoft.Xna.Framework.GameTime)>(Main , GameTime )
at Terraria.Main.Draw_Inner(GameTime gameTime)
at Terraria.Main.Draw(GameTime gameTime)
at Microsoft.Xna.Framework.Game.Tick()
at Microsoft.Xna.Framework.Game.RunLoop()
at Microsoft.Xna.Framework.Game.Run()
at Terraria.Program.RunGame()
at Terraria.Program.LaunchGame_(Boolean isServer)
at Terraria.Program.LaunchGame(String[] args, Boolean monoArgs)
at Terraria.MonoLaunch.Main_End(String[] args)
at Terraria.MonoLaunch.<>c__DisplayClass1_0.<Main>b__1()
at Terraria.MonoLaunch.Main(String[] args)

Dynamic Gear Advancements uses the dynamicgearadvancements.DynamicItem.Sum(String stat, Int32 index, Player player, Item item) function during the ModPlayer.ModifyMaxStats() hook. The Sum() function calls ItemLoader.ChooseAmmo() which is causing an issue with my mod, VacuumBags because it hasn't had a chance to set up yet. I strongly suggest changing the code used in the ModifyMaxStats() so that it doesn't call ChooseAmmo(). One option could be to check if !Main.gameMenu in the Sum() function so that it only happens while in game?