3.7 KiB
Barotrauma C# modding guide
Introduction
C# modding is part of the Lua For Barotrauma mod and requires the package Cs For Barotrauma to be turned on (steam workshop), in some cases the package is not needed and a prompt in game will be shown to enable it automatically.
This modding requires strict source structure, but comes with the benefits of being handled natively by game engine, witch removes many hurdles with type casting or similar issues.
Starting a new mod
The main star of the show is Barotrauma::ACsMod class. It is what most of your mods will use to hook game methods, and execute custom code. If you are planning on creating new components it's possible to just inherit from ItemComponent.
Important features
- Mods have full access to Harmony to allow you to perform any patches you wish.
- All utility classes can be accessed either by their type (i.e that have name that starts with
LuaCs...) or throughGameMain.LuaCsproperty (refer to class documentation). - All C# code files must be located in
<mod_root>/CSharp/*otherwise they won't be compiled - To configure server / client execution behaviour create
RunConfig.xmlinCSharpdirectory, like is shown below (run types areStandard,ForcedandNone) - Additionally you can specify what code runs where by either filepath or pre-processor statements
- In case of filepath, your files must be located in either
CSharp/Shared/*,CSharp/Server/*orCSharp/Client/*, for shared code, server-side code or client-side code respectively (in any other case, the code is assumed to be shared) - I case of pre-processor, you can use
SERVERorCLIENTdefinitions to separate code into server-side code and client-side code respectively
Code example
A generic C# mod boilerplate:
File-tree:
<mod_root>/
├─ CSharp/
│ ├─ RunConfig.xml
│ ├─ Shared/ExampleMod.cs
│ ├─ Server/ExampleMod.cs
│ └─ Client/ExampleMod.cs
└─ dummyitem.xml
<mod_root>/CSharp/RunConfig.xml
<?xml version="1.0" encoding="utf-8"?>
<RunConfig>
<Server>Standard</Server>
<Client>Forced</Client>
</RunConfig>
<mod_root>/CSharp/Shared/ExampleMod.cs
using System;
using Barotrauma;
namespace ExampleNamespace {
partial class ExampleMod: ACsMod {
public ExampleMod() {
// shared code
...
#if SERVER
InitServer();
#elif CLIENT
InitClient();
#endif
}
public override void Stop() {
// stopping code, e.g. save custom data
#if SERVER
// server-side code
...
#elif CLIENT
// client-side code
...
#endif
}
}
}
<mod_root>/CSharp/Server/ExampleMod.cs
using System;
using Barotrauma;
namespace ExampleNamespace {
partial class ExampleMod {
public void InitServer() {
// server-side initialization
...
}
}
}
<mod_root>/CSharp/Client/ExampleMod.cs
using System;
using Barotrauma;
namespace ExampleNamespace {
partial class ExampleMod {
public void InitClient() {
// client-side initialization
...
}
}
}
<mod_root>/dummyitem.xml
<Items></Items>