DrawableSuits is a Lethal Company v81 BepInEx mod that lets players draw on suits in-game, place image decals, save and load designs, and apply edited textures to vanilla or modded suits.
- Default third-person paint editor: opening DrawableSuits switches to an editor camera around the local player so you can paint directly on the visible suit.
- Compact side overlay with Paint, Erase, Fill, Decal, Text, Eyedropper, a UI-only Mirror toggle, brush/fill sliders, a hue/SV color picker, decal/text controls, design name, visible decal rows, visible saved-design rows, share-code import/export, Undo, Redo, Reset, Apply, Save, Load, and Close.
- Fill Bucket flood-fills contiguous matching texture regions under the cursor using the current brush color, opacity, and Fill Tolerance slider.
- Mirror painting duplicates Paint, Erase, Fill, Decal, and Text edits onto the opposite suit surface using the editor's baked avatar mesh, without adding keyboard or controller shortcuts.
- Decal placement preview: Decal mode shows a translucent live preview before stamping, then places one projected decal per click or right-trigger press in third-person mode.
- Text stamping: Text mode previews typed single-line text on the suit as a transparent alpha-mask stamp, then bakes it into the texture once per click or right-trigger press. In third-person mode, text is projected onto the visible suit surface instead of stamped as a flat UV rectangle.
- Pause-menu entry point: use the
DrawableSuitsbutton below Resume. - Fallback shortcuts:
F8on keyboard orView/Back + Yon controller. - Emergency open shortcut:
F10, which opens the editor and does not toggle it closed. - Controller support: left stick moves the editor cursor,
Aclicks exactly the UI control under the cursor, right trigger paints only, right stick/bumpers orbit the camera, D-pad up/down zooms,Ycycles tools,Xundoes, and Start saves. - Direct surface painting: the editor bakes a hidden mesh collider from the local player model and paints by raycasting from the third-person camera to suit UV coordinates.
- UV fallback mode: press
Use UV Fallbackif third-person setup fails; it shows the full editable suit texture. - PNG/JPG decals from
BepInEx/config/DrawableSuits/Decals. The in-game OS file dialog is disabled for stability in Gale/Unity. - Reusable saved designs stored as JSON metadata plus PNG texture files.
- Compact lossless
DSUIT2:design codes for copy/paste import and export between profiles or players, with legacyDSUIT1:import compatibility. - Apply/save multiplayer sync for other players who also have DrawableSuits installed, keyed per player so two players wearing the same suit can have different edits.
- Vanilla and modded suit support as long as the suit exposes a normal suit material and texture.
- Install BepInExPack for Lethal Company.
- Build this project with
dotnet build -c Release. - Copy
dist/DrawableSuits/BepInEx/plugins/DrawableSuits/DrawableSuits.dllinto your mod profile, or package thedist/DrawableSuitsfolder for Thunderstore.
Keyboard and mouse:
- Pause menu
DrawableSuits: primary open path. F8: toggle editor.F10: emergency open.- Left mouse: paint/erase continuously; in Fill mode, fill once per press; in Decal or Text mode, stamp one preview at the cursor location.
- Fill: click the
FillUI button, adjust Fill Tolerance if needed, then left-click a contiguous color region on the suit. - Text: click the
TextUI button, type up to 64 characters, then left-click the suit to stamp it. Text uses the current brush color and opacity. - Eyedropper: click the
EyedropperUI button, then left-click the suit to sample that texture color. It returns to the previous tool after one successful sample. - Mirror: click the
MirrorUI button to duplicate paint, erase, fill, decal stamps, and text stamps onto the opposite suit surface. - Export Code / Import Code: use the design code panel to copy the current editable texture as a compact
DSUIT2:code or paste a sharedDSUIT2:or legacyDSUIT1:code into the current suit. - Right mouse: orbit the third-person editor camera.
- Mouse wheel: zoom the third-person camera.
- Ctrl + mouse wheel: change brush size.
- Escape or Close: close the editor.
Controller:
View/Back + Y: open or close.- Left stick: move the editor cursor.
A: click the button, field, slider, or color picker region directly under the cursor.- Text: move the virtual cursor over the
TextUI button and pressA, type text with the UI field, then aim at the suit and press right trigger once to stamp it. - Fill: move the virtual cursor over the
FillUI button and pressA, adjust Fill Tolerance if needed, then aim at a matching color region and press right trigger once. - Eyedropper: move the virtual cursor over the
EyedropperUI button, pressA, then aim at the suit and press right trigger once to sample a color. It returns to the previous tool after one successful sample. - Mirror: move the virtual cursor over the
MirrorUI button and pressA; there is no controller shortcut for this modifier. - Export Code / Import Code: use
Aon the design code UI buttons. There are no shortcuts for import/export. - Right trigger: paint/erase continuously; in Fill mode, fill once per press; in Decal or Text mode, stamp one preview at the cursor location.
- Right stick or bumpers: orbit the third-person editor camera.
- D-pad up/down: zoom the third-person editor camera.
Y: cycle Paint/Erase/Decal. Fill, Text, Eyedropper, and Mirror are UI-only and are not part of this shortcut.X: undo.- Start: save.
DrawableSuits creates these folders after launch:
BepInEx/config/DrawableSuits/Savesstores.jsondesign metadata.BepInEx/config/DrawableSuits/Texturesstores saved design.pngtextures.BepInEx/config/DrawableSuits/Decalsstores user decal images.BepInEx/config/DrawableSuits/Logsstores the diagnostics log.
Put .png, .jpg, or .jpeg files in Decals and press Refresh Decals in the editor to use them.
Edited suits update locally while painting. Other mod users receive your player-specific texture only when you press Apply or Save. Texture payloads are chunked through Unity Netcode custom messages with the owner client ID and validated with a hash before being applied.
Players without DrawableSuits can still join normally, but they will see the original suit textures.
DrawableSuits no longer replaces every rack/player using the same base suit when one player edits their suit. Saved designs are reusable, but active in-session edits are applied to the selected player only.
Share codes embed a PNG copy of the current editable texture plus metadata. Importing a code loads it into the currently selected suit editor texture only. It creates one undo entry, does not auto-save, and does not sync to multiplayer until you press Apply or Save.
New exports use the shorter lossless DSUIT2: format. Older DSUIT1: codes still import normally, but newly copied codes default to DSUIT2:.
DrawableSuits works with modded suits by detecting unlockables that expose a suitMaterial. Saved designs are reusable on any suit, but loading a design onto a suit with a different UV layout can stretch or misplace drawings and decals.
The BepInEx config file controls:
- Open editor key.
- Emergency diagnostics overlay key.
- Debug HUD toggle key.
- Startup diagnostics HUD enable/disable and display duration.
- Controller cursor speed.
- Max editable texture size.
- Undo history size.
- Multiplayer sync enable/disable.
- Max sync payload size and chunk size.
StartInUvFallbackMode, disabled by default, opens directly into the old UV fallback view.ThirdPersonCameraDistance, the default third-person editor camera distance.ApplyLocalFirstPersonArms, disabled by default, is experimental and allows edited materials on local first-person arms/body outside the editor.AutoDisableBrokenJetpackWarningLateUpdatePatch, enabled by default, disables only the broken JetpackWarningPlayerControllerB.LateUpdatepostfix after repeated null-reference errors are detected.EnableExperimentalModelPreview, disabled by default, keeps the old RenderTexture model preview as diagnostics only.- OS file dialog import remains disabled/experimental and is ignored in-game for stability.
DrawableSuits writes detailed startup, pause-menu, input, editor, camera, collider, raycast, suit-detection, list-row, and paint logs to BepInEx/config/DrawableSuits/Logs/diagnostics.log.
When testing with Gale, also search BepInEx/LogOutput.log in the active Gale profile for DrawableSuits.
Expected 0.5.23 behavior:
- Opening the editor shows a compact side overlay and a third-person camera view of the local player.
- The diagnostics text should show
Preview mode: WorldThirdPersonwhen the default path succeeds. - The visible editor model is
DrawableSuitsWorldAvatarProxy, a baked suit/body proxy on an isolated layer, not the live first-person local rig. First-person helmet/viewmodel renderers are hidden during editing and restored on close. - Normal session startup should log
SessionSafetyCheckwithEditorOpen=False, no active DrawableSuits cameras,Camera.mainstate, local player state, prompt context, andjetpackWarningGuardstatus. - If third-person setup fails, the editor falls back to
TextureFallbackand logs the reason. - Decal and saved-design rows are explicit anchored buttons, not ScrollRect/layout rows.
- Controller right trigger paints only. Camera zoom uses mouse wheel or controller D-pad up/down.
- Active edited textures are per player/client, not global per suit type.
- The color changer is a compact side-by-side hue ring and saturation/value square with a swatch and editable
#RRGGBBhex field. - Color picker handles are tied to the same coordinate conversion used for mouse/controller input, so the visible handle positions should match the selected hue, saturation, value, and typed hex color.
- Reset, Save, and Load no longer rebuild list hitboxes during the click; decal and saved-design rows only change selection when their rows are clicked directly.
- Third-person camera yaw, pitch, and distance are preserved when loading a design or switching suits while the editor is open.
- Controller
Adoes not activate UI immediately after opening; move the left stick once to arm the virtual cursor, thenAclicks the control under the cursor. - Normal buttons should not stay highlighted after unrelated clicks; only selected tools, decals, and saved designs keep orange selection styling.
- The decal section has one
Refresh Decalsbutton. It refreshes decal and save rows and shows only a short status line. - In Decal mode with a selected decal, hovering over the suit shows a translucent preview and status
Previewing decal. Click/RT to stamp. - Decal placement is single-shot: holding left mouse or RT places one decal until the input is released and pressed again.
- Third-person Decal preview and stamping project onto the visible suit surface and fill between valid projected samples, so decals avoid both UV-island wrapping and small suit-background cracks on curved geometry. UV fallback keeps direct flat UV decal stamping.
- The editor cursor is dynamic and rendered as a top-level non-raycastable graphic inside the visible editor canvas: Paint and Erase show a hollow brush ring sized to the current editable target, while UI hover, invalid targets, Decal, Text, Eyedropper, and normal navigation show a small white dot.
- The old filled UV brush indicator and world-space sphere marker are kept hidden, so there should not be a colored square or blob following the cursor.
- In Text mode, the text input uses Unity's built-in Arial font, accepts one line up to 64 characters, and shows
Previewing text. Click/RT to stamp.when the cursor is over a valid suit target. - Text stamps are generated as transparent alpha-mask textures and tinted with the current brush color/opacity, so they should not stamp a black rectangle behind the letters.
- In third-person mode, Text stamps project onto the visible suit surface and skip glyph pixels that fall off the suit instead of wrapping them through unrelated UV islands.
- Third-person Text should read left-to-right from the editor camera. Mirrored Text should only appear when the UI-only
Mirrorbutton is enabled. - UV fallback keeps direct flat UV Text stamping for texture-layout editing.
- Text is baked into the suit texture after stamping. It is not an editable layer after placement.
- The
Fillbutton is a UI-only tool. It flood-fills the contiguous same-color region under the cursor using the current brush color and opacity. - Fill is single-shot: holding left mouse or controller RT fills once until the input is released and pressed again.
- The Fill Tolerance slider appears when Fill is active. Lower tolerance fills tighter matching regions; higher tolerance accepts more color variation.
Export Codecopies a compact losslessDSUIT2:code to the clipboard and fills the design code field.Import Codevalidates a pastedDSUIT2:or legacyDSUIT1:code and loads it into the current suit without auto-saving, broadcasting, or resetting the third-person camera.- UV fallback mode shows a non-interactive rotated decal preview over the texture panel.
- The
Mirrorbutton is a UI-only modifier. When it is orange, paint, erase, fill, decal stamps, and text stamps use a surface-map mirror target on the opposite side of the baked suit mesh in one undo action. - Mirrored decal previews show both the primary and mirrored decal. The mirrored decal is horizontally flipped and uses inverse rotation.
- UV fallback also uses the mesh mirror map when the clicked UV maps back to a suit triangle. If no mirror target is available, DrawableSuits applies the primary edit only and shows a short status.
- The
Eyedropperbutton is a UI-only one-shot tool. It samples the editable suit texture at the cursor hit point, updates the swatch, color picker, hex field, and brush color, then returns to the previous Paint, Erase, or Decal tool. - Eyedropper does not create undo entries and Mirror does not affect sampling.
- The part picker is removed. Third-person mode always shows the full avatar proxy, and UV fallback always shows the full editable suit texture.
- Paint and Erase in third-person mode project onto the visible suit surface and fill between valid projected samples, so brush strokes avoid UV-island cutoffs while still guarding against unrelated UV island bleeding. UV fallback keeps direct flat UV brush painting.
- Paint, erase, decal preview, and decal stamping operate on the full editable texture.
- Active editor diagnostics report full proxy mesh/collider state through
WorldAvatarProxy updated;PartClassifierBuiltshould not appear during normal editor use.
Troubleshooting:
- If no decal preview appears, confirm a decal row is selected and Decal tool is active, then check
DecalPreviewUpdatedorDecalPreviewHiddendiagnostics. - If decals stamp repeatedly while holding input, confirm the installed package is 0.4.8 or newer and check for
DecalStampCommittedentries; there should be one per press/release cycle. - If Mirror does not appear to find the opposite side, check
MirrorSurfaceMap builtandMirrorSurfaceTargetdiagnostics. Asymmetric or unusual modded meshes may not have a reliable opposite surface for every hit. - If entering a session starts on a black screen before opening DrawableSuits, check
SessionSafetyChecklines. They listCamera.main, active cameras, camera target textures, local player flags, prompt context such as grab/hover fields, local renderer materials, and any repaired DrawableSuits objects. DrawableSuits should report no active DrawableSuits cameras whileEditorOpen=False. - If the black screen shows
Grab: [E]andSessionSafetyCheckreportsCamera.main=null, inspectLogOutput.logfor repeatedJetpackWarningPlayerControllerB.LateUpdateNullReferenceException. By default, DrawableSuits disables onlyJetpackWarning.Patches.PlayerControllerB_LateUpdate_Postfixafter repeated failures and logs the unpatch result indiagnostics.log. SetAutoDisableBrokenJetpackWarningLateUpdatePatch=falseto turn this compatibility guard off. - If third person shows first-person arms, a giant helmet, held items, or another partial rig, check
World renderer candidate,Hidden nearby first-person overlay renderer,World editor visible renderer candidate, andWorldAvatarProxy updatedlines. The selected renderer should be a body/suit renderer and the proxy should use only the player-specific DrawableSuits material for suit-compatible submeshes. - If action buttons such as Reset, Save, or Load also select decal/save rows, confirm the installed package is 0.4.7 or newer. Lists now use stable row pools and log
ListRowsUpdatedinstead of rebuilding/destroying row buttons during normal UI refresh. - If controller
Aclicks the wrong UI item, confirm the installed package is 0.4.7 or newer, move the left stick before the firstApress, then checkVirtual cursor A pressandVirtual cursor A releasediagnostics. They should show the same resolved button or control that is visually under the cursor. - If button highlights stick around, confirm the installed package is 0.4.7 or newer. Normal button selected colors are neutral.
- If the color picker handles do not line up with the selected color, check
ColorPickerInputdiagnostics for hue, saturation, value, local pointer coordinates, and final handle positions. - If loading a design or switching suits resets the third-person camera, confirm the installed package is 0.4.7 or newer and check for
World camera state preserveddiagnostics. - If the color picker does not update paint color, check the swatch, editable hex field, and
DrawableColorPickerBuiltdiagnostics. Hex input accepts#RRGGBBorRRGGBB. - If right trigger zooms the third-person camera, confirm the installed package is 0.4.4 or newer. In 0.4.4, right trigger is paint-only and D-pad up/down controls controller zoom.
- If UV fallback shows a second colored cursor, confirm the installed package is 0.4.4 or newer. The old filled brush indicator is disabled because it looked like another cursor.
- If editing one player changes every other player wearing the same skin, confirm the installed package is 0.4.4 or newer. Active edits now sync with owner client IDs and do not mutate suit rack/global suit materials.
- If you cannot see the local suit in third person, check
diagnostics.logforWorldThirdPerson setup,WorldAvatarProxy updated, andWorldEditorCamera updated. - If painting misses the suit, check
PaintAttemptentries forworld paint input, UV coordinates, and whether the cursor is over the editor panel. - If Eyedropper does not sample a color, check
EyedropperMissentries for whether the cursor was over the visible suit or UV preview. A successful sample logsEyedropperSampledwith UV, pixel, sampled hex color, and return tool. - If Text does not preview or stamp, check that the text field is not empty, then search
diagnostics.logforTextStampRendered,TextPreviewUpdated,TextPreviewHidden,TextStampCommitted, orTextStampSkipped. - If Text stamps with a black rectangle, confirm the installed package is 0.5.10 or newer.
TextStampRenderedshould reportalphaMode=luminance, glyph bounds, and a trimmed final texture size. - If third-person Text drops side letters, confirm the installed package is 0.5.11 or newer and check
TextSurfacePreviewUpdated,TextSurfaceStampCommitted, orTextSurfaceStampSkippedfor written and skipped glyph-pixel counts. - If third-person Text appears backwards, confirm the installed package is 0.5.12 or newer and check
TextProjectionFrameBuiltfor camera-right alignment and sample order diagnostics. - If decals rotate unexpectedly or get clipped on third-person suit seams, confirm the installed package is 0.5.14 or newer and check
DecalSurfacePreviewUpdated,DecalSurfaceStampCommitted, orDecalSurfaceStampSkippeddiagnostics for projected written/skipped pixels. - If third-person decals show small suit-background cracks through the decal, confirm the installed package is 0.5.15 or newer and check the same decal surface diagnostics for sample, hit, rasterized-cell, seam-skip, off-suit, and written-pixel counts. High seam-skip counts mean DrawableSuits is intentionally avoiding UV island bleeding.
- If Paint or Erase strokes cut off on third-person suit seams, confirm the installed package is 0.5.22 or newer and check
BrushSurfaceStrokeApplied,BrushSurfaceStrokeSkipped, andBrushSurfaceProjectionWarningdiagnostics for sample, hit, rasterized-cell, seam-skip, off-suit, and written-pixel counts. High seam-skip counts mean DrawableSuits is intentionally avoiding UV island bleeding. - If Fill affects too much or too little of the suit, adjust Fill Tolerance and check
FillBucketApplieddiagnostics for seed color, tolerance, checked pixel count, matched pixels, written pixels, and mirror target. Fill is texture-contiguous, so separated UV islands may require separate fills. - If the cursor is missing, confirm the installed package is 0.5.21 or newer and check
CanvasCursorBuilt,CanvasCursorUpdated, orCanvasCursorHiddendiagnostics. The editor now draws the cursor directly inside the same UGUI canvas as the visible editor controls. - If the cursor is still a filled square or colored world blob, confirm the installed package is 0.5.21 or newer and check
CanvasCursorUpdateddiagnostics. Paint and Erase should usemode=BrushRing; Decal, Text, Eyedropper, UI hover, and invalid targets should usemode=Dot. - If the Paint or Erase ring size looks wrong, check
CanvasCursorUpdatedfortarget=WorldThirdPersonortarget=TextureFallback, the computed diameter, hit triangle, UV, canvas-local position, and any fallback reason. - If the controller cursor does not line up with the visible cursor, check
CanvasCursorUpdatedand the virtual cursor diagnostics. The visible cursor follows DrawableSuits' virtual cursor directly instead of warping the OS mouse cursor. - If importing a design code resets the third-person camera, confirm the installed package is 0.5.14 or newer and check
DesignCodeImportedplusWorld camera state preserveddiagnostics. - If a design code does not import, confirm it starts with
DSUIT2:orDSUIT1:and checkDesignCodeImportFaileddiagnostics for prefix, Base64Url, decompression, binary/JSON payload, PNG, or texture-size validation errors. DrawableSuits never logs the full code. - If decals or saved designs do not appear, check
RefreshFileLists completeandListRowsUpdatedentries. - If scan, inventory scroll, or item use still happen while the editor is open, check for
Global gameplay actions lockedandBlocked PlayerControllerBentries. - If keyboard or controller shortcuts do not open the editor, use the pause-menu
DrawableSuitsbutton. - If the mouse cannot move after opening from pause, check cursor unlock and
pointerSource=Mousediagnostics. - Pressing
Refresh Decalsis safe in-game and shows only a short status line. To import decals, place image files inBepInEx/config/DrawableSuits/Decals, then pressRefresh Decals. - If you quit to the main menu while the editor is open, DrawableSuits closes the editor during the scene change so main-menu navigation is restored.
- Lethal Company v81 uses Unity's Input System path; repeated
UnityEngine.Inputexceptions should not appear from DrawableSuits.
- Third-person Paint, Erase, Decal, and Text project onto the visible suit surface before resolving to texture UVs. Unusual modded suit UV layouts may still make edits appear somewhere unexpected, and seam guards may skip ambiguous pixels instead of bleeding across unrelated islands.
- Mirror mode uses a mesh surface map, so unusual or asymmetric meshes may skip the mirrored edit when no reliable opposite surface can be found.
- Text stamps use Unity's built-in Arial font only in this version and are baked as tinted transparent alpha masks. Third-person Text projection can still skip letters that physically land off the visible suit surface.
- Cross-suit loading depends on UV compatibility.
- Share codes can still be long because they embed PNG image data.
DSUIT2:removes the older inner Base64 PNG-in-JSON overhead, but it is still lossless and does not downscale or reduce quality. - Very large decal images are resized to the configured maximum texture size.
- Multiplayer sync is designed for applied designs, not every brush stroke.
- The old UV fallback view remains available for debugging and edge cases.