Veil Lights for TaCZ
A NeoForge 1.21.1 compatibility addon that renders configured TaCZ weapon lights through the separate Veil Volume Lights library. Client installations need both veiltaczlights and veilvolumelights; installing only the TaCZ addon JAR on a server remains optional and enables datapack-profile and multiplayer flashlight-state synchronization.
What it does
- Captures the real animated TaCZ attachment bone matrix during rendering. Hipfire, ADS, reload, sprint, inspect, sway, recoil, custom animations, and per-gun attachment placement therefore flow through TaCZ's own transform hierarchy.
- Updates one reusable library
VolumeLight.Spotper rendered player every frame. - Supports first-person and third-person rendering, distance-culls remote lights, and removes stale lights at the end of the frame and on disconnect/world unload.
- Renders a colored, camera-facing lens flare at active third-person emitters. The flare is depth-tested, brightest while looking into the lamp, faint from the side, and never drawn over the first-person weapon view.
- Replicates the L-key flashlight state through the server so other modded clients see remote beams and flares turn on and off with their owner.
- Uses the library's native Veil point, spot, and rectangular area-light handles. TaCZ submits only spotlights.
- Preserves opaque-only world depth and applies continuous, subtractive transparent-medium transmission before stopping at opaque geometry.
- Automatically recognizes TaCZ
LASERattachments whose models contain a flashlight-like emitter bone, with explicit third-party profiles available in TOML. - Loads per-attachment beam profiles from datapack JSON, with bundled defaults for the standard PEQ-15, PEQ-6, and Nightstick attachments. Nightstick needs an explicit profile because TaCZ declares it only as a laser and supplies no flashlight marker.
Press L(by default) to toggle the local player's weapon light.
The client config includes thirdPersonFlare, thirdPersonFlareSize, and thirdPersonFlareIntensity. Flare distance uses the existing thirdPersonLightDistance limit.
Configuration
NeoForge creates config/veiltaczlights-client.toml for global fallback behavior. Bounds are enforced for every numeric option.
Attachment profiles are datapack files at:
data/<attachment namespace>/veiltaczlights/attachment_profiles/<attachment path>.json
For example, data/addonpack/veiltaczlights/attachment_profiles/weapon_light.json configures addonpack:weapon_light:
{
"enabled": true,
"emitter_bone": "flashlight",
"beam": {
"length": 40.0,
"width": 14.0,
"inner_width": 7.0,
"color": "#F2FAFF",
"intensity": 1.2,
"shadows": true,
"volumetric_strength": 0.4
}
}
length is the maximum distance in blocks. width and optional inner_width are full beam diameters in blocks at that distance, which the addon converts to Veil cone angles. color accepts #RRGGBB or a three-number RGB array. Datapack profiles take priority and reload with /reload.
In singleplayer, the integrated server loads and synchronizes these files and flashlight states automatically. For a dedicated multiplayer server, install the addon JAR on the server to synchronize server datapack profiles and player flashlight toggles to clients. TaCZ and Veil are not required server-side, and clients can still join servers that do not install this addon; in that case only the client's legacy TOML fallback is available and remote recognized lights default to on.
The addon still creates config/veiltaczlights-attachments.toml as a legacy/local fallback when no datapack profile exists for an attachment:
[attachments."addonpack:weapon_light"]
enabled = true
emitterBone = "flashlight"
range = 40.0
intensity = 1.2
outerConeAngle = 30.0
innerConeAngle = 16.0
red = 1.0
green = 0.97
blue = 0.90
shadows = true
volumetricStrength = 0.0
Set emitterBone = "@attachment" only for a pack whose attachment origin itself is authored at the lamp. Set enabled = false to override automatic recognition for an attachment.
The bundled JSON defaults use a clearly visible volumetric strength. Veil Volume Lights excludes transparent surfaces from the terminating depth snapshot, coalesces adjacent identical media, and integrates the actual distance traveled inside each volume. Colored media multiply their wavelength transmission along a light path, while separate light sources remain framebuffer-additive. The same behavior applies to point, spot, and area lights.
If an attachment lacks a recognized/configured emitter bone, it is skipped. Debug mode logs its resolved gun, attachment, bone, position, forward vector, and Veil handle state at most once per second per player.

