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. ๐โ๏ธ
All Relations
- All Relations
- Embedded Library
- Optional Dependency
- Required Dependency
- Tool
- Incompatible
- Include
This mod has no related projects

