在上篇教程中,我们学习了如何添加游戏事件,其中我们知道了AssetRequested
事件,它也可以替换或者修改游戏内的内容。在这篇教程中,我们将学习如何替换修改游戏内的内容。
在替换游戏内容直接我们需要知道每个文件的路径,我们可以使用StardewXnbHack来解包游戏内容,下载完成之后将StardewXnbHack
文件放到游戏目录下,然后运行StardewXnbHack
,它会自动解包游戏内容到Stardew Valley\Content (unpacked)
文件夹下。
这里就先替换游戏的肖像图片,我们可以在Stardew Valley\Content (unpacked)\Portraits
文件夹下找到肖像图片,比如这里我选择替换Abigail.png
。
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
,如果有多个模组替换同一个文件,优先级高的会生效。
这里依旧是修改Abigail.png
,这里准备一张有Alpah
通道的图片,然后将它遮罩到Abigail.png
上。
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
,这样就可以将我们的图片遮罩到游戏内的图片上了。
这里我们选择修改商店的数据,我们可以在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
。