You are viewing a potentially older version of this package.
View all versions.
EvenMoreSkinColors
Adds a multiplayer-synced custom skin-tone picker with presets, hex entry, and per-loadout persistence.
| Date uploaded | a month ago |
| Version | 0.2.0 |
| Download link | Cray-EvenMoreSkinColors-0.2.0.zip |
| Downloads | 553 |
| Dependency string | Cray-EvenMoreSkinColors-0.2.0 |
This mod requires the following mods to function
BepInEx-BepInExPack
BepInEx pack for Mono Unity games. Preconfigured and ready to use.
Preferred version: 5.4.2305README
EvenMoreSkinColors
EvenMoreSkinColors adds a custom skin-tone panel to the character customization menu. It keeps the
vanilla skin index intact for compatibility, then layers an exact custom color override on top.
Current features
- Adds a new custom tone area under the vanilla skin color buttons.
- Includes a hue wheel and saturation/value square for full RGB skin color selection.
- Adds quick presets, a built-in hex editor, reset-to-vanilla, and reset-to-default actions.
- Syncs exact custom tone values over Mirror so other players with the mod see the same color.
- Saves the custom tone per loadout in BepInEx config without touching the game's
Cosmetics.json. - Stays additive when
MoreSkinColorsis installed instead of rewriting the vanilla swatch list.
Compatibility notes
- Vanilla still syncs
skinColorIndex; this mod adds a second channel for exact color. - Players without the mod will fall back to the vanilla skin tone index.
MoreSkinColorscan stay installed. Its extra vanilla swatches remain intact; this mod adds a separate exact-color override panel.- The custom picker is still mouse-first. Controller navigation still works for the vanilla menu, but the custom picker panel is not yet controller-native.
Debugging
- The mod emits
EMSC_DEBUG ...log lines when it broadcasts, receives, applies, or reverts custom tones. - These logs are intended to make harness integration and multiplayer verification easier.
- It also exposes a small reflection-friendly debug API via
EvenMoreSkinColors.DebugApiwithGetLocalState(),GetRemoteStates(), andGetSnapshot().
Build
dotnet build -c Release
CHANGELOG
Changelog
0.2.0
- Stop kicking vanilla clients out of modded lobbies. The skin-tone state broadcast was using
Mirror's
SendToAll, which delivered our custom message id to vanilla peers — Mirror disconnects the offending client on unknown messages. The host now tracks which connections have proven they speak this protocol (via snapshot or update requests) and fans out only to those, leaving vanilla peers untouched. - Clean up the modded-connections set on disconnect via
NetworkServer.OnDisconnectedEventso reconnecting clients get re-detected on their next snapshot request. - Silence the per-event
EMSC_DEBUGbroadcast/receive/apply/revert log lines by default; flipDiagnostics.VerboseLogging = trueto bring them back when reporting an issue.
0.1.3
- Remove the redundant "Show/Hide Wheel" toolbar button. The whole-panel minimize from 0.1.2 already covers the same need without the second confusable affordance, and the wheel is now always visible while the panel is expanded.
- Fix wheel-drag stutter. Three changes:
- Skip the SV gradient regen when hue hasn't moved (it's parameterized only by hue, so
SV-square drags reuse the existing texture and tiny wheel jitters do too) and switch from
65,536
SetPixelcalls to oneSetPixels32upload using a reused buffer. - Defer disk-save and Mirror broadcast to drag-end. During the drag we still apply the new
color to the preview material live, but
cray.evenmoreskincolors.cfgnow writes once on pointer-up via a newIPointerUpHandler/IEndDragHandlerpair on the drag surface, and a_dragFinalizingguard makes sure the two handlers only commit once between them. - Drop the duplicate
ApplyToPreviewat the end ofRefreshUi—SetLocalSelectionalready calls it; the explicit call is kept on the cold paths (Initialize, minimize/ restore) that don't go throughSetLocalSelection.
- Skip the SV gradient regen when hue hasn't moved (it's parameterized only by hue, so
SV-square drags reuse the existing texture and tiny wheel jitters do too) and switch from
65,536
0.1.2
- Add a whole-panel minimize/restore so the picker no longer covers the character preview and
the vanilla skin-color buttons. A new
\u2013button in the panel's top-right collapses everything to a small "Custom Tone" launcher pill (with a live swatch); clicking the pill expands the picker back. State is persisted incray.evenmoreskincolors.cfgunder[Picker.Panel] Minimized, so the panel reopens in whichever mode you last left it.
0.1.1
- Fix the color-wheel picker being unresponsive and appearing locked to the current character tone.
Three separate problems contributed: the panel was being parented inside the Skincolors
GridLayoutGroup (which squashed it, injected a
Contentwrapper, and hid AdvancedArea), the wheel's pointer math assumed a centered pivot while the box was top-left pinned (so clicks in the ring always fell outside the hit distance), and the handle Images were raycast targets that could steal events from the drag surface. Panel now parents to thePreviewcontainer, pointer math is pivot-agnostic viarect.rect.center, and handles are raycast-inert.
0.1.0
- Initial release candidate.
- Adds a custom multiplayer-synced skin tone override with a color-wheel UI in character customization.
- Adds per-loadout persistence in BepInEx config.
- Adds quick presets, hex entry, reset-to-vanilla, and reset-to-default controls.
- Adds additive compatibility handling for MoreSkinColors.
- Adds debug log hooks for harness-driven verification.