Перейти к содержимому
Mineforgian

Fairy Lighting

A modern port of the beloved decorative hanging lights mod, bringing customizable string lights, bunting, and garlands to Minecraft 1.21.1.

Загрузки
8K
Подписчики
10
Обновлён
15 августа 2026 г.
Лицензия
MIT

Опубликован 22 января 2026 г.

Illuminate your world with holiday cheer and cozy vibes! This expanded port of Fairy Lights brings the classic decorative mod to NeoForge 1.21.1, allowing you to craft and hang a wide variety of beautiful light strings, pennants, and garlands.

Whether you're decorating for Christmas with Tinsel Garlands, setting up a spooky Halloween vibe with Jack-o-Lantern lights, or just adding a warm glow to your base with standard hanging lights, this mod gives you complete creative control. Use the custom crafting system to design your own string patterns, mix and match colors, and even add text to bunting!

Key Features:

  • Hanging Lights: Choose from various shapes like Fairy Lights, Paper Lanterns, Orbs, Flowers, and specialized holiday themes.
  • Garlands & Bunting: Decorate with connection types like Tinsel, Vine, Pennant, and Letter Bunting.
  • Customization: Craft intricate patterns by combining different lights on a single string.
  • Letter Bunting: Write custom text messages to hang on your walls (now fully functional in 1.21.1!).
  • Dynamic Physics: Ropes and strings sway gently and react to players.

Credits:

  • Original Creator: pau101 (Huge thanks for creating the original masterpiece!)
  • Source: Forked from the original Fairy Lights repository.
  • Port Author: Imbavirus (Ported to NeoForge 1.21.1)

Ченджлог

8.0.15Релиз1.21.1 · 15 августа 2026 г.

Fairy Lights 8.0.15 - Crafting + / manual grid

Crafting

  • Generic recipes were marked incomplete because empty 3x3 cells used Ingredient.EMPTY. Vanilla treats that as "missing items", so the recipe book never unlocked them. JEI / recipe-book + would not pull ingredients, and a limited-crafting world also refused a manual grid.
  • Light and pennant extras now match the fairylights:lights / fairylights:pennants tags, so dyed / twinkling stacks count the same as bare ones.
  • Item ingredients are item-type matches, not prototype ItemStacks.

Build

  • Compile JEI pin moved 19.21.2.31319.27.0.340 (old artifact gone from Maven). Runtime pack JEI 19.39 still fine.
8.0.14Релиз1.21.1 · 22 июля 2026 г.

Fairy Lights 8.0.14 - JEI Twinkle / Color-Changing Recipes

JEI

  • Twinkle (light + glowstone) and color-changing (light + gold nugget + dyes) are special crafts with no fixed result. JEI now gets sample results and registers those special recipes so they show when viewing a fairy light.
  • Dye color subtypes no longer hide shared upgrade recipes (color still separates stacks in the item list).
  • Twinkle / color-changing stay distinct from plain lights in recipe matching (fixes empty JEI output when viewing a non-twinkling light).
  • Twinkle / color-changing recipes cycle every light type in JEI, not only the first tag entry.

Twinkle / color-changing behavior

  • Hanging-light patterns now persist twinkle and color-changing data across sync (same backup path as dye color).
  • Client connections apply powered state after feature rebuilds so twinkle/emissive rendering can run.
  • Placed light blocks tick their light behavior so twinkle animates there too.
  • Crafting only keeps an active twinkle flag (false/absent no longer sticks as a component).
  • Color-changing lights store their palette on a real fairylights:colors data component (CUSTOM_DATA alone was producing plain dyed results).
8.0.13Релиз1.21.1 · 22 июля 2026 г.

Fairy Lights 8.0.13 - Fence Placement & Tether Fixes

Placement

  • Finishing a place no longer destroys the connection (incoming peer-teardown was colliding with reconnect).
  • Hotbar abort still clears the tether from the owner fastener without breaking completed strands.
  • Clicking a fence attaches via FenceFastenerEntity instead of spawning a wall Fastener block beside the post.

Fence tether / sync

  • Fence fastener updates are sent as real network payloads (client tether rope renders during place).
  • Connect before spawning the fence entity so spawn data includes the placing tether.
  • Player tether hand offset uses the held item + main arm (no longer stuck on the left when player fastener data is client-local).

Fence break

  • Breaking a fence tears down both ends of the connection immediately.
  • Removed fence entities are treated as gone so the other end does not leave a ghost rope.
  • Fence fastener model uses the FIXED display transform again (nub centered on the post).

Tooling

  • publish.ps1 auto-resolves CurseForge Client/Server environment version IDs (75208).
8.0.11Релиз1.21.1 · 21 июля 2026 г.

Fairy Lights 8.0.11 - Stability, Colors, Placement

Critical Fixes

Server Watchdog Hang on Chunk Unload

  • Guarded HangingLightsConnection.removeLight() with world.isLoaded(pos) so unload no longer triggers blocking chunk loads / deadlocks.
  • Soft-teardown on fastener remove (noDrop() before connection teardown) to avoid item rain and world mutation during unload.

Placement Tether / Player Fling

  • Aborting a place (e.g. hotbar switch) now fully tears down the connection instead of only stripping the player’s incoming map entry.
  • PlayerFastener is ticked from ServerEventHandler and stored via NeoForge data attachments (replacing the fragile WeakHashMap).

Visual / Item Fixes

Invisible Black / Gray (and EMI icons)

  • Normalize dye/string/item tints to opaque ARGB for Minecraft 1.21 ItemColor.
  • Sync COLOR from connection logic on pickup; restore fl_backup_color for pennant patterns; opaque seasonal/ClientProxy fallbacks.

Light Block Toggle

  • Migrated dead LightBlock.use() to useItemOn / useWithoutItem and sync BE on with LIT.

Recipes / Data

  • Restored color_changing_light recipe (was a width-0 stub) and wire "colors" through crafting + ColorChangingBehavior.
  • Fixed light_twinkle crafting to persist the twinkle component; tooltip/name helpers read components correctly.
  • Fixed malformed NeoForge tag JSON for #c:ingots/iron and #c:nuggets/gold.

Performance

  • Stop per-tick sendBlockUpdated for dynamic catenaries (only sync when explicitly dirty).
  • Strip hot-path info logging (letter/pennant/tinsel/JEI).

Other

  • Pick-block (getCloneItemStack) updated for NeoForge 1.21.1.
  • Fastener renderer provides infinite render bounds so long connections cull correctly.
  • settings.gradle NeoForge plugin repo URL uses /releases.
8.0.10Релиз1.21.1 · 2 мая 2026 г.

Fairy Lights 8.0.10 - Performance: Remove Dead Reflection Code

Performance Fixes

CapabilityHandler (~16% render thread overhead eliminated)

  • Removed per-tick reflection calls in getFastenerCapability() for both Entity and BlockEntity overloads. The code was calling Class.getMethod() / Method.invoke() every tick trying to find old Forge API methods (getCapability, getData, setData, addCapability, getOrCreateCapability) that don't exist in NeoForge 1.21.1. Each call threw NoSuchMethodException which is expensive to construct.
  • The instanceof checks for FastenerBlockEntity, FenceFastenerEntity, and Player already covered all real use cases — the reflection fallbacks never succeeded.

Bug Fixes

Connection Item Matching (Connection.java)

  • Fixed matches() and replace() using dead getTag() reflection instead of the Data Components API. ItemStack.getTag() was removed in 1.20.5 — the reflection always failed and returned null, causing matches() to always return true for same-type items (preventing valid NBT comparison) and replace() to always pass empty data (losing connection properties like color/pattern). Now correctly reads from FLDataComponents.CONNECTION_LOGIC.

Dead Code Removal

FenceFastenerEntity.java

  • Removed two useless reflection attempts for NbtAccounter.unlimitedHeap() and NbtAccounter.createUnlimited(int) in readSpawnData() — neither exists in 1.21.1. The correct NbtAccounter.create() was already the final fallback.

NetBuilder.java

  • Removed dead reflection in sendToClient() trying PayloadRegistrar.send() and PayloadRegistrar.sendToPlayer() — neither method exists. The handler map fallback was the actual working code path.

ClientEventHandler.java

  • Removed reflection-based addVertexToBuffer() trying the old VertexConsumer.vertex(double,double,double) chained API. This code path is unreachable (only called from commented-out drawEntityHighlight).

ClientProxy.java

  • Removed unused getUvIndex() method containing VertexFormatElement.getUsage() reflection — never called from anywhere in the codebase.
8.0.9Релиз1.21.1 · 3 апреля 2026 г.
  • Suppressed FL_DEBUG and FL_DEBUG_CRITICAL console spam.
8.0.8Релиз1.21.1 · 2 марта 2026 г.

Fairy Lights 8.0.8 - Letter & Pennant Bunting Rendering Fix

Major Fixes

Letter Bunting Rendering

  • Fixed letters not appearing on string: Letters now render correctly on letter bunting after entering text in the dialog. The root cause was a broken manual vertex extraction approach — replaced with Minecraft's native putBulkData() method for rendering BakedQuads.

Pennant Bunting Rendering

  • Fixed pennants not appearing on string: Pennants now render correctly. The model lookup was using the wrong variant ("inventory" instead of "standalone"), causing all models to return the missing model.
  • Fixed pennants off-center: Added proper centering translation to align pennants under their attachment points on the string.

Rendering Pipeline

  • Fixed texture atlas mismatch: BakedQuad rendering was using the mod's custom entity texture atlas, but the quad UV coordinates reference the block texture atlas. Switched to Sheets.cutoutBlockSheet() for correct rendering.

Technical Improvements

  • Replaced ~120 lines of broken manual vertex extraction and reflection-based rendering with a single putBulkData() call
  • Fixed model variant from "inventory" to "standalone" in PennantBuntingRenderer
  • Updated FenceFastenerRenderer to use the MultiBufferSource overload
  • Removed excessive debug logging and System.out.println statements
  • Removed unnecessary depth offset hacks from all connection renderers
8.0.7Релиз1.21.1 · 7 февраля 2026 г.

Fairy Lights 8.0.7 - Connection Placement & Item Drop Fixes

Major Fixes

Connection Placement System

  • Fixed placement after breaking: Hanging lights can now be placed at different distances after breaking the first fastener. Previously, the connection would remain in the player's hand and block new placements.
  • Fixed reconnection logic: When placing a connection at a different distance, the system now properly handles reconnecting to a new destination or creating a new connection if the old destination is invalid.
  • Improved connection validation: The placement system now correctly ignores removed or invalid connections, allowing new placements even when stale connection data exists.

Item Drop System

  • Fixed swapped light drops: When breaking a hanging lights connection, all individual lights from the pattern (including any lights you swapped in) are now properly dropped as items. Previously, swapped-in lights would be lost.
  • Fixed drop behavior: Pattern items are now dropped both when manually disconnecting a connection and when breaking the fastener block, ensuring you always get your lights back.

Technical Improvements

  • Enhanced connection type matching to allow reconnection when types match
  • Improved handling of stale connections in player capability
  • Better null safety checks in connection removal code
  • Fixed item dropping to occur in both onRemove() and disconnect() methods

Notes

  • Breaking a hanging lights connection now returns all lights that were placed in the pattern
  • You can now freely place connections at different distances without being blocked by previous placements
  • The connection system now properly cleans up invalid connections automatically

Комментарии

Загружаем…