Files
SymlinkModels/README.md
T
2026-06-22 06:44:43 -04:00

4.6 KiB

SymlinkModels

Replace unwanted Sven Co-op player models with a neutral placeholder by symlinking them to helmet.mdl. This keeps your client from rendering anime, NSFW, or other models you don't want to see, while still letting you connect to any server that uses them.

How it works

For each model ID, the scripts create a relative symlink:

svencoop_addon/models/player/<id>/<id>.mdl
    -> ../../../../svencoop/models/player/helmet/helmet.mdl

Every suppressed model renders as the default helmet instead.

Prerequisites

  • Sven Co-op installed (scripts must run from the game's root folder, alongside tags.json)
  • Python 3.8+ or PowerShell 5.1+
  • Windows only: Developer Mode enabled (Settings → For developers) or run as Administrator — both Windows symlink scripts check for this and warn if neither condition is met

Files

File Description
tags.json Model ID lists grouped by category (anime, nsfw, vehicle)
symlink_models.py Python — symlink models from tags.json, a server path, or a text file
symlink_models.ps1 PowerShell equivalent of symlink_models.py
symlink_downloads.py Python — symlink downloaded models that match tags.json, then optionally clean up svencoop_downloads
symlink_downloads.ps1 PowerShell equivalent of symlink_downloads.py
server_models.txt Example model ID dump from a server, usable with --from-file

Usage

Place the scripts and tags.json in your Sven Co-op root folder (the directory that contains svencoop/ and svencoop_addon/).

Symlinks every model ID from the selected source.

Python:

# Default: all IDs in tags.json
python symlink_models.py

# Scan a server's player/ directory
python symlink_models.py --server /path/to/svencoop_addon/models/player

# Read IDs from a text file (one ID per line)
python symlink_models.py --from-file server_models.txt

# Preview changes without writing anything
python symlink_models.py --dry-run

PowerShell:

# Default: all IDs in tags.json
.\symlink_models.ps1

# Scan a server's player/ directory
.\symlink_models.ps1 -Server "C:\path\to\svencoop_addon\models\player"

# Read IDs from a text file
.\symlink_models.ps1 -FromFile server_models.txt

# Preview changes without writing anything
.\symlink_models.ps1 -DryRun

Scans svencoop_downloads/models/player/ for .mdl files whose names match IDs in tags.json. For each match it creates the symlink in svencoop_addon, then lists the source folders and prompts whether to delete them.

Python:

python symlink_downloads.py

# Preview without writing or deleting
python symlink_downloads.py --dry-run

PowerShell:

.\symlink_downloads.py

# Preview without writing or deleting
.\symlink_downloads.ps1 -DryRun

The svencoop_downloads/models/player/ root itself is never deleted — only matched sub-folders.

Dumping model IDs from a server

If you have access to a server's files (directly or via a network mount), you can dump its player model IDs to a text file and feed it to symlink_models:

Linux/macOS:

find /path/to/svencoop_addon/models/player \
     -mindepth 2 -maxdepth 2 -name "*.mdl" -printf "%f\n" \
     | sed 's/\.mdl$//' > server_models.txt

PowerShell:

Get-ChildItem -Path "C:\path\to\svencoop_addon\models\player" -Recurse -Filter "*.mdl" |
    Where-Object { $_.DirectoryName -ne "...\player" } |
    ForEach-Object { $_.BaseName } | Sort-Object -Unique | Set-Content server_models.txt

tags.json

The tag file is a flat JSON object with three category arrays:

{
  "anime":   ["2d_ab_kanna_coco", "sagas_trunks_ssj", ...],
  "nsfw":    [...],
  "vehicle": [...]
}
  • anime (~2,129 entries) — anime character models
  • nsfw (~579 entries) — adult content models
  • vehicle (~73 entries) — vehicle models

Model IDs are lowercase with underscores or hyphens. Version suffixes like _v2 and _hd are treated as separate entries. To add or remove a model, edit the relevant array directly. Existing entries are not fully sorted, but try to insert near alphabetical neighbours.

Output

Each script prints one line per model processed and a summary on exit:

[anime] — 2129 models
  create  : 2d_ab_kanna_coco
  skipped : 2d_ab_kratos
  replace : sagas_trunks_ssj

147 symlinks written (147 new, 0 replaced), 1982 already correct

Exit codes are 0 on success, non-zero on a fatal error (missing helmet.mdl, bad path, etc.).