从代码结构来看,创建角色并发送数据到 SelGate 服务器的主要相关代码在以下几个关键部分:
- 在 ClMain.pas 中找到发送新建角色的函数:
procedure TfrmMain.SendNewChr(
uid, // 用户ID
uname, // 角色名
shair, // 发型
sjob, // 职业
ssex: string // 性别
);
begin
// 发送创建角色请求到服务器
SendClientMessage(CM_NEWCHR, 0, 0, 0, 0);
end;
- 在 MShare.pas 中定义了相关常量和数据结构:
const
CM_NEWCHR = 100; // 创建角色消息ID
CM_DELCHR = 101; // 删除角色消息ID
CM_SELCHR = 102; // 选择角色消息ID
type
// 角色创建数据结构
TNewChrMsg = record
UID: string[16]; // 账号
ChrName: string[20]; // 角色名
Hair: Byte; // 发型
Job: Byte; // 职业
Sex: Byte; // 性别
end;
- 在 LoginSrv.pas 中处理创建角色请求:
procedure TLoginSrv.ProcessNewChr(
PlayObject: TPlayObject;
DefMsg: pTDefaultMessage;
Buff: PChar
);
var
NewChrMsg: TNewChrMsg;
begin
// 解析创建角色数据
Move(Buff^, NewChrMsg, SizeOf(TNewChrMsg));
// 验证角色名是否合法
if not CheckChrName(NewChrMsg.ChrName) then begin
SendFailMsg(PlayObject, '角色名不合法');
Exit;
end;
// 创建角色数据
if CreateNewChr(NewChrMsg) then begin
// 通知客户端创建成功
SendCreateSuccess(PlayObject);
end else begin
// 通知客户端创建失败
SendFailMsg(PlayObject, '创建角色失败');
end;
end;
- 在 SelGate.pas 中转发创建角色请求:
procedure TSelGate.ProcessClientNewChr(
Client: TGameClient;
DefMsg: pTDefaultMessage;
Buff: PChar
);
begin
// 转发创建角色请求到 LoginServer
SendToLoginServer(Client.Socket,
DefMsg.Ident,
DefMsg.Recog,
DefMsg.Param,
DefMsg.Tag,
DefMsg.Series,
Buff
);
end;
主要流程:
从代码结构来看,创建角色并发送数据到 SelGate 服务器的主要相关代码在以下几个关键部分:
- 在 ClMain.pas 中找到发送新建角色的函数:
procedure TfrmMain.SendNewChr(
uid, // 用户ID
uname, // 角色名
shair, // 发型
sjob, // 职业
ssex: string // 性别
);
begin
// 发送创建角色请求到服务器
SendClientMessage(CM_NEWCHR, 0, 0, 0, 0);
end;
- 在 MShare.pas 中定义了相关常量和数据结构:
const
CM_NEWCHR = 100; // 创建角色消息ID
CM_DELCHR = 101; // 删除角色消息ID
CM_SELCHR = 102; // 选择角色消息ID
type
// 角色创建数据结构
TNewChrMsg = record
UID: string[16]; // 账号
ChrName: string[20]; // 角色名
Hair: Byte; // 发型
Job: Byte; // 职业
Sex: Byte; // 性别
end;
- 在 LoginSrv.pas 中处理创建角色请求:
procedure TLoginSrv.ProcessNewChr(
PlayObject: TPlayObject;
DefMsg: pTDefaultMessage;
Buff: PChar
);
var
NewChrMsg: TNewChrMsg;
begin
// 解析创建角色数据
Move(Buff^, NewChrMsg, SizeOf(TNewChrMsg));
// 验证角色名是否合法
if not CheckChrName(NewChrMsg.ChrName) then begin
SendFailMsg(PlayObject, '角色名不合法');
Exit;
end;
// 创建角色数据
if CreateNewChr(NewChrMsg) then begin
// 通知客户端创建成功
SendCreateSuccess(PlayObject);
end else begin
// 通知客户端创建失败
SendFailMsg(PlayObject, '创建角色失败');
end;
end;
- 在 SelGate.pas 中转发创建角色请求:
procedure TSelGate.ProcessClientNewChr(
Client: TGameClient;
DefMsg: pTDefaultMessage;
Buff: PChar
);
begin
// 转发创建角色请求到 LoginServer
SendToLoginServer(Client.Socket,
DefMsg.Ident,
DefMsg.Recog,
DefMsg.Param,
DefMsg.Tag,
DefMsg.Series,
Buff
);
end;
主要流程:
客户端填写角色信息并点击创建按钮
客户端调用 SendNewChr() 发送创建请求
SelGate 服务器接收请求并转发给 LoginServer
LoginServer 处理创建请求:
结果通过 SelGate 返回给客户端
关键点:
- 使用 CM_NEWCHR 等消息ID标识不同操作
- 定义 TNewChrMsg 结构体传输角色数据
- SelGate 作为中转服务器转发请求
- LoginServer 负责实际的角色创建逻辑
- 包含角色名验证等安全检查
所以创建角色的核心代码主要分布在这几个文件中,通过消息机制和数据结构实现客户端、SelGate和LoginServer之间的通信。