星露谷模组开发教程#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个电池制造一个矿石复制机。

相关推荐
William_cl2 小时前
C# ASP.NET MVC 数据验证实战:View 层双保险(Html.ValidationMessageFor + jQuery Validate)
后端·c#·asp.net·mvc
狮子不白3 小时前
C#WEB 防重复提交控制
开发语言·前端·程序人生·c#
Charles_go4 小时前
C#8、有哪些访问修饰符
java·前端·c#
yue0086 小时前
C# 求取整数的阶乘
java·开发语言·c#
黑咩狗夜.cm8 小时前
Aspose.word实现表格每页固定表头、最后一行填满整个页面
开发语言·c#·word
code bean8 小时前
【C#笔记】Newtonsoft.Json 中 `[JsonIgnore]` 的作用详解
笔记·c#·json
ccut 第一混8 小时前
用c# 制作一个扑克牌小游戏
开发语言·c#
IT老大哥9 小时前
局域网扫码枪/局域网二维码接收工具
c#·net
自由的好好干活10 小时前
C#桌面框架与Qt对比及选型(国产操作系统开发视角)
开发语言·qt·c#
The Sheep 202310 小时前
MicroService(Redis)
数据库·redis·c#