星露谷模组开发教程#7 自定义机器

添加大型工艺品

机器也算是大型工艺品,所以我们需要先添加它的大型工艺品。

这里做一张16x32格式为png的图。

Orearium

if (e.Name.IsEquivalentTo("Data/BigCraftables"))
{
    e.Edit(assets =>
    {
        var dict = assets.AsDictionary<string, BigCraftableData>();
        dict.Data["Awesome_Orearium"] = new BigCraftableData
        {
            Name = "Awesome_Orearium",
            DisplayName = "Orearium",
            Description = "Insert a ore of your choice and it will grow copies.",
            Texture = "Awesome_Orearium"
        };
    });
}

if (e.Name.IsEquivalentTo("Awesome_Orearium"))
{
    e.LoadFromModFile<Texture2D>("assets/Orearium.png", AssetLoadPriority.Medium);
}

添加机器

Data/Machines.json中我们可以看到所有机器的信息,我们就仿照着宝石复制机做一个矿石复制机。

if (e.Name.IsEquivalentTo("Data/Machines"))
{
    e.Edit(assets =>
    {
        var dict = assets.AsDictionary<string, MachineData>();
        dict.Data["(BC)Awesome_Orearium"] = new MachineData
        {
            OutputRules = new List<MachineOutputRule> {
                new() {
                    Id = "Default",
                    Triggers =
                    new List<MachineOutputTriggerRule>() {
                        new() {
                            Id = "OutputCollected",
                            Trigger = MachineOutputTrigger.OutputCollected,
                            RequiredCount = 1
                        },
                        new() {
                            Id = "CopperOre",
                            Trigger = MachineOutputTrigger.ItemPlacedInMachine,
                            RequiredItemId = "(O)378"
                        },
                        new() {
                            Id = "IronOre",
                            Trigger = MachineOutputTrigger.ItemPlacedInMachine,
                            RequiredItemId = "(O)380"
                        },
                        new() {
                            Id = "GoldOre",
                            Trigger = MachineOutputTrigger.ItemPlacedInMachine,
                            RequiredItemId = "(O)384"
                        },
                        new() {
                            Id = "IridiumOre",
                            Trigger = MachineOutputTrigger.ItemPlacedInMachine,
                            RequiredItemId = "(O)386"
                        }
                    },
                    OutputItem = new List<MachineItemOutput>() {
                        new() {
                            Id = "Default",
                            ItemId = "DROP_IN"
                        }
                    },
                    MinutesUntilReady = 10,
                }
            },
            ReadyTimeModifiers = new List<StardewValley.GameData.QuantityModifier>() {
                new() {
                    Id = "CopperOre",
                    Condition = "ITEM_ID Target (O)378",
                    Modification = StardewValley.GameData.QuantityModifier.ModificationType.Multiply,
                    Amount = 1
                },
                new() {
                    Id = "CopperOre",
                    Condition = "ITEM_ID Target (O)380",
                    Modification = StardewValley.GameData.QuantityModifier.ModificationType.Multiply,
                    Amount = 2
                },
                new() {
                    Id = "CopperOre",
                    Condition = "ITEM_ID Target (O)384",
                    Modification = StardewValley.GameData.QuantityModifier.ModificationType.Multiply,
                    Amount = 3
                },
                new() {
                    Id = "CopperOre",
                    Condition = "ITEM_ID Target (O)386",
                    Modification = StardewValley.GameData.QuantityModifier.ModificationType.Multiply,
                    Amount = 4
                }
            }
        };
    });
}

首先我们需要添加一个输出规则,它有一些触发器,首先是OutputCollected,它会将输出物品继续放入机器,接着是ItemPlacedInMachine它可以指定只能让机器使用某些物品,比如放入矿石,它有一个RequiredItemId属性,这表示只能放入指定的物品,这里多加了几个矿石,铜矿石、铁矿石、金矿石和铱矿石。之后是它的输出物品,它的物品ID是DROP_IN,这表示它会复制放入的物品。最后是它的准备时间,这里是10分钟。之后我们可以使用ReadyTimeModifiers属性来修改准备时间,它有一个Condition属性,比如这里使用了ITEM_ID Target (O)378,这表示如果放入的物品是铜矿石,Modification也就是修改的类型,这里是MultiplyAmount也就是修改的倍数,这里是1,所以铜矿石的准备时间是10分钟,以此类推,铁矿石是20分钟,金矿石是30分钟,铱矿石是40分钟。

添加配方

if (e.Name.IsEquivalentTo("Data/CraftingRecipes"))
{
    e.Edit(assets =>
    {
        var dict = assets.AsDictionary<string, string>();
        dict.Data["Awesome_Orearium"] = "390 99 335 5 336 2 787 1/Home/Awesome_Orearium/true/default/";
    });
}

这里使用99个石头、5个铁锭、2个金锭和1个电池制造一个矿石复制机。

20240810234307

20240810235606

20240810235458