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

首发于Enaium的个人博客


添加大型工艺品

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

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

csharp 复制代码
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中我们可以看到所有机器的信息,我们就仿照着宝石复制机做一个矿石复制机。

csharp 复制代码
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分钟。

添加配方

csharp 复制代码
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个电池制造一个矿石复制机。

相关推荐
武藤一雄1 小时前
一款基于WPF开发的BEJSON转换工具
windows·c#·json·wpf
秦苒&2 小时前
【C语言】详解数据类型和变量(二):三种操作符(算数、赋值、单目)及printf
c语言·开发语言·c++·c#
张人玉2 小时前
c#常用的类
服务器·数据库·c#
云中飞鸿3 小时前
为什么有out参数存在?
开发语言·c#
应用市场3 小时前
基于 C# WinForms 的 Windows 系统监控工具开发实战
windows·单片机·c#
c#上位机3 小时前
halcon计算仿射变换矩阵的逆矩阵
计算机视觉·矩阵·c#
Lv11770084 小时前
Visual Studio中的静态成员
笔记·c#·visual studio
云中飞鸿4 小时前
C# params 关键字详解
开发语言·c#
Poetinthedusk5 小时前
设计模式-模板方法模式
windows·设计模式·c#·wpf·模板方法模式