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; } } }