MP_ChatSystem is a powerful, efficient, and modular multiplayer chat system built for Unreal Engine. Supports Global, Team, Party, and Private (DM) channels with a room-based design and highly optimized message replication — ideal for both Listen Server and Dedicated Server projects, it's Scalable, extendable, and open-source.
- 💬 Structured support for Global, Team, Party, and Private (DM) chat
- 🧩 Room-based system: clean isolation of conversations and channels
- 📡 Network-efficient via FastArray Replication — not RPC per message
- 🔀 Supports temporary and persistent rooms per use case
- 🧠 Client-specific relevancy filtering — only receive what you need
- 🎛️ Full runtime control: create, join, route messages through code or UI
- 🖼️ Built-in scrollable chat box system for easy UI integration
- ⚙️ Easy to extend, debug, and customize for games, simulation, and more
| Class | Role |
|---|---|
AMP_ChatManager |
Central server-side manager that handles room creation, joining, and message routing. |
AMP_ChatRoom |
Replicated actor that holds message state per room. Sent only to relevant clients. |
UMP_ChatBox |
ScrollBox class for displaying dynamic chat messages using slot injection. |
IMP_Chat_PlayerController_I |
Interface to fetch player identity like SenderID/Name from any PlayerController. |
| Struct | Purpose |
|---|---|
FMP_ChatMessage |
Stores chat message data: sender, body, timestamp, channel, etc. |
FMP_ChatMsgItem |
Wraps a message in FastArray for replication tracking. |
FMP_ChatMsgArray |
The actual FFastArraySerializer, replicates all message deltas. |
FMP_ChatRoomKey |
Unique identifier for a room (used internally). |
FMP_ChatRoomDesc |
Room metadata (optional name, visibility, etc.). |
| Enum | Description |
|---|---|
EChatChannel |
Channel types: Global, Team, Party, Private, System, Admin |
- Each chat room is one replicated actor (
AMP_ChatRoom), spawned on the server. - Clients receive that actor only if they've joined the room.
- This filtering is handled using
IsNetRelevantFor()to decide which clients should see the actor. - Global rooms can be marked as
bAlwaysRelevant = trueto make them visible to all.
This design ensures minimal bandwidth, no duplicated actors, and room-specific visibility — scalable and efficient.
git clone https://github.com/Yuvi-GD/MP_ChatSystem.git- Copy the
MP_ChatSystemfolder into your project'sPlugins/directory. - Open your project → Edit ➡ Plugins ➡ Enable "MP_ChatSystem"
- Restart Unreal Editor when prompted.
-
Place
AMP_ChatManagerin your level (or spawn it via GameMode). -
In your PlayerController Blueprint, implement
IMP_Chat_PlayerController_I- Define
GetSenderID()andGetSenderName().
- Define
-
Add
UMP_ChatBoxto your widget hierarchy. -
On input: call a Server RPC → Manager → Room →
AddChatMessage(...) -
Bind
AMP_ChatRoom::OnMessageReceivedto a Widget function for UI updates.
- Client sends message → RPC →
AMP_ChatManager - Manager finds correct
AMP_ChatRoom - Server calls
Room->AddChatMessage(...) - Message is added to
FMP_ChatMsgArray MarkItemDirty(...)triggers FastArray delta replication- Client receives
OnRep_Messages()and dispatches to UI
- Use
IsNetRelevantFor()to control who receives which room - Use
bAlwaysRelevant = truefor global chat - Use
ForceNetUpdate()andFlushNetDormancy()after join/subscription - Never spawn room actors on clients manually — server handles replication
- Avoid calling expensive logic (e.g., Blueprint interfaces) inside
TickorIsNetRelevantFor()if not needed
We welcome all contributions to help improve and expand MP_ChatSystem! Whether it's bug fixes, feature enhancements, documentation improvements, or performance optimizations, we'd love to have your input.
If you're new to open-source, here's the standard workflow:
-
Fork this repository
Click theForkbutton at the top-right to create your own copy. -
Clone your fork locally
# Clone your fork (Don't Forget to Change 'your-username' with your github username in URL) git clone https://github.com/your-username/MP_ChatSystem.git cd MP_ChatSystem
-
Create a new branch
git checkout -b feature/your-feature-name
-
Make your changes
Add your improvements, fix bugs, or update documentation. -
Commit and push
git add . git commit -m "Describe your changes" git push origin feature/your-feature-name
-
Open a Pull Request (PR)
Go to your fork on GitHub and click Compare & Pull Request. Describe your changes clearly.
- Use feature branches to keep your fork’s
mainbranch clean and synced. - Write clear commit messages and document your changes.
- For major changes, open an Issue or Discussion first.
- Be respectful and collaborative—feedback is part of the process!
Licensed under the GNU General Public License v3.0.
You may use, modify, and distribute this plugin under the license terms. See the LICENSE file for details.
We'd love to hear from you!
- 💡 Found a bug?
- Have an idea for improvement?
- Want to request a new feature?
- Want a new channel type?
- Need better save/persist logic?
- Thinking about database sync or REST API features?
- Would you like to add any additional sections or details to the README file?
Feel free to open an Issue or Discussion to share your thoughts! let's build it together.