Game Packs & Modding
The SDK is optional.
If you are the developer of a new game built in a supported engine, you should usually start with an engine plugin instead of the SDK.
Choose the right path
Game Developers
If you are the developer of the game itself:
- Unity games: use the Unity plugin.
- Unreal games: use the Unreal plugin.
- Custom engines, tools, or services with socket support: use the WebSocket service.
- Environments where WebSockets are not practical: use the HTTP service.
Modders
If you are adding Crowd Control to an existing game you do not own or directly maintain:
- Existing Unity PC games: start from the BepInEx example plugin.
- Emulator packs, memory-based integrations, or older C# game packs: use the SDK docs in this section.
Who this section is for
This part of the docs is mainly for:
- modders working on existing games
- developers maintaining older Crowd Control pack workflows
- authors of emulator packs
- integrations that need SimpleTCP or memory injection
If you are shipping a game you actively develop in Unity or Unreal, the plugin docs are usually the better starting point.
What the SDK is for
The SDK is mainly used for pack-based integrations:
- emulator packs
- memory-injection workflows
- SimpleTCP-based C# game packs
- older or highly custom modding setups
A game pack is a C# file loaded by the Crowd Control desktop app. It defines your game metadata, effect list, and connector details. Depending on the connector, the effect logic may live inside the pack itself or inside a separate mod/plugin.
Unity game devs vs Unity modders
If you are working with Unity, the main distinction is:
- Use the Unity plugin if you are the developer of the game and can integrate Crowd Control directly into the project.
- Use the BepInEx example plugin if you are a modder adding Crowd Control to an existing Unity game you do not control.
- Use the legacy MelonLoader docs only if you are maintaining an older existing integration.
Download the SDK
Before starting a new SDK-based project, make sure you have the latest Crowd Control desktop app and the latest SDK build.
We recommend extracting the SDK with 7-Zip, then opening CrowdControl.SDK.exe.
Picking a connector
Choose the connector that matches how your game can communicate:
- Emulators: see Emulators Overview
- Existing PC games with your own mod/plugin layer: see SimpleTCP Connector
- Older PC games without a good modding framework: see Memory Inject
- Existing Unity PC games being modded: prefer the BepInEx example plugin
The old MelonLoader docs are now legacy-only and should not be used for new projects.
Minimal SimpleTCP pack
The SDK ships with examples. For a simple pack-based workflow, SimpleTCP is a good starting point.
using ConnectorLib.SimpleTCP;
using CrowdControl.Common;
using ConnectorType = CrowdControl.Common.ConnectorType;
namespace CrowdControl.Games.Packs.YourGame;
public class YourGame : SimpleTCPPack<SimpleWebsocketServerConnector>
{
public YourGame(
UserRecord player,
Func<CrowdControlBlock, bool> responseHandler,
Action<object> statusUpdateHandler
) : base(player, responseHandler, statusUpdateHandler)
{
}
public override Game Game => new(
"Your Game",
"YourGame",
"PC",
ConnectorType.SimpleWebsocketServerConnector
);
public override ushort Port => 28379;
public override EffectList Effects => new Effect[]
{
new("Damage Player", "damage_player")
{
Price = 100,
Quantity = 10,
Description = "Damages the player.",
Category = "Player",
},
new("Flip Screen", "flip_screen")
{
Price = 100,
Duration = 30,
Description = "Flips the screen for a short time.",
Category = "Visual",
},
};
}Defining effects
Every effect needs:
- a viewer-facing name
- a stable effect ID/code
- pricing and optional metadata such as description, category, quantity, or duration
Examples:
new("Kill Player", "kill_player") { Price = 1000 };
new("Flip Screen", "flip_screen") { Price = 100, Duration = 30, Category = "Visual" };
new("Damage Player", "damage_player") { Price = 100, Quantity = 1..10, Category = "Player" };Use:
Descriptionto explain what the effect doesCategoryto group effects in the menuQuantityfor stackable effectsDurationfor timed effectsNotewhen you need variants such as host/random player versions
Handling effects
Your integration should attempt to execute the effect and report the result quickly.
- Return success when the effect started correctly.
- Return a temporary failure if it could work later.
- Return a permanent failure if the effect is invalid or unsupported.
For most integrations, you should respond within about 5 seconds. Timed effects should also report when they begin, pause, resume, and end if your connector supports it.
Running a pack in the SDK
- Use Load Pack Source to load your
.csfile. - Select the matching Game Connector.
- Click Connect to start the connection.
Need help?
If you run into issues, join the developer community on Discord and ask in #cc-developer.
Submitting a pack
If you want your pack listed and supported publicly, reach out on Discord with:
- the game and platform
- any required mods, versions, or setup steps
- anything special QA should know
Our team will review the integration, test it, and follow up with any issues or release requirements.
More on our release process: crowdcontrol.live/how-we-work
