Tags
Creators
Details
Licensed ARR
Published 3 months ago
Updated last week
All versions
1.3.4-1024px
Release
DynamicSkins 1.3.4last week 447
Compatibility
Minecraft: Java Edition
1.20.1
Platform
Forge
Supported environments
Client and server
Required content
Unavailable version
Changes
DynamicSkins 1.3.4 — Forge
Fixed
- Fixed uploads getting stuck on "Another upload is already in progress" (reported on 1.3.2). Starting a new upload cleared the previous upload's unsent chunks while the server still held its session, so the server refused every retry until that session sat idle for 30 seconds.
- The server now replaces a player's unfinished upload when a new one starts at its first chunk, and drops leftover chunks of the abandoned upload silently. This also fixes 1.3.2 clients.
- The client's "upload in progress" guard moved from the editor screen into the avatar manager, so closing and reopening the editor no longer lets a second upload abandon the first.
- The client ignores upload results for older uploads, and a reopened editor shows the result of an upload already in flight.
Also includes everything from 1.3.3 below.
DynamicSkins 1.3.3 — Forge
Performance
- Upload completion no longer stalls the server tick: PNG validation, the file write and the metadata read run on a dedicated storage thread, and the result is applied back on the server thread.
- Online players' skins are kept in memory, so delivering skins to players who come into range (including late joiners) no longer reads files on the server thread. Each player's stored skin is loaded once, off-thread, when they join.
- Skin packets are built once per skin version and shared by every recipient, instead of re-splitting and copying the PNGs per recipient. Packets are also written straight into Forge's network buffer.
- Skin delivery uses smaller chunks (about 8 KB for typical skins, up from 28 KB) at about 160 KB/s per player, and the closest players' skins are sent first.
- PNG validation decodes from memory instead of letting ImageIO buffer through temp files on disk.
- Saving a skin on the server renames the previous files aside instead of copying them, while keeping the same rollback on failure.
- The skin library loads on a background thread once per editor session instead of on the render thread at every open and window resize. Rename, delete and import update the list in place.
- Importing a skin into the library no longer decodes it twice, and rename no longer re-reads and re-decodes it.
- Library thumbnails are small face-only images (at most 32x32, with the hat layer) instead of full-size skin textures.
- Avatar, preview and thumbnail textures free their CPU pixel copy after upload, which halves memory per skin.
- GPU uploads of received skins are budgeted by pixel count, so many small skins can appear in the same tick.
- The preview widget uploads each image once instead of twice.
- The editor watermark is drawn in one batch and skips copies that are fully clipped.
Fixed
- The local talking state no longer flickers: Plasmo Voice activation and the loudness filter are combined in one place instead of overwriting each other.
- Decoded skin images still waiting for GPU upload are now freed on disconnect.
- Server-wide limit of 64 MB for uploads in progress, and expired upload sessions are cleaned up every tick.
Compatibility
- Network protocol stays at version 2; 1.3.2 and 1.3.3 clients and servers can connect to each other.
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:RQtFfZ30:QFrQpdhq"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:RQtFfZ30:QFrQpdhq"
}

