|
@@ -1,4 +1,6 @@
|
|
|
using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.Linq;
|
|
|
|
|
|
namespace ET.Server
|
|
|
{
|
|
@@ -10,43 +12,52 @@ namespace ET.Server
|
|
|
{
|
|
|
protected override async ETTask Run(Session session, C2G_BindPlayer request, G2C_BindPlayer response, Action reply)
|
|
|
{
|
|
|
- if (session.DomainScene().SceneType != SceneType.Game)
|
|
|
+ if (string.IsNullOrEmpty(request.UserId.ToString().Trim()))
|
|
|
{
|
|
|
- Log.Debug($"Game 请求的Scene错误...SceneType={session.DomainScene().SceneType}");
|
|
|
- session.Dispose();
|
|
|
+ Log.Debug($"参数错误,账号id为空");
|
|
|
+ response.Error = ErrorCode.ERR_ParameterError;
|
|
|
+ reply();
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- // 移除session自动超时组件
|
|
|
- session.RemoveComponent<SessionAcceptTimeoutComponent>();
|
|
|
-
|
|
|
Scene scene = session.DomainScene();
|
|
|
-
|
|
|
- PlayerInfo playerInfo;
|
|
|
-
|
|
|
+ // 预先创建数据
|
|
|
+ long _id = IdGenerater.Instance.GenerateUnitId(scene.DomainZone());
|
|
|
+ PlayerInfo playerInfo = new PlayerInfo();
|
|
|
+ playerInfo.Id = _id;
|
|
|
+ playerInfo.UserId = session.GetComponent<SessionPlayerComponent>().UserId;
|
|
|
+ playerInfo.Name = "玩家-" + _id;
|
|
|
+ playerInfo.Sex = 0;
|
|
|
+ playerInfo.Pro = (int)PlayerProType.CANG_LANG;
|
|
|
+ playerInfo.Level = 1;
|
|
|
+ playerInfo.Exp = 0;
|
|
|
+
|
|
|
+ // 简易版登录,直接创建一个player
|
|
|
if (request.PlayerId <= 0)
|
|
|
{
|
|
|
- long _id = IdGenerater.Instance.GenerateUnitId(scene.DomainZone());
|
|
|
+ // 角色列表是否有数据
|
|
|
+ List<PlayerInfo> playerList = session.GetComponent<SessionPlayerComponent>().PlayerList;
|
|
|
|
|
|
- // 简易版登录,直接创建一个player
|
|
|
- using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.CreatePlayer, _id.ToString().Trim().GetHashCode()))
|
|
|
+ if (playerList is { Count: > 0 })
|
|
|
+ {
|
|
|
+ foreach (PlayerInfo info in playerList.Where(info => info != null))
|
|
|
+ {
|
|
|
+ playerInfo = info;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- playerInfo = new PlayerInfo();
|
|
|
- playerInfo.Id = _id;
|
|
|
- playerInfo.UserId = request.UserId;
|
|
|
- playerInfo.Name = "玩家-" + _id;
|
|
|
- playerInfo.Sex = 0;
|
|
|
- playerInfo.Pro = (int)PlayerProType.CANG_LANG;
|
|
|
- playerInfo.Level = 1;
|
|
|
- playerInfo.Exp = 0;
|
|
|
-
|
|
|
- await DBManagerComponent.Instance.GetZoneDB(session.DomainZone()).Save(playerInfo);
|
|
|
+ using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.CreatePlayer, _id.ToString().Trim().GetHashCode()))
|
|
|
+ {
|
|
|
+ await DBManagerComponent.Instance.GetZoneDB(session.DomainZone()).Save(playerInfo);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
// 正常选角,判断参数
|
|
|
- if (!session.GetComponent<SessionPlayerComponent>().PlayerList.ContainsKey(request.PlayerId))
|
|
|
+ if (!session.GetComponent<SessionPlayerComponent>().IsExist(request.PlayerId))
|
|
|
{
|
|
|
Log.Debug($"选角出错,没有选择的角色");
|
|
|
response.Error = ErrorCode.ERR_BindPlayerError;
|
|
@@ -54,7 +65,7 @@ namespace ET.Server
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- playerInfo = session.GetComponent<SessionPlayerComponent>().PlayerList[request.PlayerId];
|
|
|
+ playerInfo = session.GetComponent<SessionPlayerComponent>().Get(request.PlayerId);
|
|
|
|
|
|
if (playerInfo == null)
|
|
|
{
|
|
@@ -75,7 +86,12 @@ namespace ET.Server
|
|
|
return;
|
|
|
case > 0 when bindPlayerId != request.PlayerId:
|
|
|
// todo 老角色下线
|
|
|
-
|
|
|
+ WNPlayer oldPlayer = scene.GetComponent<GamePlayerComponent>().Get(bindPlayerId);
|
|
|
+ if (oldPlayer != null)
|
|
|
+ {
|
|
|
+ oldPlayer.Dispose();
|
|
|
+ scene.GetComponent<GamePlayerComponent>().Remove(bindPlayerId);
|
|
|
+ }
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
@@ -85,16 +101,18 @@ namespace ET.Server
|
|
|
if (player != null)
|
|
|
{
|
|
|
// todo 顶号
|
|
|
+ player.Dispose();
|
|
|
+ scene.GetComponent<GamePlayerComponent>().Remove(request.PlayerId);
|
|
|
}
|
|
|
|
|
|
player ??= scene.GetComponent<GamePlayerComponent>()
|
|
|
.AddChild<WNPlayer, Session, PlayerInfo>(session, playerInfo);
|
|
|
|
|
|
- await player.GetComponent<PlayerTempDataComponent>().InitFromDB(player);
|
|
|
-
|
|
|
- session.AddComponent<MailBoxComponent, MailboxType>(MailboxType.GateSession);
|
|
|
+ await player.GetComponent<PlayerTempDataComponent>().InitFromDB();
|
|
|
|
|
|
+ // 绑定选择的玩家
|
|
|
session.GetComponent<SessionPlayerComponent>().PlayerId = request.PlayerId > 0 ? request.PlayerId : player.GetId();
|
|
|
+ session.AddComponent<MailBoxComponent, MailboxType>(MailboxType.GateSession);
|
|
|
|
|
|
// todo 分配场景
|
|
|
Map map = MapHelper.BindPlayerDispatch(player);
|