ET服务端 怎么写正常的关服流程?http/rpc/终端等接收停服指令,断开客户端连接,通知缓存服把剩余数据实时入库?销毁各个组件?对应修改ET6 哪些文件?
ET GM实现思路流程
文件夹:Server/Hotfix/Module/Console/
先推荐阅读一下ReloadConfigConsoleHandler.cs的代码
写GM指令,我是这样的:
1、Server\Model\Module\Console\ConsoleComponent
在头部先定义一个自己的标签
public const string UserTodo = “U”;
2、在Server/Hotfix/Module/Console/ 新建一个CS文件
UserTodoConsoleHandler.cs
[ConsoleHandler(ConsoleMode.UserTodo)]
public class UserTodoConsoleHandler : IConsoleHandler
{
public async ETTask Run(ModeContex contex, string content)
{
switch (content)
{
case ConsoleMode.UserTodo:
contex.Parent.RemoveComponent<ModeContex>();
break;
default:
string[] ss = content.Split(" ");
string name = ss[1];
string itemName = ss[2];
int itemCount = 1;
if (ss[3] != "") itemCount = Convert.ToInt32(ss[3]);
UnitComponent unitCom = null;
foreach (Entity e in Game.Scene.Children.Values)
{
if (e is Scene)
{
if (((Scene)e).Name == "Map1")
{
unitCom = ((Scene)e).GetComponent<UnitComponent>();
}
}
}
if (unitCom == null) return;
//ID为6的地图服务器
// Scene scene = Game.Scene.Get(StartSceneConfigCategory.Instance.Get(6).InstanceId);
foreach (Entity e in unitCom.Children.Values)
{
if (e is Unit)
{
Unit u = (Unit)e;
if (u.SubInfo.Name == name)
{
if (u.GetComponent<UserComponent>().Userdata.AddNewItem(itemName, itemCount))
{
Log.Console(itemName + " 已成功添加给" + name + itemCount.ToString());
return;
}
else
{
Log.Console(itemName + " 添加给" + name + " 失败");
return;
}
}
}
}
Log.Console(name + " 不在线");
break;
}
await ETTask.CompletedTask;
}
}
使用方法就是在服务端控制台输入:U 玩家名字 物品名 1
就会给玩家添加一个物品
如果要关服的话
1、先断开所有玩家的连接——我的UserComponent会自动储存数据,你可以自己先保存数据,再断开连接
2、保存服务器公共数据
3、终止进程
上面都是实现功能的代码,真实环境下肯定要做更严谨的处理,仅做参考
做个gm帐号,也是一个普通游戏帐号,但是有gm权限可以响应gm消息指令,这个帐号发送消息给服务端,服务端收到就踢所有玩家下线。玩家下线就存数据库。下线完之后再通知中心服存库。所有操作完成,自己手动kill掉进程就行了
3 个月 后
langligelang 走console的话, 那进程启动不得开放console,每次操作得上服务器输入指令?(还没部署过外网,不太清楚console在linux上面是咋样操作的) 走http会不会好一些?
watcher进程有端口,直接创建Session发送即可
9 个月 后
IxbxAx 是的,就是这样
IxbxAx 是的
NetInnerComponent是用来发actor消息的 NetServerComponent才是做原始的session连接