前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >星露谷物语 Mod 制作 0x01

星露谷物语 Mod 制作 0x01

原创
作者头像
青橙.
发布2023-04-05 20:03:59
7920
发布2023-04-05 20:03:59
举报
文章被收录于专栏:橙、

0x01 环境准备

1.1 硬件环境:

  • Windows 11 专业版 64bit 操作系统
  • 可以胜任的 CPU 和 还算够用的内存
  • 有可用的网络连接

1.2 软件环境:

因为不喜欢 VS 并且有 JetBrains 大礼包的授权,所以直接使用 Rider 进行开发。

1. 安装 JetBrains Rider

官网下载安装包,根据提示进行安装即可。

Rider 主界面
Rider 主界面

2. 安装 .NET 环境

需要准备 .NET 开发环境,推荐使用的版本是 .NET Framework 4.6.2,与其相匹配的 SDK 版本为 .NET 6.0,。

获取 .NET SDK 6.0 及 .NET Framework 4.6.2

获取地址

.NET SDK 6.0
.NET SDK 6.0
.NET Framework 4.6.2
.NET Framework 4.6.2

下载完成后按引导进行安装。

构建 Mod

创建项目

使用 Rider 创建解决方案,类型选择 .NET FrameWork,若没有找到或者无法继续,可能是 .NET 环境未就绪或环境变量配置错误导致,自行查阅文档工具进行排查。

为项目设置一个好记的名字和方便寻找的位置,即可点击创建。

创建项目
创建项目

通过 NuGet 获取 StardewModdingAPI

在解决方案上右键,选择 Manage NuGet Packages 或通过菜单、快捷键等方式打开管理器,搜索 Pathoschild.Stardew.ModBuildConfig, 进行安装。

NuGet Manage
NuGet Manage

搜索结果:

Pathoschild.Stardew.ModBuildConfig
Pathoschild.Stardew.ModBuildConfig

如果报错The type or namespace name "StardewModdingAPI" could not be found,可能是您的游戏未安装或游戏路径未能被识别。

编写 Mod 脚本

Mod 脚本自行进行编写,具体实现参考 Wiki。

此处以增加每日问候和钓鱼成功后的提示为例进行说明。

代码语言:c#
复制
using System;
using System.Collections.Generic;
using System.Runtime.Remoting.Metadata.W3cXsd2001;
using Microsoft.Xna.Framework;
using StardewModdingAPI;
using StardewModdingAPI.Events;
using StardewValley;


internal sealed class FishMod : Mod
{
    private bool _gameRuning = false;
    private bool _hasPlayerInfo = false;
    private Dictionary<string, int> _playerInfo = new Dictionary<string, int>();
    private IModHelper _helper;
    public override void Entry(IModHelper helper)
    {
        _helper = helper;
        helper.Events.GameLoop.UpdateTicked += OnUpdateTicked;
        helper.Events.GameLoop.DayStarted += OnDayStarted;
        helper.Events.GameLoop.ReturnedToTitle += OnReturnedToTitle;
    }
    
    private void OnDayStarted(object sender, DayStartedEventArgs e)
    {
        _gameRuning = true;
        string message = "";
        if (_hasPlayerInfo) {
            if (_playerInfo["farmingExp"] == Game1.player.experiencePoints[0] &&
                _playerInfo["fishingExp"] == Game1.player.experiencePoints[1] &&
                _playerInfo["foragingExp"] == Game1.player.experiencePoints[2] &&
                _playerInfo["miningExp"] == Game1.player.experiencePoints[3] &&
                _playerInfo["combatExp"] == Game1.player.experiencePoints[4]) {
                message += "今天似乎也和昨天一样呢。";
            } else {
                message += "昨天获得了:";
                if (_playerInfo["farmingExp"] != Game1.player.experiencePoints[0])
                {
                    message += (Game1.player.experiencePoints[0] - _playerInfo["farmingExp"]) +  "种植经验,";
                }

                if (_playerInfo["fishingExp"] != Game1.player.experiencePoints[1])
                {
                    message += (Game1.player.experiencePoints[1] - _playerInfo["fishingExp"]) + "钓鱼经验,";
                }

                if (_playerInfo["foragingExp"] != Game1.player.experiencePoints[2])
                {
                    message += (Game1.player.experiencePoints[2] - _playerInfo["foragingExp"]) + "觅食经验,";
                }

                if (_playerInfo["miningExp"] != Game1.player.experiencePoints[3])
                {
                    message += (Game1.player.experiencePoints[3] - _playerInfo["miningExp"]) + "挖掘经验,";
                }

                if (_playerInfo["combatExp"] != Game1.player.experiencePoints[4])
                {
                    message += (Game1.player.experiencePoints[4] - _playerInfo["combatExp"]) + "战斗经验,";
                }
            }
        }else
        {
            message += "你回来了。";
            _hasPlayerInfo = true;
        }
        _playerInfo["farmingExp"] = Game1.player.experiencePoints[0];
        _playerInfo["fishingExp"] = Game1.player.experiencePoints[1];
        _playerInfo["foragingExp"] = Game1.player.experiencePoints[2];
        _playerInfo["miningExp"] = Game1.player.experiencePoints[3];
        _playerInfo["combatExp"] = Game1.player.experiencePoints[4];
        
        double luck = Game1.player.DailyLuck * 1000f;
        
        message += "今日好运指数:" + luck + "。";
        message += "这平凡的每一天都是连续发生中的奇迹。";
        Game1.showGlobalMessage(message);
        Game1.chatBox.addMessage(message,Color.Green);
    }

    private void OnReturnedToTitle(object sender, ReturnedToTitleEventArgs e)
    {
        _gameRuning = false;
        _hasPlayerInfo = false;
    }

    private uint lastfish = 0;
    private int lastfishexp = 0;
    private void OnUpdateTicked(object sender, EventArgs e)
    {
        if (lastfish!=Game1.stats.fishCaught)
        {
            Game1.addHUDMessage(new HUDMessage($"这是你钓到的第 {Game1.stats.fishCaught} 个东西,获得了钓鱼经验 {Game1.player.experiencePoints[1]-lastfishexp} ",6));
            lastfish = Game1.stats.fishCaught;
            lastfishexp = Game1.player.experiencePoints[1];
        }
    }
}

构筑dll

直接点击 Build 进行构筑,忽略警告直接继续。

测试运行

从项目目录下可获得 Mod 相关文件,将其放入游戏目录下即可运行,通过 Rider 直接点击运行也可进行调试。

每日问候
每日问候
钓鱼经验
钓鱼经验

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01 环境准备
    • 1.1 硬件环境:
      • 1.2 软件环境:
        • 1. 安装 JetBrains Rider
        • 2. 安装 .NET 环境
      • 构建 Mod
        • 创建项目
        • 通过 NuGet 获取 StardewModdingAPI
        • 编写 Mod 脚本
        • 构筑dll
        • 测试运行
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档