You are viewing a potentially older version of this package. View all versions.
invent60-Blood_System-3.2.6 icon

Blood System

Realistic blood splatter from bullet exit wounds. Animated flying dots, spray, and drip stains. Real penetration detection — armor stops and ricochets produce no splatter.

Date uploaded 21 hours ago
Version 3.2.6
Download link invent60-Blood_System-3.2.6.zip
Downloads 405
Dependency string invent60-Blood_System-3.2.6

This mod requires the following mods to function

BepInEx-BepInExPack_H3VR-5.4.1700 icon
BepInEx-BepInExPack_H3VR

BepInEx pack for H3VR. Preconfigured and ready to use.

Preferred version: 5.4.1700

README

Blood System

Stupidly exaggerated blood visuals! When a bullet physically exits a sosig, it projects blood from the exit wound onto any surface behind it — walls, floors, other sosigs. Real penetration detection means blunt hits, armored stops, and ricochets produce nothing.

Effects

  • Splash — Raycast-based blood dots projected from the exit wound. Spread pattern sampled from included blood PNGs. Each dot gets individual brightness from noise.png (10 levels, 0.7–1.0 range) so the splatter looks dimensional rather than flat. Dots scale with distance and stretch along the bullet path.
  • Spray — Quick particle burst at the exit wound. Gib explosions fire a 360° burst with lifetime and velocity scaled to bullet entry speed.
  • Drip stain — Vanilla sosig blood drip particles are hooked at runtime. When a drip lands on a static surface (floor, wall) it spawns a cluster of blood drops with a smoothstep soft edge. Drips landing on dynamic objects (guns, other sosigs, moving RBs) are skipped.

Blood color

Blood color is read from the sosig's actual body color, not hardcoded. Priority order:

  1. Color Override (if set) — see below, applied before or after NGA depending on Soft/Hard mode.
  2. NGA SosigIntegrity config — if the NGA Sosig Integrity mod is installed, the plugin reads that sosig's configured body color directly from its config values (Mustard Colour hex string, Ketchup bool).
  3. Sosig.Mustard field — the vanilla per-instance color H3VR assigns to each sosig.
  4. Fallback — default mustard yellow if neither is available.

This means alien-colored sosigs from custom scripts, and any sosig whose color NGA overrides, will bleed the right color automatically.

Color Override

Set a custom blood color instead of each sosig's natural color, using Color Override (hex, e.g. #8C1A1A) and Color Override Mode:

Mode value Behavior
1 Soft — replaces the default blood color, but sosigs with a color specifically set via NGA SosigIntegrityConfigs (e.g. zombies) keep their own color
2 Hard — replaces blood color for every sosig, no exceptions
anything else (spaces ignored) Unset — no override, vanilla per-sosig color behavior described above

How it works

  • Blunt hit / ricochet / armor deflect / faceshield → no splatter
  • Bullet punches through and continues → splatter on whatever is behind the exit wound
  • Splatter direction and animation speed follow bullet exit speed and direction
  • Segment explosions fire blood in all directions
  • Splash stains on dynamic rigidbodies (dropped guns, ragdolled gibs) are parented to that object and move with it — stains won't float in the air after the body falls
  • Drop custom blood shape PNGs or a greyscale noise PNG into the plugin folder and they are loaded and normalized at startup automatically

Config

All settings in F1 (ConfigurationManager) or the .cfg file in BepInEx/config.

Setting Default Description
Enabled true Toggle all blood effects
Lifetime seconds 30 How long splash stains persist
Max rays per shot 3000 Raycasts per penetration event (capped to image pixel count)
Cone half-angle 10 Half-angle in degrees of the splash spread cone
Dot base radius 0.008 Base radius of each splash dot in metres
Range metres 50 Maximum splash cast distance
Projection Mode Animated How dots appear: Animated / Delayed / Immediate
Projection Speed Ratio 2 Bullet speed multiplier for dot travel speed in Animated mode
Projection Speed Bias 10 Flat m/s added to dot travel speed
Dot Max Scale 5 Maximum size multiplier for dots at full range
Dot Scale Range metres 50 Distance at which dots reach maximum size
Gib Ray Count 200 Rays fired on segment explosion
Color Override #8C1A1A Hex blood color used when Color Override Mode is Soft or Hard
Color Override Mode 0 1 = Soft override, 2 = Hard override, anything else = Unset (see Color Override section above)

Performance Tips

Blood only spawns from bullets fired by the player — sosig-vs-sosig gunfire never triggers blood effects, since that crossfire is what causes the worst frame spikes in big fights. This is automatic, no config needed.

Splash is the most CPU/GPU intensive effect. If you are dropping frames, apply these fixes in order of impact.

Highest impact

1. Switch Projection Mode to Immediate

The default Animated mode keeps a live particle system running with thousands of in-flight dots. Immediate removes all flight animation — dots appear the instant the bullet exits. This is the single biggest FPS win. No visual difference in stain placement, only the flying animation is removed.

2. Reduce Max rays per shot

Default 3000 is high. Try 1000 or 500. Below ~200 the splatter starts to look sparse. This directly controls how many raycasts happen per shot and how many dot quads build up per second.

Moderate impact

3. Reduce Lifetime seconds

Fewer accumulated stain meshes = fewer draw calls per frame across a long fight. 10–15 seconds keeps the scene looking fresh without piling up hundreds of meshes.

4. Reduce Gib Ray Count

Segment explosions fire rays in 360°. High gib fights (shotguns, explosives, multiple sosigs) multiply this cost fast. Cutting from 200 to 100 helps significantly in those scenarios.

Lower impact

5. Reduce Dot Max Scale

Smaller maximum dot size = less GPU fragment overdraw from large-radius quads at range.

6. Reduce Range metres

Caps the maximum raycast distance. Combined with reduced Max rays per shot, limits the worst-case cost per shot.

Low-end preset

Projection Mode = Immediate, Max rays per shot = 500, Lifetime seconds = 10, Gib Ray Count = 100

CHANGELOG

3.2.6

  • Fixed: spray particles (mist/blobs/drops on gunshots and gib explosions) still appeared red even with blood color set to mustard-yellow. The blood image's color was supposed to be stripped to plain white on load so it could be tinted any color, but the strip step silently skipped flat-colored source images (color-only-in-alpha-mask, which is how the shipped blood image is drawn) and left them in their original color. Spray now tints correctly to the configured blood color.

3.2.5

  • Optional interop (only active if Onslaught Mode is installed): dead sosigs now fall and settle for a few seconds before disappearing instead of vanishing the instant they die, and fixed a crash in Onslaught's own cleanup logic that could occur when two or more sosigs died in the same moment.

3.2.4

  • Fixed: with Color Override Mode left at its default (Unset), blood was appearing red instead of the correct mustard-yellow, and setting Color Override to a custom color had no effect while the mode was Unset. Blood now always defaults to mustard-yellow as intended; Color Override only needs Mode set to Soft or Hard to apply.

3.2.3

  • Minor fix

3.2.2

  • Minor fix

3.2.1

  • Minor fix

3.2.0

  • New config: Color Override / Color Override Mode — set a custom blood color instead of each sosig's natural color. Mode 1 (Soft) replaces default blood color but leaves sosigs with a color specifically set via NGA SosigIntegrityConfigs (e.g. zombies) untouched. Mode 2 (Hard) replaces blood color for every sosig, no exceptions. Any other value in Mode = Unset, vanilla per-sosig color behavior.
  • Performance: blood effects (splash, spray, drip) now only trigger for bullets fired by the player — sosig-vs-sosig gunfire no longer spawns blood, cutting frame spikes during large firefights

3.1.0

  • Fixed icon.png being picked up and used as a blood splatter shape texture (it sits in the same folder as the DLL after install)
  • Penetration detection upgraded to geometric dot-product check — bullet position vs surface normal determines real penetration vs deflection; armor and faceshields now correctly produce zero blood
  • Per-dot brightness variation from noise.png: each splash dot gets an individual brightness level (10 buckets, 0.3–1.0 range) so splatter looks dimensional instead of flat
  • Blood PNG and noise texture luminance normalized at load — drop in any custom image and it matches
  • Drip stains upgraded: smoothstep edge (opaque center, gradual falloff); elongated streaks based on impact angle and velocity; separate growing stains from wounds that drip for several seconds after penetration
  • Spray upgraded to three-layer system: outer mist ring, mid-range blobs, inner fast drops — each with independent physics and gravity (still barely noticable)
  • Spray particles have a chance to leave stains on static surfaces
  • Stains fade out smoothly over their lifetime instead of popping out
  • New config: Max shot groups — caps how many shots worth of splash decals stay in scene; oldest shot removed as a group when exceeded
  • New config: Max drip stains — caps drip stains from particle detection separately from shot groups

3.0.0

  • Complete rewrite — no performance spikes, no audio issues
  • Blood splatter projected from bullet exit wounds using penetration detection
  • Animated mode: dots fly from wound to wall before settling
  • Natural spread pattern sampled from included blood PNG images
  • Dots scale with distance and stretch along the bullet path
  • Blood spray particle burst from exit wound on penetration
  • Segment explosion blood spray in all directions, scaled by bullet entry speed
  • Blood drips from wounds
  • Configurable projection mode (Animated / Delayed / Immediate), speed, dot scale, ray counts, and lifetime

1.0.0

  • Initial release
  • Wall splatter spawns when a bullet physically exits a sosig and hits a surface behind it
  • Uses actual bullet penetration state — blunt damage and ricochets produce no splatter
  • Splatter size and lifetime configurable via F1 or .cfg