using System;
using System.Collections.Generic;
namespace ET.Server
{
///
/// 选角绑定角色
///
[MessageHandler(SceneType.Game)]
public class C2G_BindPlayerHandler: AMRpcHandler
{
protected override async ETTask Run(Session session, C2G_BindPlayer request, G2C_BindPlayer response, Action reply)
{
// 判断参数
if (string.IsNullOrEmpty(request.PlayerId.ToString()))
{
Log.Debug($"参数错误,角色id为空");
response.Error = ErrorCode.ERR_ParameterError;
reply();
return;
}
PlayerInfo info = session.GetComponent().PlayerInfo;
if (info != null && request.PlayerId != info.Id)
{
Log.Debug($"参数错误,角色id错误");
response.Error = ErrorCode.ERR_ParameterError;
reply();
return;
}
Scene scene = session.DomainScene();
WNPlayer player = scene.GetComponent().Get(request.PlayerId);
if (player != null)
{
// 重新登录,赋值session
if (player.Session.InstanceId != session.InstanceId)
{
player.Session = session;
Log.Debug($"重新登录,赋值session...");
}
}
else
{
player = scene.GetComponent().AddChild(session);
}
// 绑定选择的玩家
session.GetComponent().BindPlayerId(player);
// todo 分配场景
Map map = MapHelper.BindPlayerDispatch(player);
MapConfig mapConfig = map.Prop;
// 登录数据
player.OnLogin();
map.OnPlayerLogin(player);
response.Player = PlayerHelper.PlayerInfoToProto(player);
response.Player.areaId = mapConfig.TemplateID;
response.Player.instanceId = map.Id;
response.Player.mapId = map.MapId;
reply();
await ETTask.CompletedTask;
}
}
}