# HDSkinSupportGravit Client-side Minecraft mod that adds **HD skins** (up to 2048×2048) and, importantly, **animated GIF cape support** — including HD and transparent GIFs — on top of a UUID-keyed asset API. Built for GravitLauncher setups but backend-agnostic. This branch targets **Fabric and Forge 1.20.1** through an Architectury multiloader build. The core (GIF decoder, cape state, mixins) is shared between loaders. ## Features - **HD skins**: the legacy-skin conversion is rescaled so 128/256/…/2048-wide skins render correctly. - **GIF capes**: animated capes decoded from GIF (HD, transparency, per-frame timing). Decoded once, then played back by copying a pre-composited frame per tick — no per-frame decoding, no AWT, so it doesn't cost FPS. Playback speed comes from the GIF itself (overridable per player). - HD PNG capes fall through to the vanilla renderer untouched. - Per-player control and persistence. ## Backend integration (easy) The mod talks to your existing site/launcher backend over plain HTTP — no server-side plugin needed. Set one value (`baseUrl`) in the config and the mod requests: ``` GET /api/minecraft/cape/?gif ``` If the response is a GIF it is animated; anything else (PNG / 404) keeps the vanilla cape. This maps cleanly onto most launcher-site engines (DLE-based sites, custom backends, etc.) — you just expose that one endpoint returning the player's GIF cape by UUID. HD skins use the normal skin URL your launcher already serves, so they need no extra endpoint. ## Install Drop the matching `skinsg-fabric-x.y.z.jar` or `skinsg-forge-x.y.z.jar` into your Minecraft 1.20.1 client's `mods/` folder. Client-side only. ## Configuration On first launch the mod writes `config/skinsg.json` with an **empty** `baseUrl`. Nothing is fetched until you set it. ```json { "baseUrl": "https://your.host", "mode": "ALL", "enabled": [], "blocked": [], "globalSpeed": 100, "speed": {} } ``` - `baseUrl` — root of your asset API (no hardcoded host in the mod). - `globalSpeed` — playback speed in percent (`100` = the GIF's own timing). - The rest is managed by the in-game commands and shouldn't be edited by hand. Edit `baseUrl`, then restart the client (or rejoin). ## Commands `/skinsg` (client-side, tab-completes online players and `@a`): | Command | Effect | | --- | --- | | `/skinsg playgif` | Turn animated capes off (frees memory) | | `/skinsg playgif @a` | Animate everyone | | `/skinsg playgif ` | Animate only listed players | | `/skinsg stopgif` | Same as `playgif` with no target — off | | `/skinsg stopgif @a` | Off for everyone | | `/skinsg stopgif ` | Stop a specific player (works even in `@a` mode) | | `/skinsg self` | Animate only your own cape | | `/skinsg speed @a ` | Global speed override | | `/skinsg speed ` | Per-player speed override | All settings persist in `config/skinsg.json`. ## Building ``` ./gradlew build ``` Runtime jars: - `build/libs/skinsg-fabric-.jar` - `build/libs/skinsg-forge-.jar` Requires JDK 17. ## License Free to use and modify for any purpose. Commercial use must credit the author (Nghtly). See [LICENSE](LICENSE).