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

核心 API 速查 ​

常用 API 快速参考,复制粘贴即可使用。命名空间差异见 第一个插件 顶部的说明(源码构建用 Game.Server,发行构建用 Game.Server.EssentialCmd)。

命名空间 ​

csharp
using Game.Server;              // 服务端核心
using Game.Server.PlayerEvent;  // 玩家事件
using Game.Server.EssentialCmd; // 命令处理(发行构建;源码构建改为 Game.Server)
using GameEntitySystem;         // 实体系统
using Engine;                   // 引擎(向量等)
using Game.NetWork;             // 网络
using Game.NetWork.Packages;    // 网络包

GameManager ​

csharp
// 检查游戏是否加载
if (GameManager.Project == null) return;

// 获取玩家子系统
var players = GameManager.Project.FindSubsystem<SubsystemPlayers>();

// 获取地形子系统
var terrain = GameManager.Project.FindSubsystem<SubsystemTerrain>();

向量和坐标 ​

csharp
// 创建坐标
Vector3 pos = new Vector3(100f, 50f, 200f);  // 浮点坐标
Point3 block = new Point3(100, 50, 200);     // 方块坐标(整数)

// 访问坐标
float x = pos.X;
float y = pos.Y;
float z = pos.Z;

网络包 ​

发送消息 ​

csharp
var pkg = new MessagePackage(null, "消息内容", 0, null);
pkg.To = player.Client;
CommonLib.Net.QueuePackage(pkg);

传送玩家 ​

csharp
// 设置位置
player.ComponentBody.Position = new Vector3(x, y, z);

// 通知客户端(PlayerAction.12 = 传送)
CommonLib.Net.QueuePackage(new ComponentPlayerPackage(player, (PlayerAction)12));

踢出玩家 ​

csharp
CommonLib.Net.RemoveClient(player.Client, "踢出原因");

组件转换 ​

csharp
// PlayerData → ComponentPlayer
ComponentPlayer cp = playerData.ComponentPlayer;

// ComponentPlayer → 位置
Vector3 pos = cp.ComponentBody.Position;

// ComponentPlayer → 背包
var inventory = cp.Entity.FindComponent<ComponentInventory>();

// ComponentPlayer → 生命值
var health = cp.ComponentHealth;

背包操作 ​

csharp
var inventory = ((Component)player).Entity.FindComponent<ComponentInventory>();

// 获取格子数量
int slots = inventory.SlotsCount;

// 获取格子内容
int value = inventory.GetSlotValue(i);   // 物品ID
int count = inventory.GetSlotCount(i);   // 数量

// 添加物品
inventory.AddSlotItems(i, itemId, count);

// 清空格子
inventory.RemoveSlotItems(i, inventory.GetSlotCount(i));

事件注册 ​

csharp
// 玩家进入/离开
PlayerEnterGameEventManager.AddObject(this);

// 方块破坏/放置
PlayerBreakAndPlaceBlockEventManager.AddObject(this);

// 玩家移动
PlayerMoveEventManager.AddObject(this);

// 玩家交互
PlayerInteractEventManager.AddObject(this);

常用判断 ​

csharp
// 游戏是否加载
if (GameManager.Project == null) { /* 未加载 */ }

// 是否为控制台
if (m_isTerminal) { /* 是控制台 */ }

// 玩家是否在线
var player = FindPlayer(name);
if (player == null) { /* 不在线 */ }

// 是否在某个区域
bool inArea = x >= minX && x <= maxX && z >= minZ && z <= maxZ;

时间相关 ​

csharp
// 当前时间
DateTime now = DateTime.Now;

// 今天日期
DateTime today = DateTime.Today;

// 格式化时间
string time = now.ToString("yyyy-MM-dd HH:mm:ss");

// 计算时间差
TimeSpan diff = now - lastTime;
int seconds = (int)diff.TotalSeconds;

文件操作 ​

csharp
using System.IO;

// 创建目录
Directory.CreateDirectory("Plugins/MyPlugin");

// 写入文件
File.WriteAllText(path, content);

// 读取文件
string content = File.ReadAllText(path);

// 检查文件存在
if (File.Exists(path)) { /* 存在 */ }

JSON 操作 ​

csharp
using Newtonsoft.Json;

// 序列化
string json = JsonConvert.SerializeObject(obj, Formatting.Indented);

// 反序列化
MyClass obj = JsonConvert.DeserializeObject<MyClass>(json);

小贴士 ​

  1. 复制粘贴:这些代码片段可以直接使用。
  2. 按需修改:根据实际情况调整参数。
  3. 异常处理:重要操作加 try-catch。
  4. 持久化路径:写入数据时优先用 Plugins/你的插件子目录,避免写入程序目录失败。
参与共建发现错误或有建议?两种零门槛方式,无需本地环境

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