星露谷模组开发教程#4 替换修改内容

在上篇教程中,我们学习了如何添加游戏事件,其中我们知道了AssetRequested事件,它也可以替换或者修改游戏内的内容。在这篇教程中,我们将学习如何替换修改游戏内的内容。

解包游戏内容

在替换游戏内容直接我们需要知道每个文件的路径,我们可以使用StardewXnbHack来解包游戏内容,下载完成之后将StardewXnbHack文件放到游戏目录下,然后运行StardewXnbHack,它会自动解包游戏内容到Stardew Valley\Content (unpacked)文件夹下。

替换图片内容

这里就先替换游戏的肖像图片,我们可以在Stardew Valley\Content (unpacked)\Portraits文件夹下找到肖像图片,比如这里我选择替换Abigail.png

Abigail

private void OnAssetRequested(object? sender, AssetRequestedEventArgs e)
{
    if (e.Name.IsEquivalentTo("Portraits/Abigail"))
    {
        e.LoadFromModFile<Texture2D>("assets/Abigail.png", AssetLoadPriority.Medium);
    }
}

首先判断资源名称是否为Portraits/Abigail,然后使用LoadFromModFile来加载我们的图片文件,第一个参数就是图片的路径,也就是assets/Abigail.png,这里就是在项目的目录下创建一个assets文件夹,然后放入我们的图片文件,这样就可以替换游戏内的图片了,第二个参数是加载优先级,这里选择Medium,如果有多个模组替换同一个文件,优先级高的会生效。

20240805225516

修改图片内容

这里依旧是修改Abigail.png,这里准备一张有Alpah通道的图片,然后将它遮罩到Abigail.png上。

Black

private void OnAssetRequested(object? sender, AssetRequestedEventArgs e)
{
    if (e.Name.IsEquivalentTo("Portraits/Abigail"))
    {
        e.Edit(asset =>
        {
            var editor = asset.AsImage();
            IRawTextureData sourceImage = Helper.ModContent.Load<IRawTextureData>("assets/Black.png");
            editor.PatchImage(sourceImage, patchMode: PatchMode.Overlay);
        });
    }
}

调用Edit方法,之后将资源转为一个图片,然后加载我们的图片文件,之后调用PatchImage方法,第一个参数是我们的图片文件,第二个参数是修补模式,这里选择Overlay,这样就可以将我们的图片遮罩到游戏内的图片上了。

20240805225201

修改数据内容

这里我们选择修改商店的数据,我们可以在Stardew Valley\Content (unpacked)\Data文件夹下找到Shops.json文件,这个文件包含了所有物品的数据。

private void OnAssetRequested(object? sender, AssetRequestedEventArgs e)
{
    if (e.Name.IsEquivalentTo("Data/Shops"))
    {
        e.Edit(asset =>
        {
            var editor = asset.AsDictionary<string, ShopData>();
            ShopItemData? parsnip = editor.Data["SeedShop"].Items.Find(it => it.Id == "(O)472");
            if (parsnip != null)
            {
                parsnip.Price = 0;
            }
        });
    }
}

首先判断资源名称是否为Data/Shops,然后将资源转为一个字典,它的键就是字符串类型,值就是ShopData类型,之后我们就可以修改数据了,这里我们修改皮埃尔商店的防风草种子的价格为0,商店的键值就是SeedShop,之后找到防风草种子也就是Id(O)472的物品,然后将价格修改为0

20240805224954