Silence in the Forest

They are everywhere. If you see two shadows... run.

File Details

silence-in-the-forest-0.5.1+26.1.2.jar

  • R
  • Jun 22, 2026
  • 155.76 KB
  • 51
  • 26.1.2
  • Fabric

File Name

silence-in-the-forest-0.5.1+26.1.2.jar

Supported Versions

  • 26.1.2

Curse Maven Snippet

Fabric

modImplementation "curse.maven:silence-in-the-forest-1574874:8302929"
Curse Maven does not yet support mods that have disabled 3rd party sharing

Learn more about Curse Maven

Changelog

[0.5.1] — 2026-06-22

Fixed

  • Death vignette — replaced the broken RenderPipelines.VIGNETTE blit (which rendered as a uniform full-screen overlay) with a programmatic alpha-gradient texture drawn via GUI_TEXTURED. Centre is fully transparent; edges darken proportionally to countdown progress.

  • Hatched block textures missing — five PNG textures for hatched infected oak variants were absent from the 26.1.2 build, causing the missing-texture checkerboard at hatch time.

[0.5.0] — 2026-06-22

Added

  • Village infection system — plains villages generate with a configurable chance of already being infected. Corrupted oak blocks spread outward over days, activate nearby trees, and convert villagers into Village Shadows on hatch.

  • Village Shadow entity — a hostile mob that replaces consumed villagers. Wears a skull mask and tattered cloth, patrols within the ruins of its former home, and attacks players on sight. Intentionally does not extend Monster so iron golems — having no villagers left to protect — do not proactively retaliate.

  • village_infection_rate config option — controls the per-chunk seed probability (default 0.15). Set to 0 to disable village infection entirely.

  • /sif debug villages — lists all recorded infected village centers sorted by distance to the player.

  • /sif debug hatchin <seconds> — reschedules all infected blocks to hatch in N seconds, for testing the cascade without waiting days.

Fixed

  • VashtaShadow cloth layer — replaced coloredCutoutModelCopyLayerRender (which forces entityCutout) with direct submitModel calls using model.renderType() (entityTranslucent), matching PlayerModel's declared render type. Tattered cloth now renders correctly on the 26.x render graph.

  • VillageShadow cloth layerEntityRenderDispatcher.getRenderer() has a fast-path for AvatarRenderState that bypasses the entity-type registry and routes to the vanilla player renderer. Extended the existing mixin to intercept VILLAGE_SHADOW so VillageShadowRenderer (and its cloth layer) is actually used.

Port notes (MC 26.1.2)

This is the first release on the MC 26.x branch. The 1.20.1 build continues on master at version 0.4.x. Key rendering changes required for 26.1.2:

  • SubmitNodeCollector deferred render graph replaces direct BufferBuilder calls.
  • Any non-player entity using AvatarRenderState + PlayerModel requires a mixin intercept on EntityRenderDispatcher.getRenderer() to bypass the vanilla player-renderer fast-path.
  • ClientAsset.ResourceTexture + PlayerSkin.insecure supply a fixed skull texture independent of player skin resolution.

[0.4.0] — 2026-06-17

Added

  • JSON config file — server-side settings now live in config/silence_in_the_forest.json and are loaded on startup. All values are clamped and written back on load so new fields appear automatically in existing configs. Configurable fields: death countdown, sprint-escape duration, hatch min/max days, proximity radius and window, night multiplier, shadow patrol radius.

  • Grave soul particles — the vashta_grave block emits drifting soul particles above it (via animateTick) so the grave is visible from a distance without coordinates.

  • Soul compass — on respawn after a marked death, the player receives a Soul Compass pointing to their grave (lodestone compass with LodestoneTracked: false, no real lodestone required). Destroying the grave block also removes the compass from the breaker's inventory; breaking the grave before the player respawns cancels the pending compass.

  • Grave drops bonesvashta_grave now drops 1–3 bones when broken instead of the block itself.

  • Shadow companion animation — the second-shadow companion entity now mirrors the tracked player's full limb animation (walk cycle, arm swing, body poses) via PlayerModel.setupAnim, so its silhouette matches the real player under shaders.

  • Shadow debug commands (cheats required):   - /sif debug shadow visible — toggles the companion entity visible with a Steve skin for in-game tuning   - /sif debug shadow tilt <0–30> — sets the companion's sideways lean in degrees (live, no restart)   - /sif debug shadow distance <0.1–3.0> — sets the perpendicular offset from the player in blocks (live)

Changed

  • Shadow companion defaults — tilt 30°, distance 0.4 blocks (tuned from in-game testing).
  • Shadow companion scale — companion model now renders at the correct 0.9375× scale to match the vanilla player renderer. Companion entity sized to player proportions (0.6 × 1.8).
  • Shadow companion lag fix — position was frozen at spawn because putNonPlayerEntity does not add entities to the tick list. Fixed: position is now pushed directly each render frame via pushPosition(), bypassing the broken tick path.

[0.3.0] — 2026-06-17

Added

  • Vashta Shadow skin rendering — the shadow mob now wears the dead player's actual Minecraft skin.   - Per-region cloth tinting: sleeve, pants, and jacket colors are sampled directly from the player's skin texture via GPU readback (glGetTexImage) and applied to the tattered cloth overlay. Outer-layer UV regions are checked first (with a minimum opaque-pixel threshold to avoid sparse/dark border pixels skewing the average); falls back to the base layer if the outer layer is too sparse.   - Skin resolution: uses PlayerInfo.getSkinLocation() as a fast path (available immediately in-session), then fires SkinManager.registerSkins once to self-correct if PlayerInfo still held a loading placeholder. Offline fallback (save/reload with the player not in the session) uses async fillProfilePropertiesregisterSkins callback.   - Caches resolved skin and tint values per UUID; invalidates tint cache when a confirmed skin arrives, so colors re-resolve on the next frame.

  • Shadow inventory — the Vashta Shadow carries the dead player's full inventory (36 main + 4 armor + 1 offhand slots). Items drop in full when the shadow is killed — the player must hunt down their own remains to recover gear. Inventory persists across world saves via NBT.

  • Grave marker block — a simple carved-bone marker block (vashta_grave) is placed at the death position as a landmark. Drops itself when broken. Replaces the previous chest-like grave block entity.

  • Death coordinates in chat — on death, the player receives a [SiF] Your remains haunt X, Y, Z message so they can navigate back even if the grave is out of sight.

Changed

  • Second shadow offset — positional side offset increased from 0.4 to 0.6 blocks (perpendicular to player facing) so the double shadow reads as clearly distinct rather than a subtle blur.
  • Second shadow yaw skew removed — companion now faces the same direction as the player (with the existing rotation lag), giving a clean parallel double shadow instead of a tilted/angled silhouette variant.
  • Grave block simplifiedVashtaGraveBlock and VashtaGraveBlockEntity removed; replaced with a plain Block using bone block sound and no block entity. The shadow entity now owns the player's inventory, not the grave block.

[0.2.0] — 2026-06-16

Added

  • Second shadow companion — a marked player now trails a second, subtly-wrong shadow.   - Outside Iris (or with no shaderpack active), renders as the original flat blob-shadow quad — checked live each frame via Iris's isShaderPackInUse() API (reflection-based, no hard dependency), so toggling a shaderpack on/off mid-session switches behavior immediately.   - Under an active Iris shaderpack, instead spawns a client-only, never-networked ShadowCompanionEntity rendered with a fully invisible (zero-alpha translucent) player model, so Iris's shadow pass still picks up its depth geometry and casts a real, lit shadow.   - Position tracks the player exactly plus a fixed sideways offset (avoids sitting on top of the player, which previously caused depth-buffer "cutout" artifacts through water and the player's own skin overlay layer).   - Facing lags behind the player's actual yaw with a fixed skew, lerped wrap-safe each frame, so the companion turns late and never lines up with the player's own shadow.   - Leans slightly (10°) to keep the silhouette from ever being a clean duplicate, while staying upright enough that the cast shadow doesn't read as visibly shortened or thin.

Changed

  • Debug commands gated behind cheats/sif debug ... (mark, unmark, immune, hatchnow, etc.) now requires permission level 2, the same tier as vanilla's /gamemode and /give. Previously usable by any player; now only reachable by ops, or a singleplayer host with "Allow Cheats" enabled.

[0.1.1] — 2026-06-14

Added

  • Vashta Shadow mob — a hostile entity that spawns at a player's grave when the infection countdown expires.   - Wears the dead player's skin on the body (all skin layers: jacket, sleeves, pants).   - Head is replaced by a custom skull texture.   - Named "Remains of [player]" with the name tag always visible.   - Patrols within 10 blocks of the grave block; returns to anchor if wandering too far.   - Targets and attacks players on sight.   - Does not burn in sunlight.   - Persists across chunk unloads (setPersistenceRequired).

  • Hatched block proximity threat — once a placed infected block hatches (visually consumed), it begins exerting the same proximity infection pressure as active Vashta trees. Players must dismantle every hatched section of their base to make it safe again. Hatched block positions are saved to world data and persist across restarts.

  • Inventory contamination — picking up any infected wood item converts all matching vanilla wood items already in the player's inventory to their infected equivalents. Stacks are merged correctly so the hotbar does not fill with duplicate "Oak Log" entries.

  • Debug command: /sif debug countdown <seconds> — sets the death countdown duration for testing without waiting the full five minutes. Also clamps any active countdowns to the new ceiling.

Changed

  • Death sequence — on countdown expiry, the player's inventory is cleared into a grave chest before the kill. A Vashta Shadow is spawned and anchored to the grave position before player.kill() is called.
  • Infected oak log block break — breaking a log from an active Vashta tree now adds the infected log directly to the player's inventory (discarding the vanilla drop entity) so it stacks immediately with any existing infected logs.
  • Version scheme reset — previous build used 1.0.0; versioning restarted at 0.1.1 to reflect the mod's pre-release status.

Fixed

  • Skull head rendering: model.head and model.hat are now both suppressed in the main render pass and re-drawn by a dedicated skull layer, ensuring the outer hat UV region (eye sockets, jaw gaps) is applied correctly.
  • Arm transparency: switched renderer from ZombieModel to PlayerModel so all six skin layers (including outer sleeves and pants) are rendered, covering transparent base-layer pixels in the skull skin.
  • Hatched block positions now removed from world data when the player breaks them (onRemove added to all six hatched block classes).

[0.1.0] — initial build

  • Fabric 1.20.1 dev environment (Loom 1.16-SNAPSHOT, Gradle 8.8, JDK 21).
  • Vashta Nerada tree infection system: forest oak trees randomly activated on chunk load; player proximity in forest biomes accumulates infection time and marks the player.
  • Night multiplier: proximity accumulates twice as fast after midnight.
  • Randomised proximity threshold: each fresh approach to a tree rolls a new 30–60 second window before the player is marked.
  • Infection spread: small chance to activate a nearby unactivated tree when a player is marked.
  • Death countdown: 5-minute timer with vignette effect that darkens and narrows vision as time runs out.
  • Sprint escape: sprinting continuously for 10 seconds removes the mark.
  • Infected wood blocks: infected_oak_log, infected_oak_planks, stairs, slab, fence, fence gate — all with hatched variants that appear after the hatch timer fires.
  • Hatch timer: placed infected blocks convert to hatched variants after 2–5 in-game days; marks the nearest player within 16 blocks on hatch.
  • Vashta grave block: placed at death position, stores player inventory in a chest-like block entity.
  • Debug commands: /sif debug mark, unmark, immune, activatetree, cleartrees, showtrees, hatchnow, trees.
  • Client-side vignette overlay synced from server via packet.
  • Tree debug outlines: magenta bounding boxes around active trees and infected blocks (toggled with /sif debug showtrees).