COI Docs

Create your first machine

How to create and register new machines

Define your machine data

Create a new class that implements IModData and register your machine data in the RegisterData method. The injected ProtoRegistrator is used to register new machine and recipe data.

ExampleMachineData.cs
using Mafi;
using Mafi.Base;
using Mafi.Core.Entities.Animations;
using Mafi.Core.Entities.Static.Layout;
using Mafi.Core.Mods;

namespace ExampleMod;

internal class ExampleMachineData : IModData {

	public void RegisterData(ProtoRegistrator registrator) {
		registrator.MachineProtoBuilder
			.Start("Example furnace", ExampleModIds.Machines.ExampleFurnace)
			.Description("Testing furnace")
			.SetCost(Costs.Build.CP(80).Workers(10))
			// For examples of layouts see `Mafi.Base.BaseMod` and `EntityLayoutParser`.
			.SetLayout(new EntityLayoutParams(),
				"   [2][2][2][3][3][3][3][3][2]>~Y",
				"   [2][2][3][5][5][7][7][4][3]   ",
				"A~>[2][2][3][5][5][7][7][4][3]>'V",
				"B~>[2][2][3][5][5][7][7][4][3]>'W",
				"   [2][2][2][3][3][7][7][4][3]   ",
				"   [2][2][2][2][2][2][2][2][3]>@E")
			.SetCategories(Ids.ToolbarCategories.Smelting)
			.SetPrefabPath("Assets/ExampleMod/BlastFurnace.prefab")
			.SetAnimationParams(
				animParams: AnimationParams.RepeatTimes(Duration.FromKeyframes(360),
				times: 2,
				changeSpeedToFit: true))
			.BuildAndAdd();

		// Example of a new furnace recipe.
		registrator.RecipeProtoBuilder
			.Start(name: "Example smelting",
				recipeId: ExampleModIds.Recipes.ExampleSmelting,
				machineId: ExampleModIds.Machines.ExampleFurnace)
			.AddInput(8, ExampleModIds.Products.ExampleLooseProduct)
			.AddInput(2, Ids.Products.Coal)
			.SetDuration(20.Seconds())
			.AddOutput(8, ExampleModIds.Products.ExampleMoltenProduct)
			.AddOutput(24, Ids.Products.Exhaust, outputAtStart: true)
			.BuildAndAdd();

	}
}

Define a unique machine ID

Create a new partial class that will contain all your machine IDs.

ExampleModIds.cs
using Mafi.Base;
using MachineID = Mafi.Core.Factory.Machines.MachineProto.ID;

namespace ExampleMod;

public partial class ExampleModIds
{
  public partial class Machines
  {
      public static readonly MachineID ExampleFurnace = Ids.Machines.CreateId("ExampleFurnace");
    }
  }
}

Register your machine

In your main mod class, implementing DataOnlyMod, register your machine in the RegisterPrototypes method.

public override void RegisterPrototypes(ProtoRegistrator registrator)
{
		registrator.RegisterData<ExampleMachineData>();
}
Edit on GitHub

On this page