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

相关推荐
啦啦啦_99991 小时前
Redis-5-doFormatAsync()方法
数据库·redis·c#
Porco.w2 小时前
C#与三菱PLC FX5U通信
网络·c#
E_ICEBLUE3 小时前
PPT 批量转图片:在 Web 预览中实现翻页效果(C#/VB.NET)
c#·powerpoint·svg
JQLvopkk5 小时前
C# 轻量级工业温湿度监控系统(含数据库与源码)
开发语言·数据库·c#
wxin_VXbishe8 小时前
C#(asp.net)学员竞赛信息管理系统-计算机毕业设计源码28790
java·vue.js·spring boot·spring·django·c#·php
bugcome_com19 小时前
零基础入门C#:一篇搞懂核心知识点
c#
程序员敲代码吗1 天前
如何通过命令行启动COMSOL的参数化、批处理和集群扫描
java·c#·bash
缺点内向1 天前
C#: 告别繁琐!轻松移除Word文档中的文本与图片水印
c#·自动化·word·.net
喵叔哟1 天前
06-ASPNETCore-WebAPI开发
服务器·后端·c#
2501_930707781 天前
使用 C# .NET 从 PowerPoint 演示文稿中提取背景图片
c#·powerpoint·.net