Skip to content
服务器插件与终端接口

数据存储 ​

插件常需要保存配置和玩家数据。最常用、最稳妥的方式是用 Newtonsoft.Json 写成 JSON 文件,放在插件自己的 Plugins/你的插件/ 子目录下(不要写进程序目录,可能无写入权限)。

关于日志

下面示例用 Console.WriteLine 调试。真实服务端更推荐 Log.Information(...) / Log.Warning(...)。

JSON 配置文件 ​

csharp
using System;
using System.IO;
using Newtonsoft.Json;

public class PluginConfig
{
    public string Message { get; set; } = "欢迎来到服务器!";
    public int MaxPlayers { get; set; } = 100;
}

保存配置 ​

csharp
void SaveConfig(PluginConfig config, string path)
{
    string json = JsonConvert.SerializeObject(config, Formatting.Indented);
    File.WriteAllText(path, json);
}

读取配置 ​

csharp
PluginConfig LoadConfig(string path)
{
    if (File.Exists(path))
    {
        string json = File.ReadAllText(path);
        return JsonConvert.DeserializeObject<PluginConfig>(json);
    }
    return new PluginConfig();  // 返回默认配置
}

玩家数据存储 ​

定义玩家数据 ​

csharp
public class PlayerInfo
{
    public int Score { get; set; }
    public DateTime LastLogin { get; set; }
}

使用字典存储 ​

csharp
using System.Collections.Generic;

Dictionary<string, PlayerInfo> playerData = new Dictionary<string, PlayerInfo>();

// 保存玩家数据
playerData["玩家名"] = new PlayerInfo
{
    Score = 100,
    LastLogin = DateTime.Now
};

// 读取玩家数据
if (playerData.ContainsKey("玩家名"))
{
    PlayerInfo info = playerData["玩家名"];
}

保存到文件 ​

csharp
void SaveAllPlayers(string path)
{
    string json = JsonConvert.SerializeObject(playerData, Formatting.Indented);
    File.WriteAllText(path, json);
}

void LoadAllPlayers(string path)
{
    if (File.Exists(path))
    {
        string json = File.ReadAllText(path);
        playerData = JsonConvert.DeserializeObject<Dictionary<string, PlayerInfo>>(json);
    }
}

插件数据目录 ​

建议在插件文件夹下创建数据目录:

Plugins/
└── MyPlugin/
    ├── config.json      (配置文件)
    └── players.json     (玩家数据)

获取数据路径 ​

csharp
string pluginDir = Path.Combine("Plugins", "MyPlugin");
string configFile = Path.Combine(pluginDir, "config.json");
string playersFile = Path.Combine(pluginDir, "players.json");

// 确保目录存在
Directory.CreateDirectory(pluginDir);

完整示例:签到插件数据 ​

csharp
using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;

public class SignInData
{
    public int TotalDays { get; set; }
    public int ContinuousDays { get; set; }
    public DateTime LastSignIn { get; set; }
}

public class SignInDataManager
{
    private readonly string _dataPath;
    private Dictionary<string, SignInData> _data = new Dictionary<string, SignInData>();

    public SignInDataManager(string pluginPath)
    {
        _dataPath = Path.Combine(pluginPath, "signin.json");
        Load();
    }

    public SignInData GetPlayer(string name)
    {
        if (!_data.ContainsKey(name))
        {
            _data[name] = new SignInData();
        }
        return _data[name];
    }

    public bool CanSignIn(string name)
    {
        var info = GetPlayer(name);
        return info.LastSignIn.Date != DateTime.Today;
    }

    public void SignIn(string name)
    {
        var info = GetPlayer(name);

        if (info.LastSignIn.Date == DateTime.Today.AddDays(-1))
        {
            info.ContinuousDays++;
        }
        else
        {
            info.ContinuousDays = 1;
        }

        info.TotalDays++;
        info.LastSignIn = DateTime.Now;

        Save();
    }

    private void Load()
    {
        if (File.Exists(_dataPath))
        {
            string json = File.ReadAllText(_dataPath);
            _data = JsonConvert.DeserializeObject<Dictionary<string, SignInData>>(json);
        }
    }

    private void Save()
    {
        Directory.CreateDirectory(Path.GetDirectoryName(_dataPath));
        string json = JsonConvert.SerializeObject(_data, Formatting.Indented);
        File.WriteAllText(_dataPath, json);
    }
}

小贴士 ​

  1. 使用 UTF-8 编码:处理中文时确保编码正确。
  2. 异常处理:文件操作可能失败,用 try-catch 包裹。
  3. 定期保存:重要数据要及时保存。
  4. 备份机制:重要数据考虑备份。
  5. 随世界保存:需要随世界切换/保存时,可把数据写到当前世界目录,并在 Save() 中写盘、Load() 中读取。
参与共建发现错误或有建议?两种零门槛方式,无需本地环境

玩家共建文档 · 原版、插件版、联机版与插件联机版请注意区分