willis81808-UnboundLib icon

UnboundLib

This is a helpful utility for ROUNDS modders aimed at simplifying common tasks.

Last updated 2 weeks ago
Total downloads 54786
Total rating 5 
Categories Utilities
Dependency string willis81808-UnboundLib-2.7.3
Dependants 47 other mods depend on this mod

This mod requires the following mods to function

BepInEx-BepInExPack_ROUNDS-5.4.1100 icon
BepInEx-BepInExPack_ROUNDS

BepInEx pack for ROUNDS. Preconfigured and ready to use.

Preferred version: 5.4.1100
willis81808-MMHook-1.0.0 icon
willis81808-MMHook

MonoMod Runtime Hooks generated for ROUNDS

Preferred version: 1.0.0

README

Join Us!

For more mods, news, and support join us on discord here: https://discord.gg/mGfsTvc53v

UnboundLib

This is a helpful utility for ROUNDS modders aimed at simplifying certain common tasks.

Usage

NetworkingManager

The NetworkingManager abstracts the default Photon networking capabilities away into an easy-to-use interface you can use for communication between clients. Example usage:

private const string MessageEvent = "YourMod_MessageEvent";

NetworkingManager.RegisterEvent(MessageEvent, (data) =>
{
	ModLoader.BuildInfoPopup("Test Event Message: " + (string)data[0]);    // should print "Test Event Message: Hello World!"
});

// send event to other clients only
NetworkingManager.RaiseEventOthers(MessageEvent, "Hello World!");

// send event to other clients AND yourself
NetworkingManager.RaiseEvent(MessageEvent, "Hello World!");

CustomCard Framework

Create a class for your card, extend the CustomCard class, implement its methods, and then in your mod initialization register your card like so:

void Start()
{
    CustomCard.BuildCard<TestCard>();
}

CustomMap Framework

First create a map in unity by using the package and export your scene to a AssetBundle. Then in your mod initialization register your map like so:

void Start()
{
    LevelManager.RegisterLevels(TestAssetBundle);
}

Credits Framework

Registering credits for a mod is as simple as:

void Start()
{
    Unbound.RegisterCredits(string modName, string[] credits, string linkText, string linkURL);
}

GameMode Framework

The GameMode framework provides a modding-friendly API for custom game modes, allowing mods to target them without having to know about their existence.

Custom game modes are defined in two layers: the actual game mode class that does all the heavy gameplay logic, and a handler class that provides an interface between mods and the game mode.

Hooks

The framework offers a flexible hook system. With hooks, mods can trigger actions at specific points of time as a game is running, without needing to know anything about the specific game mode or its implementation.

Triggering hooks

Game modes can trigger async hooks whenever they wish:

private IEnumerator RoundStart()
{
	// Hook keys are case-insensitive
	yield return GameModeManager.TriggerHook("RoundStart");

	// A healthy set of predefined keys is provided to make hooking on to them easier.
	// Predefined keys should be used in favour of custom ones when possible.
	yield return GameModeManager.TriggerHook(GameModeHooks.HookRoundStart);
}

Registering hooks

Mods can register hook listeners wherever they wish:

private void Init()
{
	// Hooks are called with the game mode that triggered the hook, which is always the currently active game mode
	GameModeManager.AddHook(GameModeHooks.HookRoundStart, this.OnRoundStart);
}

private IEnumerator OnRoundStart(IGameModeHandler gm)
{
	// Triggers are IEnumerators so they support yields
	yield return new WaitForSeconds(2f);

	UnityEngine.Debug.Log(gm.Name);

	/* Since triggers are IEnumerators, they must be executed within a coroutine. This means triggers are guaranteed to
	 * be able to disrupt the execution of the current game mode.
	 */
	gm.GameMode.StopAllCoroutines();
}

The existing game modes in ROUNDS, namely Arms Race and Sandbox, have also been patched to trigger hooks.

Settings

The framework also adds a setting system to help mods change common game mode settings easily. Settings provide an easy-to-use method for mods to change gameplay, but they place a lot of responsibility onto game modes to provide sufficient settings.

Using settings in a game mode

private void CheckPoints()
{
	if (p1Points >= (int)GameModeManager.CurrentHandler.Settings["pointsToWinRound"])
	{
		WinRound();
	}
}

Changing settings (in a mod)

private void Init()
{
	GameModeManager.AddHook(GameModeHooks.HookInitEnd, this.OnInitEnd);
}

private IEnumerator OnInitEnd(GameModeHandler gm)
{
	gm.ChangeSetting("pointsToWinRound", 10);
}

See /UnboundLib/GameModes for implementation details and example GameModeHandlers.

Development

Building the project is likely to work without having to change anything. However, if your ROUNDS installation resides in somewhere other than C:\Program Files (x86)\Steam\steamapps\common\ROUNDS, you will need to change the path we have pre-configured for you:

  1. Copy UnboundLib/UnboundLib.csproj.user.dist to UnboundLib/UnboundLib.csproj.user
  2. Change the ROUNDS installation folder path inside UnboundLib/UnboundLib.csproj.user

You can now open the project solution with Visual Studio, and you're set.

Available versions

Please note that the install buttons only work if you have compatible client software installed, such as the Thunderstore Mod Manager. Otherwise use the zip download links instead.

Upload date Version number Downloads Download link  
2021-9-29 2.7.3 7135 Version 2.7.3 Install
2021-9-26 2.7.2 2056 Version 2.7.2 Install
2021-9-7 2.7.1 7878 Version 2.7.1 Install
2021-9-3 2.7.0 2404 Version 2.7.0 Install
2021-8-31 2.6.2 1800 Version 2.6.2 Install
2021-8-28 2.6.1 1372 Version 2.6.1 Install
2021-8-23 2.6.0 2371 Version 2.6.0 Install
2021-8-11 2.5.1 5188 Version 2.5.1 Install
2021-8-11 2.5.0 449 Version 2.5.0 Install
2021-7-27 2.4.0 6511 Version 2.4.0 Install
2021-7-21 2.3.0 3561 Version 2.3.0 Install
2021-7-13 2.2.1 4377 Version 2.2.1 Install
2021-7-7 2.2.0 2765 Version 2.2.0 Install
2021-7-3 2.1.5 1870 Version 2.1.5 Install
2021-6-27 2.1.4 2015 Version 2.1.4 Install
2021-6-23 2.1.3 1188 Version 2.1.3 Install
2021-6-18 2.1.2 1020 Version 2.1.2 Install
2021-6-18 2.1.0 287 Version 2.1.0 Install
2021-6-14 1.1.2 429 Version 1.1.2 Install
2021-6-12 1.0.9 42 Version 1.0.9 Install
2021-6-11 1.0.7 35 Version 1.0.7 Install
2021-6-11 1.0.6 33 Version 1.0.6 Install