Skip to content

Crash: NeoForgeSlopeBakedModel.getQuads NPEs on null frame sprite when called with empty ModelData (e.g. by Xaero's World Map) #154

Description

@CN-YiMin

Version

  • Automobility: 0.5.0.h+1.21.1-neoforge
  • Minecraft: 1.21.1 / NeoForge 21.1.235
  • Triggering mod: Xaero's World Map 1.43.0 (via xaerolib 1.6.0)

Description

NeoForgeSlopeBakedModel.getQuads(...) resolves the frame sprite from
data.get(FRAME_SPRITE). FRAME_SPRITE is only ever populated in
getModelData(). When another mod calls getQuads with an empty/underived
ModelData (Xaero's World Map does this to compute block translucency while
caching map chunks), data.get(FRAME_SPRITE) returns null. That null sprite
is passed into buildSlopeGeometryrightTriPrism
NeoForgeGeometryBuilder.vertex, which calls sprite.getU0() and throws NPE.

Stack trace (abridged)

Caused by: java.lang.NullPointerException: Cannot invoke
"net.minecraft.client.renderer.texture.TextureAtlasSprite.getU0()" because "sprite" is null
at automobility/...NeoForgeGeometryBuilder.vertex(NeoForgeGeometryBuilder.java:56)
at automobility/...SlopeBakedModel.rightTriPrism(SlopeBakedModel.java:143)
at automobility/...SlopeBakedModel.buildSlopeGeometry(SlopeBakedModel.java:83)
at automobility/...NeoForgeSlopeBakedModel.getQuads(NeoForgeSlopeBakedModel.java:83)
at xaerolib/...NeoForgeBlockModelUtils.getQuads(NeoForgeBlockModelUtils.java:39)
at xaerolib/...BlockTranslucencyUtils.getModelBasedTranslucency(...)
at xaeroworldmap/...MapWriter.shouldOverlay(MapWriter.java:642)
... (Xaero's World Map chunk writer)

Steps to reproduce

  1. Install Automobility + Xaero's World Map on NeoForge 1.21.1.
  2. Place any Automobility slope block in the world.
  3. Have the world map cache/render a chunk containing that slope block.
    → Client crashes with the NPE above.

Suggested fix

Guard against a missing frame sprite in NeoForgeSlopeBakedModel.getQuads
(and/or null-check sprite in NeoForgeGeometryBuilder.vertex), e.g. return
Collections.emptyList() when data.get(FRAME_SPRITE) == null, since a caller
without proper ModelData cannot provide the sprite anyway.

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