Skip to content

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:

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.

Download the latest SDK

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:

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.

cs
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:

cs
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:

  • Description to explain what the effect does
  • Category to group effects in the menu
  • Quantity for stackable effects
  • Duration for timed effects
  • Note when 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

  1. Use Load Pack Source to load your .cs file.
  2. Select the matching Game Connector.
  3. 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