外观
数据存储
插件常需要保存配置和玩家数据。最常用、最稳妥的方式是用 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);
}
}小贴士
- 使用 UTF-8 编码:处理中文时确保编码正确。
- 异常处理:文件操作可能失败,用 try-catch 包裹。
- 定期保存:重要数据要及时保存。
- 备份机制:重要数据考虑备份。
- 随世界保存:需要随世界切换/保存时,可把数据写到当前世界目录,并在
Save()中写盘、Load()中读取。
IyDmlbDmja7lrZjlgqgKCuaPkuS7tuW4uOmcgOimgeS/neWtmOmFjee9ruWSjOeOqeWutuaVsOaNruOAguacgOW4uOeUqOOAgeacgOeos+WmpeeahOaWueW8j+aYr+eUqCBgTmV3dG9uc29mdC5Kc29uYCDlhpnmiJAgSlNPTiDmlofku7bvvIzmlL7lnKjmj5Lku7boh6rlt7HnmoQgYFBsdWdpbnMv5L2g55qE5o+S5Lu2L2Ag5a2Q55uu5b2V5LiL77yI5LiN6KaB5YaZ6L+b56iL5bqP55uu5b2V77yM5Y+v6IO95peg5YaZ5YWl5p2D6ZmQ77yJ44CCCgo6OjogdGlwIOWFs+S6juaXpeW/lwrkuIvpnaLnpLrkvovnlKggYENvbnNvbGUuV3JpdGVMaW5lYCDosIPor5XjgILnnJ/lrp7mnI3liqHnq6/mm7TmjqjojZAgYExvZy5JbmZvcm1hdGlvbiguLi4pYCAvIGBMb2cuV2FybmluZyguLi4pYOOAggo6OjoKCiMjIEpTT04g6YWN572u5paH5Lu2CgpgYGBjc2hhcnAKdXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uSU87CnVzaW5nIE5ld3RvbnNvZnQuSnNvbjsKCnB1YmxpYyBjbGFzcyBQbHVnaW5Db25maWcKewogICAgcHVibGljIHN0cmluZyBNZXNzYWdlIHsgZ2V0OyBzZXQ7IH0gPSAi5qyi6L+O5p2l5Yiw5pyN5Yqh5Zmo77yBIjsKICAgIHB1YmxpYyBpbnQgTWF4UGxheWVycyB7IGdldDsgc2V0OyB9ID0gMTAwOwp9CmBgYAoKIyMjIOS/neWtmOmFjee9rgoKYGBgY3NoYXJwCnZvaWQgU2F2ZUNvbmZpZyhQbHVnaW5Db25maWcgY29uZmlnLCBzdHJpbmcgcGF0aCkKewogICAgc3RyaW5nIGpzb24gPSBKc29uQ29udmVydC5TZXJpYWxpemVPYmplY3QoY29uZmlnLCBGb3JtYXR0aW5nLkluZGVudGVkKTsKICAgIEZpbGUuV3JpdGVBbGxUZXh0KHBhdGgsIGpzb24pOwp9CmBgYAoKIyMjIOivu+WPlumFjee9rgoKYGBgY3NoYXJwClBsdWdpbkNvbmZpZyBMb2FkQ29uZmlnKHN0cmluZyBwYXRoKQp7CiAgICBpZiAoRmlsZS5FeGlzdHMocGF0aCkpCiAgICB7CiAgICAgICAgc3RyaW5nIGpzb24gPSBGaWxlLlJlYWRBbGxUZXh0KHBhdGgpOwogICAgICAgIHJldHVybiBKc29uQ29udmVydC5EZXNlcmlhbGl6ZU9iamVjdDxQbHVnaW5Db25maWc+KGpzb24pOwogICAgfQogICAgcmV0dXJuIG5ldyBQbHVnaW5Db25maWcoKTsgIC8vIOi/lOWbnum7mOiupOmFjee9rgp9CmBgYAoKIyMg546p5a625pWw5o2u5a2Y5YKoCgojIyMg5a6a5LmJ546p5a625pWw5o2uCgpgYGBjc2hhcnAKcHVibGljIGNsYXNzIFBsYXllckluZm8KewogICAgcHVibGljIGludCBTY29yZSB7IGdldDsgc2V0OyB9CiAgICBwdWJsaWMgRGF0ZVRpbWUgTGFzdExvZ2luIHsgZ2V0OyBzZXQ7IH0KfQpgYGAKCiMjIyDkvb/nlKjlrZflhbjlrZjlgqgKCmBgYGNzaGFycAp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKCkRpY3Rpb25hcnk8c3RyaW5nLCBQbGF5ZXJJbmZvPiBwbGF5ZXJEYXRhID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBQbGF5ZXJJbmZvPigpOwoKLy8g5L+d5a2Y546p5a625pWw5o2uCnBsYXllckRhdGFbIueOqeWutuWQjSJdID0gbmV3IFBsYXllckluZm8KewogICAgU2NvcmUgPSAxMDAsCiAgICBMYXN0TG9naW4gPSBEYXRlVGltZS5Ob3cKfTsKCi8vIOivu+WPlueOqeWutuaVsOaNrgppZiAocGxheWVyRGF0YS5Db250YWluc0tleSgi546p5a625ZCNIikpCnsKICAgIFBsYXllckluZm8gaW5mbyA9IHBsYXllckRhdGFbIueOqeWutuWQjSJdOwp9CmBgYAoKIyMjIOS/neWtmOWIsOaWh+S7tgoKYGBgY3NoYXJwCnZvaWQgU2F2ZUFsbFBsYXllcnMoc3RyaW5nIHBhdGgpCnsKICAgIHN0cmluZyBqc29uID0gSnNvbkNvbnZlcnQuU2VyaWFsaXplT2JqZWN0KHBsYXllckRhdGEsIEZvcm1hdHRpbmcuSW5kZW50ZWQpOwogICAgRmlsZS5Xcml0ZUFsbFRleHQocGF0aCwganNvbik7Cn0KCnZvaWQgTG9hZEFsbFBsYXllcnMoc3RyaW5nIHBhdGgpCnsKICAgIGlmIChGaWxlLkV4aXN0cyhwYXRoKSkKICAgIHsKICAgICAgICBzdHJpbmcganNvbiA9IEZpbGUuUmVhZEFsbFRleHQocGF0aCk7CiAgICAgICAgcGxheWVyRGF0YSA9IEpzb25Db252ZXJ0LkRlc2VyaWFsaXplT2JqZWN0PERpY3Rpb25hcnk8c3RyaW5nLCBQbGF5ZXJJbmZvPj4oanNvbik7CiAgICB9Cn0KYGBgCgojIyDmj5Lku7bmlbDmja7nm67lvZUKCuW7uuiuruWcqOaPkuS7tuaWh+S7tuWkueS4i+WIm+W7uuaVsOaNruebruW9le+8mgoKYGBgClBsdWdpbnMvCuKUlOKUgOKUgCBNeVBsdWdpbi8KICAgIOKUnOKUgOKUgCBjb25maWcuanNvbiAgICAgICjphY3nva7mlofku7YpCiAgICDilJTilIDilIAgcGxheWVycy5qc29uICAgICAo546p5a625pWw5o2uKQpgYGAKCiMjIyDojrflj5bmlbDmja7ot6/lvoQKCmBgYGNzaGFycApzdHJpbmcgcGx1Z2luRGlyID0gUGF0aC5Db21iaW5lKCJQbHVnaW5zIiwgIk15UGx1Z2luIik7CnN0cmluZyBjb25maWdGaWxlID0gUGF0aC5Db21iaW5lKHBsdWdpbkRpciwgImNvbmZpZy5qc29uIik7CnN0cmluZyBwbGF5ZXJzRmlsZSA9IFBhdGguQ29tYmluZShwbHVnaW5EaXIsICJwbGF5ZXJzLmpzb24iKTsKCi8vIOehruS/neebruW9leWtmOWcqApEaXJlY3RvcnkuQ3JlYXRlRGlyZWN0b3J5KHBsdWdpbkRpcik7CmBgYAoKIyMg5a6M5pW056S65L6L77ya562+5Yiw5o+S5Lu25pWw5o2uCgpgYGBjc2hhcnAKdXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLklPOwp1c2luZyBOZXd0b25zb2Z0Lkpzb247CgpwdWJsaWMgY2xhc3MgU2lnbkluRGF0YQp7CiAgICBwdWJsaWMgaW50IFRvdGFsRGF5cyB7IGdldDsgc2V0OyB9CiAgICBwdWJsaWMgaW50IENvbnRpbnVvdXNEYXlzIHsgZ2V0OyBzZXQ7IH0KICAgIHB1YmxpYyBEYXRlVGltZSBMYXN0U2lnbkluIHsgZ2V0OyBzZXQ7IH0KfQoKcHVibGljIGNsYXNzIFNpZ25JbkRhdGFNYW5hZ2VyCnsKICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF9kYXRhUGF0aDsKICAgIHByaXZhdGUgRGljdGlvbmFyeTxzdHJpbmcsIFNpZ25JbkRhdGE+IF9kYXRhID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBTaWduSW5EYXRhPigpOwoKICAgIHB1YmxpYyBTaWduSW5EYXRhTWFuYWdlcihzdHJpbmcgcGx1Z2luUGF0aCkKICAgIHsKICAgICAgICBfZGF0YVBhdGggPSBQYXRoLkNvbWJpbmUocGx1Z2luUGF0aCwgInNpZ25pbi5qc29uIik7CiAgICAgICAgTG9hZCgpOwogICAgfQoKICAgIHB1YmxpYyBTaWduSW5EYXRhIEdldFBsYXllcihzdHJpbmcgbmFtZSkKICAgIHsKICAgICAgICBpZiAoIV9kYXRhLkNvbnRhaW5zS2V5KG5hbWUpKQogICAgICAgIHsKICAgICAgICAgICAgX2RhdGFbbmFtZV0gPSBuZXcgU2lnbkluRGF0YSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX2RhdGFbbmFtZV07CiAgICB9CgogICAgcHVibGljIGJvb2wgQ2FuU2lnbkluKHN0cmluZyBuYW1lKQogICAgewogICAgICAgIHZhciBpbmZvID0gR2V0UGxheWVyKG5hbWUpOwogICAgICAgIHJldHVybiBpbmZvLkxhc3RTaWduSW4uRGF0ZSAhPSBEYXRlVGltZS5Ub2RheTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBTaWduSW4oc3RyaW5nIG5hbWUpCiAgICB7CiAgICAgICAgdmFyIGluZm8gPSBHZXRQbGF5ZXIobmFtZSk7CgogICAgICAgIGlmIChpbmZvLkxhc3RTaWduSW4uRGF0ZSA9PSBEYXRlVGltZS5Ub2RheS5BZGREYXlzKC0xKSkKICAgICAgICB7CiAgICAgICAgICAgIGluZm8uQ29udGludW91c0RheXMrKzsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaW5mby5Db250aW51b3VzRGF5cyA9IDE7CiAgICAgICAgfQoKICAgICAgICBpbmZvLlRvdGFsRGF5cysrOwogICAgICAgIGluZm8uTGFzdFNpZ25JbiA9IERhdGVUaW1lLk5vdzsKCiAgICAgICAgU2F2ZSgpOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBMb2FkKCkKICAgIHsKICAgICAgICBpZiAoRmlsZS5FeGlzdHMoX2RhdGFQYXRoKSkKICAgICAgICB7CiAgICAgICAgICAgIHN0cmluZyBqc29uID0gRmlsZS5SZWFkQWxsVGV4dChfZGF0YVBhdGgpOwogICAgICAgICAgICBfZGF0YSA9IEpzb25Db252ZXJ0LkRlc2VyaWFsaXplT2JqZWN0PERpY3Rpb25hcnk8c3RyaW5nLCBTaWduSW5EYXRhPj4oanNvbik7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgdm9pZCBTYXZlKCkKICAgIHsKICAgICAgICBEaXJlY3RvcnkuQ3JlYXRlRGlyZWN0b3J5KFBhdGguR2V0RGlyZWN0b3J5TmFtZShfZGF0YVBhdGgpKTsKICAgICAgICBzdHJpbmcganNvbiA9IEpzb25Db252ZXJ0LlNlcmlhbGl6ZU9iamVjdChfZGF0YSwgRm9ybWF0dGluZy5JbmRlbnRlZCk7CiAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQoX2RhdGFQYXRoLCBqc29uKTsKICAgIH0KfQpgYGAKCiMjIOWwj+i0tOWjqwoKMS4gKirkvb/nlKggVVRGLTgg57yW56CBKirvvJrlpITnkIbkuK3mlofml7bnoa7kv53nvJbnoIHmraPnoa7jgIIKMi4gKirlvILluLjlpITnkIYqKu+8muaWh+S7tuaTjeS9nOWPr+iDveWksei0pe+8jOeUqCB0cnktY2F0Y2gg5YyF6KO544CCCjMuICoq5a6a5pyf5L+d5a2YKirvvJrph43opoHmlbDmja7opoHlj4rml7bkv53lrZjjgIIKNC4gKirlpIfku73mnLrliLYqKu+8mumHjeimgeaVsOaNruiAg+iZkeWkh+S7veOAggo1LiAqKumaj+S4lueVjOS/neWtmCoq77ya6ZyA6KaB6ZqP5LiW55WM5YiH5o2iL+S/neWtmOaXtu+8jOWPr+aKiuaVsOaNruWGmeWIsOW9k+WJjeS4lueVjOebruW9le+8jOW5tuWcqCBgU2F2ZSgpYCDkuK3lhpnnm5jjgIFgTG9hZCgpYCDkuK3or7vlj5bjgIIK
