Skip to content

玩家进服导致其他玩家客户端崩溃 IndexOutOfRangeException (PlayerLoader.DrawEffects) #11

Description

@giugiu845

环境

  • tModLoader: 2026.06 stable(1.4.4.9 内核)
  • InnoVault: v1.9.101(Steam 工坊订阅,ID 3338554501)
  • 相关模组: FargowiltasSouls(栈里的 EternityWingDrawer),ImproveGame(栈里的隐身药水钩子)
  • 服务器模式:多人专用服务器(SSC 开启)

现象

服务器运行中,每当有新玩家进服,已在服内的其他玩家客户端有概率会崩溃弹窗(IndexOutOfRangeException)。
刚进服的人不崩;被崩的人重进后,又可能会导致其他人崩,反复几次才稳定。
单人模式不出现。

报错栈

System.IndexOutOfRangeException: Index was outside the bounds of the array.
at Terraria.ModLoader.PlayerLoader.DrawEffects(PlayerDrawSet drawInfo, ...) in PlayerLoader.cs:line 1199
at Terraria.DataStructures.PlayerDrawSet.BoringSetup_2(...)
at Terraria.Graphics.Renderers.LegacyPlayerRenderer.DrawPlayerInternal(...)
at ImproveGame.Content.Functions.MinorPatches.TranslucentInvisPotion.PatchDrawPlayerFull(...)
at FargowiltasSouls.Common.Graphics.Drawers.EternityWingDrawer.DrawWingTarget(...)
at InnoVault.RenderHandles.RenderHandleLoader.DrawPlayersHook(...)
at InnoVault.GameSystem.PlayerRebuildLoader.On_DrawPlayersHook(...)
......

我的初步分析(仅供参考)

崩溃点是 tML 的 PlayerLoader.DrawEffects 在遍历玩家 ModPlayer 特效列表
(FilteredSpanEnumerator)时越界,疑似列表在遍历途中被修改。
三个模组都挂在"渲染玩家"这条必经之路上,但真正与"列表被中途修改"对得上号的只有 InnoVault 的重建系统
(PlayerRebuildLoader),另外两个只是同路被记录。
栈中 InnoVault 的 PlayerRebuildLoader.On_DrawPlayersHook 用 ref players
且调用 SnapshotOverrides / VaultTypeRegistry 运行时注册,
怀疑新玩家进服触发 PlayerOverride 重建与 DrawEffects 遍历发生竞态。

##附日志
client.log

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions