promotional bannermobile promotional banner

Enchanted Outlines

Each enchantment type is assigned a unique color identifier, allowing you to instantly comprehend the power of the item in your hand
Back to Files

enchanted_outlines-0.1.5.jar

File nameenchanted_outlines-0.1.5.jar
Uploader
LOVE_U987LOVE_U987
Uploaded
Aug 8, 2026
Downloads
25
Size
84.0 KB
Mod Loaders
NeoForge
File ID
8605591
Type
R
Release
Supported game versions
  • 1.21.1

Curse Maven Snippet

NeoForge

implementation "curse.maven:enchanted-outlines-1643642:8605591"

Learn more aboutย Curse Maven

What's new

Enchanted Outlines Changelog ๐ŸŽจโœจ


v0.1.5 (2026-08-09)

๐Ÿ›ก๏ธ Fixed: Elytra outline now matches armor thickness (unified config)

  • Issue: Elytra outlines used their own scaling (0.09 + refDiag 0.701), so at the same armorThickness setting, the pixel expansion was ~3ร— wider than armor (e.g. 8 โ†’ ~4px vs armor's 8 โ†’ ~1.2px). Players reported: "Armor needs 8 to be visible, but Elytra at 8 looks way too thick."
  • Fix: Elytra now shares the exact same inflate logic as armor โ€” using ARMOR_INFLATE_PER_THICKNESS (0.04) and ARMOR_REF_DIAG (0.468). Both now expand by the exact same pixel amount for any given armorThickness value. One slider rules them all! ๐ŸŽฏ

๐Ÿ”ง Fixed: Crescent Spear outline misaligned in inventory / dropped / item frame (removed bewlr3dPrefer)

  • Issue: Eternal Starlight's Crescent Spear looked fine in hand, but its outline was completely off in inventory, on the ground, or in item frames.
  • Why: In GUI/GROUND/FIXED, the spear's actual body is a flat inventory model (crescent_spear_inventory#standalone). But the old bewlr3dPrefer=true config forced outlines to skip flat models and always use a 3D inflated shell โ€” so a 3D shell was wrapped around a flat sprite. Naturally, it didn't line up. In hand, the body is 3D, so it worked. Classic case of: "match the outline to the actual render, always."
  • Fix:
    • GUI/GROUND/FIXED now unconditionally prefers flat variants (inventoryModelFor). No config can skip this anymore. Only items without a flat variant (like Cataclysm weapons, which are already 3D in GUI) fall back to 3D shells.
    • BREAKING: bewlr3dPrefer config is removed entirely. It meant "force 3D in GUI" โ€” but for items with flat variants, that's always wrong; for items already 3D, it's pointless. Old keys in your TOML will be auto-cleaned by NeoForge. The behavior now defaults to the correct one. ๐Ÿ—‘๏ธ

๐Ÿ”„ Reworked: Cataclysm (LionfishAPI) weapon outlines โ€” per-cube vertex-normal expansion

  • Issue: Cataclysm weapons used a single bounding-box inflated shell โ€” scaling the entire weapon from its center. On long weapons (spear shafts, sword blades), the tip is far from center โ†’ inflates way more than the handle โ†’ bulging tips, uneven outline thickness.
  • Fix (new default): OutlineRenderer.renderLionfishPerCube โ€” each cube is expanded along its averaged vertex normals:
    • Perfectly replicates the full transform chain from BasicModelPart.render (translate โ†’ rotateZYX โ†’ scale), rendering outlines in each part's local space with live animation sync.
    • Reflects ModelBox.quads, groups 24 quad vertices into 8 corner points, averages adjacent face normals โ†’ shared expansion direction โ†’ no cracks between faces.
    • Expansion distance is constant: thickness ร— THICKNESS_SCALE ร— bewlr3dScale โ€” independent of distance from center. Tips no longer bulge, outline thickness is perfectly uniform! ๐Ÿ“
    • UVs reuse PositionTextureVertex.textureU/V (pre-calculated from textureOffset), so alpha mask shapes match the body pixel-perfectly.
    • Static geometry (coords/UVs/normals) is cached per-cube via WeakHashMap (ExpandedLionfishCube). Per-frame: only matrix transforms + vertex writes. Zero reflection overhead. โšก
  • Config: New bewlr3dPerCube (default true, in run/config/enchanted_outlines-common.toml):
    • true = per-cube vertex-normal expansion (default, recommended)
    • false = fallback to old single-bounding-box shell (renderLionfishInflated, kept for comparison)
  • Backward compat: If per-cube expansion fails (missing reflection fields / no quads in another LionfishAPI version), it auto-falls back to the old shell. renderLionfishPart returns cube count; if 0 cubes drawn, renderBewlrEntityOutline switches to renderLionfishInflated. You'll never get a silent missing outline. ๐Ÿ›ก๏ธ

๐Ÿฆบ Fixed: Modded armor with small cubes (Thermal Springstone) had way thinner outlines

  • Issue: Eternal Starlight's Thermal Springstone armor looked noticeably thinner than vanilla armor when worn.
  • Why: Armor outlines used "per-cube bounding-box inflation" โ€” expansion = (scale-1) ร— cube half-diagonal. Vanilla armor cubes are huge (e.g. chestplate 8ร—12ร—4 px, half-diagonal โ‰ˆ0.468), so outlines are thick. Modded armors use smaller custom cubes โ†’ proportional shrinkage โ†’ visibly thinner outlines. Same class of problem as Cataclysm's "bulging tips" (expansion depends on geometry size).
  • Fix: renderPartInflated now has a uniform mode (enabled only for armor; elytra/projectiles/spears pass false to keep their existing look):
    • Per-cube adaptive scale: perCubeScale = 1 + (scale-1) ร— refDiag / selfHalfDiagonal (refDiag = 0.468, vanilla chestplate reference)
    • Result: identical surface expansion across all parts โ€” vanilla armor looks exactly the same, modded armors get their outlines beefed up to match! ๐Ÿ’ช
    • New config armorUniformExpand (default true, false reverts to old fixed shell).

๐Ÿ“ Fixed: Missing translation keys in config screen

  • Issue: Config screen showed raw key names instead of readable labels for bewlr3dScale, bewlr3dPrefer, bewlr3dPerCube, and the new armorUniformExpand.
  • Fix: Added name + tooltip translations to zh_cn.json and en_us.json. (bewlr3dPrefer was removed alongside its config, see above.)

๐Ÿน Fixed: Eternal Starlight Crescent Spear had no outline; Thermal Springstone armor had wrong shape

  • Issue:
    • Crescent Spear (Eternal Starlight v0.8.1+1.21.1+NeoForge): no outline at all when enchanted.
    • Thermal Springstone armor: outline shape didn't match the body (missing corners, solid white rectangle).
  • Why:
    • Spear: It's a BEWLR item (crescent_spear.json parent = builtin/entity, placeholder model has no geometry). In GUI/GROUND/FIXED, Eternal Starlight's ItemRendererMixin swaps it to crescent_spear_inventory#inventory flat model at render time. Outlines previously skipped anything with isCustomRenderer() โ†’ no outline rendered.
    • Armor: Thermal Springstone armor swaps both model and texture inside HumanoidArmorLayer.renderArmorPiece via NeoForge hooks after HEAD: model โ†’ ThermalSpringstoneArmorModel (IClientItemExtensions.getHumanoidArmorModel), texture โ†’ custom path (Item.getArmorTexture, not standard textures/models/armor/). The outline at HEAD used the unswapped vanilla model + a texture path generated from layer.texture() that didn't exist โ†’ missing corners + fallback to solid white rectangle.
  • Fix:
    • Armor: HumanoidArmorLayerMixin now uses the same official NeoForge hooks as the body โ€” ClientHooks.getArmorModel (model) + ClientHooks.getArmorTexture (texture, inner = slot==LEGS matching usesInnerModel). Default hook behavior = original logic, so vanilla/normal modded armor is unchanged. Mods implementing NeoForge extensions auto-align. If hook returns non-HumanoidModel, gracefully falls back to original model. ๐Ÿค
    • BEWLR items: OutlineRenderer.inventoryModelFor(ItemStack) โ€” universal flat-model detection for GUI/GROUND/FIXED. Probes MRL variants in tested priority order (Eternal Starlight style <ns>:item/<id>_inventory#standalone first, then fallbacks). Filters out missing models and builtin/entity placeholders. Finds the same flat model the body actually renders โ†’ outline matches. If no flat variant found, skips as before.
    • BEWLR in-hand 3D outline (NEW): OutlineRenderer.renderBewlrEntityOutline reflects the BEWLR held model for inflated-shell rendering:
      • Standard Mojang models (root is ModelPart, e.g. Eternal Starlight's CrescentSpearModel) โ†’ per-cube inflation shell.
      • LionfishAPI skeletal models (root is AdvancedModelBox, e.g. Cataclysm) โ†’ single bounding-box shell (T(c)ยทSยทT(-c) + root.render).
      • Model fields read by convention: item ID uppercase + _MODEL from adapter classes (ESItemStackRenderer / CMItemstackRenderer) via reflection. Missing? Triggers one-time BEWLR render init. Works for FIRST_PERSON, THIRD_PERSON, and GROUND/FIXED without flat variants.
    • BEWLR offset/flip fix (round 2): Mod BEWLR renderers apply an internal pre-transform after display transforms but before renderToBuffer โ€” Eternal Starlight does scale(1,-1,-1), Cataclysm does translate(0.5,0.5,0.5)+scale(1,-1,-1). Outlines must apply the same pre-transform or they misalign / mirror. Tracked per-mod in BewlrModel (ES_FLIP / CM_CENTER_FLIP), applied via applyBewlrPreTransform.
    • BEWRL Cataclysm shell center fix (round 3): LionfishAPI bounding-box shell used pixel coordinates for AABB center (off by 16ร—) and ignored per-part rotationPointX/Y/Z offsets โ†’ shell drifted from body. Fixed: lionfishBounds recursively accumulates global pixel AABB including all rotationPoint offsets, center รท16 to model space. Eternal Starlight (standard Mojang per-cube path) was already correct, unaffected.
    • BEWLR color blending (round 4): BEWLR 3D outlines previously used pure white texture (outline color only, no blending). Now reflects body texture (adapter class <ID>_TEXTURE or model class TEXTURE, e.g. Cataclysm CMItemstackRenderer.THE_IMMOLATOR_TEXTURE, Eternal Starlight CrescentSpearModel.TEXTURE). Outline color = texture pixel ร— outline color, consistent with flat/armor color-mixing toggle. Falls back to white if texture unavailable.
    • BEWLR 3D outline config (round 5): 3D outlines are geometric inflated shells (expansion = (scale-1) ร— distance from center). On slender weapons, most faces are close to center โ†’ old hardcoded 0.12 was too weak. New config bewlr3dScale (default 0.3, 0.05โ€“1.0) replaces hardcoded value. (bewlr3dPrefer was added then removed in v0.1.7, see first entry above.)

๐Ÿ› Fixed: Crash with FerriteCore when holding shield / trident (Immutable Map)

  • Issue: Game crashed with UnsupportedOperationException when holding a shield or trident while FerriteCore was installed. Stack trace pointed to ModelSidesImpl.minimizeCulled โ†’ ImmutableCollections$AbstractImmutableMap.put.
  • Why: shieldModel() / tridentModel() used Map.of() + List.of() for culledFaces passed to SimpleBakedModel. FerriteCore's mixin calls put() on the incoming map at constructor start (replacing empty lists with compact shared instances). Immutable Map โ†’ instant crash. ๐Ÿ’ฅ
  • Fix: New newEmptyCulledFaces() helper returns a mutable HashMap with 6 mutable ArrayLists. Both model constructors now use this. The original behavior (missing direction โ†’ get(dir) returns null โ†’ collectQuads addAll(null) crash) is preserved where relevant.

Happy enchanting! May your outlines be ever colorful. ๐ŸŒˆโš”๏ธ

This mod has no related projects