enchanted_outlines-0.1.5.jar
Curse Maven Snippet
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
armorThicknesssetting, 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) andARMOR_REF_DIAG(0.468). Both now expand by the exact same pixel amount for any givenarmorThicknessvalue. 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 oldbewlr3dPrefer=trueconfig 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:
bewlr3dPreferconfig 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. ๐๏ธ
- GUI/GROUND/FIXED now unconditionally prefers flat variants (
๐ 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 fromtextureOffset), 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. โก
- Perfectly replicates the full transform chain from
- Config: New
bewlr3dPerCube(defaulttrue, inrun/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.
renderLionfishPartreturns cube count; if 0 cubes drawn,renderBewlrEntityOutlineswitches torenderLionfishInflated. 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:
renderPartInflatednow has a uniform mode (enabled only for armor; elytra/projectiles/spears passfalseto 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(defaulttrue,falsereverts to old fixed shell).
- Per-cube adaptive scale:
๐ Fixed: Missing translation keys in config screen
- Issue: Config screen showed raw key names instead of readable labels for
bewlr3dScale,bewlr3dPrefer,bewlr3dPerCube, and the newarmorUniformExpand. - Fix: Added name + tooltip translations to
zh_cn.jsonanden_us.json. (bewlr3dPreferwas 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.jsonparent =builtin/entity, placeholder model has no geometry). In GUI/GROUND/FIXED, Eternal Starlight'sItemRendererMixinswaps it tocrescent_spear_inventory#inventoryflat model at render time. Outlines previously skipped anything withisCustomRenderer()โ no outline rendered. - Armor: Thermal Springstone armor swaps both model and texture inside
HumanoidArmorLayer.renderArmorPiecevia NeoForge hooks after HEAD: model โThermalSpringstoneArmorModel(IClientItemExtensions.getHumanoidArmorModel), texture โ custom path (Item.getArmorTexture, not standardtextures/models/armor/). The outline at HEAD used the unswapped vanilla model + a texture path generated fromlayer.texture()that didn't exist โ missing corners + fallback to solid white rectangle.
- Spear: It's a BEWLR item (
- Fix:
- Armor:
HumanoidArmorLayerMixinnow uses the same official NeoForge hooks as the body โClientHooks.getArmorModel(model) +ClientHooks.getArmorTexture(texture,inner = slot==LEGSmatchingusesInnerModel). 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#standalonefirst, then fallbacks). Filters out missing models andbuiltin/entityplaceholders. 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.renderBewlrEntityOutlinereflects the BEWLR held model for inflated-shell rendering:- Standard Mojang models (root is
ModelPart, e.g. Eternal Starlight'sCrescentSpearModel) โ 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 +
_MODELfrom 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.
- Standard Mojang models (root is
- BEWLR offset/flip fix (round 2): Mod BEWLR renderers apply an internal pre-transform after display transforms but before
renderToBufferโ Eternal Starlight doesscale(1,-1,-1), Cataclysm doestranslate(0.5,0.5,0.5)+scale(1,-1,-1). Outlines must apply the same pre-transform or they misalign / mirror. Tracked per-mod inBewlrModel(ES_FLIP/CM_CENTER_FLIP), applied viaapplyBewlrPreTransform. - 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/Zoffsets โ shell drifted from body. Fixed:lionfishBoundsrecursively accumulates global pixel AABB including allrotationPointoffsets, 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>_TEXTUREor model classTEXTURE, e.g. CataclysmCMItemstackRenderer.THE_IMMOLATOR_TEXTURE, Eternal StarlightCrescentSpearModel.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 configbewlr3dScale(default 0.3, 0.05โ1.0) replaces hardcoded value. (bewlr3dPreferwas added then removed in v0.1.7, see first entry above.)
- Armor:
๐ Fixed: Crash with FerriteCore when holding shield / trident (Immutable Map)
- Issue: Game crashed with
UnsupportedOperationExceptionwhen holding a shield or trident while FerriteCore was installed. Stack trace pointed toModelSidesImpl.minimizeCulled โ ImmutableCollections$AbstractImmutableMap.put. - Why:
shieldModel()/tridentModel()usedMap.of()+List.of()forculledFacespassed toSimpleBakedModel. FerriteCore's mixin callsput()on the incoming map at constructor start (replacing empty lists with compact shared instances). Immutable Map โ instant crash. ๐ฅ - Fix: New
newEmptyCulledFaces()helper returns a mutableHashMapwith 6 mutableArrayLists. 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 additional files

