Outward Adjustable Chat
Resize and reposition your chat panel — it finally obeys you!
Overview
Outward Adjustable Chat gives you complete control over your in-game
chat panel. Stuck in the corner with no way to move it? Forced to use
a tiny chat window that ruins your immersion? Those days are over —
now you can drag your chat anywhere on screen, resize it to fit your
needs, and your settings travel with your character across saves.
Features
- Drag to Reposition — Click and drag anywhere on non-interactive areas of the chat panel to move it wherever you want
- Resize with Style — Pull the golden handle in the bottom-right corner to resize the panel freely
- Persistent Settings — Your position and size are saved automatically with each character save
- Smart Sprite Handling — Uses Sliced image type so the panel background stays crisp and unstretched when resized
Technical Details
XML Data Storage
Chat panel settings are stored per-character in XML format. Each character maintains their own panel configuration that follows them across save/load cycles.
File Location: BepInEx/config/gymmed.Mods_Communicator/Adjust_Chat/{characterUID}/ChatPanelState.xml
Data Structure:
DisplaySize — The size of the "Display" child element (x, y)
PositionOffset — The screen position of the "Chat - Panel" parent element (x, y)
BackgroundSize — The size of the background element (x, y)
Load Flow:
- Harmony patch intercepts
CharacterSaveInstanceHolder.ApplyLoadedSaveToChar()
- XML file is loaded and stored as pending state
- When
ChatPanel.StartInit() completes, the component's Start() method applies the saved values
- Position is applied to the parent "Chat - Panel" RectTransform, size to the child "Display" RectTransform
Save Flow:
- Harmony patch intercepts
SaveInstance.Save()
- Current position is read from the "Chat - Panel" parent RectTransform
- Current size is read from the "Display" child RectTransform
- Data is serialized to XML using
System.Xml.Serialization
Sprite Styling
The mod enhances the chat panel's visual quality using Unity's built-in image handling:
- Trigger: SideLoader's
SL.OnSceneLoaded event calls ChatPanelStyler.ApplyToAllCharacters() for each active character
- Problem: The original sprite (
tex_men_backgroundChat) stretches when the panel is resized, causing blurry/pixelated edges
- Solution: Uses
UnityEngine.Sprite.Create() with custom border parameters (14px for sides, 58px for bottom) to create a styled sprite
- Result: Sets
UnityEngine.UI.Image.type = Image.Type.Sliced so the corners remain sharp and borders intact during resize
- Optimization: The styled sprite is created once and cached for reuse across all characters
Drag & Resize Implementation
- Dragging: Uses Unity's native
EventTrigger system (PointerDown, Drag, PointerUp events) rather than polling in Update()
- Resizing: Creates a 10x10 golden-colored handle at the bottom-right corner of the "Display" element
- Position Tracking: Position is saved from the "Chat - Panel" parent (not the child "Display") to ensure absolute screen positioning
How to set up
To manually set up, do the following
- Create the directory:
Outward\BepInEx\plugins\OutwardAdjustableChat\.
- Extract the archive into any directory(recommend empty).
- Move the contents of the plugins\ directory from the archive into the
BepInEx\plugins\OutwardAdjustableChat\ directory you created.
- It should look like
Outward\BepInEx\plugins\OutwardAdjustableChat\OutwardAdjustableChat.dll
Launch the game.
If you liked the mod leave a star on GitHub it's free